Forum: Mikrocontroller und Digitale Elektronik Kl. Problem Pulsein Bascom


von NurGast (Gast)


Lesenswert?

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.
von NurGast (Gast)


Lesenswert?

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.
von Karl H. (Gast)


Lesenswert?

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?

von Achim H. (pluto25)


Lesenswert?

Das ist der Timeout vom Pulseein
Erkönnte mit
If Err=0 Then
Locate...
abgefangen werden.

von NurGast (Gast)


Lesenswert?

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

von NurGast (Gast)


Lesenswert?

Danke pluto25!!!
Das habe ich auch gerade gemerkt!
Die Zeit würde passen!

von Achim H. (pluto25)


Lesenswert?

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?

von NurGast (Gast)


Lesenswert?

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.

von Achim H. (pluto25)


Lesenswert?

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?

von NurGast (Gast)


Lesenswert?

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

von Karl H. (Gast)


Lesenswert?

Zur Sicherheit nachgefragt: Masse von Pulsgenerator/Servotester und µC 
auch verbunden?

von Uwe D. (monkye)


Lesenswert?

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“

von Uwe D. (monkye)


Lesenswert?

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.

von Achim H. (pluto25)


Lesenswert?

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
von NurGast (Gast)


Lesenswert?

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.
von Uwe D. (monkye)


Lesenswert?

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.
von NurGast (Gast)


Lesenswert?

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.
von Uwe D. (monkye)



Lesenswert?

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.

von NurGast (Gast)


Lesenswert?

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

von Uwe D. (monkye)


Lesenswert?

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.

von AuchGast (Gast)


Lesenswert?

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.
von Uwe D. (monkye)


Lesenswert?

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
Noch kein Account? Hier anmelden.