Hallo, hätte da mal ne Frage versuch gerade mittels Atmega8535 über Hyperterminal ein ASCII-Zeichen auf den Controller zu schicken und diese möchte ich wieder auf dem Hyperterminal ausgeben. Hab leider keine Ahnung was falsch läuft. Gruß Flo. #define F_CPU 4000000L // Taktfequenz #define BAUD 9600L // Baudrate #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <stdlib.h> #include <util/delay.h> #define MYUBRR ((F_CPU)/((BAUD)*16L)-1) // Uebergabewert #define PORTC_OUT DDRC = 0xff; void Portinit(void) { PORTC_OUT; } void UARTinit(void) { UBRRH=(unsigned char)(MYUBRR>>8); UBRRL=(unsigned char) MYUBRR; UCSRC |= (1<<URSEL)|(3<<UCSZ0); // Asynchron 8N1 UCSRB |= (1<<TXEN)|(1<<RXEN); // UART TX und RX einschalten } void uart_putc(unsigned int c) { while (!(UCSRA & (1<<UDRE))); // warten bis Senden moeglich UDR = c; // sende Zeichen } void Usart_Rx(void) { while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar { uart_putc(UDR); // Zeichen zurück senden PORTC ^= 0xff; // PORTC toggeln } } int main(void) { Portinit(); UARTinit(); while(1) { Usart_Rx(); } return(0); }
1 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar |
2 | {
|
3 | uart_putc(UDR); // Zeichen zurück senden |
4 | PORTC ^= 0xff; // PORTC toggeln |
5 | }
|
Solang kein Zeichen verfügbar ist läuft die while-Schleife durch, wenn dann einskommt springt sie wieder raus. Nimm mal die { und } weg bzw. den Code dazwischen dannach. Damit er in der Schleife bleibt bis er etwas empfangen hat und dann den Code abarbeitet.
1 | while (!(UCSRA & (1<<RXC))) // warten bis Zeichen verfuegbar |
2 | // { Nich nötig da die While-Schleife hier nur solang durchlaufen soll
|
3 | // } bis was passiert also quasi warten soll
|
4 | uart_putc(UDR); // Zeichen zurück senden |
5 | PORTC ^= 0xff; // PORTC toggeln |
Wenn doch alles nur so einfach wär. Vielen Dank, so gehts natürlich. Gruß flo. ps: später vielleicht mehr.
Das Semikolon nach dem While sollte man nicht vergessen...
1 | while (!(UCSRA & (1<<RXC))); // warten bis Zeichen verfuegbar |
Schreib das ; in eine neue Zeile. Dann sieht man es besser while (!(UCSRA & (1<<RXC))) ; Wenn du abolut klarstellen willst, dass das interessante an der while-Schleife einzi gund alleine in der Bedinung zu suchen ist und der Schleifenrumpf leer ist, schreibe ich auch mal gerne while (!(UCSRA & (1<<RXC))) { // do nothing } Jetzt kann nur noch ein Blinder nicht mitbekommen was da abläuft.
>Schreib das ; in eine neue Zeile.
Dann sieht es aber sehr verloren aus... ;-)
Ich mache das Semikolon immer ans Ende einer Zeile.
Wenn man noch eine Anweisung hinter dem while(..) stehen hat, kommt da
ja auch das Semikolon ans Ende. Sobald mehr als eine Anweisung folgt,
braucht man ja eh die geschweiftenen Klammern. Die fangen dann in einer
neuen Zeile an.
Das habe ich mir beim Pascal-Programmieren angewöhnt...
Ist aber wie immer eine Anschauungssache...
> Wenn man noch eine Anweisung hinter dem while(..) stehen hat, kommt da > ja auch das Semikolon ans Ende. Wenn ich noch eine Anweisung hinter dem while habe, kommt die ebenfalls bei mir in eine neue Zeile. while( xyz ) bla-bla; Übrigens: Das ; alleine ist eine eigene Anweisung. Eine leere Anweisung. Das ; hat in diesem Fall nichts mit dem while zu tun. Keine der Kontrollstrukturen wird in C mit einem ; abgeschlossen.
Wie gesagt: Ich hab mir die Schreibweise in meiner Schulzeit (ewig her) mit dem Programmieren in Pascal angewöhnt....
ist es so auch Okay? while (!(UCSRA & (1<<RXC))){} Oder eher sehr schlechter Programmierstiel.
Na ja. Die Frage ist, wie schreibst du das ganze, wenn in den {} eine Anweisung drinnen ist? Ich schreibs so while( xyyz ) { abcd; } Konsequenterweise lautet das ganze dann while( xyz ) { } Andere schreiben ersteres so while( xyyz ) { abcd; } folgerichtig schreiben sie dann while( xyz ) { } Das wichtigste bei Formatierregeln ist: Es ist weniger wichtig, welchen Stil du benutzt. Viel wichtiger ist, dass du den Stil konsequent durchziehst und sowenig Ausnahmen wie möglich machst.
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.