Forum: Mikrocontroller und Digitale Elektronik Über UART Display (EA SER204-NLED) ansprechen


von Otto Bastian (Gast)


Lesenswert?

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
int main (void)
2
 { 
3
  UART_init();
4
5
  //Umleiten der Standardausgabe stdout fuer printf
6
  stdout = &mystdout;
7
8
 while(1)
9
{    
10
   
11
  uint8_t zeichen ="TestTest";    // soll ans LCD gesendet werden
12
  send_ascii_to_term(zeichen);
13
 
14
15
  _wait();                     //wartet 1 sec bis zum nächsten senden
16
17
}
18
19
//******************************************************************
20
21
22
void send_ascii_to_term(uint8_t _zeichen)
23
{
24
   printf ("%s",_zeichen);
25
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
26
}
27
28
//******************************************************************
29
30
//UART Init Funktion
31
32
void UART_init ()
33
{
34
  uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU / ((16*BAUDRATE)-1));
35
  UBRRH = (uint8_t)(ubrr >> 8);
36
  UBRRL = (uint8_t)(ubrr);
37
  //Baudrate einstellen
38
39
  UCSRB |= (1<<TXEN); 
40
  //senden ein
41
42
  UCSRB |= (1<<RXEN); 
43
  //empfangen ein
44
45
  UCSRB |= (1<<RXCIE); 
46
  //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

von Daniel V. (danvet)


Lesenswert?

Eventuell fehlt noch ein '\r' oder '\n' am Zeilenende..???

von Otto Bastian (Gast)


Lesenswert?

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

von Spess53 (Gast)


Lesenswert?

Hi

Sind auf deinem µC-Board auch die Brücken (RTS-CTS,DSR-DTR-DCD) 
vorhanden?

MfG Spess

von Daniel V. (danvet)


Lesenswert?

Ich vermisse die Initialisierungsroutine für das Display.
Stimmt die Baudrate?
Wie sieht dein printf aus?

Edit: Käse, was ich geschrieben hab.

von Karl H. (kbuchegg)


Lesenswert?

Ä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);

von Karl H. (kbuchegg)


Lesenswert?

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

von Otto Bastian (Gast)


Lesenswert?

Moin,

danke für die Resonanz,

@ K:-H. B.: Ich habe die Funktion auch bereits geändert.
1
void send_ascii_to_term(uint8_t *_zeichen)
2
{
3
  
4
  uint8_t x=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.

von Daniel V. (danvet)


Lesenswert?

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

von Otto Bastian (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

Otto Bastian schrieb:

> Das Piepen tauch immer auf, egal was ich sende!

Das Piepen ist höchst wahrscheinlich daher gekommen, dass du mit
1
void send_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.

von Karl H. (kbuchegg)


Lesenswert?

Otto Bastian schrieb:

> @ K:-H. B.: Ich habe die Funktion auch bereits geändert.
>
1
> void send_ascii_to_term(uint8_t *_zeichen)
2
> {
3
> 
4
>   uint8_t x=0;
5
> 
6
>   while (_zeichen[x])
7
>     putchar (_zeichen[x++]);
8
> }

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.

von Otto Bastian (Gast)


Lesenswert?

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:
1
int uart_putchar(char c, FILE *stream);
2
3
//  Umleiten der Standardausgabe stdout (Teil 1)
4
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );

Aufruf im Source File so:
1
int uart_putchar( char c, FILE *stream )
2
{
3
  if( c == '\n' )
4
    uart_putchar( '\r',stream);
5
 
6
  loop_until_bit_is_set( UCSRA, UDRE );
7
  UDR = c;
8
  return 0;
9
}


Hier nocheinmal der Aufruf im void main()
1
void main()
2
{
3
4
while(1)
5
  {    
6
   
7
8
  //Welcher Wert soll auf dem Display erscheinen?
9
10
  uint8_t ascii_zeichen[] ="Uarttest";
11
12
  send_ascii_to_term(ascii_zeichen);
13
14
  }
15
16
}

hoffe es ist einigermaßen durschaubar

von Otto Bastian (Gast)


Lesenswert?

Hat sich erledigt.. Problem gelöst, senden aufs Display klappt nun.
Danke für die Hilfe

von Daniel V. (danvet)


Lesenswert?

Otto Bastian schrieb:
> Hat sich erledigt.. Problem gelöst, senden aufs Display klappt nun.
> Danke für die Hilfe

Und die Lösung war...?

von ReinHerR (Gast)


Lesenswert?

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

von Otto Bastian (Gast)


Lesenswert?

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

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.