ITG-ABI 03/04

28.4.2004

Korrekturhinweise

Oliver Mezger GBS Schwäb. Hall

Gruppe 1 Aufgabe 2

4. Hauptprogramm

An der GBS-SHA verwenden wir den MC von ATMEL AT90S2313. Infos dazu unter: http://mezmedia.de/avr/04-03-31_schnelleinstieg/index.html
Der MC hat 32 Register, d.h. kein Akku! Hier meine Musterlösung:

anfang:
  in  R16,PINB        ;Einlesen von PortB
  andi R16,0b001 1111 ;maskieren, ausblenden
  rcall umcodieren    ;Unterprogrammaufruf
  rcall anzeigen      ;Unterprogrammaufruf 
  sbis PINB,7         ;Lese PortB,Bit7: Skip if Bit set, überspringen des nächsten Befehls wenn Bit=1
  rjmp anfang         ;somit Sprung wenn Bit=0
  rcall speichern     ;Unterprogrammaufruf 
  rcall ruecksetzen   ;Unterprogrammaufruf 
  rjmp anfang         ;unbedingter Sprung

5. Unterprogramm Rücksetzen

5.1 & 5.2 Musterlösung für 8051 ist fehlerhaft...

Wichtiger Hinweis: Im Unterricht wurde Verzögerungsschleife behandelt, dabei wurden Register mit dem Wert 255 gesetzt, nicht mit 0!
Daher ist Lösung mit "ldi R.. ,255" auch OK! Hintergrund, die Lösungen wurden aus C abgeleitet und die Besonderheit 0-1=255 bei 8Bit war hierbei kein Lernziel.

Marke Befehl MZ Kommentar
ruecksetzen:
clr R17 1 Lösche R17 (alternativ ldi R17,255)
clr R18 1 Lösche R18 (alternativ ldi R18,255)
sbi PORTD,7 2 Setze Bit7 in PortD
warten:
dec R17 1 R17-1
brne warten 1/2 Sprung nach warten wenn nicht Null 2MZ,

sonst 1MZ

dec R18 1 R18-1
brne warten 1/2 Sprung nach warten wenn nicht Null 2MZ,

sonst 1MZ

cbi PORTD,7 2 Lösche Bit7 in PortD
ret 4 Rückkehr

5.3 Zeit

1 + 1 + 2 + 3 * 256 * 256 + 3 * 256 + 2 + 4 = 197386 * 1µS &Mac197; 197 mS &Mac197; 0,2 S als Lösungsraum..

Hinweis: Als Risc-MC verarbeitet der AVR-Controller ca. 1 Befehl pro Takt! Somit gilt Zeit für 1MHz.

6. Unterprogramm Speichern

Vorab: Indirekte Adressierung wurde im Unterricht nicht deutlich behandelt. Wenn ein Schüler auf Lösungen mit X+ als Operand kommt,
könnte das schon als besondere Leistung betrachtet werden.

AVR ist 8 Bit Risc Controller. Es gibt 3 Indirect Address Register: X,Y,Z
Hier sei X (R27 & R26) verwendet:

  .equ speicher = 0x60   ;Anfang des Ram

  ldi R26,low(speicher)  ;low byte in R26 laden
  ldi R27,high(speicher) ;high byte in R27 laden
  ldi R16,13             ;Ergebnis 13 soll in den Speicherbereich geschrieben werden
  ldi R17,100            ;Anzahl der Datensätze
schleife:
  st x+,R16              ;store indirect mit post-inkrement
  dec R17                ;R17-1
  brne schleife          ;solange >0
  ret