Die serielle Schnittstelle mit den Atmega32: USART

Transcrição

Die serielle Schnittstelle mit den Atmega32: USART
Die serielle Schnittstelle mit den Atmega32: USART
Die Schnittstelle hat die Bezeichnung USART, die für
UNIVERSAL SYNCHRONOUS and ASYNCHRONOUS RECEIVER and TRANSMITTER
steht.
In dieser Abhandlung wird nur die asynchrone Datenübertragung behandelt.
Wie man am PINOUT sieht, befinden sich die Anschlüsse der seriellen Schnittstelle
am PORTD(PD0 und PD1)
Bei serieller Datenübertragung sind diese Portanschlüsse für andere Zwecke
gesperrt. Die serielle Datenübertragung funktioniert auch nicht, wenn der LCD_PORT
auf PORTD eingestellt ist.
Bei der Programmierung sind die folgenden Register von Bedeutung
Die USART-Datenregister UDR
Es handelt sich um 2 physikalische 8-Bit-Register, die mit dem gemeinsamen Namen
UDR angesprochen werden.
Die USART Controll and Status Register UCSRA, UCSRB und USCRC:
UCSRA:
Bit 7 – RXC: USART Receive Complete
Bit 6 – TXC: USART Transmit Complete
Bit 5 – UDRE: USART Data Register Empty
Bit 4 – FE: Frame Error
Bit 3 – DOR: Data OverRun
Bit 2 – PE: Parity Error
Bit 1 – U2X: Double the USART Transmission Speed
Bit 0 – MPCM: Multiprocessor Communication Mode
UCSRB:
Bit 7 – RXCIE: RX Complete Interrupt Enable
Bit 6 – TXCIE: TX Complete Interrupt Enable
Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
Bit 4 – RXEN: Receiver Enable
Bit 3 – TXEN: Transmitter Enable
Bit 2 – UCSZ2: Character Size
Bit 1 – RXB8: Receive Data Bit 8
Bit 0 – TXB8: Transmit Data Bit 8
UCSRC:
Bit 7 – URSEL: Register Select
This bit selects between accessing the UCSRC or the UBRRH Register. It is read as
one when reading UCSRC. The URSEL must be one when writing the UCSRC.
Bit 6 – UMSEL: USART Mode Select
Bit 5:4 – UPM1:0: Parity Mode
Bit 3 – USBS: Stop Bit Select
Bit 2:1 – UCSZ1:0: Character Size
Bit 0 – UCPOL: Clock Polarity
Die USART-Baudratenregister UBRRH und UBRRL:
Die folgende Tabelle zeigt Einstellwerte für das Baudratengegister bei einer
Oszillatorfrequenz von 8 MHz. Bei Werten unter 256 ist UBRRH=0.
Wir wollen die Schnittstelle nur im asynchronen Modus nutzen:
Beispiel: Die USART-Schnittstelle soll zum asynchronen Senden und Empfangen von
Daten genutzt werden mit 9600 Baud, 8 Datenbits, keine Parität, 1 Stopbit (8N1):
(fosz=8MHz)
Initialisierung der Schnittstelle:
void USART_init(void){
UBRRH=0;
UBRRL=51;
//8N1 Daten
UCSRC|=0x86;
//Empfangen und Senden
UCSRB=0x18;
}
Ein Byte senden:
void USART_putc(uint8_t byte){
while(bit_is_clear(UCSRA,UDRE)); //warten auf Datenregister empty
UDR=byte;
}
Prüfen, ob ein Byte empfangen wurde:
uint8_t USART_byte_avail(void){
if(bit_is_set(UCSRA,RXC))
return 1;
else return 0;
}
Ein Byte empfangen:
uint8_t USART_getc(void){
while(bit_is_clear(UCSRA,RXC));//warten auf Receive Complete
return UDR;
}
void USART_puts(char *s)
/* print string on USART (no auto linefeed) */
{
while (*s!=0) {
USART_putc(*s);
s++;
}
}
Eine Zahl vom Typ float senden:
void USART_putf(float zahl, int sges, int snach){
//Ausgabe einer Fließkommazahl mit sges Gesamtstellen.
//Hiervon sind snach Nachkommastellen.
//Die Nachkollastellen werden gerundet.
char buffer[16];
dtostrf(zahl,sges,snach,buffer);
USART_puts(buffer);
}
Eine Zahl vom Typ int senden:
void USART_puti(int zahl, int sges){
//Ausgabe der Integerzahl zahl formatiert mit sges Stellen
char buffer[17];
uint8_t l=0,n;
char *z=buffer;
itoa(zahl,buffer,10);
while(*z!=0){l++; z++;}//Bufferlänge l
for(n=l;n<sges;n++) USART_putc(' ');
USART_puts(buffer);
}
Eine Zahl vom Typ unsigned int senden:
void USART_putui(unsigned int zahl, int sges){
//Ausgabe der Integerzahl zahl formatiert mit sges Stellen
char buffer[17];
uint8_t l=0,n;
char *z=buffer;
utoa(zahl,buffer,10);
while(*z!=0){l++; z++;}//Bufferlänge l
for(n=l;n<sges;n++) USART_putc(' ');
USART_puts(buffer);
}
Eine Zahl vom Typ unsigned int senden (Leestellen=0):
void USART_putui_0(unsigned int zahl, int sges){
//Ausgabe der Integerzahl zahl formatiert mit sges Stellen
//Leerstellen werden mit 0 aufgefüllt (TSC)
char buffer[17];
uint8_t l=0,n;
char *z=buffer;
utoa(zahl,buffer,10);
while(*z!=0){l++; z++;}//Bufferlänge l
for(n=l;n<sges;n++) USART_putc('0');
USART_puts(buffer);
}
Eine Zahl vom Typ unsigned int hexadezimal senden:
void USART_putui_hex(unsigned int zahl, int sges){
//Ausgabe der nur-positiven Integerzahl zahl formatiert mit sges Stellen
// das Ausgabeformat ist hex (TSC)
char buffer[17];
uint8_t l=0,n;
char *z=buffer;
utoa(zahl,buffer,16);
while(*z!=0){l++; z++;}//Bufferlänge l
for(n=l;n<sges;n++) USART_putc(' ');
USART_puts(buffer);
}
Eine Zahl vom Typ unsigned int binär senden::
void USART_putui_bin(unsigned int zahl, int sges){
//Ausgabe der Integerzahl zahl formatiert mit sges Stellen
// Das Ausgabeformat ist binär. Leerstellen werden mit 0 aufgefüllt.
char buffer[17];
uint8_t l=0,n;
char *z=buffer;
utoa(zahl,buffer,2);
while(*z!=0){l++; z++;}//Bufferlänge l
for(n=l;n<sges;n++) USART_putc('0');
USART_puts(buffer);
}
Ein Byte binär senden:
//Ausgabe einer 8-Bit-Zahl binär(TSC)
void USART_putb(uint8_t a){
USART_putui_bin(a,8);
}
Eine erweiterte Bibliothek zur nicht-interrupt-gesteuerten seriellen Schnittstelle
finden sie hier:
Bibliothek

Documentos relacionados