Hallo,
habe ein LED Display, welches ich über einen ATmega ansteuere. Das
Display benötigt folgende Mitgabeparameter zum ansterern:
<ID00><L1><PB><FE><MC><WC><FE>a14<E>
Der eigentliche Text in diesem Beispiel ist ein 'a', welches am Display
angezeigt wird, die 14 dahinter ist die Hexzahl von 'a' ver XOR mit 0x75
ergibt 14.
Nun mein Problem, wenn ich diesen String vom Mikrocontroller an das
Display schicke funktiniert es nicht. Wenn ich jedoch den selben String
via Terminal sende funktioniert es. Wie kann das sein, hab auch schon
versucht den Code des Mikrocontrollers zu empfangen, er ist der selbe.
Was könnte der fehler sein, bin ratlos. Bitte um Antworten, danke.
MfG Sabine
Ein LED Display der Firma Lunartec, mit 350 LEDs. Habe schon alles
versucht. Verstehe nicht woran es liegen kann, der Controller sendet,
hab es mit einem zweiten Terminal probiert.
Silvan König schrieb:> Hast du das Display mit dem Controller verbunden?
Ja, habe den Controller natürlich verbunden.
Nochmal: Wenn die Zeichen direkt vom Mikrocontroller an das LED -
Display gesendet werden, dann funktiniert nichts. Wenn man jedoch die
Zeichen mit einem anderen Terminal empfängt und dann an das Display
weitersendet (siehe Screenshot), dann funktiniert es ohne Probleme. Bin
am verzweifeln :(.
//char text[1000]="<27>x1<27>P<27>p0<27>k1<27>EGespeicherter Auftrag:<27>F 1/20 von LWZ<\r><\n><27>EEinsatznummer:<27>F E120300300 2012-03-08 13:20:21<\r><\n>----------------------------------------------------------------------<\r><\n><27>EEinsatzort:<27>F MICHELDORF IN OBER?STERREICH <\r><\n>MICHELDORF-IN-OBER?STERREICH: @MICHELDORF IN OBER?STERREICH<\r><\n><\r><\n><27>EEinsatzart:<27>F PERSONENRETTUNG<\r><\n><27>EAlarmstufe:<27>F 1<\r><\n><\r><\n><27>EName: <27>F <\r><\n><\r><\n><27>EAlarmtext: <27>F PERSON IN KREMS GEFALLLEN ALTE SPITALSTR 1<\r><\n><\r><\n><27>EAnrufer: <27>F 07582635810<\r><\n><27>EProgramm: <27>FFeuer<\r><\n><27>EAusger?ckt:<27>F 2012-03-08 13:24:54<\r><\n><27>EBeendet:<27>F 2012-03-08 13:57:10<\r><\n><\r><\n>======================================================================<\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n><\r><\n>"; //Text StringArray....noch probleme bei der größe
Sabine F. schrieb:> Doch, es ist natürlich lesbarer, jedoch bin ich noch eine Anfängerin,> sry.
dann solltest du erstmal ein paar übungen zur string verarbeitung in C
machen. (am besten auf eine PC ).
Dann kann man auch das noch lesbarer machen:
1
ftext[fzeiger]='A';
2
ftext[fzeiger+1]='l';
3
ftext[fzeiger+2]='a';
4
ftext[fzeiger+3]='r';
5
ftext[fzeiger+4]='m';
6
ftext[fzeiger+5]='t';
7
ftext[fzeiger+6]='e';
8
ftext[fzeiger+7]='x';
9
ftext[fzeiger+8]='t';
10
ftext[fzeiger+9]=':';
11
ftext[fzeiger+10]=' ';
12
fzeiger=fzeiger+11;
kann man lesbarer so schreiben:
1
strncpy(ftext+fzeiger,"Alarmtext: ",11);
das hilft aber leider nicht bei deinem Problem - es muss ein unterschied
geben zwischen dem was du sendest und was der µC sendet - anders ist das
nicht zu erklären.
Wenn ich vom Mikrocontroller etwas empfangene, und das gleiche dann
sende (mit kopieren als ASCII), dann funktiniert es.
<ID00><L1><PB><FE><MC><WC><FE>a14<E> ... empfangen
<ID00><L1><PB><FE><MC><WC><FE>a14<E> ... gesendet
Versteh nicht warum es durch senden via Terminal an das Display
funktiniert und direkt über den Mikrocontroller nicht, obwohl das selbe
(zumindest sieht es so aus) gesendet wird.
Sendet das Terminal die Daten anders?
100% richtig angeschlossen.
Peter II schrieb:> stimmt denn die Hardware? oder kann es sein das die spannung vom µC> nicht zum display passt?
Die Hardware funktiniert sonst einwandfrei. Spannung vom µC != Spannung
Display???
Verstehe nicht was Sie meinen. Das Display wird mit einer externen
Stromversorgung betrieben.
Sabine F. schrieb:> Wenn ich vom Mikrocontroller etwas empfangene, und das gleiche dann> sende (mit kopieren als ASCII), dann funktiniert es.
Bau doch mal beim Senden zwischen den einzelnen Zeichen ein bisschen
Pause ein.
Kannst du das Timing vom UART beim Atmega mit einem Oszi anschaun?
Vielleicht ist der PC ja toleranter gegenüber Baudraten-Fehlern als das
Display.
Michael H. schrieb:> Bau doch mal beim Senden zwischen den einzelnen Zeichen ein bisschen> Pause ein.
Wie kann ich so eine Pause einbauen? Bin noch Anfänger, sry.
Kann mir das Timing leider nicht ansehen, habe momentan leider kein
SpeicherOszi zur Verfügung. Wenn der Text richtig übertragen wird, kann
es dann trotzdem ein minimaler Baudrtatenfehler vorliegen?
Sabine F. schrieb:> Wie kann ich so eine Pause einbauen? Bin noch Anfänger, sry.
Das ist wohl irgendwo in deiner (s)uart.c vergraben.
Aber Aufschluss darüber kann auch ein Oszillogramm geben.
Sabine F. schrieb:> Wenn der Text richtig übertragen wird, kann> es dann trotzdem ein minimaler Baudrtatenfehler vorliegen?
Ja. Sagen wir mal, der AVR sendet mit 3% Fehler. Der PC kann bis 5%
problemlos empfangen, das Display aber höchstens bis 2%.
Dann siehst du am PC alles ohne Probleme, während das Display nicht
richtig empfängt.
Beschreib doch mal blockweise deinen Aufbau mit allen seinen
Komponenten und wie du die untereinander bei welchem Test verbindest.
Ein Foto kann auch viel helfen.
Sabine F. schrieb:> Das Display benötigt doch die Handshakes, ohne funktiniert es nicht.
XON und XOFF? einfach die richtigen Steuerzeichen senden, wenn es
Software-Handshake ist.
Bei Hardware-Handshake müssen ein paar Leitungen mehr angeschlossen
werden.
Eigentlich denke ich, dass Handshake hier überhaupt nicht das Problem
ist.
mfg mf
Sabine F. schrieb:> Das Display benötigt doch die Handshakes, ohne funktiniert es nicht.>> Wie implementier ich diese Software - Handshakes?
Ich seh da auch nix von Software Handshake. Für Hardware Handshake
reicht es im allgemeinen, im Stecker die Kontakte RTS mit CTS zu
verbinden, als auch DTR mit DSR.
Das Xor'ing ist ein bisschen missverständlich. Sieht mir nach einer Art
Data Integrity Check aus. Im DataPacket könnte nach jedem gesendeten
Nutzbyte (ASCII) das gleiche mit 0xFF gexored gesendet werden. Das
könnte man recht simpel im MC mit
1
voiduartSendwithXor(){
2
for(intz=0;z<strlen(ftext);z++){
3
sputchar(ftext[z]);
4
_delay_ms(5);// einige teilnehmer empfehlen ein delay