PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pulsein



Horst12
16.09.2013, 21:12
Hallo Leute
Kann mir mal jemand sagen warum der Code nicht funktioniert?


$regfile = "m8def.dat".dat "
$crystal = 1000000

Dim X As Word

Config Pind.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output


Do
Pulsein X , Pind , 4 , 0

If X <= 34000 Then
Portd.5 = 1
Elseif X > 34000 And X <= 64000 Then
Portd.6 = 1

End If
Loop

Ich möchte die Drehzahl eines Motors überwachen.Das Eingangssignal hat zwischen 4 ms und 30 ms.
Kann mir jemand helfen?

Gruß
Horst12

JoeM1978
16.09.2013, 21:26
$regfile = "m8def.dat".dat "


... is das so beabsichtigt mit dem .dat" zu viel ?

dazu fehlt doch dann noch der Timer wenn ich nicht irre...

so in etwa:

Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8

Aso... fragst du die Flanke bei anstieg, abfall oder generell bei wechsel ab ?
Musst eben an deine bedürfnisse anpassen.

Grüsse,... JoeM

Sauerbruch
16.09.2013, 23:23
dazu fehlt doch dann noch der Timer wenn ich nicht irre...


Da irrst Du Dich - die Bascom-Hilfe sagt ganz zum Befehl Pulsein folgendes:
"No hardware timer is used. A 16 bit counter is used. It will increase in 10 uS units. But this depends on the XTAL. You can change the library routine to adjust the units."
Und selbst wenn man einen Timer bräuchte, wären die ganzen PWM-Statements überflüssig.


Aso... fragst du die Flanke bei anstieg, abfall oder generell bei wechsel ab ?

Auch das ist korrekt erledigt: Mit der Null in der Zeile "Pulsein X , Pind , 4 , 0" wird definiert, dass eine steigende Flanke ausgewertet wird.

Mir fallen bislang zwei Fehler in diesem Teil des Codes auf;

Erstens:


If X <= 34000 Then
Portd.5 = 1
Elseif X > 34000 And X <= 64000 Then
Portd.6 = 1


Du setzt die Ports D.5 und D.6 nirgendwo auf 0! Oder anders gesagt: Ist X kleiner als 34000, geht Portd.5 auf 1 - aber wenn X dann irgendwann einmal größere Werte als 34000 annimmt, bleibt Portd.5 weiterhin 1! (Gleiches gilt für Portd.6).

Eine Lösung wäre z.B.



If X <= 34000 Then Portd.5 = 1 Else Portd.5 = 0
If X > 34000 AND X <= 64000 Then Portd.6 = 1 Else Portd.6 = 0


Und zweitens:
Die Bascom-Hilfe schreibt, dass der Pulsein-Befehl im Normalfall (d.h. wenn Du nichts an der Lib verändert hast, wovon ich mal ausgehe) den Impuls in 10µS-Schritten ausmisst. Bei 4ms Impulsdauer müsste Pulsein also einen Wert von 400 liefern, und bei 30 ms etwa 3000. Das heißt, Du bist mit Deinen Grenzwerten von 34000 um etwa eine Zehnerpotenz daneben.

Kannst Du Dir die realen Werte von X denn mal anzeigen lassen, mit einem LCD oder so?

Horst12
17.09.2013, 20:57
Hallo

Jetzt wo ich deine Antwort lese ist das klar. Hätte ich auch selber drauf kommen.Ich werde es gleich ausprobieren.

Danke im voraus
Horst12