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

6.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 6.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 6.5-1: Senden über RS232 vom Mikrocontroller an den PC.