kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




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

(EN google-translate)

(PL google-translate)

Themen

  1. Lauflicht mit Auswahl
  2. Quiz
  3. Robo-Sumo
  4. PWM Prinzip
  5. PWM mit Arduino-Befehlen
  6. Preview: PWM über Register-Konfigurationen
  7. Übungen

1. Lauflicht mit Auswahl

//Rotieren realisieren
unsigned int arr[] = {0b1111111100000000,
                      0b1000000010000000,
                      0b1010101010101010};
unsigned int auswahl = 0;
void setup() 
{
    DDRB = 0b11111111;
    Serial.begin(9600);
}
void loop() 
{
    if(Serial.available())
    {
         auswahl = arr[Serial.read()%3];
    }
    auswahl = ((auswahl << 1) | (auswahl >> 15)) ;     
    PORTB = auswahl;
    delay(200);
}

Code 0-1: Lauflicht mit Auswahl.

2. Quiz

  • Wie groß ist ein Register?
  • Welche Register-Typen gibt es im Zusammenhang mit digitalen Ein- und Ausgängen?
  • Was ist dezimal 1<<3
  • Was ist dezimal 1>>3
  • Was ist dezimal 3<<1
  • Was ist dezimal 0<<1
  • Was ist dezimal 1<<0
  • Was ist dezimal 1<
  • Was ist dezimal (1<
  • Was ist dezimal 0b00001111 & 0b11110000
  • Was ist dezimal 0b00001111 | 0b11110000
  • Was ist dezimal 0b00001111 | ~0b11110000

3. Robo-Sumo

https://www.youtube.com/watch?v=lUpUQf16qzQ
83_AV/05_SUMO/10_Umsetzung -- Zustandsübergangs-Modell

4. PWM Prinzip

40_Mikrocontroller/04_PWM

5. PWM mit Arduino-Befehlen

//Dimmen einer LED mittels "analogWrite"
void setup() 
{
  
}
int x=0;
int y=0;
void loop() 
{
    if(x<256)
       y=x;
    else
       y=511-x;   
    analogWrite(9,y);
    x++;
    x%=512;
    delay(5);
}

Code 0-2: Dimmen einer LED mittels "analogWrite"

https://www.arduino.cc/reference/en/libraries/servo/
https://docs.arduino.cc/learn/electronics/servo-motors
Übung 1
  • Schreiben Sie ein Lauflicht mit 8 möglichen Zuständen aller 8 LEDs.
  • Die 8 Zustände sollen in 8 Byte-Variablen in einem Array abgelegt sein.
  • In einem der 8 Schritte 0..7 wird das Muster aus dem Array am korrespondierenden Platz 0..7 ausgewählt und angezeigt.
Übung 2
  • Über die Tasten 1,2,3,4,5 sollen bei einem Servo die Winkel -90 Grad, -45 Grad, 0 Grad +45 Grad und +90Grad einstellbar sein.
  • Außerdem soll jeweils eine von sieben LEDs in einer Reihe passend dazu aufleuchten. Die mittlere LED grün, die anderen rot.

NEU ergänzt im Sommersemester 2024, LV #4, 18.04.2024:


Themen heute:

  1. Besprechung der Übung zur Kodieranzeige
  2. Neues Thema: PWM-Signale (Theorie)
  3. Bearbeitung der Übung zur Kodieranzeige
  4. Neue Übung: Dimmer, 16 Helligkeitsstufen mit Kodierer auf LED bei Digital Out 7 einstellen (analogWrite)
  5. Musterlösung zu Kodieranzeige
  6. Musterlösung zu Dimmer
Aufbau der Drehkodierer-Anzeige auf einer Laborplatine.

Bild 0-1: Aufbau der Drehkodierer-Anzeige auf einer Laborplatine.

Test der Drehkodierer-Anzeige https://youtu.be/6F6wxnTZYuc
Musterlösung für den Drehkodierer mit Anzeige
uint8_t ziffer[] = {
0b00111111,//0  
0b00000110,//1  
0b01011011,//2  
0b01001111,//3  
0b01100110,//4  
0b01101101,//5  
0b01111101,//6  
0b00000111,//7  
0b01111111,//8  
0b01101111,//9  
0b01110111,//A  
0b01111100,//B  
0b00111001,//C  
0b01011110,//D  
0b01111001,//E  
0b01110001//F
};

void setup() 
{
     DDRB = 0b01111111;
     PORTB = 0b01111111;  
     DDRF &= 0b00001111;
     PORTF |= 0b11110000;
     pinMode(4,OUTPUT);
     pinMode(5,OUTPUT);
     pinMode(6,OUTPUT);
     pinMode(7,OUTPUT);
}

void loop() 
{
     DDRB = 0b01111111;
     PORTB = ~ziffer[(PINF>>4)];
     digitalWrite(4,((PINF & 0b00010000)>>4));
     digitalWrite(5,((PINF & 0b00100000)>>5));
     digitalWrite(6,((PINF & 0b01000000)>>6));
     digitalWrite(7,((PINF & 0b10000000)>>7));
}

Code 0-3: Drehkodierer mit Anzeige

Studentische Lösung:
uint8_t displayValue[16] = {

0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3

0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7

0b01111111, // 8
0b01101111, // 9
0b01110111, // A
0b01111100, // B

0b00111001, // C
0b01011110, // D
0b01111001, // E
0b01110001, // F

};


void setup() {
  //explicitly tells the register B, all pins are outputs
  DDRB = 0xFF;
  // DDRF &= tells the register F, the leftmost 4 ports are inputs while not
  // altering the other bits
  DDRF &= ~((1 << PF4) | (1 << PF5) | (1 << PF6) | (1 << PF7));
  // PORTF |= sets the leftmost 4 bits to activate internal pull-up
  PORTF |= (1 << PF4) | (1 << PF5) | (1 << PF6) | (1 << PF7);

}


void loop() {
  
  int switchValue = (PINF & ((1 << PF4) | (1 << PF5) | (1 << PF6) | (1 << PF7))) >> PF4;

  PORTB = ~(displayValue[switchValue]);

}

Code 0-4: Drehkodierer mit Anzeige


ENDE NEU ergänzt im Sommersemester 2024, LV #4, 18.04.2024: