Hallo, habe ein kleines Verständnisproblem mit dem Bascom-Befehl Pulsein. Ich wollte mal schnell einen Servokanal damit auswerten und komme aber nicht auf den erwarteten Wert. Bei 1,5ms bekomme ich den Wert 92! Hätte so um die 150 erwartet, da er ja mit 10µs multipliziert werden sollte. Da ich aber nur eine LED setzen wollte, ist mir dies aber egal. Möchte es aber mal wissen! Das andere Problem ist, wenn ich nur einmal einen einzelnen Impuls von 1,5ms generiere, dann erscheint im Display 90 und nach ca. einer halben Sekunde wieder 0! Warum??? Hier mein kleines Programm: '*************************************************************** 'Compiler : BASCOM-AVR 2.0.7.7 'Hardware : LCD-Anzeige 2 X 8 'Chip type : ATMega48V '*************************************************************** $regfile = "m48def.dat" 'ATMega48V $crystal = 1000000 'Quarz intern 8MHz + Divide Clock Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 Config Lcdpin = Pin , Db7 = Portb.3 , E = Portb.5 , Rs = Portb.4 Config Lcd = 16x2 Dim Puls As Word Cursor off Cls Wait 1 Locate 1, 1 Lcd "Puls:" Do Pulsein Puls, Pind, 2, 1 Locate 2, 1 LCD Puls LCD " " Loop End --------------------------- Danke und schönen Sonntag noch Jörg
Beitrag #6544629 wurde von einem Moderator gelöscht.
Danke aber es steht zwar oben in der Hilfe:
>> State: 0 bedeutet einfach 0 zu 1 Zustandsänderung
aber weiter unten steht: wenn Status 0 gesetzt wird wartet die Routine
bis der Pegel am def. Eingangspin 0 ist. Anschließend wird der Zähler
gestartet und gestoppt, wenn der Pin 1 ist!
Und ich habe einen positiven Impuls von 1,5ms Länge. Ich habe den auch
nur ein mal generiert (kl. Impulgenerator als Monoflop) und es passierte
genau das Beschriebene. Dazwischen kann ich Kaffee trinken gehen ohne
Reaktion. Deshalb auch im STATE die 1! Nehme ich die 0 dann habe ich
undef. 5 stellige Zahlen!
Jörg
Beitrag #6544715 wurde von einem Moderator gelöscht.
NurGast schrieb: > Ich wollte mal schnell einen Servokanal damit auswerten und komme aber Einen Servokanal? Gibt es denn noch andere Servokanäle auf der Signalleitung?
Das ist der Timeout vom Pulseein Erkönnte mit If Err=0 Then Locate... abgefangen werden.
Na klar, das ist mir bekannt! Es wird ein Softwarezähler mit 2^16 Werten, also ein Word, verwendet. Der Kompiler errechnet daraus den Abtasttakt. Es würde also von 10µs bis 655,35ms gehen bis er überläuft! Bei 1,5ms Impuls würde ich aber einen anderen Wert als 90 erwarten. Und der interne RC-Takt ist nicht die Ursache. Habe den ATMega aber mit externen Quarz getaktet. Wert ist jetzt 94! Aber warum zeigt er beim Impuls 94 an und geht dann wieder auf 0 zurück? Wenn ich ihn kontinuierlich takte passiert das nicht. Das sieht fast so aus als ob mir der Pulsein-Befehl nach dem Überlauf eine 0 in den Wert schreibt. Nein Karl H., es ist nur ein Kabel dran! Ich wollte heute Vormittag bei einem Bekannten mal schnell seinen ATTiny24 zu einem 2Kanal-Schalter machen. Ging nicht so einfach! Dann habe ich zu Hause mal meinen ATMega48 mit einem Display bemüht damit ich etwas sehe. Gespeist wurde der Pin zunächst mit dem Pulsgenerator und mit einem Servotester. Beides positive Impulse. Danke und Gruß aus MD Jörg
Danke pluto25!!! Das habe ich auch gerade gemerkt! Die Zeit würde passen!
NurGast schrieb: > nach dem Überlauf > eine 0 in den Wert schreibt. Klar, als Indiz das der Puls nicht da war. Auch das Err wird gesetzt. Vielleicht eine dritte Meinung einholen (Oszi) zwischen 940ms und 1,5 ms ist schon ein größerer Schritt. Da "lügt" jemand. Ich hätte da den Pulsgeber in Verdacht. Der Pegel ist ok? Auch kein Servo an der gleichen Versorgung?
Nein Pluto25! Den Pulsgeber zwar selbst gebaut mit einem NE555 aber mit meinem Zähler mit Periodendauermessung überprüft. Zeigt 3 Stellen nach dem "Komma" an. Und Du meintest bestimmt 940µs (94*10µs) oder? Erwartet hätte ich einen Wert um die 150 (also 150*10µs = 1,5ms) +- 10%, da ja wohl intern von der Lib nur mit Ganzzahlen gerechnet wird. Ja, das Ganze soll später einen Senderausfall ignorieren und auf Neutralstellung gehen. Und wo finde ich das Err-Bit? Nehme jetzt wahrscheinlich einen Timer zum Messen wie in anderen Projekten obwohl mein Bekannter mit dem Ergebnis leben kann, da der "Denk"-Fehler jetzt bekannt ist.
NurGast schrieb: > Und wo finde ich das Err-Bit? Einfach mit "If Err" abfragen. Es ist Standartmäßig vorhanden. Physikalisch ist es Bit 2 von R6 Dennoch unklar wo der Fehler herkommt? Ist es die gleiche Abweichung wenn der Puls länger ist? Oder stimmt es wenn ein Bitwait voraus gestellt wird?
Beim Servotester: Links = 58, Mitte = 92, Rechts = 126! Der macht das gut! Wie gesagt wollte ich nur den Befehl Pulsein in Bascom verstehen und vor allem, dass der Wert bei Impulsausfall auf Null geht. Haate gedacht, dass der Zähler bei pos. Flanke gestartet und bei der nächsten negativen gestoppt wird und dann den letzten Wert behält, da ja kein neuer Impuls eintrifft. Das dies nicht so ist habe ich dann gemerkt und das Ganze mal bei mir aufgebaut mit dem beschriebenen Ergebnis. Danke nochmal und vielleicht bis denne .... Jörg
Zur Sicherheit nachgefragt: Masse von Pulsgenerator/Servotester und µC auch verbunden?
A. H. schrieb: > NurGast schrieb: >> Und wo finde ich das Err-Bit? > > Einfach mit "If Err" abfragen. Es ist Standartmäßig vorhanden. > Physikalisch ist es Bit 2 von R6 > Dennoch unklar wo der Fehler herkommt? Ist es die gleiche Abweichung > wenn der Puls länger ist? Oder stimmt es wenn ein Bitwait voraus > gestellt wird? Das Bitwait ist aber eine „heiße“ Sache, weil Du beim Ausbleiben eines Impulses festhängst an der Stelle. Ein Failsafe wird dann zum „Fail“
NurGast schrieb: > Danke aber es steht zwar oben in der Hilfe: >>> State: 0 bedeutet einfach 0 zu 1 Zustandsänderung > aber weiter unten steht: wenn Status 0 gesetzt wird wartet die Routine > bis der Pegel am def. Eingangspin 0 ist. Anschließend wird der Zähler > gestartet und gestoppt, wenn der Pin 1 ist! Da ist ja auch richtig so: Wenn bei Start von „Pulsein“ der PIN bereits „1“ ist, dann wird gewartet bis der wieder „0“ ist. Und die nächste 0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder. > Und ich habe einen positiven Impuls von 1,5ms Länge. Ich habe den auch > nur ein mal generiert (kl. Impulgenerator als Monoflop) und es passierte > genau das Beschriebene. Dazwischen kann ich Kaffee trinken gehen ohne > Reaktion. Deshalb auch im STATE die 1! Nehme ich die 0 dann habe ich > undef. 5 stellige Zahlen! > Jörg Auch das ist richtig: Der Zähler läuft über oder ins Nirvana. Das kannst Du prüfen, indem Du das „Err“-Bit prüfst. Steht genauso in der Hilfe.
NurGast schrieb: > Der macht das gut! Aber dennoch falsch??? Das einfachste wäre den Compiler zu belügen. $Crystal=580000 Damit bleibt der Fehler aber die Anzeige stimmt. Kommt kein Puls gibts auch einen Timeout. Anders beim Bitwait da bleibt er wirklich stehen. Solange er nichts anders tun soll Problemlos. Man könnte die Timeouts zählen um eine Selbstabschaltung durchzuführen. Ähnlich wie bei den Meßgeräten.
:
Bearbeitet durch User
Nur monkye schrieb: > Da ist ja auch richtig so: Wenn bei Start von „Pulsein“ der PIN bereits > „1“ ist, dann wird gewartet bis der wieder „0“ ist. Und die nächste > 0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder. Denke NEIN! Wenn 0>1 Start und wieder 0>1 Stopp dann würde ich nicht die Pulsdauer messen sonder die Periodendauer. Aber BitWait würde ich auch nicht nehmen denn bei einem Ausfall hängt mein ganzes Programm und eine Neutralstellung wird nie erreicht!
Beitrag #6545242 wurde von einem Moderator gelöscht.
Beitrag #6545335 wurde von einem Moderator gelöscht.
Beitrag #6545346 wurde von einem Moderator gelöscht.
NurGast schrieb: > Nur monkye schrieb: >> Da ist ja auch richtig so: Wenn bei Start von „Pulsein“ der PIN bereits >> „1“ ist, dann wird gewartet bis der wieder „0“ ist. Und die nächste >> 0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder. > > Denke NEIN! Wenn 0>1 Start und wieder 0>1 Stopp dann würde ich nicht die > Pulsdauer messen sonder die Periodendauer. > Aber BitWait würde ich auch nicht nehmen denn bei einem Ausfall hängt > mein ganzes Programm und eine Neutralstellung wird nie erreicht! Aha... das sehe ich nicht so. Wenn Dein Programm die Messung startet ist ungewiss, denn wenn Du an der Fernsteuerung rumrührst (oder von mir aus Deinen Servotester dran steckst) kann der Kanalimpuls gerade schon auf „1“ stehen und dann misst PULSEIN daher nur noch 60% des Impulses. Deshalb kann es gut sein, dass die eine oder andere Messung Mist misst. Denn Deine Ausgabe zum LCD kostet (unberücksichtigte) Zeit. So mal als *Tipp*: 0x92 ist Dezimal 146....
Beitrag #6545735 wurde von einem Moderator gelöscht.
Uwe D. (monkye) schrieb: >Denn Deine Ausgabe zum LCD kostet (unberücksichtigte) Zeit. der Pulsein- Befehl wartet auf eine Flanke und zwar am Pin! Habe aber mal zur Sicherheit eine Waitms 400 eingefügt ohne Änderung. LCD hat also keinen Einfluß! Uwe D. (monkye) schrieb: >So mal als *Tipp*: 0x92 ist Dezimal 146.... Bin immer für Tipps zu haben. Aber der Softwarezähler zählt nun mal von 1 bis 65535! Wie auch die Timer on Board! Und was wäre dann 0x65535 in Dezimal??? ;-))
Beitrag #6548318 wurde von einem Moderator gelöscht.
NurGast schrieb: > Nur monkye schrieb: >> Da ist ja auch richtig so: Wenn bei Start von „Pulsein“ der PIN bereits >> „1“ ist, dann wird gewartet bis der wieder „0“ ist. Und die nächste >> 0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder. > > Denke NEIN! Wenn 0>1 Start und wieder 0>1 Stopp dann würde ich nicht die > Pulsdauer messen sonder die Periodendauer. > Aber BitWait würde ich auch nicht nehmen denn bei einem Ausfall hängt > mein ganzes Programm und eine Neutralstellung wird nie erreicht! Schau Dir einfach die Bilder vom Simulator an... Bei der Ausgabe von "LCD" hatte ich die implizite Wandlung auf DEZIMAL nicht auf dem Schirm, deshalb der Hinweis, dass 0x92 = 146.
Ja Uwe,
genau so passiert es. Bei 0 (also zurückgesetzt 1 > 0) stoppt der
Zähler wieder. Ich sehe in Deinem Simulator keine neue Flanke 0 > 1.
Aber warum schreibst Du aber dann:
>0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder.
Habe jemanden gefragt, der es genau weiß. War ein Auslandsgespräch!
Wenn State = 1 dann reagiert der Pin auf die pos. Flanke!
Also bei 0 > 1 startet der Zähler und überträgt das Ergebnis bei der
neg. Flanke (1 > 0) in die Variable. Der Zähler läuft weiter!!! Wenn
innerhalb seines Bereiches von 65353 (also Überlauf) keine neue pos.
Flanke auftritt dann setzt er das Err-Bit und schreibt in die Variable
eine 0! Siehe ganz oben!
Bei einer neuen pos. Flanke wird das Err-Bit gelöscht und der Zähler
fängt wieder bei 0 an! Man kann das Err-Bit auch selbst setzen und dann
erst zählt der Zähler nicht mehr weiter. Der seltsame Wert soll wegen
der Rechnung in der LIB kommen. Kann nur ganze Zahlen und wenn eine 1.90
als Teiler auftritt, dann wird eben nur durch 1 geteilt. Habe es
ausprobiert und den Oszillator-Wert nur leicht geändert und schon stand
bei 1,5ms Puls eine 163 drin!
Der Befehl Pulsein ist ziemlich mächtig und hat mir 3% vom Speicher
gekostet. Deshalb bevorzuge ich die Timer aber für solch kleine Zwecke
auch egal.
Trotzdem danke und weiter so im Bascom-Forum, denn dort kenne ich Dich
Jörg
NurGast schrieb: > Ja Uwe, > genau so passiert es. Bei 0 (also zurückgesetzt 1 > 0) stoppt der > Zähler wieder. Ich sehe in Deinem Simulator keine neue Flanke 0 > 1. > Aber warum schreibst Du aber dann: >>0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder. Die „Flanke“ muss zu Fuß gesetzt werden, indem PIND=4 gesetzt wird (Pin 2). Für mich ist Pegel <> Flanke.
Die „Flanke“ muss zu Fuß gesetzt werden, Uwe??? Hä??? Habe die Hardware kurz auf den Tisch gelegt. War kein Zeitauffwand, da ich einige Bords mit AVR und Displays habe. Also schnell mal einen Puls von 1,5ms generiert und siehe da, das Ergebnis ist wie der TO beschrieben hat. Uwe schrieb: >0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder! das ist eben falsch! Start bei pos. Impuls Flanke 0 > 1 und Ergebnis bei Flanke 1 > 0 und keinen STOPP! So wie beschrieben. Der Zähler läuft einfach weiter. Deshalb auch erst die "90" und nach ca. 650ms die "0" am Display! Warum kannst Du Deinen Irrtum nicht einsehen. So ein Kollege sitzt mir Morgen wieder gegenüber. Bis denne Frank
Beitrag #6561511 wurde von einem Moderator gelöscht.
Beitrag #6561568 wurde von einem Moderator gelöscht.
AuchGast schrieb: > Die „Flanke“ muss zu Fuß gesetzt werden, Uwe??? Hä??? Habe die Hardware > kurz auf den Tisch gelegt. Nimm‘s mir nicht übel: Aber ich bin nicht Dein Feind. Und ja, ich habe keine Hardware auf dem Tisch liegen und habe den Simulator verwendet. Sieht man doch prima im Bild. Und da muss ich „zu Fuß“ - also manuell - den Pin.2 setzen oder zurücksetzen. > Uwe schrieb: >>0-1-Flanke startet die Messung und die 0-1-Flanke stoppt diese wieder! > das ist eben falsch! Start bei pos. Impuls Flanke 0 > 1 und Ergebnis bei > Flanke 1 > 0 und keinen STOPP! So wie beschrieben. Der Zähler läuft > einfach weiter. Deshalb auch erst die "90" und nach ca. 650ms die "0" am > Display! > Warum kannst Du Deinen Irrtum nicht einsehen. Also ich schrieb nicht, dass der Zähler nicht weiterläuft. Was Du in den Bildern sehen kannst sind die Werte der Variablen, die hängen halt vom Status von PULSEIN ab.
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.