µC-Portpin
Zeichnen Sie das Blockschaltbild der Innenschaltung eines Port-Pins und erklären Sie die Komponenten und deren Funktion. Lösung...
Wozu sind PullUp- bzw. PullDown-Widerstände notwendig? Um offene Eingänge auf einen definierten Wert zu ziehen Log 1 bzw. Log 0.
Initalisierung von Port-Pins
Enwickeln Sie den Programmcode für die Initialiserung der Portpins:
PB7..PB0 als Ausgang für LED gegen GND (pos. Logik). DDRB=0xff;
PB3..PB0 als Ausgang für LED gegen VCC. PORTB=0x0f; DDRB=0x0f;
PD7..PD0 als Eingang ohne interne PullUps.
PD3..PD0 als Eingang mit internen PullUps. PORTD=0x0f;
Umrechnen
Dezimal | Binär | Hex | Alternativ |
---|---|---|---|
10 | 0b1010 | 0xA | 1<<3 | 1<<1 |
20 | 0b10100 | 0x14 | 1<<4 | 1<<2 |
32 | 0b100000 | 0x20 | 1<<5 |
254 | 0b11111110 | 0xfe | ~1 |
Ermitteln Sie die anderen Wertedarstellungen.
Masken basteln
Pins | Binär | Hex | Dokumentiert |
---|---|---|---|
PB2,PB0 | 0b101 | 0x5 | 1<<PB2 | 1<<PB0 |
PB5,PB2,PB1 | 0b100110 | 0x26 | 1<<PB5 | 1<<PB2 | 1<<PB1 |
PB7,PB6,PB5 | 0b11100000 | 0xe0 | 1<<PB7 | 1<<PB6 | 1<<PB5 |
PB8,PB4 | Fehler | Fehler | Fehler |
Programm schreiben
Erstellen Sie den kompletten C-Quellcode:
(#include, Initalisierung, Dauerschleife)
4 Taster sind an PD3..PD0 gegen GND angeschlossen
Interne PullUps an PD3..PD0 anschalten
LEDs sind an PB7..PB0 gegen VCC angeschlossen
Wenn eine (nicht genau eine) der Tasten gedückt ist sollen alle LED leuchten.
Quellcode Lösung
#include <avr/io.h> // Einbinden der Konstanten
int main(){ // Hauptprogramm
PORTD = 0x0F; // PullUps an
PORTB = 0xFF; // LED aus (neg. Logik)
DDRB = 0xFF; // PB7..PB0 als Ausgang
while(1){ // Endlosschleife
if((PIND&0xF)<0xF){ // eine Taste gedrückt?
PORTB = 0; // alle LED an
}
else{
PORTB = 0xFF; // alle LED aus
}
}
}
Codeschnipsel erzeugen
Zn | PB1 | PB0 | PB3 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 1 | 0 |
2 | 1 | 0 | 1 |
3 | 1 | 1 | 0 |
Baustein/Schaltfunktion
PB3 = PB1 & ! PB0
Quellcode Lösung
if((PINB&3)==2){ // PB0 & PB1
PORTB |= 1<<PB3;
}
else{
PORTB &= ~(1<<PB3);
}
Zn | PB1 | PB0 | PB3 |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
2 | 1 | 0 | 1 |
3 | 1 | 1 | 0 |
Baustein/Schaltfunktion
PB3 = PB1 ^ PB0
Quellcode Lösung
if((PINB&3)==2 || (PINB&3)==1){ // PB0 xor PB1
PORTB |= 1<<PB3;
}
else{
PORTB &= ~(1<<PB3);
}
Zn | PB1 | PB0 | PB2' |
---|---|---|---|
0 | 0 | 0 | PB2 |
1 | 0 | 1 | 1 |
2 | 1 | 0 | 0 |
3 | 1 | 1 | 0 |
Baustein/Schaltfunktion
Quellcode Lösung
if(PINB&2){ // PB1 = 1 ?
PORTB &=~4; // PB2 <- 0
}
else if(PINB&1){ // PB0 = 1 ?
PORTB |=4; // PB2 <- 1
}
Zn | PB1 | PB0 | PB2' |
---|---|---|---|
0 | 0 | 0 | PB2 |
1 | 0 | 1 | PB2 |
2 | 1 | 0 | 0 |
3 | 1 | 1 | 1 |
Baustein/Schaltfunktion
Quellcode Lösung
if(PINB&2){ // PB1
if(PINB&1){ // PB2 <- PB0
PORTB |=4;
}
else {
PORTB &=~4;
}
}
Zn | PB2 | PB1 | PB0 | PB3' |
---|---|---|---|---|
0 | 0 | 0 | 0 | PB3 |
1 | 0 | 0 | 1 | PB3 |
2 | 0 | 1 | 0 | 0 |
3 | 0 | 1 | 1 | 1 |
4 | 1 | 0 | 0 | 0 |
5 | 1 | 0 | 1 | 0 |
6 | 1 | 1 | 0 | 0 |
7 | 1 | 1 | 1 | 0 |
Baustein/Schaltfunktion
Quellcode Lösung
if(PINB&4){
PORTB &=~8;
}
else if(PINB&2){
if(PINB&1) PORTB|=8;
else PORTB &=~8;
}
Zn | PB2 | PB1 | PB0 | PB3 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 0 |
2 | 0 | 1 | 0 | 1 |
3 | 0 | 1 | 1 | 0 |
4 | 1 | 0 | 0 | 0 |
5 | 1 | 0 | 1 | 1 |
6 | 1 | 1 | 0 | 1 |
7 | 1 | 1 | 1 | 1 |
Baustein/Schaltfunktion
Quellcode Lösung
if((PINB&7)==2 || (PINB&7)>4){
PORTB |= 8;
}
else{
PORTB &=~8;
}
Zn | PB2 | PB1 | PB0 | PB3 |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | 1 |
2 | 0 | 1 | 0 | 1 |
3 | 0 | 1 | 1 | 0 |
4 | 1 | 0 | 0 | 1 |
5 | 1 | 0 | 1 | 0 |
6 | 1 | 1 | 0 | 0 |
7 | 1 | 1 | 1 | 1 |
Baustein/Schaltfunktion
Quellcode Lösung
if((PINB&7)==1 || (PINB&7)==2 ||
(PINB&7)==4 || (PINB&7)==7){
PORTB |= 8;
}else{
PORTB &=~8;
}
Zn | PB1 | PB0 | PB2' |
---|---|---|---|
0 | 0 | 0 | PB2 |
1 | 0 | 1 | PB2 |
2 | ↑ | 0 | 0 |
3 | ↑ | 1 | 1 |
Baustein/Schaltfunktion
Quellcode Lösung
byte merker=0; // merkerbyte
if(!merker && (PINB&2)){ // PB1 steigende Flanke
if(PINB&1){ // PB2 <- PB0
PORTB |=4;
}
else {
PORTB &=~4;
}
}
merker = PINB&2;
Zn | PB1 | PB0 | PB1' | PB0' |
---|---|---|---|---|
0 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 |
2 | 1 | 0 | 1 | 1 |
3 | 1 | 1 | 0 | 0 |
Zustandsdiagramm (Schaltwerk CLK an PB2)
Zustandsdiagramm für Zähler mod 4 zeichnen!
Quellcode Lösung
unsigned char merker=0; // merkerbyte
unsigned char zahl=0;
if(!merker && (PINB&4)){ // PB2 steigende Flanke
if(zahl<3){
zahl++;
}
else {
zahl=0;
}
PORTB = PORTB & ~0b11 | zahl;
}
merker = PINB&4;