kramann.info
© Guido Kramann

Login: Passwort:










Mikrocontroller
1 Einfuehrung
..1.1 Entwicklungsgeschichtliches
..1.2 Maschinensprache
..1.3 Assemblerbeispiel
..1.4 Sprachwahl
..1.5 Praxis
....1.5.1 Digital_IO
....1.5.2 Byteoperationen
....1.5.3 AVR_Studio
....1.5.4 Testboard
....1.5.5 Aufgaben
....1.5.6 Do_it_yourself
......1.5.6.1 Ampel
......1.5.6.2 Programmierer
..1.6 Literatur
..1.7 Programmierer
....1.7.1 Bauverlauf
....1.7.2 KurzreferenzLow
....1.7.2 Kurzreferenz_16PU
..1.8 Uebung1
..1.9 BoardAtHome
....1.9.1 Software
....1.9.2 Hardware
....1.9.3 Knoppix
....1.9.4 Aufbau
....1.9.5 LED
2 Oszillator
..2.1 Assembler
..2.2 Interner_RC
..2.3 Quarz
..2.4 Taktgenerator
3 DigitalIO
..3.1 Elektrische_Eigenschaften
..3.2 Pullup_Widerstaende
..3.3 Bitmasken_Eingang
..3.4 Bitmasken_Ausgang
..3.5 Tic_Tac_Toe
....3.5.1 DuoLEDs
....3.5.2 Schaltplan
....3.5.3 Spielfeld
....3.5.4 Anwahl
....3.5.5 Kontrolle
..3.6 Laboruebung2
..3.7 Zaehler
4 PWM
..4.1 Prinzip
..4.2 Nutzen
..4.3 Generierung
..4.4 Programmierung
..4.5 Servos
..4.7 Laboruebung3
..4.8 LoesungUE3
..4.9 Uebung6
5 LichtKlangKugeln
..5.1 LED
..5.2 RGB
..5.3 Sensoren
..5.4 lautsprecher
..5.5 tonerzeugung
6 UART
..6.1 Bussysteme
..6.2 UART
..6.3 RS232
..6.4 Hardware
..6.5 Senden
..6.6 Hyperterminal
..6.7 Empfangen
..6.8 Broadcast
..6.9 Uebung4
7 Infrarot
..7.1 schalten
..7.2 seriell
..7.3 Uebung
..7.4 Cloud
8 OOP
..8.1 Ansatz
..8.2 Uebung
..8.3 Statisch
..8.4 Datentypen
..8.5 RS232
....8.5.1 Prozedural
....8.5.2 Analyse
....8.5.3 Umsetzung
....8.5.4 Vererbung
....8.5.5 Statisch
....8.5.6 Performance
..8.6 Fahrzeug
9 ADW
..9.1 ADW
..9.2 Zufallsgenerator
..9.3 Sensoren
..9.4 Musterloesung
10 Cloud
11 SPI
..11.1 Testanordnung
..11.2 Register
..11.3 Test1
..11.4 Test2_Interrupt
..11.5 Test3_2Slaves
..11.6 Laboruebung
12 EEPROM
13 I2C
..13.1 MasterSendByte
..13.2 MasterSend2Bytes
..13.3 MasterReceiveByte
..13.4 MasterReceive2Bytes
14 Anwendungen
..14.1 Mechatroniklabor
....14.1.1 Biegelinie
....14.1.2 Ausbruchsicherung
....14.1.3 Einachser
....14.1.4 AV
....14.1.5 Vierradlenkung
....14.1.6 Kommunikation
..14.2 Sinuserzeugung
....14.2.1 Variante1
....14.2.2 Variante2
....14.2.3 Variante3
....14.2.4 Variante4
..14.3 Laboruebung8
..14.4 Loesung_Ue8
..14.5 SPI_Nachtrag
20 Xubuntu

8.6 Programmierung eines Autonomen Vehikels mit objektorientierten Modulen

vorlesung_2014_05_21.zip - Material aus der Vorlesung vom 21.05.2014
vorlesung_2014_06_04.zip - Material aus der Vorlesung vom 04.06.2014
vorlesung_2014_06_11.zip - Material aus der Vorlesung vom 11.06.2014

Die Möglichkeiten der Programmierung sind an der nachfolgend abgebildeten Platine zu ersehen:

  • Eine LED-Leiste bei PORTC kann angesteuert werden.
  • Der Antriebsservo wird über OCR1A angesteuert
  • Der Lenkservo wird über OCR1B angesteuert
  • Ein Entfernungssensor kann an ADW0 angeschlossen werden
  • Kommunikation über die serielle Schnittstelle mit einem PC ist möglich (vergl. Beispiele in Kapitel 6 UART)
Fahrzeugplatine

Bild 8.6-1: Fahrzeugplatine

Konfiguration für Timer 1:

            TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<COM1B1) | (0<<COM1B0) | (0<<FOC1A) | (0<<FOC1B) | (1<<WGM11) | (1<<WGM10);
            TCCR1B = (0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (1<<CS11) | (1<<CS10);
            DDRD |= (1<<PB5) | (1<<PB4); //auf Ausgang setzen.           
            OCR1A = 108;// 72...144, middle 108
            OCR1B = 108;// 72...144, middle 108

Code 8.6-1: Passende Konfiguration für die Servos. - Es ergibt sich ein sinnvoller PWM-Bereich von 72 bis 144 (vergl. Kapitel 4.8 "Verfeinerte Winkelauflösung")

Konfiguration für den Analog-Digital-Wandler:

            ADCSRA = (1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
	    ADMUX = (0<<REFS1) | (0<<REFS0) | (1<<ADLAR) | (0<<MUX4) | (0<<MUX3) | (0<<MUX2) | (0<<MUX1) | (0<<MUX0);
            DDRA &= 0b11111110;

Wert holen:


        int holeWert()
        {
            ADCSRA |= (1<<ADSC);        	
  
            while( (ADCSRA & (1<<ADSC)) );  
        	
            x = ADCL;
            y = ADCH;

            return ((y<<2) | (x>>6));
        }

Code 8.6-2: Kein Freilaufmodus. Neuer Wert wird bei Bedarf geholt.

Abstrakte Klassen

Über abstrakte Klassen mit virtuellen Methoden, können die Schnittstellen (Objektmethoden) einer Klasse vorab vereinbart werden: Die eigentliche Klasse erbt von der abstrakten Klasse und muss die dort vereinbarten Methoden exakt implementieren.

Hinweis: In Java kann dieses Konzept über Schnittstellen (Schlüsselwort interface) realisiert werden.

Hier ein Beispiel aus einem älteren Projekt mit änlicher Zielrichtung:

class CoachBASIS 
{
	virtual void start();
	virtual void stop();
	virtual int summe(int,int);
};

Code 8.6-3: Datei CoachBASIS.h

class Coach : CoachBASIS
{
    public:		
        Coach()
        {
	}

        void start()
        {
            DDRA = 0b00000000;
            DDRB = 0b00000000;
            DDRC = 0b00000000;
            DDRD = 0b10111000; 

            PORTA = 0b00000000;
            PORTB = 0b00000000;
            PORTC = 0b00000000;
            PORTD = 0b10111000;
        }

        void stop() //hier wie start()
        {
            DDRA = 0b00000000;
            DDRB = 0b00000000;
            DDRC = 0b00000000;
            DDRD = 0b10111000; 

            PORTA = 0b00000000;
            PORTB = 0b00000000;
            PORTC = 0b00000000;
            PORTD = 0b10111000;
        }

        int summe(int x, int y)
        {
            return x+y;
        }
};

Code 8.6-4: Datei Coach.h - erbt von CoachBASIS, muss start(), stop() und int summe(int,int) implementieren.

Übungen (3./4.6.2014)

Im Verlauf der kommenden Übungen und Vorlesungen soll basierend auf den obign Angaben ein modulares objektorientiertes Framework zur Programmierung der AVs umgesetzt werden.

Aufgabe 1 - Sicherer Start

Ähnlich zu Coach / CoachBASIS soll eine Klasse Fahrzeug umgesetzt werden, die die in FahrzeugBASIS vereinbarten Methoden implementiert.

Die Klasse Fahrzeug dient dazu, dass nach dem Einschalten des Mikrocontrollers das Fahrzeug mit der Start-Methode in einen sicheren Zustand überführt wird.

class FahrzeugBASIS
{
	virtual void start();
	virtual void stop();
	virtual int summe(int,int);
};

Code 8.6-5: Datei FahrzeugBASIS.h

Aufgabe 2 - Serielle Kommunikation

Setzen Sie nachfolgende abtrakte Klasse RS232BASIS in einer von ihr erbenden Klasse RS232 in sinnvoller Weise um.

Schreiben Sie ein passendes Testprogramm.

class RS232BASIS
{
	virtual void start();
	virtual void stop();

	virtual void sendeZeichen(char);
	virtual char empfangeZeichen();

	virtual void sendeText(char*);
	virtual void empfangeText(char*);

	virtual void sendeInt(int);
	virtual int  empfangeInt();
};

Code 8.6-6: Datei RS232BASIS.h

Aufgabe 3

Setzen Sie nachfolgende abtrakte Klasse SensorBASIS in einer von ihr erbenden Klasse Sensor in sinnvoller Weise um.

Schreiben Sie ein passendes Testprogramm, welches RS232 verwendet und die aktuellen Sensorwerte anzeigt.

class SensorBASIS
{
	virtual void start();
	virtual void stop();

	virtual int holeWert();
};

Code 8.6-7: Datei SensorBASIS.h

Aufgabe 4

Setzen Sie nachfolgende abtrakte Klasse LEDBASIS in einer von ihr erbenden Klasse LED in sinnvoller Weise um.

Hinweis: der übergebene Wert bei an(unsigned char), aus(unsigned char) bezeichnet die Nummer der zu schaltenden LED.

Schreiben Sie ein passendes Testprogramm, welches RS232 verwendet, um über ein PC-Terminal die LEDs zu schalten.

class LEDBASIS
{
	virtual void start();
	virtual void stop();

	virtual void an(unsigned char);
	virtual void aus(unsigned char);
};

Code 8.6-8: Datei LEDBASIS.h

Aufgabe 5

Schreiben Sie sinnvolle Klassen TasterBASIS und Taster nach dem gleihen Schema wie bei den vorangegangenen Aufgaben.

Gesamtkonzept

In der Vorlesung am 11.06.2014 wird abschließend beispielhaft ein Gesamtkonzept für ein sehr einfaches autonomes Vehikel umgesetzt.

Aufgaben hierzu (17.6./18.6.):

Aufgabe 1

  • Die Regelparameter des PI-Reglers für das Fahrzeut (vergl. Vorlesung) sollen über gtkterm vom PC aus vorgegeben werden können.

Aufgabe 2

Das, was der Entfernungssensor im Verlauf einer Testfahrt geliefert hat, soll im Mikrocontroller gespeichert und bei Tastendruck an den PC geschickt werden.

Der Einfachheit halber soll dort in gtkterm ein zeilenweises Balkendiagramm sichtbar werden, um den Verlauf der Sensorwerte darzustellen, ähnlich wie nachfolgend (günstigerweise mit zusätzlicher Zeitangabe):

0.1s ####
0.2s ######
0.3s ############
0.4s ##############
0.5s ##############
0.6s ##########
0.7s ######
0.8s ###
0.9s #
1.0s ######
1.1s ##########
1.2s #############
1.3s #####
1.4s ##
usw.

Code 8.6-9: Ausgabe des Sensorwert-Verlaufs auf gtkterm am PC.