Goedendag,
Ik ben op het moment bezig met het integraal ontwerpen van een program loop voor een BOSE folietester. het gaat hier om een programma om een wandpanneel, van BOSE te testen op juistheid heb het volgende programma ontworpen
Het paneeltje is een zeer eenvoudige versie van een
-Volume up and Down
-Radio Channel + -
Display met hierop voorgaande informatie
Zou men hier een blik op kunnen werpen en evt. evrtellen of hier een vereenvoudiging van is? :eusa_whistle:
;=============================================================================
;
; Folie Tester voor CS-WC AMS8
;
;=============================================================================
;
; In opdracht van : ____
;
; Versie
: 4.2
; Datum
: 09-04-2010
; Auteur
: Robert
;
;
;
;=============================================================================
.include "m32def.inc"
// IO definitions
.equ Return = PC0
.equ VolDown = PC1
// Volume minus button
.equ VolUp = PC2
// Volume positive button
.equ ChDown = PC3
// Channel minus button
.equ ChUp = PC4
// Channel positive button
.equ LedFoil = PA7
.equ LedR1 = PD0
.equ LedG1 = PD1
.equ LedR2 = PD2
.equ LedG2 = PD3
.equ LedR3 = PD4
.equ LedG3 = PD5
.equ LedR4 = PD6
.equ LedG4 = PD7
.equ dispErr = 0b00110000
.equ disp1 = 0b11001111
.equ disp2 = 0b10010010
.equ disp3 = 0b10000110
.equ disp4 = 0b11001100
.equ Startdisp = 0b10000001
// Registers definitions
.dseg
.def reserved = r0
; reserved for LPM instructions
.def s_stack = r1
; stack for status during interrupt
.def w
= r16 ; working register
.def temp1 = r17
; temporary register
.def temp2 = r18
.def counter = r19
; general purpose counter
.def tempL = r24
; temporary 16bits register
.def tempH = r25
.equ Stack = 100
; reserved for stack 100 bytes
.equ Reserve = (RAMEND - Stack)
.cseg
.org $000
;Reset Vector
rjmp Reset
;Interrupt vectors
.org INT0addr
reti
.org INT1addr
reti
.org OC2addr
reti
.org OVF2addr
reti
.org ICP1addr
reti
.org OC1Aaddr
reti
.org OC1Baddr
reti
.org OVF1addr
reti
.org OVF0addr
reti
.org SPIaddr
reti
.org URXCaddr
reti
.org UDREaddr
reti
.org UTXCaddr
reti
.org ADCCaddr
reti
.org ERDYaddr
reti
.org ACIaddr
reti
.org TWIaddr
reti
.org INT2addr
reti
.org OC0addr
reti
.org SPMRaddr
reti
;=============================================================================
; Main program init
;=============================================================================
Reset:
ldi w,low(RAMEND)
// init stack
out SPL,w
ldi w,high(RAMEND)
out SPH,w
// Init IO ports
ldi w,255
out PortA,w
ldi w,0b11111111
out DDRA,w
// direction register all output
ldi w,0b11111111
// enable pullup portC
out PortC,w
ldi w,0b00000000
// direction register all input
out DDRC,w
ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All RED Leds on
out PortD,w
ldi w,0b11111111
// enable all output mode leds
out DDRD,w
ldi w,0
// load value 0
ldi xl,low(0x0060)
// load sram begin address
ldi xh,high(0x0060)
ldi temp2,high(Reserve+1)
// load sram end address
ldi temp1,low(Reserve+1)
Startdisplay:
ldi w,Startdisp
out PortA,w
ClearSram:
st x+,w
// clear sram register and increment pointer
cp xl,temp1
cpc xh,temp2
brne ClearSram
// enable timer0
// Tdeb=50ms, Fosc=4MHz
// F=1/T T=periodetime F=4mHz registerpins CS00|CS02 hoog maken omdat 1024 nodig is om te vertragen (delay)om uit te komen op:50mHz
ldi w,(1<<CS00)|(1<<CS02)
out TCCR0,w
;=============================================================================
; Main program loop
;=============================================================================
Main:
sbic PinC,Return
// skip next instruction if input is low
rjmp MainTest
rcall DebounceDelay
sbic PinC,Return
rjmp MainTest
StartNewTest:
ldi w,(1<<LedR1)|(1<<LedR2)|(1<<LedR3)|(1<<LedR4) // All Red Leds on
out PortD,w
MainTest:
rcall ReadSwVolDown
// Check VolDown button
rcall ReadSwVolup
// Check VolUp button
rcall ReadSwChDown
// Check ChDown button
rcall ReadSwChUp
// Check ChUp button
rjmp Main
ReadSwVolDown:
// Check VolDown button
sbic PinC,VolDown
ret
rcall DebounceDelay
sbic PinC,VolDown
ret
in temp1,PinC
// Get status all keys
com temp1
ldi w,0xFF^(1<<VolDown)
and w,temp1
brne ReadSwVolDownErr
in temp1,PortD
ldi w,(1<<LedG1)
// Led1 Green
ldi temp2,0xFF^((1<<LedG1)|(1<<LedR1))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR1
sbi PortD,LedG1
ldi w,disp1
out PortA,w
ret
ReadSwVolDownErr:
ldi w,DispErr
out PortA,w
ret
ReadSwVolUp:
// Check VolUp button
sbic PinC,VolUp
ret
rcall DebounceDelay
sbic PinC,VolUp
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<VolUp)
and w,temp1
brne ReadSwVolUpErr
in temp1,PortD
ldi w,(1<<LedG2)
// Led2 Green
ldi temp2,0xFF^((1<<LedG2)|(1<<LedR2))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR2
sbi PortD,LedG2
ldi w,disp2
out PortA,w
ret
ReadSwVolUpErr:
ldi w,DispErr
out PortA,w
ret
ReadSwChDown:
// Check ChDown button
sbic PinC,ChDown
ret
rcall DebounceDelay
sbic PinC,ChDown
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<ChDown)
and w,temp1
brne ReadSwChDownErr
in temp1,PortD
ldi w,(1<<LedG3)
// Led3 Green
ldi temp2,0xFF^((1<<LedG3)|(1<<LedR3))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR3
sbi PortD,LedG3
ldi w,disp3
out PortA,w
ret
ReadSwChDownErr:
ldi w,DispErr
out PortA,w
ret
ReadSwChUp:
// Check ChUp button
sbic PinC,ChUp
ret
rcall DebounceDelay
sbic PinC,ChUp
ret
in temp1,PinC
com temp1
ldi w,0xFF^(1<<ChUp)
and w,temp1
brne ReadSwChDownErr
in temp1,PortD
ldi w,(1<<LedG4)
// Led4 Green
ldi temp2,0xFF^((1<<LedG4)|(1<<LedR4))
and temp1,temp2
or w,temp1
out PortD,w
cbi PortD,LedR4
sbi PortD,LedG4
ldi w,disp4
out PortA,w
ret
ReadSwChUpErr:
ldi w,DispErr
out PortA,w
ret
DebounceDelay:
push temp1
// store temp1,temp2
push temp2
ldi temp1,0
// reset timer0
out TCNT0,temp1
ldi temp2,195
Wait:
in temp1,TCNT0
cp temp1,temp2
brne Wait
pop temp2
// restore temp2,temp1
pop temp1
ret