Hallo an alle, ich versuche schon seit ein paar Tagen mit dem Laptop über uart Zeichen an den atmega8 zu senden ( mit minicom / linux). Der atmega8 soll dann die Zeichen einfach mal auf einem LCD anzeigen. Leider klappt das nicht so ganz. Frage 1 . Was für Zeichen werden eigentlich über den uart gesendet ( int oder ascii ) ? Frage 2: Nachdem ich schon das uart-tutorial hier von µCnet durchgemacht hab, ausserdem die uart-routinen von peter fleury ausprobiert hab und dadurch vollends durcheinander gekommen bin... hat jemand einen funktionierenden Beispielcode für mich ( bitte in C). ?
Teile und herrsche! d.h. spalte dein Projekt in kleinere Portionen auf und teste deren Funktion. Funktioniert die LCD Ausgabe grundsätzlich nicht oder nur in diesem Fall nicht? Keine Ahnung? Dann lasse die LCD Ausgabe weg. Ob der AVR empfängt oder nicht kann man mit einer LED anzeigen. Funktioniert die RS232-Strecke zwischen Atmega8 und Linux-Rechner oder nicht? Keine Ahnung? Dann mache den Looptest. Atmega aus dem Sockel nehmen und Drahtbrücke zwischen RXD und TXD pin im Sockel. Alles was der Linux-Rechner jetzt sendet muss der Linux-Rechner wieder empfangen. Funktioniert sind die RX/TX Leitungen auf der RS232-Strecke zwischen Atmega8 und Linux-Rechner gekreuzt (Nullmodemkabel) oder nicht (1:1 Verbindung)? Keine Ahnung? Dann verwende die Spion-LED. Atmega8 noch rausgezogen und LED so anbringen: AVR-Sockel R >150 Ohm RXD o----|>---###---o GND LED-rot 20 mA Die LED muss leuchten, wenn der Linux-Rechner nix sendet (vom Linuxrechner her kommender TTL Ruhepegel ist HIGH) und flackern, wenn der Linux-Rechner sendet. Alle Tests erfolgreich? Dann weisst du jetzt an der Hardware ausserhalb des AVRs hängt es mal nicht. Jetzt kann das Programm im AVR zicken oder das Programm ist grundsätzlich OK, aber der Baudratenfehler ist zu groß. Letzteres kann man mit einer genauen Taktquelle (externer Quarz) in den Griff bekommen. Funktionieren die Baudraten- und Datenformat-Einstellungen, die bei AVR und Linux gleich sein müssen? Keine Ahnung? Dann mache den Echotest: Schicke alles was der AVR empfängt wieder auf den Sender zurück. Das macht aber erst dann Sinn, wenn dir vorhergehenden Punkte erfolgreich abgeklärt sind. Ein Echotest-Programm ist im µC-net Wiki.
Also, minicom ist zwar nett, aber versuch erstmal, dich mit HTerm (http://www.der-hammer.info/terminal/) auseinanderzusetzen. Bietet eine GTK+-GUI und ist kinderleicht bedienbar - und ist auch hauptsächlich für Deine Zwecke da - minicom ist ja eigentlich für serielle Modems. Wenn's damit auch nicht klappt, melde dich wieder ;) Übrigens: Für den Anfang empfehle ich, UART ohne(!) Interrupts einzusetzen. Dazu kann man sich wunderbar am Code hier im Wiki (unter GCC-Tutorial - UART) orientieren. Wenn man's nicht direkt hier über die Seite findet, hilft Google weiter - ist meist übersichtlicher als die Suchergebnisse direkt von hier. ~void~
@ Krapao Das LCD funktioniert einwandfrei. Ich kann aus dem Programmspeicher aufs Display schreiben. Krapao schrieb: > Ob der AVR empfängt > oder nicht kann man mit einer LED anzeigen. Ok. Wie ? Zur RS232 Strecke... Ich hab hier ein mysmartUSB. Kein RS232 . Wenn ich mit minicom eine Taste drücke, blinken die grünen LEDs darauf kurz auf. Also irgendwas geht da schon. Ich vermute, Daß es an der initialisierung des uart am atmega liegt... Oder an der Baudratenberechnung... Krapao schrieb: > Atmega aus dem Sockel > nehmen und Drahtbrücke zwischen RXD und TXD pin im Sockel. Verträgt das der mysmartUSB ? ich acker das jetzt erstmal durch. Danke, auch an theVoid
Das mysmartUSB ist erstmal ein ISP-Programmer und ein serielles Interface. Ein LCD kann man da nicht ohne weiteres anschliessen (außer mit vielen Klimmzügen). "Our USB-programmer mySmartUSB is produced in SMD-technologie, fully equipped and allows you to program an AVR-microcontroller and to communicate with it via UART, TWI or ISP." http://shop.myavr.com/index.php?sp=article.sp.php&artID=42 Ich denke du hast noch ein weiteres Board auf dem sich der Atmega8 befindet. Dieses Board meine ich mit "AVR aus dem Sockel nehmen". Wenn du Bedenken hast, ob der serielle Pegelwandler auf dem mysmartUSB ~20 mA für die LED liefern kann, nimm eine Low-Current-LED und einen 1.5K Widerstand und du bist bei ~2mA. Das sollte der Adapter auf jeden Fall packen. Du kannst auch mit der normalen LED und einem größeren Vorwiderstand arbeiten und aus der prallen Sonne rausgehen :-) Auch mit 5-10 mA sollte man bei normalem Bastlerlicht im Hobbykeller allemal ein Leuchten sehen. > ich vermute, Daß es an der initialisierung des uart am atmega liegt... > Oder an der Baudratenberechnung... Beides kann kein Mensch hier kontrollieren.
ok, hterm funktioniert. Die Sache mit der Drahtbrücke auch. Da kommt genau das zum laptop / hterm zurück, was ich losschicke. ich poste jetzt einfach mal meine main.c Aber ich muss euch warnen: Vor lauter probieren hab ich sie wahrscheinlich vollends versaut...
@ Krapao Ja klar hab ich da noch ein anderes Board. ( war jetzt bloß zu langsam...sorry) Das Ding heißt myavr mk2. Das Display ist auch von myavr. (Alles zusammen gekauft - die SIND kompatibel). Der Code in der main.c ( Posting weiter oben) ist eigentlich im großen und ganzen aus m avr-uart tutorial übernommen. Allerdings steht dort, die initialisierung sei fpr atmega16 oder so. Im Datenblatt vom m8 steht dann was ganz anderes, weil die das dort im beispiel mit 2 stoppbits initialisieren.
> uint8_t c; > c = uart_getc(); > LCDWrite("emfangen: "); > LCDWrite(c); IIIIHHHHH - Da ist ein Bug! Du kannst mit einer C-Funktion nicht einmal einen String ausgeben und das nächste Mal ein einzelnes Zeichen. > void uart_init(void) > { > UCSRB |= (1<<TXEN) | (1<<RXEN); > UCSRC = (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); > } Da fehlt das Setzen der Baudrate komplett!
Hi das ist nicht dein Ernst.... >Frage 1 . Was für Zeichen werden eigentlich über den uart gesendet ( int >oder ascii ) ? Der UART sendet Bytes ! Wie du diese definierst ist ganz allein dein Problem. Beispiel: Hex 30 ist ASCII "0" Integer 48 BIT-Muster 00110000 Eine 16Bit Integer ist das Ergebnis aus 2 Bytes usw. Also, alle Zahlenformate sind irgendwie aus Bytes zusammengesetzt. Wenn du 3,74555 als Real-Zahl versendest, sind i.d.R. 8 Bytes daran beteiligt. Gruß oldmax
ok. danke für die antworten, ich muss das mal in ruhe noch mal anschauen. Krapao schrieb: > Da fehlt das Setzen der Baudrate komplett! ??? gilt das hier nicht ?
1 | // hier Makro für die Baudratenberechnung |
2 | |
3 | #define BAUD 9600UL // Baudrate |
4 | #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) |
5 | #define UBRR UBRR_BAUD |
Nein das gilt nicht. Das berechnet in den ersten beiden Zeilen den Wert UBRR_BAUD, der für eine gegebene Taktrate F_CPU und eine gewünschte Baudrate BAUD in das Baudratenregister UBRR des UART geschrieben werden muss. Die dritte Zeile ist -sorry- Quatsch! Da sollte der C-Compiler sich eigentlich mit einer Warnung gemeldet haben, weil du das Spezialregister UBRR umdefinierst. Per Makro kannst du die Zuweisung nach UBRR nicht machen. Das muss eine Anweisung im Programmcode sein, so wie es auch im Tutorial gezeigt ist: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART#UART_initialisieren
Also ich hab jeztz noch mal völlig neu angefangen. im Anhang die main.c ich kann jetzt immerhin schon vom flash des avr auf den/die/das hterm schreiben. Umgekehrt geht zwar auch schon irgendwas, aber nicht das was soll. Ich habe das Gefühl, dass ich beim senden mit hterm den buffer2 ( im quellcode) vollschreibe. Und wenn der voll ist, geht nix mehr. Auch wenn ich ihn nicht vollschreibe, liefert das display nur müll. ( aber immerhin es reagiert schon mal). Kann bitte jemand die main.c durchschauen. wahrscheinlich ist da nicht nur ein fehler drin... :( danke im vorraus
Krapao schrieb: >> LCDWrite(c); > > IIIIHHHHH - Da ist ein Bug! hast Du das gelesen? hast du es verstanden? hast Du dein Programm entsprechend korrigiert? hast du ein C-Buch?
Walter schrieb: > hast Du das gelesen? > hast du es verstanden? > hast Du dein Programm entsprechend korrigiert? > hast du ein C-Buch? zu 1. ja. zu 2. nicht wirklich. zu 3. ja. Die oben erwähnte Zeile kommt überhaupt nicht mehr vor, oder ? zu 4. ja. ich habe ein c-Buch.
Giuseppe B. schrieb: > zu 3. ja. Die oben erwähnte Zeile kommt überhaupt nicht mehr vor, oder ? Nein, aber das selbe Problem ist immer noch vorhanden:
1 | LCDWrite("hello sent"); |
2 | ...
|
3 | LCDWrite(buffer2[i]); |
Du rufst die selbe Funktion einmal mit einem Pointer auf einen String auf, und einmal mit einem einzelnen Zeichen. Und da wir hier in C und nicht C++ sind, kann das auf gar keinen Fall funktionieren.
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.