kramann.info
© Guido Kramann

Login: Passwort:










5.2.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 5.2.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 5.2.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 5.2.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 5.2.5.3-2: Hauptprogramm