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; }
>zusammengesucht
Das ist wohl der Knackpunkt. Nur programmieren kannst du nicht.
Eine Funktion in main anlegen?
Wohl keine gute Idee.
unsigned char USART1_Receive (void)
{
}
Und hör auf dauernd UDR1 auszulesen. Damit
verhinderst du das überhaupt was empfangen wird.
Ja, das mag ich so an diesem Forum. Erste Behauptung: Man kann nicht programmieren. Hab ich ja auch gar nicht behauptet. Ist ja nicht so, das ich einen fertigen Code 1 zu 1 übernommen habe oder einen fertigen Code wünsche. Ich habe mich schon mit dem Datenblatt, dem Controller und auch mit der Schnittstelle auseinander gesetzt. Meine Frage war nur, och ich das so richtig gemacht habe. Gut, die Funktion habe ich nun aus der main geworfen. Aber ein kleines Feedback zur Initialisierung z. B. wäre schön oder warum wird verhindert Daten zu empfangen, wenn ich ständig UDR1 abfrage.
Duu schrieb: > Meine Frage war nur, och ich das so richtig gemacht habe. Gut, die > Funktion habe ich nun aus der main geworfen. Aber ein kleines Feedback > zur Initialisierung z. B. wäre schön oder warum wird verhindert Daten zu > empfangen, wenn ich ständig UDR1 abfrage. nein du hast es falsch gemacht. falls du mehr wissen willst: mach es so: 1. Lerne C 2. Kompiliere deinen Code, übertrage ihn auf den microcontroller 2.1 kompiliert dein code nicht gehe zu 1. 3. schau ob er tut was du willst 3.1 wenn ja hast du es richtig gemacht 3.2 wenn nein nicht. dann kannst du nachfragen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.