Hallo ich versuche hier für ein Projekt mein Display (EA SER204-NLED)
über mein ATmega 32 - Testboard anzusprechen.
Mein Problem:
Das senden per UART an z.B. Hyper Terminal funktioniert einwandfrei
(ascii oder hex - je nach dem). Ich kann auch vom Hyper Terminal das
Display ansteuern und alles wird korrekt dargestellt. Warum kann ich
aufs HT senden aber nicht auf das Display bzw. warum wirds nicht
angezeigt? Es tut sich rein gar nichts.
schicke anbei noch ein paar code Sequenzen:
1
intmain(void)
2
{
3
UART_init();
4
5
//Umleiten der Standardausgabe stdout fuer printf
6
stdout=&mystdout;
7
8
while(1)
9
{
10
11
uint8_tzeichen="TestTest";// soll ans LCD gesendet werden
//Interruptbehandlung auslösen (Daten werden zwischengespeichert)
47
48
UCSRC|=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
49
//Uebertragungsformat konfigurieren
50
}
Ich weiss, es nicht besonders aufwendig und sicherlich ein trivialer
Fehler. Vermute, dass es Probleme mit den Datentypen gibt. Vor allem
weiss ich nicht ob ich noch irgendwas bzgl. des Übertragungsformates
(8 Datenbits, 1 Stopbit, no Parity) zu beachten habe!
Hoffe jemand kann mir helfen ...
MfG
Otto
Moin Daniel,
erstmal danke, aber nein. Ich habe schon jegliche Möglichkeit
ausgeschöpft was die Endung des Zeichensatzes angeht!
Noch was zum senden:
Ich sende die Daten ja immer im Sekunden Takt rüber und irgendwie ist
das auch zu "hören", denn jedesmal wenn gesendet wird höre ich ein
leises Piepen vom Display, keine Ahnung ob das ein gutes oder ein böses
Piepen ist.
Vielleicht hast du ja noch ne Idee..
Ähm
printf ("%s",_zeichen);
%s ist für Strings. Du hast keinen String. Du hast ein einzelnes Zeichen
denn _zeichen ist vom Datentyp her ein uint8_t
printf ("%c",_zeichen);
Die ganze Funktion ist Käse, so wie du sie verwendest. Du möchtest
nämlich einen String versenden. Dann musst du der Funktion aber auch
sagen, das das ws hereinkommt ein String ist und kein einzelnes Zeichen.
1
voidsend_ascii_to_term(uint8_t*_zeichen)
2
{
3
printf("%s",_zeichen);
4
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
5
}
und gewöhn die Variablennamen mit führendem _ ab. Die sind für den
Compiler bzw. seine Header Files reserviert.
Moin,
danke für die Resonanz,
@ K:-H. B.: Ich habe die Funktion auch bereits geändert.
1
voidsend_ascii_to_term(uint8_t*_zeichen)
2
{
3
4
uint8_tx=0;
5
6
while(_zeichen[x])
7
putchar(_zeichen[x++]);
8
}
@Daniel: eine Initialisierung ist nicht vorhanden, ich bin davon
ausgegangen, dass weil es ja über das HP auch so funktioniert, es doch
auch über die UART funktionieren muss, schließlich werden die korrekten
Zeichen im HT angezeigt! Baudrate passt (9600)!
Dann nochmal 2 Fragen:
Kann ich das denn einfach über printf() senden oder muss ich evtl eine
Funktion names sprintf() benutzen?
Muss ich meine Daten irgendwie anpassen um in das UART Sendemuster von:
1 Startbit, 8 Datenbits und 1 Stopbit reinzupasen?
Bin im Bereich Microcontroller noch recht neu also bitte etwas
Verständnis für meine, euch evtl. lächerlich vorkommenden, Fragen.
Danke.
Otto Bastian schrieb:> Das senden per UART an z.B. Hyper Terminal funktioniert einwandfrei> (ascii oder hex - je nach dem). Ich kann auch vom Hyper Terminal das> Display ansteuern und alles wird korrekt dargestellt. Warum kann ich> aufs HT senden aber nicht auf das Display bzw. warum wirds nicht> angezeigt? Es tut sich rein gar nichts.>> schicke anbei noch ein paar code Sequenzen:
Leider kann man aus Codeschnipsel, die dann auch noch falsch zitiert
werden (siehe dein letzte Beitrag), nicht viel rauslesen, wie du merkst.
Ich habe mit RS232-Displays noch nicht gearbeitet, aber aus dem
Datenblatt entnehme ich, dass es verschiedene Betriebsmodi gibt
(autoscroll, etc.), die man erstmal einstellen sollte.
Wenn es mit dem Hyperterminal an das Display funktioniert, dann ist die
Frage, was funktioniert? Einzelne Zeichen senden, beschreiben beider
Zeilen etc. ?? Ist der Test vergleichber mit dem µC Betrieb?
Braucht das Display eventuell Zeitpausen zwischen den einzelnen Zeichen
etc..??
Wieso piept das Display? Was sagt das Datenblatt dazu? Kann man einen
Piepser ansteuern? Dann hast du vielleicht die falsche Zeichenfolge
erwischt...???
Fragen über Fragen...
Moin, ich weiss nicht was daran so schwer zu verstehen ist..
>Das senden per UART an z.B. Hyper Terminal funktioniert einwandfrei>(ascii oder hex - je nach dem). Ich kann auch vom Hyper Terminal das>Display ansteuern und alles wird korrekt dargestellt.
...aber ich erklär es gerne: Ich kann das Display mit Zeichen Füllen
(über das HT) an jeder denkbaren Stelle und kann über Hex-Werte
Initialisierungen vornehmen (Cursor soll blinken etc.).
>Wieso piept das Display? Was sagt das Datenblatt dazu? Kann man einen>Piepser ansteuern? Dann hast du vielleicht die falsche Zeichenfolge>erwischt...???
Das Piepen tauch immer auf, egal was ich sende! Aber das sagt mir ja das
ich iwas richtig mache, denn es kommen anscheinend Daten an!!! Es gibt
keinen Summer oder ähnliches an dem Display, Man könnte aber einen
nachträgich anbauen soweit ich gelesen habe - das steht hier aber ja
nicht zur Debatte.
>Braucht das Display eventuell Zeitpausen zwischen den einzelnen Zeichen>etc..??
Ich sende ja schon meinen Zeichensatz mit Pausen aber zwischen den
einzelnen Zeichen ist das nicht nötig ich muss doch das ganze Paket in
eins rüberschicken, oder sehe ich das falsch? Habe im Datenblatt auch
nichts derartiges gelesen.
möchte an dieser stelle nochmal auf die beiden vorherigen Fragen
hinweisen!
danke
Otto Bastian schrieb:> Das Piepen tauch immer auf, egal was ich sende!
Das Piepen ist höchst wahrscheinlich daher gekommen, dass du mit
1
voidsend_ascii_to_term(uint8_t_zeichen)
2
{
3
printf("%s",_zeichen);
4
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
5
}
nicht die Zeichen, sondern irgendwelche Speicherbereiche an das LCD
geschickt hast. _zeichen war kein Pointer auf den Anfang des Textes.
Da es aber unwahrscheinlich ist, dass da irgendwas Vernünftiges
drinnenstand, werden da jede Menge nicht darstellbarer ASCII Zeichen an
das LCD geschickt worden sein (wahrscheinlich lauter 0), die den
Prozessor im LCD zum piepsen veranlasst haben.
und klappts damit?
> Dann nochmal 2 Fragen:> Kann ich das denn einfach über printf() senden
Wenn du den Stream Setup so benutzt hast, dass die Zeichen von printf
über die UART ausgegeben werden, dann spricht nichts dagegen. Du musst
printf nur richtig bedienen.
In dem Zusamenhang: Sieh dir nach jedem Compilerlauf an, ob du Errors
oder Warnings hast. Als Anfänger solltest du dringend jegliche Warnung
wie einen Fehler behandeln und dem nachgehen. Ich kann mir nämlich nicht
vorstellen, dass dein Compiler zum urpsrünglichen nichts zu sagen hatte.
> Muss ich meine Daten irgendwie anpassen um in das UART Sendemuster von:> 1 Startbit, 8 Datenbits und 1 Stopbit reinzupasen?
Nein.
Danke Karl-heinz,
mit der neuen Funktion erscheint zwar immer noch nichts auf dem Display
jedoch hat sich das Piepen zu einem klicken gewandelt als ob ein Relais
schaltet (ein klitze-kleines Relais ). Auf dem HT getestet erscheint
jedoch alles zu meiner Zufriedenheit.
>Du musst printf nur richtig bedienen.
Ich benutze ja jetzt gar kein Printf mehr wenn ich es über die putchar
Geschichte mache. Allerdings zeigt der Compiler eine Warnung in der
steht das 'mystdout' definiert ist, jedoch nicht verwendet wird!
Hier nochmal die wichtigesten Definitionen:
der Stream ist im Header folgendermaßen definiet:
Ja, wie war die Lösung?
Ich werde das gleiche Problem haben weil ich auch noch so ein Display
rumfliegen habe. Da nutze ich natürlich gerne Deine Erfahrungen.
Gruß
ReinHerR
>Und die Lösung war...?
Ach jo Sorry, mein Problem war rein hardwaremäßig.
Programm, so einfach es auch ist, war korrekt.
Ihr werdet lachen aber ich habe Displayseitig Rx und Tx getauscht dann
ging es ;)
Hab mich halt einfach drauf verlassen das es wie beim PC ist und als ich
mit dem Scope gesehen hatte, dass die Spg zusammenbricht, ist dann alles
sehr schnell gegangen!
Also ich hoffe es hilft weiter immerhin sind einige Fehlerquellen
angesprochen worden und so evtl als Hilfe für z.B. dich ReinHerR
dienlich.
Danke an alle die sich hier beteiligt haben!