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
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
|
|
Wie der Port B beim ArduinoMicro abgerufen werden kann, ist hier dargestellt:

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




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:

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
|






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

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

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

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

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: