Forum: Mikrocontroller und Digitale Elektronik atmega8, c, minicom und uart


von Giuseppe B. (brungi)


Lesenswert?

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). ?

von Krapao (Gast)


Lesenswert?

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.

von theVoid (Gast)


Lesenswert?

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~

von Giuseppe B. (brungi)


Lesenswert?

@ 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

von Krapao (Gast)


Lesenswert?

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.

von Giuseppe B. (brungi)


Angehängte Dateien:

Lesenswert?

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...

von Giuseppe B. (brungi)


Lesenswert?

@ 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.

von Krapao (Gast)


Lesenswert?

>    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!

von oldmax (Gast)


Lesenswert?

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

von Giuseppe B. (brungi)


Lesenswert?

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

von Krapao (Gast)


Lesenswert?

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

von Giuseppe B. (brungi)


Angehängte Dateien:

Lesenswert?

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

von Walter (Gast)


Lesenswert?

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?

von Giuseppe B. (brungi)


Lesenswert?

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.

von Stefan E. (sternst)


Lesenswert?

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
Noch kein Account? Hier anmelden.