MezData-Logo Creative Commons License 150 :AVR: SPS Übungen

Schlüsselwörter: SPS, Port, Mikrokontroller, C

µ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
Ermitteln Sie die Masken für diese Eingangspinkombinationen:

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#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

Wertetabelle
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
if((PINB&3)==2){ // PB0 & PB1
  PORTB |= 1<<PB3;
}
else{
  PORTB &= ~(1<<PB3);
}
Wertetabelle
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
if((PINB&3)==2 || (PINB&3)==1){ // PB0 xor PB1
  PORTB |= 1<<PB3;
}
else{
  PORTB &= ~(1<<PB3);
}
Funktionstabelle
Zn PB1 PB0 PB2'
0 0 0 PB2
1 0 1 1
2 1 0 0
3 1 1 0

Baustein/Schaltfunktion

SR-FF

Quellcode
if(PINB&2){    // PB1 = 1 ?
  PORTB &=~4;  // PB2 <- 0
}
else if(PINB&1){ // PB0 = 1 ?
  PORTB |=4;     // PB2 <- 1
}
Funktionstabelle
Zn PB1 PB0 PB2'
0 0 0 PB2
1 0 1 PB2
2 1 0 0
3 1 1 1

Baustein/Schaltfunktion

SR-FF

Quellcode
if(PINB&2){ // PB1
  if(PINB&1){ // PB2 <- PB0
    PORTB |=4;
  }
  else {
    PORTB &=~4;
  }
}
Funktionstabelle
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

SR-FF

Quellcode
if(PINB&4){
PORTB &=~8;
}
else if(PINB&2){
if(PINB&1) PORTB|=8;
else PORTB &=~8;
}
Wertetabelle
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

SR-FF

Quellcode
if((PINB&7)==2 || (PINB&7)>4){
  PORTB |= 8;
}
else{ PORTB &=~8; }
Wertetabelle
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

SR-FF

Quellcode
if((PINB&7)==1 || (PINB&7)==2 ||
   (PINB&7)==4 || (PINB&7)==7){
  PORTB |= 8;
}else{
  PORTB &=~8;
}
Funktionstabelle
Zn PB1 PB0 PB2'
0 0 0 PB2
1 0 1 PB2
2 0 0
3 1 1

Baustein/Schaltfunktion

SR-FF

Quellcode
byte merker=0; // merkerbyte
if(!merker && (PINB&2)){ // PB1 steigende Flanke
  if(PINB&1){ // PB2 <- PB0
    PORTB |=4;
  }
  else {
    PORTB &=~4;
  }
}
merker = PINB&2;
Zustandsübergangstabelle
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
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;