kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




LV 11.04.2024 Grundlagen der Mikrocontrollertechnik 4EIT 4EMO 4MT im Sommersemester 2023

(EN google-translate)

(PL google-translate)

Themen
  1. Wiederholung der praktischen Aspekte der Programmentwicklung für den Arduino Micro
  2. Quiz: Wiederholung wichtiger Merkmale eines Mikrocontrollers
  3. Vertiefung der bisherigen Programmierkenntnisse anhand der Analyse einfacher Beispiele
  4. Systematische Einführung von Registerbefehlen im Zusammenhang mit digitalen Ein- und Ausgängen
1. Wiederholung der praktischen Aspekte der Programmentwicklung für den Arduino Micro
  1. Booten und Verwenden der (Linux-) Xubuntu-Distribution auf den PC-Pool-Rechnern
  2. Verwendung der Arduino-IDE
  3. Konfiguration der Arduino-IDE für einen über USB verbundenen Arduino Micro - Mikrocontroller
  4. Schreiben eines Programms
  5. Kompilieren eines Programms
  6. Übertragen eines Programms auf den Mikrocontroller
  7. Ansteuern digitaler Ein- und Ausgänge über Arduino-Befehle
2. Quiz: Wiederholung wichtiger Merkmale eines Mikrocontrollers
  1. Wozu werden Mikrocontroller verwendet?
  2. Was ist ein engebettetes System?
  3. Wie unterscheidet sich ein Mikrocontroller von einem PC?
  4. Wie zeichnet sich ein Mikrocontroller-Programm aus?
  5. Was ist ein Cross-Compiler?
  6. Was ist Maschinen nahes Programmieren?
  7. Worin liegt der Sinn darin, höhere Programmiersprachen wie C oder C++ zu verwenden?
  8. Was wird in dieser Lehrveranstaltung unter dem Begriff interne Peripherie verstanden?
  9. Welche Programmier-technische Bedeutung haben Register beim Mikrocontroller?
  10. Wie groß ist ein Register?
  11. Haben Sie Bitmasken und Shiftoperatoren in der Informatikvorlesung behandelt? Was ist Ihnen erinnerlich?
40_Mikrocontroller/01_Einfuehrung/02_Maschinensprache
40_Mikrocontroller/01_Einfuehrung/03_Assemblerbeispiel
3. Vertiefung der bisherigen Programmierkenntnisse anhand der Analyse einfacher Beispiele
void setup() 
{
    pinMode(1,OUTPUT);
}

void loop() 
{
    digitalWrite(1,HIGH);
    delay(1000);
    digitalWrite(1,LOW);
    delay(1000);
}

Code 0-1: Blinkende LED

void setup() 
{
    pinMode(1,OUTPUT);
    pinMode(2,INPUT);
    digitalWrite(2,HIGH); //Pullup aktivieren, intern auf +5V setzen
}
int x;
void loop() 
{
    x = digitalRead(2);
    if(x<=0)
    {
        digitalWrite(1,HIGH);
        delay(1000);
        digitalWrite(1,LOW);
        delay(1000);
    }    
}

Code 0-2: Blinkende LED mit Taster

void setup() 
{
    pinMode(1,OUTPUT);
    pinMode(2,INPUT);
    digitalWrite(2,HIGH); //Pullup aktivieren, intern auf +5V setzen
}
int x;
void loop() 
{
    x = digitalRead(2);
    if(x<=0)
    {
        //digitalWrite(1,HIGH);
        //PORTD = 8;
        PORTD = 0b00001000;
        delay(1000);
        //digitalWrite(1,LOW);
        PORTD = 0;
        delay(1000);
    }    
}

Code 0-3: Blinkende LED unter Verwendung von Register-Befehlen

4. Systematische Einführung von Registerbefehlen im Zusammenhang mit digitalen Ein- und Ausgängen
  • Zugreifbar von Außen ist bei dem ArduinoMicro lediglich der Port B.
  • Jedem digitalen Ein- und Ausgang X sind drei Port-Register zugeordnet: PORTX, PINX, DDRX.
  • Beim Port B sind das somit: PORTB, PINB und DDRB.
  • DDRB legt die Richtung jedes der 8 Bits fest, also ob es als Ein- oder Ausgang verwendet wird.
  • PINB dient zur Abfrage, ob am Eingang etwas anliegt.
  • PORTB wird dazu verwendet, Ausgangszustände zu setzen und Pullup-Widerstände zu aktivieren.

Wie der Port B beim ArduinoMicro abgerufen werden kann, ist hier dargestellt:

96_Arduino/22_Universal/02_LED_Leiste -- siehe Bild 0-1: Anschlußplan der LED-Leiste.

Das ganze IO-Registerthema wird für den ATmega32 bzw. ATmega32u4 ausführlich hier behandelt:

  • Darstellung der IO-Register im Datenblatt
  • Elektrische Eigenschaften der digitalen Ein- und Ausgänge
  • Pullup-Widerstände
  • Zuständige Konfigurationsregister
  • Arbeiten mit Bitmasken und Bitshift-Operatoren
40_Mikrocontroller/03_DigitalIO/01_Elektrische_Eigenschaften
40_Mikrocontroller/03_DigitalIO/02_Pullup_Widerstaende
40_Mikrocontroller/03_DigitalIO
40_Mikrocontroller/03_DigitalIO/03_Bitmasken_Eingang
Im Verlauf des Unterrichts veränderte Varianten von "Blinkende LED mit Taster"
void setup() 
{
    pinMode(12,OUTPUT);
    pinMode(11,INPUT);
    digitalWrite(11,HIGH); //Pullup aktivieren, intern auf +5V setzen
}
int x;
void loop() 
{
    x = digitalRead(11);
    if(x<=0)
    {
        digitalWrite(12,HIGH);
        delay(300);
        digitalWrite(12,LOW);
        delay(300);
    }    
}

Code 0-4: Version 1: Verwendung von Arduino-Befehlen

void setup() 
{
    //pinMode(10,OUTPUT); //PB6 auf 1 in DDRB
   //      MSB      LSB
    DDRB = 0b01000000;
    //DDRB = 64; wäre das Gleiche!
    //pinMode(11,INPUT);  //PB7 auf 0 in DDRB
    //DDRB = 0b00000000;
    
    //digitalWrite(11,HIGH); //Pullup aktivieren, intern auf +5V setzen
    PORTB = 0b10000000;  //PB7 bei PORTB setzen == Pullup auf PB7
}
int x;
void loop() 
{
    //x = digitalRead(11);
    x = PINB; //nur PB7 interessant wäre 128
    if(x<128)
    {
        //digitalWrite(10,HIGH);
        PORTB = 0b11000000; // PB6=1, PB7 BLEIBT 1 wg. Pullup
        delay(300);
        //digitalWrite(10,LOW);
        PORTB = 0b10000000; // PB6=0, PB7 BLEIBT 1 wg. Pullup
        delay(300);
    }    
}

Code 0-5: Version 2: Verwendung von Register-Befehlen

void setup() 
{
    //pinMode(10,OUTPUT); //PB6 auf 1 in DDRB
   //      MSB      LSB
    //DDRB = 0b01000000;
    DDRB = DDRB | 0b01000000;  //gezielt PB6 auf 1 setzen => PB6 ist Ausgang
    //DDRB = 64; wäre das Gleiche!
    //pinMode(11,INPUT);  //PB7 auf 0 in DDRB
    //DDRB = 0b00000000;
    DDRB = DDRB & 0b01111111;  //gezielt PB7 auf 0 setzen => PB7 ist Eingang
    
    //digitalWrite(11,HIGH); //Pullup aktivieren, intern auf +5V setzen
    //PORTB = 0b10000000;  //PB7 bei PORTB setzen == Pullup auf PB7
    PORTB = PORTB | 0b10000000;  //PB7 bei PORTB setzen == Pullup auf PB7
}
int x;
void loop() 
{
    //x = digitalRead(11);
    x = PINB; //nur PB7 interessant wäre 128
    if(x<128)
    {
        //digitalWrite(10,HIGH);
        //PORTB = 0b11000000; // PB6=1, PB7 BLEIBT 1 wg. Pullup
        //Mit Bitmaske Bit PB6 setzen, ohne andere Bits zu beeinflussen:
        PORTB = PORTB | 0b01000000; //zu setzendes Bit in Maske 1 setzen
        delay(300);
        //digitalWrite(10,LOW);
        //PORTB = 0b10000000; // PB6=0, PB7 BLEIBT 1 wg. Pullup
        PORTB = PORTB & 0b10111111; //zu löschendes Bit in Maske 0 setzen
        delay(300);
    }    
}

Code 0-6: Version 3: Verwendung von Register-Befehlen mit Bitmasken

void setup() 
{
    //pinMode(10,OUTPUT); //PB6 auf 1 in DDRB
   //      MSB      LSB
    //DDRB = 0b01000000;
//    DDRB = DDRB | 0b01000000;  //gezielt PB6 auf 1 setzen => PB6 ist Ausgang
    DDRB = DDRB | (1<<PB6);  //.. ist auch 64! gezielt PB6 auf 1 setzen => PB6 ist Ausgang
    //DDRB = 64; wäre das Gleiche!
    //pinMode(11,INPUT);  //PB7 auf 0 in DDRB
    //DDRB = 0b00000000;
//    DDRB = DDRB & 0b01111111;  //gezielt PB7 auf 0 setzen => PB7 ist Eingang
    DDRB = DDRB & (~(1<<PB7));  //gezielt PB7 auf 0 setzen => PB7 ist Eingang
    
    //digitalWrite(11,HIGH); //Pullup aktivieren, intern auf +5V setzen
    //PORTB = 0b10000000;  //PB7 bei PORTB setzen == Pullup auf PB7
    PORTB = PORTB | 0b10000000;  //PB7 bei PORTB setzen == Pullup auf PB7
}
int x;
void loop() 
{
    //x = digitalRead(11);
    x = PINB; //nur PB7 interessant wäre 128
    if(x<128)
    {
        //digitalWrite(10,HIGH);
        //PORTB = 0b11000000; // PB6=1, PB7 BLEIBT 1 wg. Pullup
        //Mit Bitmaske Bit PB6 setzen, ohne andere Bits zu beeinflussen:
        PORTB = PORTB | 0b01000000; //zu setzendes Bit in Maske 1 setzen
        delay(300);
        //digitalWrite(10,LOW);
        //PORTB = 0b10000000; // PB6=0, PB7 BLEIBT 1 wg. Pullup
        PORTB = PORTB & 0b10111111; //zu löschendes Bit in Maske 0 setzen
        delay(300);
    }    
}

Code 0-7: Version 4: Verwendung von Register-Befehlen mit Bitmasken und Bitshiftoperationen

Übungen

a) Bauen Sie die nachfolgende Lauflichtschaltung auf:

96_Arduino/22_Universal/02_LED_Leiste

b) Schreiben Sie unter Verwendung von Arduino-Befehlen ein Programm, das alle acht LEDs zum Leuchten bringt und testen das.

c) Ersetzen Sie das Programm von b) durch eines das Registerkonfigurationen benutzt, um die LEDs zum Leuchten zu bringen.

d) Schreiben Sie für die Schaltung ein Lauflichtprogramm, das Arduino-Befehle benutzt.

e) Ersetzen Sie das Programm von d) durch eines, bei dem Registerbefehle verwendet werden. Ausnahme: delay(...). Hinweis: Hier kann man mit Hilfe von Bitshift-Operationen eine sehr effiziente Lösung finden.

void setup() {
DDRB = 0b11111111;
}

void loop() {

    for(int i=0;i<8;i++){
      delay(200);
      PORTB= 0b00000001<<i;
    }

}

Code 0-8: Studentische Lösung.

f) Zusatzaufgabe: Denken Sie sich Varianten zum einfachen Lauflicht aus und entwickeln Sie ein System, bei dem man durch Taster zwischen den verschiedenen Lauflichtvarianten umschalten kann.

#3 Fr 14.04.2023


NEU ergänzt im Sommersemester 2024, LV #3, 11.04.2024, BEGINN 11:30Uhr:


Hauptthema: Digitale Eingänge

  1. Quiz zu bitweisen logischen Operationen
  2. Besprechung der Lauflicht-Übung
  3. Besprechung der Lauflicht-Lösung mit Shift-Operator
  4. Entwurf einer Lösung für das "Zylonen-Lauflicht"
  5. Elektrische Eigenschaften für Digitale Eingänge
  6. Verwendung eines Tasters
  7. Verwendung zweier Taster
  8. Übersicht zu Register basierter Behandlung Digitaler Eingänge
  9. Datenblatt Drehkodierschalter
  10. Datenblatt Sieben Segment Anzeige
  11. ÜBUNG: Entwurf, Aufbau und Programmierung eines Drehkodierers mit Sieben Segment Anzeige
96_Arduino
96_Arduino/22_Universal/02_LED_Leiste
40_Mikrocontroller/01_Einfuehrung/05_Praxis/02_Byteoperationen
40_Mikrocontroller/03_DigitalIO/02_Pullup_Widerstaende
40_Mikrocontroller/03_DigitalIO/03_Bitmasken_Eingang
Auszug aus dem Datenblatt eines Drehkodierers: Kodierung.

Bild 0-1: Auszug aus dem Datenblatt eines Drehkodierers: Kodierung.

Auszug aus dem Datenblatt eines Drehkodierers: Pinbelegung von oben durch das Gehäuse hindurch gesehen(?).

Bild 0-2: Auszug aus dem Datenblatt eines Drehkodierers: Pinbelegung von oben durch das Gehäuse hindurch gesehen(?).

Einbau des Drehkodierers: 1,2,4,8 an PINF.

Bild 0-3: Einbau des Drehkodierers: 1,2,4,8 an PINF.

Sieben Segmentanzeige Kingbright SA52-11GWA (gemeinsame Anode!)

Bild 0-4: Sieben Segmentanzeige Kingbright SA52-11GWA (gemeinsame Anode!)

  • Aufgabenbeschreibung:
  • Der Drehkodierer soll an PF4,PF5,PF6,PF7 angeschlossen werden.
  • Der Code des Drehkodierers soll über LEDs an Digital Pin 4,5,6,7 testweise angezeigt werden.
  • Die Sieben Segmentanzeige soll über PORTB angesteuert werden.
  • Dabei soll a auf PB0 gehen, b auf PB1, ... , g auf PB6.
  • Schließlich soll der mit dem Drehkodierer eingestellte Code als Hexadezimalzahl in der Sieben Segmentanzeige angezeigt werden.
Verschaltung der Komponenten der Kodieranzeige. Die vier LEDs bei Digital Out 4,5,6,7 dienen zur direkten Kontrollausgabe des Binärcodes.

Bild 0-5: Verschaltung der Komponenten der Kodieranzeige. Die vier LEDs bei Digital Out 4,5,6,7 dienen zur direkten Kontrollausgabe des Binärcodes.

int x = 0;
void setup() 
{
    DDRB = 0b11111111;
}

void loop() 
{
    delay(200);
    if(x<8)
        PORTB= 0b00000001<<x;
    else
        PORTB= 0b01000000>>(x-8);
    x++;
    x%=8+6;
}

Code 0-9: Musterlösung "Zylonenlauflicht".


ENDE NEU ergänzt im Sommersemester 2024, LV #3, 11.04.2024: