Unterrichts- und Lernmaterial für Mikrocontroller
Unterrichts- und Lernmaterial fürMikrocontroller

8-Bit Arithmetik - Teil 2

In diesem Kapitel geht es unter anderem um die arithmetischen Instruktionen:

  • MUL (Ganzzahl-Multiplikation),
  • MULS (Ganzzahl-Multiplikation mit gemischten Vorzeichen),
  • MULSU (Ganzzahl-Multiplikation mit gleichen Vorzeichen),
  • INC (Increment oder erhöhe um 1),
  • DEC (Dekrement oder erniedrige um 1)

Die arithmetischen Instruktionen behandeln nicht die Festpunkt-Multiplikation; sie wird später thematisiert. Bevor es losgeht, hier eine Übung zum Anwärmen.

Übung 1 - Zum Anwärmen

Du solltest jede einzelne Programmzeile durchgehen und beschreiben können, was der Controller dort macht. Sollten unbekannte Instruktionen auftauchen, schlage im Instruction Set Summary nach. Beachte, welche Flags jeder einzelne Befehl möglicherweise beeinflussen kann und beantworte dann die Frage,

  • welche LEDs an PORTB werden am Ende aufleuchten.

 

 Programm: Simulation1.asm

Einschränkungen für die Arithmetik-Befehle

  • SUBI, CPI                   : gelten nur für Arbeitsregister R16 - R31
  • ADD, SUB, NEG, CP : gelten für alle Arbeitsregister R0 - R31

Die richtige Lösung zur Frage aus Übung 1 lautet: PORTB.0, PORTB.1 und PORTB.2 leuchten auf. Der Rest ist ausgeschaltet.

Instruktionen der Multiplikation

Nach den beiden Grundrechenarten Addition und Subtraktion wenden wir uns jetzt der Multiplikation zu. Dafür stellen ATmega-Prozessoren sechs Instruktionen bereit, von denen erst einmal nur die ganzzahligen Produkte interessieren. ATtiny-Bausteine der älteren Bauart verfügen nicht über diese Instruktionen.

 

Dem Instruction Set Summary des ATmega8 ist zu entnehmen:

Tabelle 1 - Auszug aus dem Instruction Set Summary des Datenblatts ATmega8. Die rot markierten Flags können durch die zugehörigen Befehle beeinflusst werden.

Neben drei Instruktionen zur Multiplikation werden auch zwei Befehle zur Datenübertragung und ein weiterer Verzweigungsbefehl in einem Simulationsprogramm genauer angeschaut.

 

Einschränkungen

  • MUL         Rd, Rr aus R0 - R31
  • MULSU    Rd, Rr auf R16 - R31 (dabei gilt: Rd ist vorzeichenbehaftet, Rr nicht)
  • MULS       Rd, Rr aus R16 - R23

In diesem Kapitel werden die folgenden Befehle angesprochen und in Simulationsprogrammen genauer untersucht (siehe Tabelle 1).

Übung 2 - Multiplikation- Instruktionen MUL, MULSU, MULS

Übung 2 - Simulation zu den Multiplikationsbefehlen: MUL, MULSU, MULS
Material
  • AVR Studio4 oder AVR Simulator
  • Datenblatt des ATmega8
Aufgaben
  • Starte AVR Studio 4 und lege ein neues Projekt multiplikation an. Alternativ kann auch der AVR Simulator oder ein anderes Produkt benutzt werden.
  • Gib das Assemblerprogramm multiplikation_1.asm in den Editor ein und speichere es ab.
  • Kompiliere das Programm und starte anschließend die Simulation (den Debugger) im Einzelschrittverfahren.
  • Überlege vor Programmausführung, was in den Produktspeichern R1:R0 stehen wird.
  • Werden Flags bei der Programmausführung gesetzt? Wenn ja, welche?

Das Programm Multiplikation_1.asm

Wir arbeitet das Programm Multiplikation_1.asm?

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1a - Nach sieben Instruktionsschritten wurde die Multiplikation zweier vorzeichenloser Zahlen mit MUL R16,R17 ausgeführt und das Ergebnis in R1:R0 abgelegt: 0000 0000 0011 1000 (siehe Programmzeile 28). Die binäre Zahl entspricht der positiven Dezimalzahl 56 und ist das Produkt aus 8 und 7. Flags wurden keine gesetzt.

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1b - Nach acht Instruktionsschritten wurde die Multiplikation zweier negativer Zahlen mit MULS R18,R19 ausgeführt und das Ergebnis in R1:R0 abgelegt: 0000 0000 0011 1000 (siehe Programmzeile 31). Die binäre Zahl entspricht der positiven Dezimalzahl 56 und ist das Produkt aus -8 und -7. Flags wurden keine gesetzt.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 1c - Nach zwei weiteren Instruktionsschritten wurde die Multiplikation mit MULSU R18,R16 ausgeführt und das Ergebnis in R1:R0 abgelegt: 1111 1111 1100 1000 (siehe Programmzeile 34). Das MSB ist 1; es liegt ein negatives Ergebnis vor. SREG(C) ist gesetzt. Durch Zweierkomplement-Bildung kann das Ergebnis in eine lesbare Form gebracht werden. Es ist - wie zu erwarten - die Zahl -56,  das Produkt aus -7 und 8.

Achtung: R18 (Rd) muß die vorzeichenbehaftete Zahl enthalten, R16 (Rr) muss vorzeichenlos sein. Vertauscht man die beiden Inhalte, ist das Ergebnis verfälscht.

Für die Division stellen die 8-Bit ATmega-Typen keine direkt einsetzbaren Instruktionen bereit. Man muss dann über andere Instruktionen das Problem softwaremäßig lösen. Darauf gehen wir hier nicht ein. 

Statt dessen wenden wir uns jetzt den Auf- und Abwärtszählern zu. Die dazu notwendigen Befehle sind

  • INC Rd
  • DEC Rd

In den folgenden beiden Übung 2 und 3 nähern wir uns dem Verhalten dieser beiden Instruktionen über Simulationsprogramme, um anschließend die Ergebnisse auf einem STK200 Board auf der LED Bargraf Anzeige sichtbar zu machen.

Übung 3- Aufwärtszähler- Instruktion INC

Der Befehl INC lässt sich auf alle Arbeitsregister anwenden. Sobald der höchste Zählerstand erreicht ist - bei 8-Bit ist das die Zahl 255 - beginnt der Zähler wieder bei Null. Das lässt sich in einer Zählschleife abfragen.

Übung 3 - Simulation zum Aufwärtszähler - Instruktion: INC
Material
  • AVR Studio4 oder AVR Simulator
  • Datenblatt des ATmega8
Aufgaben
  • Starte AVR Studio 4 und lege ein neues Projekt zaehler_rauf an. Alternativ kann auch der AVR Simulator oder ein anderes Produkt benutzt werden.
  • Gib das Assemblerprogramm zaehler_rauf.asm in den Editor ein und speichere es ab.
  • Kompiliere das Programm und starte anschließend die Simulation (den Debugger) im Einzelschrittverfahren.
  • Überlege vor Programmausführung, welche Zeit für einen Zählschritt benötigt wird.
  • Werden Flags bei der Programmausführung gesetzt? Wenn ja, welche?

Das Programm zaehler_rauf.asm

Abb. 2 - Simulationsprogramm zaehler_rauf.asm

Wie arbeitet das Programm zaehler_rauf.asm ?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Abb. 3 - Das Bild zeigt einen Zwischenstand nach 388 Befehlsaufrufen und 517 µs. Sobald das MSB (Bit 7) im Zählerstand gesetzt wird, werden im SREG die Flags V und N gesetzt (siehe Abbildung).

Wenn der Zählerstand 1111 1111 erreicht ist, springt der Zähler mit der nächsten INC-Anweisung auf 0000 0000 zurück, die Flags VN werden gelöscht und Z gesetzt.

Das Programm benötigt 3 Zeittakte zur Ausführung der Instruktionen:

  • INC und
  • RJMP (siehe Iinstruction Set Summary).

Bei einer Taktfrequenz von 1 MHz entspricht das einer Zeit von 3 µs pro Zählerstandsanzeige. Zu schnell für das menschliche Auge, um einzeln wahrgenommen zu werden; in einem Realexperiment "sehen" wir, dass alle LEDs irgendwie leuchten.

 

Wie lässt sich die Ausgabegeschwindigkeit reduzieren?

 

Dies läßt sich dadurch erreichen, dass nach jeder Ausgabe am PORTB (LEDs), das Programm eine Warteschleife durchläuft. Dies wird in der folgenden Übung 4 gezeigt.

Übung 4- Aufwärtszähler mit Warteschleife - Instruktionen INC, DEC

Übung 4 - Aufwärtszähler mit Warteschleife
Material
  • AVR Studio4
  • STK200 Board
  • Datenblatt des ATmega8
Aufgaben
  • Starte AVR Studio 4 und lege ein neues Projekt zaehler_warteschleife an. Gib das Assemblerprogramm zaehler_warteschleife.asm in den Editor ein und speichere es ab.
  • Kompiliere das Programm und starte anschließend das Programm.
  • Wie groß ist etwa die Zeitverzögerung durch die Warteschleife?
  • Ließe sich die Warteschleife noch weiter verlängern? Wenn ja, wie?

Das Programm zaehler_warteschleife.asm

Abb. 4 - Programm zaehler_warteschleife.asm mit Aufwärts- Abwärtszähler.

Die Ausgabe auf der LED Bargrafanzeige eines STK200

LED7 blinkt in dem Kurzfilm mit einer vom Auge deutlich wahrnehmbaren Frequenz von ca. 3 Hz, während die Blinkfrequenz von LED0 mit den Augen nicht mehr aufgelöst werden kann.

Wie arbeitet das Programm zaehler_warteschleife.asm ?

 

R19 (zaehler_ab oder Abwärtszähler) wird mit dem Wert 220 geladen. Anschließend werden die PortB-Pin eingelesen und in zaehler_auf (R16) abgelegt.

Der Aufwärtszaehler (R16) wird um 1 erhöht (INC) und der neue Wert an die Portausgänge von PORTB übergeben. Sind an PORTB im Simulationsprogramm LEDs angeschlossen, dann wird ein binärer Aufwärtszähler von 0 (0b0000 0000) bis zur Zahl 255 (0b1111 1111) gezeigt. Die Warteschleife bei der Marke warten dient der Zeitverzögerung. 

 

Marke warten;

  1. der Abwärtszähler wird dekrementiert (1 T),
  2. es folgen zwei Leerbefehle (NOP) und anschließend (2T)
  3. ein Rücksprung zur Marke warten (2T); vorausgesetzt, das Z-Flag im SREG ist 0.
  4. Die Schleife wird 220 mal durchlaufen (220 x 5 = 1100 T), dann
  5. wird das Z-Flag gesetzt und es geht weiter bei der Marke wdh (1T).
  6. Der Abwärtszähler wird wieder auf 220 gesetzt und das Spiel beginnt von vorn.

In Klammern sind die Takte für die Ausführung der jeweiligen Instruktion angegeben (siehe ATmega8 ISS). Für das Ein- und Ausschalten einer LED benötigt der Controller 2210 Takte. Bei einer Taktfrequenz von 1 MHz entspricht das 2,21 msec oder einer Frequenz von ca. 452,5 Hz. LED7 leuchtet dann mit einer Frequenz von ca. 3,5 Hz.

 

Das wird mit einem Oszilloskop überprüft (siehe Abb. 5).

 

Abb. 5

Das Oszillogramm weist eine Frequenz von ca. 3,5 Hz aus und bestätigt die Berechnung.

Druckversion | Sitemap
© Reinhard Rahner - Gettorf