-         

Ergebnis 1 bis 6 von 6

Thema: Drehimpulsgeber mit 8051

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190

    Drehimpulsgeber mit 8051

    Anzeige

    SMARTPHONES & TABLETS-bis zu 77% RABATT-Kostenlose Lieferung-Aktuell | Cool | Unentbehrlich
    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

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    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.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    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.

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    21.04.2005
    Ort
    Hannover
    Beiträge
    190
    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.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    05.03.2005
    Ort
    Nürnberg
    Alter
    37
    Beiträge
    118
    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
  •