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

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

Experimentierboard STK200 mit Tastern und LED

Schaltplan mit Tastern und LED
Vereinfachter Schaltplan
STK200 Experimentierboard

Auf dem STK200 sind Fassungen für verschiedene Mikrocontroller (µC), Taster und LED. Im Schaltplan links sind zwecks Übersichtlichkeit nur jeweils 4 Taster und LED dargestellt.

Grundfunktion der µC-Pins: I/0 Ports

 /* Input Pins, Port D PIND[6:0] */ 
#define PIND    _SFR_IO8(0x10) 
#define PIND6   6 
...
#define PIND0   0 

/* Data Direction Register, Port D DDRD[6:0] */ 
#define DDRD    _SFR_IO8(0x11) 
#define DDD6    6 
...
#define DDD0    0 

/* Data Register, Port D PORTD[6:0] */ 
#define PORTD   _SFR_IO8(0x12) 
#define PD6     6 
...
#define PD0     0 

Einlesen aller Taster und Ausgeben auf LED

#include <avr/io.h>  // Einbinden der Konstanten

int main(){       // Hauptprogramm
  PORTD = 0xFF;   // PullUps an
  PORTB = 0xFF;   // LED aus (neg. Logik)
  DDRB  = 0xFF;   // PB7..PB0 als Ausgang
  while(1){       // Endlosschleife
    PORTB = PIND; // Taster lesen und ausgeben
  }
}
C-Quellcode

Die Grundfunktion der Anschlüsse (Pins) ist die Verwendung als I/O-Schnittstelle. Hier am Beispiel von Port D:

Portpin
Einzelnes Port-Pin von PortD, n ist Pin-Nummer (6..0)

Durchklickbare Präsentation..

Umgang mit negativer Logik

Bsp. Funktion LED1 = S1 und S2 soll gelöst werden. Um Verwirrung und Fehler zu vermeiden kann es sinnvoll sein, die Aufgabenstellung in positive Logik zu übersetzen:

Aufgaben

Erstellen Sie Quellcode, der PB7..PB0 als Ausgang schaltet und LED 2 leuchten lässt.

#include <avr/io.h>   // Einbinden der Konstanten
int main(){           // Hauptprogramm
  PORTB = 0b11111101; // LED2 an (neg. Logik)
  DDRB  = 0xFF;       // PB7..PB0 als Ausgang
  while(1){           // Endlosschleife
  }
}

Erstellen Sie Quellcode, der bei PD3..PD0 die PullUp-Widerstände einschaltet und LED 8 leuchten lässt.

#include <avr/io.h> // Einbinden der Konstanten
int main(){         // Hauptprogramm
  PORTD = 0x0F;     // PullUps an
  PORTB = 0x7F;     // LED8 an (neg. Logik)
  DDRB  = 0xFF;     // PB7..PB0 als Ausgang
  while(1){         // Endlosschleife
  }
}

Erstellen Sie Quellcode, der alle LED leuchten lässt, wenn irgendeine Taste gedrückt wird.

#include <avr/io.h> // Einbinden der Konstanten
int main(){         // Hauptprogramm
  PORTD = 0xFF;     // PullUps an
  PORTB = 0xFF;     // LED aus (neg. Logik)
  DDRB  = 0xFF;     // PB7..PB0 als Ausgang
  while(1){         // Endlosschleife
    if(PIND<127){   // PD7 ist bei 2313 immer 0
      PORTB = 0;    // Alle LED an
    }
    else{
      PORTB = 0xFF  // Alle LED aus
    }
  }
}