ITG-ABI 04/05 |
20.4.2005 |
Korrekturhinweise |
---|
An der GBS-SHA verwenden wir den MC von ATMEL AT90S2313 / AT-Mega32. Infos dazu unter: http://mezmedia.de/avr/
Der MC hat 32 Register, d.h. kein Akku! Es gibt noch eine Besonderheit bei den unteren 16 Registern 0..15, immediate-Operatoren sind hier oft nicht gestattet:
Bsp: ldi R0, 20 wäre kein gültiger Befehl. Daher verwenden Schüler oft erst Register ab R16, allerdings habe ich diese Beschränkung für das Abi gelockert (Chancengleichheit), somit ist ldi R0, 20 erlaubt. Hier mein Lösungsvorschlag:
P2 = PB; P3 = PD;
clr R0 ;Register 0 löschen clr R1 ;Register 1 löschen anfang: sbis PIND,3 ;skip next comand if bit 3 is set, als wenn E1 dann zu los rjmp anfang ;sonst warten los: rcall warte01 rcall zaehl sbis PIND,2 ;wenn E2 dann fertig rjmp los ;sonst wieder zu los ausg: rcall ausgabe ;ausgeben rjmp ausg ;weiter ausgeben siehe Hinweis
Hinweis: Beachte Zeitmultiplex-Verfahren, es muss ständig Ausgabe bedient werden, sonst sieht man nur eine Stelle...
zaehl: cpi R0,9 ;Vergleich mit 9 (normalerweise ungültiger Befehl mit R0) brne R0hoch ;wenn ungleich 9 inc R1 clr R0 rjmp aus R0hoch: inc R0 aus: ret
AVR ist 8 Bit Risc Controller. Es gibt 3 Indirect Address Register: X,Y,Z
Hier sei X (R27 & R26) verwendet:
.equ segmente = 0x60 ;Anfang des Ram ausgabe: ldi R26,low(segmente) ;low byte in R26 laden ldi R27,high(segmente) ;high byte in R27 laden (ist faktisch 0) add R26,R0 ;Adr. für Ziffern-Code ausrechnen ld R16,X ;R16 <- (X) indirekt über X laden cbi PORTD,7 ;Bit auf 0 out PORTB, R16 ;Ausgabe auf Port sbi PORTD,6 ;Bit auf 1 rechte Anzeige ldi R26,low(segmente) ;wieder den anfang setzen, R27 bieb unverändert add R26,R1 ;Adr. für Ziffern-Code ld R16,X ori R16,0b10000000 ;Punkt dazu cbi PORTD,6 ;Bit auf 0 out PORTB,R16 ;Ausgabe auf Port sbi PORTD,7 ;linke Anzeige ret ;oder zur Ausgabe springen -Geschmackssache