PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehimpulsgeber mit 8051



Marten83
22.06.2005, 10:30
Hallo!

Ich habe im Forum schonmal gesucht wie man den Geber möglichst effektiv (oder überhaupt) ansteuern kann. Leider ist das alles für AVRs geschrieben und dafür habe ich leider kein Board.
hat jemand von euch einen codeschnipsel der mir dabei helfen kann?
Vielen Dank im Vorraus

Marten83

Sandro
22.06.2005, 14:55
Ich hab das mal gemacht.
Hab im Moment aber leider keinen Zugriff auf den Code...

Eine simple Auswertung funktioniert so:
Du konfigurierst einen der externen Interupts auf "fallende Flanke". In der isr prüfst du jetzt welchen Pegel das zweite Signal vom Sensor hat. Daraus kannst du dann auf die Drehrichtung schließen. Bei dieser Art der Auwertung können zwar Fehler auftreten, aber sie ist sehr einfach und funktioniert auch bei hohen Frequenzen.

Marten83
27.06.2005, 13:39
Hi!

Ich hab jetzt mal n kleinen Code geschrieben.
Der funktioniert soweit auch das die Richtung erkannt wird, aber....
Wenn ich nach links drehe und wieder anhalte kommt es sehr oft vor das trotzdem rechts angezeigt wird. wie kann man das unterdrücken? kann man mit einem 2. interrupt arbeiten?
Hier mein Code:

$regfile = "89s8252.dat"
$crystal = 11059200


Config Lcd = 20 * 4
Cursor Off Noblink
Cls
Enable Interrupts
Enable Int0
On Int0 Drehen

Set P3.3
Do
Loop
End






Drehen:
If P3.3 = 0 Then
Locate 1 , 1
Lcd "rechts"
Waitms 200
Cls
Elseif P3.3 = 1 Then
Locate 1 , 1
Lcd "links"
Waitms 200
Cls
End If
Return

(Wie macht man das richtig den Code zu Posten?)
Marten83

Sandro
27.06.2005, 14:00
Mit Bascom kenn ich mich leider nicht besonders aus.
Aber wenn ich den Code richtig verstehe dann konfigurierst du den Interupt nicht.
Du mußt ihn so einstellen das er nur ausgelöst wird wenn eine fallende Flanke am Pin auftritt.
So wie du es gemacht hast wird immer bei Lowpegel ein Interupt ausgelöst.
Also auch wenn der Geber gar kein neues Signal geliefert hat.


Wenn du hier im Forum unter den Beiträgen auf antwort erstellen klickst hast du viele Knöpfe zur verrfügung. Damit ist es am einfachsten code zu posten.

Marten83
29.06.2005, 10:42
Danke Sandro!

Das war der entscheidende Tipp!
jetzt stehe ich aber noch vor anderen Problemen die ich so nicht verstehe.
wenn ich versuche das lcd zu löschen versuche damit zahlenreste nicht zu sehen sind und irritieren stürzt mir mein lcd ab. kann es sein das es je nach rotationsgeschwindigkeit einfach u schnell hintereinander abläuft?

Noch ne Frage:
Wie kann man die Zählschritte auf 100 begrenzen?
Mit einer For N = 1 to 100 next -Schleife hats auch irgendwie nicht hingehauen.

Sandro
29.06.2005, 13:03
Also wenn Bascom die LCD-ansteuerung vernünftig gelöst hat sollte das
eigentlich nicht passieren können. Der clr-Befehl des LCD dauert wesentlich
länger als ein Schreibbefehl. Aber ich denke eigentlich schon das CLS diese
Zeit abwartet. Und ein neuer Interupt kann erst ausgelöst werden wenn der alte beendet wurde.

Ich kann mit zwar nicht erklären warum dieser Fehler auftritt, aber ich würde
die isr ohnehin etwas anders aufbauen:

Du deklarierst dir eine globale Variable. Diese muß im gesamten
Programm sichtbar sein. Also auch in der isr.
Im Interupt zählst du nur diese Variable hoch oder runter.
Wenn du den Maximalwert des Zählers auf 100 begrenzen willst mußt du
den aktuellen Wert mit 100 oder 0 vergleichen (je nachdem ob ein Überlauf
oder Unterlauf statfinden kann) und bei Bedarf eingreifen. (Einfacher ist es
auf 255 zu begrenzen. Wird als Variable ein Byte benutzt ist es nach
einem Überlauf automatisch wieder 0.)
Nach der Variablenmanipulation verlässt du den Interupt wieder.

In deinem Hauptprogram brauchst du jetzt eine Schleife die ständig diese
Variable abfragt und den Wert ausgibt.