ITG-ABI 04/05

20.4.2005

Korrekturhinweise

Gruppe 1 Aufgabe 2

4.2 Zeitmessung

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...

5.2 Unterprogramm zaehl

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

6.2 Unterprogramm ausgabe

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