Über UART Display (EA SER204-NLED) ansprechen

Gast #1863178
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
Gast #1864314
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..
#1864396
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.
Gast #1864430
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.
#1864444
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...
Gast #1864474
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
#1864515
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.
#1864522
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.
Gast #1864588
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
Gast #1869901
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren