MezData-Logo Creative Commons License 528 :AVR: Umgang mit Ports -Einlesen und Ausgeben

Schlüsselwörter: Atmel, AVR, Assembler, Mikrokontroller, Port, I/O

Experimentierboard STK200

Die ersten Schritte können mit den STK200 Boards getan werden.

An PortB sind 8 Leuchtdioden (LED) über jeweils einen Widerstand gegen VCC (5V) angeschlossen. Sie leuchten wenn der jeweilige Pin PB7..PB0 eine logische Null (0V) führt.

An PortD sind 8 Taster mit GND (0V) verbunden. Wenn ein Taster gedrückt wird wird der jeweilige Pin PD7..PD0 auf Masse (0V) gezogen.

Blockschaltbild eines Pins

Befehle, die mit Ports zu tun haben

Befehl Operand Beschreibung Beispiel
IN Rd,P Einlesen eines Port in Register in R16,PIND
OUT P, Rd Ausgeben eines Register in Port out PORTB,R16
SBI P, b Setze Bit b in Port P sbi PORTB,2
CBI P, b Lösche Bit b in Port P cbi PORTB,2
SBIC P, b Überspringe, wenn Bit b in Port P gelöscht sbic PIND,4
SBIS p, b Überspringe, wenn Bit b in Port P gesetzt sbis PIND,4
rjmp testmode

Wie I/0 Ports verwendet werden (Präsentation)

Auf YouTube ansehen..

 

Im Browser durchklicken...

(Mit Pfeiltasten steuern)

Initialisieren, Schreiben und Lesen von Ports

LED 0 und 3 sollen leuchten

.include "tn2313def.inc";die spezifischen Konstanten des 2313

  ldi R16,0b11110110 ;LED 0 und 3 leuchten
  out PORTB,R16      ;das Leuchtmuster einstellen  
  ldi R16,0xff       ;PortB als Ausgang
  out DDRB,R16

Einlesen der Taster und Ausgeben auf LED

  ldi R16,0xff
  out PORTB,R16    ;alle LED aus
  out DDRB,R16     ;PortB als Ausgang
  out PORTD,R16    ;bei PortD die Pull-ups anschalten
loop: in R16,PIND  ;PortD einlesen
  out PORTB,R16    ;an PortB ausgeben
  rjmp loop        ;immer wieder 

Maskieren von Bits

Nun soll nicht mehr der ganze PortD übertragen werden sondern nur die untersten 4 Bit.
Die oberen 4 Bits des Ausgangs PortB sollen unverändert bleiben.
Das Ausblenden von Bits nennt man maskieren.

.include "tn2313def.inc";die spezifischen Konstanten des 2313 laden

.def tmp = R16  ;R16 als temporaeres Register
.def tmp2 = R17 ;R17 als tmp Register 

init:
  ldi tmp,0x0f
  out PORTB,tmp  ;LED3..0 sollen aus sein
  out DDRB,tmp   ;PB3..0 als Ausgang
  out PORTD,tmp  ;bei PD3..0 die Pull-up an
loop:
  in tmp,PIND    ;PortD einlesen
  andi tmp, 0b00001111 ;nur die 4 untersten Bits nehmen, die oberen sind nun 0
  in tmp2,PORTB  ;den Ausgang einlesen
  andi tmp2, 0b11110000 ;die oberen 4 Bits unberührt lassen, untere auf 0
  or tmp2,tmp    ;verheiraten oberes nibble aus tmp2 unteres nibble aus tmp
  out PORTB,tmp2 ;an PortB ausgeben
  rjmp loop      ;immer wieder  

Mit and können Nullen erzeugt werden vermöge 0 and x = 0.

Mit or kann gemischt werden vermöge 0 or x = x.

Einfache Schaltnetze simulieren

Mikro-Controller bzw. Speicher-Programmierbare-Steuerungen (SPS) werden oft auch eingesetzt um Schaltnetze zu realisieren. Eine logische Funktion kann durch geschickte Abfolgen von Assembler-Befehlen simuliert werden.

Hinweis: Bei unserer Mikro-Controller-Beschaltung leuchten die LED bei 0 und gedrückte Taster erzeugen das Signal 0, man spricht hierbei von negativer Logik. Wen das zu sehr verwirren mag, kann die Eingaben leicht invertieren mit dem COM-Befehl (aus null mach eins). Für die Ausgabe empfiehlt es sich hier, die Port-Bit-Befehle SBI,CBI zu erwägen.

Logisches Und simulieren

Entwickeln Sie zwei unterschiedliche Assembler-Programme für die Funktion LED1 = S1 AND S2. Hierbei unberührte Ein- bzw. Ausgänge dürfen nicht tangiert werden! Lösung anzeigen..

Logisches Oder simulieren

Entwickeln Sie eine Lösung für die Funktionen LED1 = S1 AND S2 AND S3, LED2 = S3 OR S4. Hierbei unberührte Ein- bzw. Ausgänge dürfen nicht tangiert werden!

Aufgabe Abstimmanzeige

Eine Abstimmanzeige soll realisiert werden. Wenn ein Taster S gedrückt wird bedeutet das Ja.

Entwickeln Sie ein Programm!