-
-
Erfahrener Benutzer
Fleißiges Mitglied
Drehimpulsgeber mit 8051
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
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
-
Erfahrener Benutzer
Fleißiges Mitglied
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.
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen