Hallo,
über die UDRO Schnittstelle übergebe ich eine 16 bit Temperatur. Die ich
in Labview über die Visa Schnisttelle einlese. Das Problem ist
folgendes:
Labview initialiesiert die Visa Schnittstelle bei jedem
Schleifendurchgang neu, so dass schon ca. 1000 Bytes am Port der Visa
Schnittstelle anliegen bevor die abgeolt werden können. Die Schittstelle
ist also überladen, weil der uC viel schneller ist. Außerdem wird die 16
bit Temperatut in Labview manchmal falsch angezeigt. Mal kommt das
2.Byte vor dem 1.Byte mal umgekehrt.
Kann man den µC mit Labview synchroniesieren oder gibt es noch andere
Mölglichlkeiten?
Kann mir jemand helfen?
Polling?
Irgendein Zeichen an den µC gesendet, nachdem LabView die Schnittstelle
initialisiert hat, zB ein "T". Darauf hin schickt der µC die 16 Bit an
den PC.
ja polling!
das mache ich schon, schicke bei jedem Schleifendurchgang in Labview die
PWM-Signalbreite an den µC und lese eine Temperatur aus. Habe aber immer
ein Dreher zwischen dem 1.Byte und dem 2.Byte.
Hi!
Bin ja bischen doof, aber kannste mir deine Denkweise an der Stelle mal
erklären:
>putTemp:> lds r16,UCSR0A> sbrs r16,5 ; Senderegister nicht leer?> ret ; ... dann Rücksprung>> sts UDR0,r18>> sts UDR0,r19
Ohne nachzufragen schreibst du 2 Byte nach UDR??
MFG Uwe
Genau. Die beiden Bytes schicke ich ins UDR0 und übergebe diese in
Labview, allerdings habe ich dann fast immer eine Dreher in der
Temperatur(wie oben beschrieben)
Nein, die Frage ist, woher weißt du beim zweiten "sts UDR0,rXX", dass
UDR0 schon wieder frei ist?
Und wenn die beiden Bytes verkehrt herum ankommen, dann sendest du sie
entweder verkehrt herum, oder du hast einen Fehler im Ablauf und LabView
und µC sind nicht mehr synchron.
die temperatur wird sporadisch mal richig mal falsch angezeigt.
Das heisst, entweder kommt das 1.Byte vor dem 2.Byte oder umgekehrt.
Die Reihenfolge im Assembler ist auch richtig.
Andre B. wrote:
> Außerdem wird die 16> bit Temperatut in Labview manchmal falsch angezeigt. Mal kommt das> 2.Byte vor dem 1.Byte mal umgekehrt.
Woher soll den Labview auch wissen, welches das 1. und welchse das
2.Byte ist?
Labview kann ja nicht hellsehen.
Dein Problem ist, Du hast kein Protokoll.
Ein einfaches Protokoll wäre, der AVR sendet nur auf Anforderung.
Z.B. Labwiev sendet ein '?' und dann erst sendet der AVR. Damit weiß
dann Labview, welches das 1. Byte ist.
Peter
Uwe wrote:
>>putTemp:>> lds r16,UCSR0A>> sbrs r16,5 ; Senderegister nicht leer?>> ret ; ... dann Rücksprung>>> sts UDR0,r18>>> sts UDR0,r19>> Ohne nachzufragen schreibst du 2 Byte nach UDR??
Stimmt, der Code ist falsch.
Wenn man 2 Byte schreiben will, muß man auf das TXC0 Bit testen.
Das geht aber schief, wenn noch garnichts gesendet wurde.
Daher besser ne putchar-Funktion schreiben und die zweimal aufrufen.
Peter
Peter Dannegger wrote:
> Dein Problem ist, Du hast kein Protokoll.
Ich dachte, er hätte eins, weil er sagte:
> das mache ich schon, schicke bei jedem Schleifendurchgang in Labview die> PWM-Signalbreite an den µC und lese eine Temperatur aus.
An dem Code ist nicht zu erkennen, ob du irgendein Protokoll hast, z.B.
ob du die Temperatur immer sendest, nachdem du den neuen PWM-Wert
bekommen hast.
Ich hatte das Problem auch mal. Bin jetzt dazu übergegangen, die
Messwerte in ASCII zu übertragen. LabView kann die prima einlesen, auch
bei 115200 Baud keine Fehler drin, da ein eindeutiger Rahmen das
Datenpaket kennzeichnet (\n zum Schluss und <spc> als Trennzeichen).
Hi!
Wie wäre es denn so:
putTemp:
lds r16,UCSR0A
sbrs r16,UDRE ; Senderegister nicht leer?
rjmp putTemp ; ... dann Rücksprung
sts UDR0,r18
Byte2:
lds r16,UCSR0A
sbrs r16,UDRE ; Senderegister nicht leer?
rjmp Byte2
sts UDR0,r19
ret
Viel Erfolg, Uwe
hi,
also den dreher habe ich ich nicht mehr.(siehe die letzten 4 Zeilen bei
"getPWM". Allerdings kriege ich periodisch immer mal wieder eine 0
Übergeben. Die Visaschnittstelle gibt dann auch 0Bytes am Port an. Woher
kommt die null?
getPWM:
lds r16,UCSR0A
sbrs r16,7 ; Alle Daten im UDR-Register...
ret ; ... wenn nicht, dann Rücksprung
lds serdatin,UDR0 ; ... wenn doch, dann Zeichen abholen
sts OCR1AL,serdatin ; PWM bedienen
lds r16,UCSR0A
sbrs r16,7 ; Alle Daten im UDR-Register...
rcall putTemp
rcall mainloop
ret
putTemp:
lds r16,UCSR0A
sbrs r16,5 ; Senderegister nicht leer?
ret ; ... dann Rücksprung
sts UDR0,r18
sts UDR0,r19
ret ; nächstes Zeichen
Hi!
>das habe ich schon gemacht, ändert aber auch nix
Das sah aber in deinem letzten post nicht so aus.
Sende mal feste Werte, nicht das bei deiner Einleserei was schief geht.
Viel Erfolg, Uwe