This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
●Serielle Kommunikation mit RS232●Seit 1962 !●Spezifikation regelt elektrische und mechanische Belange●Pegelanpassung zwischen TTL (0/5V) und RS232 (+/- ca.14V) nötig (MAX232)●-3..-25V: 1 | 3..25V: 0●Rx (PD0) / Tx (PD1) Pins beschalten (verbinden mit MAX232–Platine oder USB-Adapter
2
Der Serielle Port (die Leitungen)
Begriffe:DTE: Data Terminal Equipment (PC, Fax, verarbeitendes Gerät, male)DCE: Data Carrier Equipment (Daten transportierendes Gerät. Modem,.., fem)RTS: Ausgang, Redy To Send, Will Daten sendenCTS: Eingang, Clear To Send, Bereitschaft Daten zu empfangenTx : Data Transmitter, DatensendeleitungRx : Data Receiver; Datenempfangsleitung
Die Baudrate ist die Größe, die in der Nachrichten- und Übertragungstechnik die Signalrate angibt. Sie steht für die Anzahl der Zustands- oder Symboländerungen in einer bestimmten Zeiteinheit an, die eine Übertragung erfährt.
Die Einheit der Baudrate ist 1 Baud [1 Bd], benannt nach dem französischen Wissenschaftler Jean-Maurice-Emile Baudot, dem zahlreiche Erfindungen auf dem Gebiet der Telegrafie zu verdanken sind.
Die Baudrate wird häufig mit der Bitrate verwechselt. Die Bitrate steht im Gegensatz zur Baudrate aber für die Datenrate. Baudrate und Bitrate sind gleich, wenn ein Symbol (0/1) genau einem Bit entspricht.
Port Funktion Port-Adresse RAM-AdresseUCSRAUSART Status Register0x0B 0x2B
7 6 5 4 3 2 1 0RXC TXC UDRE FE OR PE U2X MPCM
Bit Name Bedeutung Funktion7 RXC UART Receive Complete 1: Zeichen empfangen/0: Kein Zeichen6 TXC UART Transmit Complete 1: Daten aus Schieberegister gesendet5 UDRE UART Data Register Empty1: Senderegister frei4 FE Framing Error 1: Ungültiges Stop-Bit3 DOR Overrun 1: Zeichenverlust2 PE Paritätskontrolle 1:Paritätsfehler1 U2X doppelte Baudrate0 MPCM Multiprozessorbetrieb (Daten/Adressen)
10
Bit Name Bedeutung
7 RXCIE enable Interrupt receive complete
6 TXCIE enable Interrupt transmit complete
5 UDREIE enable Interrupt transmit data register free
4 RXEN enable Receive
3 TXEN enable transmit
2 UCSZ2 Zeichenlänge zusammen mit UCSZ1 und UCSZ0 aus UCSRC
1 RXB8 9. Bit received
0 TXB8 9. Bit transmit
7 6 5 4 3 2 1 0
RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8
Port Funktion Port-Adresse RAM-Adresse
UCSRB USART Steuer Register 0x0A 0x2A
11
Port Funktion Port-Adresse RAM-Adresse
UCSRC USART Steuer Register 0x20 0x40
7 6 5 4 3 2 1 0
URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL
Bit Name Bedeutung Funktion
7 URSEL 1: immer, wenn UCSRC angesprochen werden soll, weil UBRRH die selbe Adresse hat
1: UCSRC0: UBRRH
6 UMSEL synchron/asynchron 0:Asyn, 1: Synchon
5
4
UPM1
UPM0
Parität 00:none01:reserved10:even11:odd
3 USBS stopp bits 0:1 Stoppbit1:2 Stoppbits
2 UCSZ1UCSZ0
Zeichenlänge zusammen mit UCSZ2 aus UCSRB
000:5 bit001:6 bit010:7 bit011:8 bit111:9 bit
0 UCPOL Synchon: Phasenlage
12
Synchroner/Asyncroner Modus
● Synchron:– Noch nicht getestet
– Auf zusätzlicher Taktleitung wird ein Übertragungstakt geschaltet
– Bei Atmega XCK (PD4)
● Asynchron:– Es wird ein Datenstrom von Bits übertragen
– Start- Stopbit Kennzeichnen Anfang und Ende einer Übertragung
13
Port Funktion Adresse Ramadresse
UDR UART I/O DataRegister
0x0C 0x2C
UBRRH Baudratenregister(high)
0x20 0x40
UBRRL Baudratenregister(low)
0x09 0x29
Das UART DATA Register (UDR) besteht eigentlich aus den Registern UDR transmit und UDR receive. Beide werden über die selbe Adresse angesprochen, offenbar erfolgt die Unterscheidung an Hand der Lese-/Schreiboperation
Empfehlungen zum Praktikum● Übertragungsprotokoll 8N1● 9600 Baud● Asynchone Übertragung● Übertragungsparameter müssen sende- und
empfangsseitig übereinstimmen● Empfang interruptgesteuert / Pollingbetrieb, je nach
Anwendungsfall● Quarz verwenden, make ext_11mhz,
F_CPU=11059200 einstellen● Empfangene Zeichen müssen auch „abgeholt
werden“, ansonsten kommt es zu Datenverlust
17
Initialisierung des USART// Baudratenteiler mit einem der beiden nachfolgenden Macros (empfohlen:9600Baud)#define UBRR ((F_CPU+BAUD*8)/(BAUD*16)-1) #define UBRR ((F_CPU/(16UL*BAUD))-1)
short int ugetchar(void){ if (irr!=irw) { char c=buffer[irr]; irr=(irr+1)%RING_SIZE; return c; } else return 1;}
20
Ausgabe auf USARTvoid uputch(char x){ loop_until_bit_is_set(UCSRA, UDRE); UDR=x;}
void uputs(char * s){ int n=0; while(*(s))uputch(*s++),n++;}
void uputu(unsigned long d){ if (d>=10) uputu(d/10); uputch(d%10+'0');}
void uputd(long d){ if (d<0) {uputch('-');d=-d;} uputu(d);}
void uputx(unsigned long d){ if (d>=0x10) uputx(d/0x10); uputch(d%0x10>9?d%16+'A'-10:d%16+'0');}
char * itoadec (char * buf, int i, int len, char leading){ unsigned int itmp=i>0?i:-i; buf[len]=0; len --; while (len>=0) { if (itmp>0) buf[len--]=itmp%10+'0'; else buf[len--]=(buf[len+1]!=0)?leading:'0'; itmp/=10; } if (i<0)buf[0]='-'; return buf;}
char * itoahex (char * buf, unsigned int i, int len, char leading){ buf[len]=0; len --; while (len>=0) { if (i>0) buf[len--]=i%0x10<10? i%0x10+'0': i%0x10+'A'-10; else buf[len--]=leading; i/=0x10; } return buf;}
21
Der PC, die andere Seite, initint init(){ /*** Init ***/ //O_RDONLY, O_WRONLY or O_RDWR - //O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck) // man 2 open fuer mehr Infos - see man 2 for more info fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY); if (fd < 0){ printf("Fehler beim oeffnen von %s\n", MODEMDEVICE); exit(-1); } memset(&newtio, 0, sizeof(newtio)); newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD; //setzt die neuen Porteinstellungen newtio.c_iflag = IGNPAR; newtio.c_oflag = 0; newtio.c_lflag = 0; /* set input mode (non-canonical, no echo, ...) */ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */ newtio.c_cc[VMIN] = 1; /* blocking read until 1 chars received */