Code:
.include "m8def.inc"
;einzelne Bits von toogleregister zuweisen
.equ toogleflagL = 2 ;Hat eine Änderung am Rad Links stattgefunden ?
.equ toogleflagR = 1 ;Hat eine Änderung am Rad Rechts stattgefunden?
.equ toogle = 0 ;Bit 0 von tooglereg für Rad R "0" und Rad L "1" umzuschalten
;Register R1 bis R4 erhalten die Werte der Zähler
.def encoder_leftL = R1
.def encoder_leftH = R2
.def encoder_rightL = R3
.def encoder_rightH = R4
.def tmpi = R16 ; Universalregister für Interrupts
.def tmpi2 = R17 ;Universalregister für 16 Bit rechnen
.def tooglereg = R18 ;Toogle Register, hier werden Flags zu Farbe- u. Radwechsel abgespeichert
.org 0x00
rjmp reset ;ResetVector
.org ADCCaddr
rjmp ADCcomplete ; ADCcomplete Interrupt Vector
;Anfangsfeierlichkeiten sollten mindestens folgendes enthalten
reset:
;Stack einrichten
ldi tmp,HIGH(RAMEND)
out SPH,tmp
ldi tmp,LOW(RAMEND)
out SPL,tmp
;Stack fertig
;A/D Conversion
ldi tmp,(1<< ADEN) | (1<<ADFR) | (1<<ADIE) | (1<<ADSC) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2)
out ADCSRA,tmp
ldi tmp,(1<<REFS0) | (1<<ADLAR) | (1<<MUX0)
out ADMUX,tmp
;A/D Conversion fertig
sbi PORTD,PD7 ;schalte Odometrie LEDs ein
main:
;Hier sollte auch mal ein Programm stehen
;Ich lasse es einfach mal weg, damit das alles nicht zu groß wird
rjmp main
ADCcomplete:
in tmpi,SREG ;lese Statusregister in tmpi ein
push tmpi ;Rette ihn auf den Stack
ldi tmpi2,0x00 ;lade 0x00 in tmpi2(wird benutzt um 16 Bitencoder zu adieren)
in tmpi,ADCL ;lese LOWbit ein(wird nicht benutzt)
in tmpi,ADCH ;Lese HIGHbit ein
sbrs tooglereg,toogle ;Wenn Bit toogle = 1 Weiter bei Rechtem Rad
rjmp radlinks ;wenn nicht dann halt bei Links
;Rad Rechts
sbrs tooglereg,toogleflagR ;ist toogleflagR gesetzt? wenn ja springe zu flagRtrue
rjmp flagRfalse ;wenn nicht springe zu flagRfalse
;flagRtrue
cpi tmpi,0x8C ;vergleiche mit 0x8C
brsh ausR ;wenn größer oder gleich springe zu ausR
ldi tmpi,0x01 ;lade 0x01 in tmpi
add encoder_rightL,tmpi;encoder_right++
adc encoder_rightH,tmpi2;encoder_right++ mit Carry
;debug
;cbi PORTD,PD2 ;Status LED rot an
;sbi PORTB,PB0 ;Status LED grün an
;ende debug
andi tooglereg,0xFD ;Lösche toogleflagR
rjmp ausR ;Springe zu ausR
flagRfalse:
cpi tmpi,0xA0 ;vergleiche mit 0xA0
brlo ausR ;wenn kleiner springe zu ausR
ldi tmpi,0x01 ;lade 0x01 in tmpi
add encoder_rightL,tmpi ;encoder_right++
adc encoder_rightH,tmpi2;encoder_right++ mit Carry
;debug
;cbi PORTD,PD2 StatusLED red aus
;sbi PORTB,PB0 StatusLED grün an
;ende debug
ori tooglereg,(1<<toogleflagR) ;Setze toogleflagR
ausR:
sbi ADMUX,MUX0 ;schalte Multiplexer auf linkes Rad um
andi tooglereg,0xFE ;lösche toogleflag
rjmp rausadc ;verlasse den Interrupt
radlinks:
sbrs tooglereg,toogleflagL ;ist toogleflagL gesetzt? wenn ja springe zu flagtrue
rjmp flagLfalse ;wenn nicht springe zu flagLfalse
;flagLtrue
cpi tmpi,0x8C ;vergleiche mit 0x8C
brsh ausL ;wenn größer oder gleich springe zu ausL
ldi tmpi,0x01
add encoder_leftL,tmpi ;encoder_left++
adc encoder_leftH,tmpi2 ;encoder_left++ mit Carry
;Debug
;sbi PORTD,PD2 Status LED rot an
;cbi PORTB,PB0 Status LED grün aus
;Ende Debug
andi tooglereg,0xFB ;Lösche toogleflagL
rjmp ausL ;verlasse Auswertung Rad Links
flagLfalse:
cpi tmpi,0xA0 ;vergleiche mit 0xA0
brlo ausL ;wenn kleiner springe zu ausL
ldi tmpi,0x01 ;lade 0x01 in tmpi
add encoder_leftL,tmpi ;encoder_left++
adc encoder_leftH,tmpi2 ;encoder_left++ mit Carry
;Debug
;sbi PORTD,PD2 Status LED rot an
;cbi PORTB,PB0 Status LED grün aus
;ende Debug
ori tooglereg,(1<<toogleflagL) ;setze toogleflagL
ausL:
cbi ADMUX,MUX0 ;schalte Multiplexer auf Rechtes Rad um
ori tooglereg,(1<<toogle) ;setze toogleflag
rausadc:
pop tmpi ;Hole Wert von Stack
out SREG,tmpi ;schreibe alten Inhalt in den Statusregister
reti ;und tschüß
Lesezeichen