www.mikrocontroller.net

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


Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int main (void)
 { 
  UART_init();

  //Umleiten der Standardausgabe stdout fuer printf
  stdout = &mystdout;

 while(1)
{    
   
  uint8_t zeichen ="TestTest";    // soll ans LCD gesendet werden
  send_ascii_to_term(zeichen);
 

  _wait();                     //wartet 1 sec bis zum nächsten senden

}

//******************************************************************


void send_ascii_to_term(uint8_t _zeichen)
{
   printf ("%s",_zeichen);
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
}

//******************************************************************

//UART Init Funktion

void UART_init ()
{
  uint16_t ubrr = (uint16_t) ((uint32_t)F_CPU / ((16*BAUDRATE)-1));
  UBRRH = (uint8_t)(ubrr >> 8);
  UBRRL = (uint8_t)(ubrr);
  //Baudrate einstellen

  UCSRB |= (1<<TXEN); 
  //senden ein

  UCSRB |= (1<<RXEN); 
  //empfangen ein

  UCSRB |= (1<<RXCIE); 
  //Interruptbehandlung auslösen (Daten werden zwischengespeichert)

  UCSRC |= (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1); 
  //Uebertragungsformat konfigurieren
}


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

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eventuell fehlt noch ein '\r' oder '\n' am Zeilenende..???

Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: Spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

MfG Spess

Autor: Daniel V. (danvet)
Datum:

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

Edit: Käse, was ich geschrieben hab.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

void send_ascii_to_term(uint8_t* _zeichen)
{
   printf ("%s",_zeichen);
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
}

und gewöhn die Variablennamen mit führendem _ ab. Die sind für den 
Compiler bzw. seine Header Files reserviert.

Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

danke für die Resonanz,

@ K:-H. B.: Ich habe die Funktion auch bereits geändert.
void send_ascii_to_term(uint8_t *_zeichen)
{
  
  uint8_t x=0;
  
  while (_zeichen[x])
    putchar (_zeichen[x++]);
}

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

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Otto Bastian schrieb:

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

Das Piepen ist höchst wahrscheinlich daher gekommen, dass du mit
void send_ascii_to_term(uint8_t _zeichen)
{
   printf ("%s",_zeichen);
//für die Verwendung von printf über UART wurden entsprechende Funktionen verwendent!
}

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Otto Bastian schrieb:

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

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.

Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int uart_putchar(char c, FILE *stream);

//  Umleiten der Standardausgabe stdout (Teil 1)
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );

Aufruf im Source File so:
int uart_putchar( char c, FILE *stream )
{
  if( c == '\n' )
    uart_putchar( '\r',stream);
 
  loop_until_bit_is_set( UCSRA, UDRE );
  UDR = c;
  return 0;
}


Hier nocheinmal der Aufruf im void main()
void main()
{

while(1)
  {    
   

  //Welcher Wert soll auf dem Display erscheinen?

  uint8_t ascii_zeichen[] ="Uarttest";

  send_ascii_to_term(ascii_zeichen);

  }

}

hoffe es ist einigermaßen durschaubar

Autor: Otto Bastian (Gast)
Datum:

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

Autor: Daniel V. (danvet)
Datum:

Bewertung
0 lesenswert
nicht 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...?

Autor: ReinHerR (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Otto Bastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.