-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Pin zählen, merken, vergleichen

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16

    Pin zählen, merken, vergleichen

    Anzeige

    Moin Moin,

    mir fehlt auch nach mehreren Stunden suchen und googeln noch der richtige Denkansatz.
    Hilft mir ein Profi auf die Sprünge?

    Ich möchte mit Bascom einen Atmega 8 programmieren.

    An zwei Eingängen ist je ein Reed-Sensor angeschlossen.
    Es gibt noch einen IO-Eingang und einen IO-Ausgang.

    Das Programm soll die Anzahl der Magnete, die am Sensor 1 vorbeikommen zählen (etwa 60 Stück pro Sekunde, insgesamt pro Zählvorgang 70 Stück).

    Als nächstes wird ein Pin auf eins gesetzt, worauf auch der Ausgang auf eins gesetzt werden soll.

    Nun flitzen an Sensor 2 ebenfalls Magnete vorbei (auch ca. 60/sec).

    Auch diese sollen gezählt werden. Wenn die an Sensor 1 gezählte Zahl an Sensor 2 erreicht ist, soll der Ausgang wieder auf 0 gesetzt werden.

    War das verständlich?

    Viele Grüße,
    Johannes

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Die Reed-Sensoren an Interrupt Eingänge und dementsprechend Variablen hochzählen.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von 021aet04
    Registriert seit
    17.01.2005
    Ort
    Niklasdorf
    Alter
    29
    Beiträge
    4.544
    Du musst nur aufpassen dass diese Reedrelais nicht prellen. Sonst hast du zuviele Impulse. Besser wäre es, wenn du statt den Reedrelais einen Hallschalter nimmst. Diese brauchen keine Entprellung. Solltest du die Reedrelais trotzdem nehmen willst bzw musst würde ich das Signal entprellen.

    Rest so wie schon geschrieben wurde.

    MfG Hannes

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Hallo,

    danke für die Antworten. Mal sehen, vielleicht funktionierts auch mit einem Hallschalter. Um das Entprellen würde ich mich ja gerne drücken...

    Könnte das hier funktionieren?

    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Pinb.1 = Input
    Sensor1 Alias Pina.1
    Config Pinb.2 = Input
    Sensor2 Alias Pina.2
    Config Pinb.3 = Input
    Eingang Alias Portb.3
    Config Portb.4 = Output
    Ausgang Alias Portb.4
    
    Dim A As Byte
    Dim B As Byte
    A = 0
    B = 0
    
    Do
    If Sensor1 = 1 And Eingang = 0 Then
    A = A + 1
    End If
    Loop Until Eingang = 1
    
    If Eingang = 1 Then
    B = B + 1
    End If
    
    If B = A Then
    Ausgang = 0
    End If
    
    End
    Über Verbesserungsvorschöäge freue ich mich,

    Johannes

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    So auf keinen Fall.
    So wird er A mehrfach hochzählen, während ein Magnet vorbeifährt. Und das hat mit entprellen noch garnichts zu tun.

    Schau dir mal Interrupts an!

    Das Entprellen kann man auch durch einen 100n Kerko, parallel zum Schalter, verhindern (tum Teil). Per Software lässt sich das aber auch leicht verhindern.

  6. #6
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Hui, das geht hier ja fix mit euren Antworten! Danke dafür!

    Hier ein neuer Versuch, diesmal mit Interrupts.
    Habe ich das so richtig verstanden?

    Code:
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Pinb.3 = Input
    Eingang Alias Portb.3
    Config Portb.4 = Output
    Ausgang Alias Portb.4
    
    Dim A As Byte
    Dim B As Byte
    A = 0                                       'beim Start ist A=0 und B=0
    B = 0
    
    Config Int0 = Rising                   'Interrupts reagieren auf steigende Flanke
    Config Int1 = Rising
    Enable Interrupts
    Enable Int0                                'Interrupts einschalten
    Enable Int1
    On Int0 Isr_von_int0
    On Int1 Isr_von_int1
    
    
    Do
    If Eingang = 1 Then                  'Wenn Eingang=1, dann Ausgang=1
    Ausgang = 1
    End If
    
    If A = B Then                            'Wenn A=B, dann Ausgang=0
    Ausgang = 0
    End If
    Loop
    
    Isr_von_int0:                             'Zähle A hoch
    Do
    A = A + 1
    Return
    
    Isr_von_int1:
    B = B + 1                                  'Zähle B hoch
    Return
    Am Ende erwartet Bascom laut Syntaxprüfung einen Loop. Warum?

    Grüße,
    Johannes

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    25.04.2010
    Beiträge
    1.249
    Loop brauch irgendeine Bedingung.

  8. #8
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    705
    Am Ende erwartet Bascom laut Syntaxprüfung einen Loop. Warum?
    Das könnte daran liegen, dass Du die ISR vom Int0 mit einem "Do" begonnen hast. Und für jedes Do will Bascom auch immer ein Loop sehen. In einer ISR brauchst Du aber kein Do/Loop.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    26.02.2011
    Beiträge
    16
    Zitat:
    Am Ende erwartet Bascom laut Syntaxprüfung einen Loop. Warum?


    Das könnte daran liegen, dass Du die ISR vom Int0 mit einem "Do" begonnen hast. Und für jedes Do will Bascom auch immer ein Loop sehen. In einer ISR brauchst Du aber kein Do/Loop.
    Ups stimmt, da hätte ich auch selbst drauf kommen können. Bin noch blutiger Anfänger...

  10. #10
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    09.08.2004
    Ort
    Potsdam
    Beiträge
    190
    Softwareseitig lässt sich der Eingang auch mit dem Befehl "debounce" entprellen.
    Einen REED-Kontakt würd ich aber bei bis zu 60Hz nicht nehmen. Da wär ein Hallsensor wesentlich besser und prellfreier.

    Isr_von_int0: 'Zähle A hoch

    'A = A + 1 <- geht wesentlich einfacher

    waitms 2 'Routine 2ms warten lassen
    incr A 'Var A um eins erhöhen
    Return

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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