kramann.info
© Guido Kramann

Login: Passwort:










7.5 Senden

Wie sieht ein einfaches Programm zur seriellen Datenübermittlung auf dem ATmega32 aus?

Vorbereiten der Hardware

  • Es sollen Daten von dem zweiten Mikrocontroller aus an den PC gesendet werden.
  • Standartmäßig ist jedoch der erste Mikrocontroller mit der RS232 verbunden.
  • Deshalb müssen die Pins 15 (TxD) beider Mikrocontroller miteinander verbunden werden.
  • Für spätere Versuche mit dem Empfangen von Daten können auch gleich die Pins 14 (TxD) beider Mikrocontroller miteinander verbunden werden (vergl. Bild unten).
  • Ferner müssen im Anzeigeprogramm des oberen Mikrocontrollers die Pins 14 und 15 hochohmig (auf Eingang) geschaltet werden und die RS232-Schnittstelle deaktiviert werden.
  • Das Projekt anzeige_ohne_rs232 (s. Download unten) ist in dieser Weise präpariert.
  • Dieses muß auf den oberen Mikrocontroller gespielt werden.
anzeige_ohne_rs232.zip - Projekt für oberen Mikrocontroller (Anzeige) mit deaktivierter RS232-Schnittstelle.
verbinden

Bild 7.5-1: Vorbereitung des Testboards: Verbindung zwischen TxD beider Mikrocontroller und dasselbe für RxD. - TxD-TxD: rot, RxD-RxD: gelb.

Quellcode für das Senden von Zahlen zwischen 0 und 255

  • Das folgende Programm zählt in der Variable akku herauf bis 255.
  • Wegen des Datentyps beginnt der Zählvorgang dann wieder bei Null.
  • Der Inhalt der Variablen akku wird dann in drei Ziffern umgewandelt, die einzeln über die RS232 gesendet werden.
  • Die vorbereitende Konfiguration der seriellen Schnittstelle wird während der Vorlesung anhand des Datenblattes erläutert und das Programm wird Zeile für Zeile nachgeschaffen und erklärt.
rs232_senden.zip - Projekt zum nachfolgenden Programm.
#include<avr/io.h>

//Definition von Taktfrequenz und Bausrate als Konstanten
#define TAKTFREQUENZ 9216000
#define BAUDRATE 115200


int main()
{
    unsigned char l,m,r;	//Variablen für Anzeige links, mitte, rechts
    unsigned char akku=0;
    unsigned long pause;

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

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

    //Aktivieren der RS232-Schnittstelle des Mikrocontrollers:
    
    //Merken des in UBRR zu speichernden Wertes.
    unsigned int baudregister = TAKTFREQUENZ/8/BAUDRATE-1;

    //setzen der Baudrate
    UBRRH = (unsigned char) (baudregister>>8); //Setzen des HIGH-Bytes des Baudraten-Registers
    UBRRL = (unsigned char)  baudregister;     //Setzen des LOW -Bytes des Baudraten-Registers
	
    //Einschalten des Senders und des Empfängers
    UCSRB = (1<<TXEN) | (1<<RXEN);
		        
    //Setzen des Nachrichtenformats: 8 Datenbits, 1 Stopbits
    UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
    UCSRA = (1<<U2X);

    //Es soll wiederholt von 0 bis 255 durchgezählt werden und
    //der aktuelle Wert im Hyperterminal zu sehen sein.

    while(1)
    {
        l= akku / 100;			//links = Inhalt von akku dividiert mit 100 
	m= (akku % 100) / 10;	        //mitte = Inhalt von akku modulo mit 100 , anschließend dividiert mit 10 
	r= akku % 10;			//rechts = Inhalt von akku modulo mit 10	
        
        //Die drei Ziffern der aktuellen Zahl werden in ASCII-Zeichen umgewandelt
        //und mit UDR = ... seriell gesendet.
        //Dann muß gewartet werden, bis das Senden beendet ist.
        //Es folgen ein Zeilenumbruch und ein Zurücksetzen des Cursers auf den 
        //Zeilenanfang:

        while( !(UCSRA & (1<<UDRE)) ); //Warten bis der Uebertragungspuffer leer ist
        UDR = l+48;                    //Daten in den Puffer schreiben und übertragen
        while( !(UCSRA & (1<<UDRE)) ); 
        UDR = m+48;
        while( !(UCSRA & (1<<UDRE)) );
        UDR = r+48;
        while( !(UCSRA & (1<<UDRE)) );
	    UDR = '\n';
        while( !(UCSRA & (1<<UDRE)) );
	    UDR = '\r';

        //Zahl außerdem wie gewohnt nach Port C schicken:
        PORTC = akku;

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

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

Code 7.5-1: Senden über RS232 vom Mikrocontroller an den PC.