Experimentierboard STK200 mit Tastern und LED


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.
- Bei der Grundfunktion als einfache I/O-Schnittstelle werden 8 Anschlüsse als eine I/O-Port-Einheit zusammengefasst.
- 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. Hinweis: Port-Pin PD7 ist beim ATtiny2313 nicht vorhanden.
- 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.
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
}
}
Die Grundfunktion der Anschlüsse (Pins) ist die Verwendung als I/O-Schnittstelle. Hier am Beispiel von Port D:

- 8 Pins werden jeweils zu einem I/O-Port zusammengefasst und als Einheit angesprochen.
(Ausnahme: PORTD beim ATtiny2313 hat nur 7 Pins) - Die binären Signal-Zustände der Pins PD6..PD0 können mit einem lesenden Zugriff auf Adresse 0x10 abgefragt werden. Ein Tri-State-Baustein schaltet dabei die Signale auf den Datenbus durch.
- Um die Handhabung zu vereinfachen und zwecks besserem Verständnis des Programmcodes wurden für die Adressen und Pin-Nummern Konstanten definiert, siehe Codeauszug rechts.
- Für die Verwendung als Ausgang sind bei jedem Pin zwei Flip-Flops vorhanden, eines für das Einschalten der Ausgangsfunktion (DDDn) und eines für den auszugebenden Wert (PORTDn).
- Bei Verwendung als Eingang wäre PORTDn arbeitslos und bekam als sinnvolle Aufgabe die Kontrolle über einen zuschaltbaren PullUp-Widerstand.
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:
- LED1 = !PB0; S1 = !PD0; S2 = !PD1
- !PB0 = !PD0 und !PD1 <DeMorgan> PB0 = PD0 oder PD1 <- das programmieren
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
}
}
}