- SF800 Solar Speicher Tutorial         
Ergebnis 1 bis 10 von 11

Thema: Hallsensoren und Atmega2560 - Richtungs- und Längenmessung mittels Interrupts

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Es kommt ein wenig darauf an wie man die Abfrage mit den Interrupts realisiert. Richtig gemacht geht es auch sicher mit den Interrupts. Der kritische Punkt ist wenn sich das Rad langsam dreht und dann gerade nach dem Umschalten eine Störung kommt. Gerade da ist die Empfindlichkeit auf Störungen am höchsten, vor allem wenn die Hardware keine merkliche Hysterese hat. Da hat man dann neben dem gewollten Pegelwechsel noch 2 zusätzliche Wechsel und damit halt ggf. 3 gleiche Interrupts (Pin Change) in sehr kurzer Zeit, wo es eigentlich nur hätte einen geben sollen. Wenn man es richtig macht, ist die Auswertung im Pin-change Interrupts fast genau so wie mit dem Timer, also mit merken des alten (d.h. zuletzt berücksichtigten) Zustandes und Auslesen des neuen. Dann geht es auch zuverlässig im Interrupt, selbst wenn man im Einzelfall mal einen Interrupt verpasst. Fehleranfällig ist dagegen wenn man das Auftreten des Interrupts schon als Ersatz für das Auslesen des Zustandes nutzt.

    Im Prinzip macht man mit der Variante den Decoder nach dem Timer abzufragen auch nichts anderes als ein Entprellen, einfach durch abtasten zu festen Zeiten.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2009
    Beiträge
    12
    So langsam lichtet sich mein Denknebel... eine letzte Frage bezüglich der Umsetzung ist jetzt noch aufgetaucht: Ist es genauso schnell die beiden Portstati mehrmals abzufragen wie diese in einer Bitvariablen zu speichern und mit der Variablen zu arbeiten? Mit dem Simulator stehe ich irgendwie auf Kriegsfuss - zumindest sobald ich mit externen Signalen arbeiten will

  3. #3
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Für den Drehgeber sollte man die Portwerte nur jeweils einmal in der ISR abfragen. Das kann man zusammen als Byte für einen Port, oder etwas langsamer als Bitwerte machen. Wirklich groß ist da der Unterschied nicht, das geht beides schnell.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2009
    Beiträge
    12
    So Besserwessi, die Abfrage der Sensoren funktioniert jetzt tadellos!!! Ich danke Dir vielmals für die Mühe und Deine Zeit! Mein Projekt kann jetzt gleich in die nächsten Probleme weitergehen )) Die ISR sieht jetzt so aus:

    Irq_hallsensoren:

    Timer1 = Timervorgabe ' Timervorgabe für die Frequenz
    Zustandhallsensor1 = Pine.4
    Zustandhallsensor2 = Pine.6
    If Zustandhallsensor2alt <> Zustandhallsensor2 Then
    If Zustandhallsensor1 = 0 Then
    'Wechsel 00 auf 01 oder 10 auf 00
    If Zustandhallsensor2 = 1 Then
    Durchgang2 = 1
    Zustandhallsensor2alt = 1
    Else
    If Durchgang1 = 1 Then
    Umdrehungen = Umdrehungen + 1
    Durchgang1 = 0
    Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
    Print #4 , "D2"
    Else
    End If
    Durchgang2 = 0
    Zustandhallsensor2alt = 0
    End If
    End If
    End If

    If Zustandhallsensor1alt <> Zustandhallsensor1 Then
    If Zustandhallsensor2 = 0 Then
    'Wechsel 00 auf 10 oder 01 auf 00
    If Zustandhallsensor1 = 1 Then
    Durchgang1 = 1
    Zustandhallsensor1alt = 1
    Else
    If Durchgang2 = 1 Then
    Umdrehungen = Umdrehungen - 1
    Durchgang2 = 0
    Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
    Print #4 , "D1"

    End If
    Durchgang1 = 0
    Zustandhallsensor1alt = 0
    End If
    End If
    End If
    Return

  5. #5
    Erfahrener Benutzer Robotik Visionär
    Registriert seit
    26.11.2005
    Ort
    bei Uelzen (Niedersachsen)
    Beiträge
    7.942
    Der Code ist noch reichlich unübersichtlich, und auch noch nicht ganz Fehlerfrei. Bis jetzt geht es mit dem Umschalten von Sensor 2 vor und beim Umschalten von Sensor1 nur zurück. Das kann Fehler geben, wenn das Rad etwas vor und zurück geht, um den einen Übergang.

    Es muss also bei einer Änderung von Sensor1 entweder vor oder zurück gehen, abhängig davon ob die beiden Sensoren 1 und 2 gleich sind oder nicht. So ähnlich dann auch mit einer Änderung an Sensor2 (wobei das ggf. optional ist wenn weniger Auflösung reicht).

    Das speichern der alten Zustände kann man direkt durch Zuweisung machen, also etwas als
    Zustandhallsensor1alt = Zustandhallsensor1 am Ende der ISR.

    Timer 1 erlaubt auch eine variable Interruptsfrequenz ohne nachladen von Hand.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    08.05.2009
    Beiträge
    12
    Ja, da hatte ich mich zu früh gefreut, der Code lief bis auf eine Kleinigkeit, die dann natürlich zum größeren Ärgernis wurde: nested If-Then-If then Else funktionieren nicht ,) Danke für den Timerhinweis - wieder eine Zeile gespart ,)
    Die Drehung erfasse ich über Durchgang1 und Durchgang2 - nur wenn vorher die "andere" Seite durchlaufen ist, kommt es zu einer Zählung (so ist zumindest der Plan)... so jetzt Suche ich mal nach einer anderen Schreibweise für meine If thens.....

    - - - Aktualisiert - - -

    ES GEHT
    Das mit der variablen Interruptsfrequenz habe ich nicht gefunden - nur viel über CTC Modi - ich werde also einfach weiter per Hand nachladen

    Für alle Interessierten - hier der funktionierende Code....

    '#################### Hallsensoren Interruptbehandlung #########################
    Irq_hallsensoren:
    Timer1 = 51647 ' Timer1 nachladen für ca. 18 Hz

    Zustandhallsensor1 = Pine.4
    Zustandhallsensor2 = Pine.6


    If Zustandhallsensor1alt <> Zustandhallsensor1 Then
    If Zustandhallsensor2 = 0 And Zustandhallsensor1 = 1 Then
    Durchgang1 = 1
    Elseif Zustandhallsensor2 = 0 And Zustandhallsensor1 = 0 And Durchgang2 = 1 Then
    Umdrehungen = Umdrehungen - 1
    Durchgang2 = 0

    'Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
    'Print #4 , "D1"

    Elseif Zustandhallsensor2 = 0 And Zustandhallsensor1 = 0 And Durchgang2 = 0 Then
    Durchgang1 = 0
    End If
    End If

    If Zustandhallsensor2alt <> Zustandhallsensor2 Then
    If Zustandhallsensor1 = 0 And Zustandhallsensor2 = 1 Then
    Durchgang2 = 1
    Elseif Zustandhallsensor1 = 0 And Zustandhallsensor2 = 0 And Durchgang1 = 1 Then
    Umdrehungen = Umdrehungen + 1
    Durchgang1 = 0

    'Print #4 , Umdrehungen ; " - " ; Zustandhallsensor1 ; " - " ; Zustandhallsensor2 ' DEBUG
    'Print #4 , "D2"

    Elseif Zustandhallsensor1 = 0 And Zustandhallsensor2 = 0 And Durchgang1 = 0 Then
    Durchgang2 = 0
    End If
    End If

    Zustandhallsensor1alt = Zustandhallsensor1
    Zustandhallsensor2alt = Zustandhallsensor2
    Return

Ähnliche Themen

  1. ATMega2560 und I2C... geht nicht?
    Von Jaecko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 13
    Letzter Beitrag: 25.11.2008, 20:07
  2. Atmega2560 und RTC PCF8583
    Von hhopf im Forum AVR Hardwarethemen
    Antworten: 5
    Letzter Beitrag: 25.07.2008, 07:17
  3. Atmega2560 cc2net Ram-Device lesen und schreiben
    Von A.Schilling im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 06.07.2007, 10:52
  4. Drehzahlerfassung via CN37 mittels Interrupts
    Von robotxy im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 8
    Letzter Beitrag: 05.08.2005, 09:29
  5. Drehgeber (mittels Hallsensoren) auslesen
    Von alex.kurke im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 25.05.2005, 23:09

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress