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