
Jag har en Atmega8 med en LM35 in på ADC0 och 2 knappar på INT0 och INT1, två 7 segments displayer kopplade via BCD->7seg dekodrar på PORTB och slutligen en LED på PD5 och ett relä via trissa på PD4.
Vad ska den göra då?
LM35 lämnar en temperatur via ADC som omvandlas till BCD och spottas ut på PortB. En termometer alltså (Som nybörjare var det väldigt upphetsande att få den biten att fungera

Vidare så lade jag till ett register med ett inställbart värde som kunde ökas och minskas med hjälp av interrupt-knapparna. När jag ökar eller minskar värdet så spottas det värdet i BCD ut på PortB, en LED tänds och indikerar att jag är i inställningsläget och efter 5 sekunders inaktivitet på knapparna så växlar den tillbaka till att visa temperaturen igen.
Lade sedan till Comparefunktion som drar reläet på PD4 om det inställda värdet är högre än temperaturen och släpper om det är lägre.
Vid det här laget ansåg jag att jag hade en termostat (Ännu lyckligare

men sedan började problemen.
Problemet är att om jag trycker på någon av knapparna snabbt upprepade gånger så visas det alla möjliga siffror på "displayen" och till slut så hittar den inte tillbaka till temperaturen och visar istället det inställda värdet hela tiden.
Ögonen blöder och jag har säkert bara orsakat skada och oreda i koden i mina försök att få rätt på problemet.
Någon som kan se något uppenbart? (ber om ursäkt för rörig kod och oortodoxa tillvägagångssätt i vissa försök till lösningar)
Alla optimeringstips och kommentarer är mycket välkomna.
Ska väl nämna att det är AvrStudio jag skriver i.
Kod: Markera allt
.include "m8def.inc"
.def Siffra4 = R3
.def Siffra5 = R4
.def Temp = R16
.def rBin1H = R17
.def rBin1L = R18
.def rBin2H = R19
.def rBin2L = R20
.def Program = R21
.def IntFlag = R22
.org 0x0000
rjmp RESET
.org INT0addr
rjmp Minus
.org INT1addr
rjmp Plus
RESET: ;*****STARTSETUP*****
SBRC IntFlag,7
rjmp main
ldi Temp,LOW(RAMEND) ; Initiera Stackpointer
out SPL,Temp
ldi Temp,HIGH(RAMEND)
out SPH,Temp
ldi Program, 20
ldi Temp, $ff
out DDRB,Temp
sbi DDRD, 4
sbi DDRD, 5
sbi PortD, 2
sbi PortD, 3
ldi TEMP,(1<<INT0)+(1<<INT1) ; int masks 0 och 1
out GICR,TEMP
ldi TEMP, $0F
out MCUCR, TEMP
sei
Main: ;*****HUVUDPROGRAM*****
cbr IntFlag,7
sei
rcall ADCInit
ldi Temp, $0
rcall ADCsel
rcall ADCTrig
lsr rBin1H
ror rBin1L
lsr rBin1H
ror rBin1L
cp rbin1L, Program
brge Off
brlo On
Cont:
rcall Bin2ToBcd5
rcall klar
rjmp Main
On: sbi PortD, 4
rjmp Cont
Off: cbi PortD, 4
rjmp Cont
ADCInit: ;*****ADC Start*****
ldi Temp, $A3
out ADCSRA, Temp
ret
ADCsel:
out ADMUX, Temp
ret
;
ADCTrig:
SBI ADCSRA, 6
rcall DEL600mus
IN rBin1L, ADCL
IN rBin1H, ADCH
ADCCLR:
SBI ADCSR, 4
IN Temp,ADCSR
SBIC ADCSR, 4
RJMP ADCCLR
RET
Bin2ToBcd5: ;*****TALOMVANDLING*****
push rBin1H
push rBin1L
ldi Temp,HIGH(10000)
mov rBin2H,Temp
ldi Temp,LOW(10000)
mov rBin2L,Temp
rcall Bin2ToDigit
ldi Temp,HIGH(1000)
mov rBin2H,Temp
ldi Temp,LOW(1000)
mov rBin2L,Temp
rcall Bin2ToDigit
ldi Temp,HIGH(100)
mov rBin2H,Temp
ldi Temp,LOW(100)
mov rBin2L,Temp
rcall Bin2ToDigit
ldi Temp,HIGH(10)
mov rBin2H,Temp
ldi Temp,LOW(10)
mov rBin2L,Temp
rcall Bin2ToDigit
st z,rBin1L
sbiw ZL,4
pop rBin1L
pop rBin1H
rcall klar
ret
Bin2ToDigit:
clr Temp
Bin2ToDigita:
cp rBin1H,rBin2H
brcs Bin2ToDigitc
brne Bin2ToDigitb
cp rBin1L,rBin2L
brcs Bin2ToDigitc
Bin2ToDigitb:
sub rBin1L,rBin2L
sbc rBin1H,rBin2H
inc Temp
rjmp Bin2ToDigita
Bin2ToDigitc:
st z+,Temp
ret
klar: ;******SKICKA UT PÅ DISPLAY******
mov rBin1H, Siffra4
mov rBin1L, Siffra5
bst rBin1H,0
bld rBin1L,4
bst rBin1H,1
bld rBin1L,5
bst rBin1H,2
bld rBin1L,6
bst rBin1H,3
bld rBin1L,7
out PORTB, rBin1L
ret
;*****DELAYRUTINER*****
DEL600mus:
LDI XH, HIGH(798)
LDI XL, LOW (798)
COUNT4:
SBIW XL, 1
BRNE COUNT4
RET
DEL49ms:
LDI XH, HIGH(65535)
LDI XL, LOW (65535)
COUNT3:
SBIW XL, 1
BRNE COUNT3
RET
Del05s:
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
rcall DEL49ms
ret
;*****INTERUPTS*****
Plus:
sbr IntFlag,7
inc Program
rjmp Visaprog
Minus:
sbr IntFlag,7
dec Program
rjmp Visaprog
Visaprog:
clr rBin1L
clr rBin1H
clr rBin2L
clr rBin2H
mov rBin1L, Program
rcall Bin2ToBcd5
rcall klar
sbi PortD, 5
rcall DEL49ms
rcall Del05s
cbi PortD, 5
reti