Hallo ich habe ein programm auf meinem atmega 8 der mit 8hz lauft und die verbindung mit uart zum computer funktioniert auch nur gibt er mir nur komische zeichen aus stat v was die ganze zeit gesendet wird bekomme ich ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````` Kann mir wer tipps geben woran das liegt?
Rene3233 schrieb: > 8hz Das ist zu wenig. Rene3233 schrieb: > ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````````````` ```````````````````````````````````````````````````````````````` Und dann ist schon Schluß? Mit welcher Baudrate arbeitest Du? Woher holt Dein Prozessor den Takt? Gruß Jobst
Ne dan ist nicht schluss das geht undendlich so weiter habe ja im programm eine dauerschleife drinn. Der holt sich den takt aus dem internen qaerz. Ich habe eine baudrate von 9600. Hier mal mein Programm: /* * UartTest.c * * Created: 28.05.2012 12:35:08 * Author: Rene */ #define F_CPU 8000000 #define BAUD 9600 #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) #include <avr/io.h> #include <avr/interrupt.h> void uart_init(void) { // Baudrate einstellen (Normaler Modus) UBRRH = (uint8_t) (UBRR_BAUD>>8); UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff); // oder einfacher: // UBRR = UBRR_BAUD; // Aktivieren von receiver und transmitter UCSRB = (1<<RXEN)|(1<<TXEN); // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); } int main(void) { uint8_t buffer; // USART initialisieren uart_init(); while (1) { // Warten bis Daten empfangen wurden while ( !(UCSRA & (1<<RXC)) ) ; // Empfangsregister auslesen buffer = UDR; // Warten bis der Sendepuffer frei ist while ( !( UCSRA & (1<<UDRE)) ) ; // Daten in den Puffer schreiben und damit senden UDR = "v"; } }
Schon ∗überprüft∗ ob der wirklich mit 8MHz läuft? Und:
> UDR = "v";
^ ^
..macht nicht das was Du denkst dass es macht.
So der lauft wirklich mit 8Mhz. Auf dem Pollin Evolution bord ist noch ein 16 Mhz querz wir kann ich den verwenden?
> 16 Mhz querz wir kann ich den verwenden
Im Prinzip ja, ist aber erstens auch nicht besser und wird Dir zweitens
obige (fehlerhafte) Zuweisung auch nicht korrigieren. Bring erst mal
jene in Ordnung sonst wirst Du auch weiterhin kein 'v' nicht zu sehen
kriegen.
Jobst M. schrieb: > Und dann ist schon Schluß? Rene3233 schrieb: > Ne dan ist nicht schluss das geht undendlich so weiter habe ja im > programm eine dauerschleife drinn. Das war eigentlich auch ehr ironisch gemeint. Ein einziges Zeichen hätte auch gereicht. > Der holt sich den takt aus dem internen qaerz. Intern befindet sich gar kein Quarz, sondern nur ein Oszillator, welcher nicht unbedingt genau ist. Und das ist auch schon Dein Fehler! ... wenn nicht noch weitere vorhanden sind ... Gruß Jobst
Bekommst Du beim Übersetzen eine Medlung bei UDR = "v"; ? Ich würde sagen: UDR = 'v'; cu Georg
Nachdem ich vorher nicht aktualisieren gedrückt habe und den Beitrag weiter oben übersehen habe, hier die Info: "v" ist eine Zeichenkette/String mit zwei Zeichen. Einmal das 'v' und einmal das Stringendezeichen '\0' oder 0x00. 'v' ist die Schreibweise eines Zeichens und somit nur ein Byte mit 'v'. PS: An alle C-Experten: Falls jemand ein bessere Erklärung hat, dann her damit. cu Georg
Hi, anbei mal der C-Code wie es funktionieren sollte. Ansonsten solltest du mal ins Datenblatt schauen, da sind Beispiele in ASM und C, darauf kannst du ja dann aufbauen.
Alternativ, einfach das Warten auf ein Zeichen Rausnehmen und keinen String senden:
1 | while (1) |
2 | {
|
3 | // Warten bis der Sendepuffer frei ist
|
4 | while ( !( UCSRA & (1<<UDRE)) ) |
5 | ;
|
6 | |
7 | // Daten in den Puffer schreiben und damit senden
|
8 | UDR = 'v'; |
9 | }
|
cu Georg
Was Du möglicherweise noch nicht verstanden hast, Rene, ist der Unterschied in der Notation. Ein 'v' in einfachen Anführungszeichen ist genau ein Zeichen, nämlich das Vau. Ein "v" in doppelten Anführungszeichen ist eine Zeichenkette, ein String, bestehend aus einem 'v' und einer '\0' In das UDR Register passen bloss 8 Bit, also genau ein Zeichen. Deswegen ist es ein Unterschied ob Du UDR = "v" schreibst oder UDR = 'v'.
Ja, der unterschied sollte im wesendlichen zwischen dem '(zeiche)' und bei dir halt "(zeichen)" sein, wie ein Vorposter schon geschrieben hatte. Falls da troz '(zeichen)' noch immer nur komisches Zeug rauskommt, stimmt wahrscheinlich die Taktfrequenz nicht. In dem Fall kannst du nochmal die FUSE-Bits checken, oder testweise mal #define F_CPU auf 1000000 setzen, das wäre der Takt im auslieferungszustand des AVRs.
ok so jetzt funktioniert es danke an alle nur noch eine wie sende ich jetzt daten an den mircocontroler habe zum empfängen einfach putty genommen wen ich aber was eigebe und enter drücke passiert nix ich komme uach in keine neue zeile. Im programm sende ich die empfangenen daten einfach zürück. while (1) { // Warten bis Daten empfangen wurden while ( !(UCSRA & (1<<RXC)) ) ; // Empfangsregister auslesen buffer = UDR; // Warten bis der Sendepuffer frei ist while ( !( UCSRA & (1<<UDRE)) ) ; // Daten in den Puffer schreiben und damit senden //USART_transmit(0b01000001); USART_transmit(buffer); } void USART_transmit (unsigned char c) { UDR = c; }
Putty sendet einfach alles was du eingibst per UART an den ATmega8, und zeigt nur an was per UART reinkommt. Da senden ja funktioniert, sollte die Verbindung ja OK sein, aber falls möglich, kannst du ja mal testweise an der Hardware mit der du Programmierst die PINs RX und TX verbinden, dann sollte Putty alles anzeigen was du eintippst, falls es das tut, stimmt etwas mit deinem Programm nicht.
Ok das funktioniert soweit jetzt alles großen danke nur wenn ich das empfangende wieder sende dan funktioniert es nur ein einziges mal und dan nicht mehr. Hat jemand tipps?
Hi Rene, ich hab da mal eine Frage. Im Code steht sauberes Deutsch, also auch Groß-und Kleinschrift. In deinen Texten ... na ja, da brauch ich nix zu sagen. Wie kommt das ? Also, von C&P lernst du nicht viel. Arbeite mal die Tutorials durch, da steht viel zu dem Thema drin. Gruß oldmax
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.