text: Schnelleinstieg in AVR-Assembler | mezdata.de
  Schnelleinstieg in AVR-Assembler
  200_schnelleinstieg
  Wichtige Assembler Sprach-Elemente
  Einleiten eines Kommentars ; Kommentar bla bla
  Einbinden einer Datei .include "2313def.inc" Die 2313-Definitionen werden eingebunden
  Wert ist nicht mehr änderbar im weiteren Quelltext .equ papagei = 1 Der Bezeichner papagei hat nun den Wert 1
  .equ fisch = -papagei * 2 Werte können auch durch Ausdrücke
  (Expressions) berechnet werden
  Definition einer Variablen.
  Eine erneute Zuweisung eines Wertes ist möglich .set cpuclock = 6000 Der Bezeichner cpuclock hat nun den Wert 6000
  .set mothercycle = cpuclock*20/8 Werte können auch durch Ausdrücke
  Weist einem Register einen symbolischem Namen zu .def temp = R16 temp ist R16
  Eine Einsprungmarke init: Die Marke (engl. label) init
  Hinweise zu .equ, .set: Der Assembler kann mühselige Rechenarbeit übernehmen: Bestimmte Werte, die öfter im Programm gebraucht werden, z.B. die Frequenz mit der der Kontroller arbeitet können unter symbolischen Namen gespeichert werden. Die Werte lassen sich direkt oder durch einfache Ausdrücke beschreiben. Der Assembler errechnet die Werte und setzt diese an den entsprechenden Stellen ein.
  Der Assembler versteht auch die Darstellung als ASCII Zeichen: 'a','A' usw.
  0xFF $FF 0xA $0A
  0b11111111 0b00001010
  Umgang mit Ports (Datenrichtung, Ein- Ausgabe)
  Der Mikrokontroller hat mehrere I/O Pins (Anschlüsse) die als 8Bit Ports gruppiert sind. Beim ATtiny2313 gibt es PORTB (PBn) und PORTD (PDn).
  Der Wert jedes Pins (z.B. PB0) kann eingelesen werden (in tmp,PINB). Die Pins können als Ausgang geschaltet werden, indem im Data Direction FlipFlop (z.B. DDB0) der Wert 1 geschrieben wird. Der Wert des Ausgangs wird dann durch PORTB0 bestimmt. Nach einem Reset sind alle Pins hochohmige Eingänge weil die FlipFlops den Wert 0 (Inital Value) haben.
  Ein Pin kann auch als Eingang mit PullUp-Funktion programmiert werden. Dabei liefert der MOS PullUp-Transistor (siehe Zeichnung rechts) einen geringen Strom, er wirkt wie ein Widerstand nach VCC (+). Man spart sich dadurch einen externen Widerstand. PINBn ist nun solange log. 1 bis der Pin z.B. mit einem Taster auf GND gezogen wird. Der PullUp-Transistor ist eingeschaltet, wenn DDBn = 0 und PORTBn = 1 ist.
  Die Pins können zusätzliche Funktionen haben, siehe die Bezeichner in den Klammern bei der Zeichnung oben, z.B. serielle Schnittstelle.
  Die einzelnen FlipFlops (z.B. PORTBn) werden zu Registern (z.B. PORTB) zusammengefasst.
  Durch das Einschreiben entsprechender Werte in die Port-Register kann nach dem Reset die Funktion festgelegt werden:
  0 1 Input Yes Der Ausgang liefert einen geringen PullUp-Strom für z.B. Taster auf GND
  1 0 Output No Push-pull Zero Output (Ausgang ist 0)
  1 1 Output No Push-pull One Output (Ausgang ist 1)
  Beispiel: An PortB sollen 8 LED gegen GND (Masse, 0 Volt) angeschlossen werden,
  alle Pins sind Ausgänge. Die LED 0 und 3 sollen leuchten: Beispiel: Hardware-Test, der PortD ist mit Tastern gegen Masse verbunden,
  die Pull-ups sind an. An PortB sind LED gegen GND angeschlossen.
  Die Eingänge sollen "eins zu eins" an den Ausgängen ausgegeben werden:
  .def temp = R16 ;R16 als temporaeres Register
  out DDRB,temp        ;PortB als Ausgang
  ldi temp,0b00001001  ;LED 0 und 3 leuchten
  out PORTB,temp       ;das Leuchtmuster ausgeben
  out DDRB,temp  ;PortB als Ausgang
  out PORTD,temp ;bei PortD die Pull-ups anschalten
  in  temp,PIND  ;PortD einlesen
  out PORTB,temp ;an PortB ausgeben
  rjmp loop      ;immer wieder
  IN Rd,P Einlesen eines Port in Register in R16,PIND PortD einlesen in R16
  OUT P, Rd Ausgeben eines Register in Port out PORTB,R16 R16 an PortB ausgeben
  SBI P, b Setze Bit b in Port P sbi PORTB,2 Das Bit 2 an PortB setzen
  CBI P, b Lösche Bit b in Port P cbi PORTB,2 Das Bit 2 an PortB löschen
  SBIC P, b Überspringe, wenn Bit b in Port P gelöscht sbic PIND,4 wenn Bit gelöscht ist, wird der folgende Befehl übersprungen.