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