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 Laboruebung2_alt
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
8 OOP
..8.1 Probleme
..8.2 Konzept
..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 Zaehler
10 Peripherie
..10.1 RS232Menue
..10.2 ASCIIDisplay
..10.3 Tastenmatrix
..10.4 Schrittmotor
..10.5 Zaehler
..10.6 Uebung7
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.5.3 Objektorientierte Umsetzung der Klasse RS232

  • Basis für alle weiteren objektorientierten Programme wird das leere Projekt sein, das sich nach dem Einloggen auf der Startseite dieser Vorlesung herunterladen läßt (projektleer.zip).
  • Und zwar gibt es nach dem Entpacken von projekt.zip das Projekt mueca und muecb.
  • Wir verwenden in der Regel muecb, welches für den unteren Mikrocontroller des Experimentierboards bestimmt ist.
  • Wir werden dieses Projekt einfach immer wieder verwenden und den übergeordneten Namen umbennen.
  • Nach dem Umbennen des übergeordneten Ordners und dem Öffnen des Projektes präsentiert es sich zunächst folgendermaßen:
BILDBESCHREIBUNG

Bild 8.5.3-1: Leeres Projekt

  • Klassen werden wir in .h-Dateien schreiben, die den gleichen Klassennamen haben, wie die Klasse selbst.
  • .h-Files werden im Projekt-Baum (links) unter Header Files angezeigt.
  • Wir können mit der rechten Maustaste ein neues Header-File anlegen und anschliessend bearbeiten und speichern:
BILDBESCHREIBUNG

Bild 8.5.3-1: Neues .h-File für die Klasse RS232 anlegen.

Die nachfolgenden Programme als Projekt rs232_oop_senden.zip herunterladen.

RS232 - Klasse

class RS232
{
  public:
    RS232(uint32_t baudrate=115200, uint8_t datenbits=8, uint8_t stopbits=1)
    {
  	    //setzen der Baudrate:
        uint32_t baudregister = TAKTFREQUENZ/8/baudrate-1;
	    UBRRH = (uint8_t) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
	    UBRRL = (uint8_t)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
        //einfache (nicht doppelte) Übertragungsgeschwindigkeit:
        UCSRA = (1<<U2X);
	    //Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
        switch(datenbits)
        {
            case 5:
	            UCSRC = (1<<URSEL)|(0<<UCSZ1)|(0<<UCSZ0);
            break;
            case 6:
	            UCSRC = (1<<URSEL)|(0<<UCSZ1)|(1<<UCSZ0);
            break;
            case 7:
	            UCSRC = (1<<URSEL)|(1<<UCSZ1)|(0<<UCSZ0);
            break;
            case 8:
	            UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
            break;
        }
        if(stopbits==2)
            UCSRC |= (1<<USBS);
    }

    void start(bool senden, bool empfangen)
    {
        if(senden==true)
            UCSRB |= 1<<TXEN;
        if(empfangen==true)
            UCSRB |= 1<<RXEN;
    }
    void stop()
    {
            UCSRB &= 255 - (1<<TXEN) - (1<<RXEN);
    }

    void sendeZeichen(uint8_t zeichen)
    {
        while( !(UCSRA & (1<<UDRE)) ); //Warten bis der Uebertragungspuffer leer ist
        UDR = zeichen;                    //Daten in den Puffer schreiben und übertragen
    }
    void sendeZahl(uint8_t zahl)
    {
        sendeZeichen( 48+zahl/100 );
        sendeZeichen( 48+(zahl % 100)/10 );
        sendeZeichen( 48+zahl%10 );
        sendeZeichen('\n');
        sendeZeichen('\r');
    }
};
 

Code 8.5.3-1: RS232.h - Klasse für RS232-Schnittstelle.

Hauptprogramm / Verwendung / Test der Klasse RS232

#include <avr/io.h>

#define TAKTFREQUENZ 9216000

#include "RS232.h"


int main(void)
{
//    RS232 rs232(115200,8,1);
    RS232 rs232;


    uint8_t akku=0;
    uint32_t pause;

    DDRA = 0b00000000;
    DDRB = 0b00000000;
    DDRD = 0b00000000;

    DDRC = 0b11111111; //über RS232 gesendete Zahlen sollen auch an 
                       //zweiten Mikrocontroller geschickt
                       //und angezeigt werden.

    rs232.start(true,false);

    while(true)
	{
        rs232.sendeZahl(akku);        
        //Zahl außerdem wie gewohnt nach Port C schicken:
        PORTC = akku;

        for(pause=0;pause<10000000;pause++);

        //Weiterzählen:
        akku++;
	}
	return 0;
}
 

Code 8.5.3-2: Hauptprogramm