- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Abfrage Pins mit Debounce merkwürdig

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    31.08.2007
    Beiträge
    30

    Abfrage Pins mit Debounce merkwürdig

    Anzeige

    E-Bike
    Hallo zusammen,

    ich programmiere mit der Bascom Demo auf einem ATMEGA8.
    In der Init Routine möchte ich einen Taster abfragen und je nach Ergebnis einen Initialwert verändern. Veränderung des Wertes wenn TAste 5 s gedrückt.
    Der Pin am Prozessor ist mittels einen 33k Widerstands auf +5V gelegt. Durch Drücken der Taste wird der Pin auf 0-Potential gezogen.
    Obwohl keine Taste gedrückt wurde verzweigt der nachfolgende Debounce Befehl auf die Routine welche eim Drücken der Taste ablaufen soll.
    Nach meiner Ansicht müsste der Pin auf High liegen und deshalb der befel der auf den Debounce Befehl folgt ausgeführt werden.

    Wo ist der Fehler ?

    Hier ein Code Ausschnitt:
    ' Definition der Taste

    Config Portd.7 = Input
    Taste_1 Alias Portd.7
    .
    Init()
    Config Debounce = 5000 ' 5s gedrückt wechselt Grunddrehrichtung

    Debounce Taste_1 , 0 , Change_hard_direction , Sub

    Config Debounce = 25
    .
    .
    Change_hard_direction:
    Direction = Hard_direction
    Print "In Hard"
    If Direction = 1 Then
    Direction = 0

    Else : If Direction = 0 Then Direction = 1

    End If

    return

    Ich kann mir das Verhalten nicht erklären und bitte deshalb um Hilfe


    beste Grüsse
    Christian

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    5 Sekunden ist vielleicht zu lang gewählt? Ich könnte mir vorstellen, dass das eine Byte-Variable ist. Also wäre 255 das Maximum.

    Debounce einfach manuell:
    Falls das Programm gleichzeitig eh nix machen soll, Frage den Wert ab, warte 5 Sekunden und frage nochmal ab. Wenn Wert A und B gleich sind, dann gilt die Taste als gedrückt.

    Eleganter ist bestimmt, einen Timer mit Interrupt zu verwenden... der fragt den Taster ab und springt alle X Millisekunden in eine Sub, die den Taster erneut abfragt und bei positivem Ergebnis einen Zähler erhöht, dann nach 5 Sekunden das Ereignis auslöst.

    Außerdem würde ich die Variable DIRECTION einfach als Bit dimensionieren und mit TOGGLE umschalten - spart CPU-Power und Codespace.

  3. #3
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    als Bit dimensionieren ....spart CPU-Power und Codespace.
    Vorsicht, das stimmt nicht ! Bascom arbeitet immer über das T-Bit, das erhöht die Befehlszahl unangenehm
    Schau dir mal den generierten Code an.

    Das Kürzeste an Code / CPU ist ein einzelnes Byte und ggf. selbst Bits ein- und ausmaskieren
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    31.08.2007
    Beiträge
    30
    Ich habe jetzt vor dem DEBOUNCE den Pin abgefragt und mir dann eine Meldung auf die serielle Schnittstelle geschickt.

    If Taste_1 = 0 Then Print "low"

    Trotz externem Pull-Up Widerstand wurde mir LOW geschickt !!!!

    Ist da noch etwas zu konfigurieren ?

    mfg
    Christian

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    26.05.2007
    Beiträge
    594
    Worauf hast du den DEBOUNCE gesetzt? Weniger als 255?

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Config Portd.7 = Input
    Ich galub, das muß heissen
    Config Pind.7 = Input
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    19.07.2007
    Alter
    59
    Beiträge
    1.080
    Das mit Direction mache ich immer gerne kurz und knapp wie folgt, wenn es wie in diesem Fall zwischen 0 und 1 toggeln soll. man kann es natürlich auch an andere Wechsel anpassen:

    direction = 1 - direction

    Das mit port und pin ist wirklich manchmal recht fehlerträchtig, so sollte es gehen:

    Config Portd.7 = Input ' beim configurieren ists noch der port
    Taste_1 Alias Pind.7 ' damit im programm der alias richtig ersetzt wird, muss hier pin stehen

    Gruß MeckPommER

    P.S.: warum einen externem Pull-Up, wenn ein interner vorhanden ist, der nur "angeschaltet" werden muss?
    Mein Hexapod im Detail auf www.vreal.de

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    06.08.2006
    Ort
    Delitzsch
    Alter
    83
    Beiträge
    54
    Hallo autoguider !


    Wo ist der Fehler ?
    Da ist kein Fehler.
    Der Debounce Befehl den Du prog. hast sagt doch folgendes aus:

    Wenn Portd.7 auf low geht,führt Subroutine ( hier) Change_hard_direktion aus.
    Portd.7 muss auf high gehen, bevor der Sprung in die Subroutine ausgeführt werden kann.
    Zum Label Change_hard_direktion , wenn Portd.7 auf low ist.

    Hier ein Code Ausschnitt:
    ' Definition der Taste

    Config Portd.7 = Input
    Taste_1 Alias Portd.7
    .
    Init()
    Config Debounce = 5000 ' 5s gedrückt wechselt Grunddrehrichtung

    Debounce Taste_1 , 0 , Change_hard_direction , Sub

    Config Debounce = 25
    .
    .
    Change_hard_direction:
    Direction = Hard_direction
    Print "In Hard"
    If Direction = 1 Then
    Direction = 0

    Else : If Direction = 0 Then Direction = 1

    End If

    return

    ich hoffe dir das richtig verständlich erklärt zu haben.

    MfG

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    17.02.2005
    Ort
    NRW-Bergisches Land
    Beiträge
    311
    Config PORTx
    Taste alias PINx.y !!!
    da es ja Debounce PINx.y und nicht Portx.y heißt.
    Gruß RePi!


    *** Holzhacken ist deshalb so beliebt, weil man bei dieser Tätigkeit den Erfolg sofort sieht. ***
    *** (Albert Einstein) ***

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    29.07.2007
    Beiträge
    386
    .....Config Portd.7 = Input .....

    so etwas geht in Bascom nicht!
    es heisst "pind.0" bis "pind.7" für einzelne belegungen oder "portb" für den gesamten port.

    lest mal die hilfe von Bascom und das datenblatt vom atmega.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen