Gast
#4414115
Hallo, ich möchte bei meinem Controller Daten von der USART1 empfangen. Bei einem Hexwert von 0x01 soll eine LED am Port G eingeschaltet werden und mit dem Wert 0x00 wieder aus. Das folgende Programm habe ich aus mehreren Teilen im Internet und Datenblatt zusammengesucht und würde mal nachfragen, ob ich das so richtig gemacht habe oder ob irgendwo ein Fehler enthalten ist. #include <avr/io.h> #include <avr/interrupt.h> #define LEDPORT DDRG |= (1<<PG1) #define LEDON PORTG |= (1<<PG1) #define LEDOFF PORTG &= ~(1<<PG1) #define F_CPU 8000000 volatile uint8_t toggle; void InitUart (void){ uint16_t ubrr; ubrr = ((F_CPU/(9600L*16L))-1); UBRR1H = (unsigned char)(ubrr>>8); UBRR1L = (unsigned char) ubrr; UCSR1B = (1<<RXEN1)|(1<<TXEN1); UCSR1C = (0<<UMSEL1) | (0<<UPM1) | (1<<USBS1) | (3<<UCSZ1); } int main () { sei(); InitUart (); while(1) { unsigned char USART1_Receive (void) { /*Wait for data to be received*/ while( ! (UCSR1A & (1<<RXC1))); /*Get and return received data from buffer*/ return UDR1; } if (UDR1 == 0x01) { LEDON; } if (UDR1 == 0x00) { LEDOFF; } } return 0; } ISR (TIMER1_COMPA_vect){ toggle = 1; }