mikrocontroller.net

Forum: Compiler & IDEs Kombination aus PeDa Taster-Entprellroutine und Matrix-Entprellroutine


Autor: Stefan B. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich sitze hier grad vor einem Problem und komme nicht mehr weiter.

Es geht um Folgendes:
Ich habe mir einen Adapter für meine im Auto vorhandene 
Lenkradfernbedienung gebaut. Die LFB-Tasten sind eine Widerstandsleiter, 
also geradezu prädestiniert für die berühmte PeDa 
Matrix-Entprellroutine.

Leider funktioniert diese ja nur genau ein Mal, also bei einem 
Tastendruck ist die Prüfung auf "Taste gedrückt" nur beim ersten Mal 
wahr.
Ich hätte aber gern, so wie bei der "normalen" PeDa-Entprellung, die 
Möglichkeit einen langen Tastendruck mit automatischer Wiederholung zu 
realisieren.

Also habe ich die Matrix-Entprellung erst mal ein wenig für mich 
umgebaut, meine Tasten sind ja nicht in einer Matrix.
Das Array mit den Schwellwerten bekommt eben eine andere Füllung, 
gleichzeitig habe ich die Einträge auf 16bit-Typen umgestellt.

Im Debugger hat das schon mal ganz gut ausgesehen, bis auf die Tatsache 
mit der fehlenden Wiederholmöglichkeit.

Darum habe ich versucht, diese Funktionen nachzurüsten.
Also die zusätzliche Variable und die #defines im Header, sowie die 
Funktion get_key_rpt in meinen Code eingefügt, und die Interrupt-Routine 
erweitert.

Original Matrix-Interrupt:
  static u16 ct0, ct1;
  u16 i;

  i = key_state ^ key_no( ADCH );  // key changed ?
  ct0 = ~( ct0 & i );      // reset or count ct0
  ct1 = ct0 ^ (ct1 & i);    // reset or count ct1
  i &= ct0 & ct1;      // count until roll over ?
  key_state ^= i;      // then toggle debounced state
  key_press |= key_state & i;    // 0->1: key press detect

Original Tasten-Interrupt:
  static uint8_t ct0 = 0xFF, ct1 = 0xFF, rpt;
  uint8_t i;

  i = key_state ^ ~KEY_PIN;                     // key changed ?
  ct0 = ~( ct0 & i );                           // reset or count ct0
  ct1 = ct0 ^ (ct1 & i);                        // reset or count ct1
  i &= ct0 & ct1;                               // count until roll over ?
  key_state ^= i;                               // then toggle debounced state
  key_press |= key_state & i;                   // 0->1: key press detect

  if( (key_state & REPEAT_MASK) == 0 )          // check repeat function
     rpt = REPEAT_START;                        // start delay
  if( --rpt == 0 ){
    rpt = REPEAT_NEXT;                          // repeat delay
    key_rpt |= key_state & REPEAT_MASK;
  }

Bei mir wurde daraus:
        uint16_t val;
        val = ADC;

        static uint16_t ct0;
        static uint16_t ct1;
        static uint16_t rpt;
        uint16_t i;

        // key press detection
        i = key_state ^ key_no(val);  // key changed ?
        ct0 = ~( ct0 & i );             // reset or count ct0
        ct1 = ct0 ^ (ct1 & i);          // reset or count ct1
        i &= ct0 & ct1;                 // count until roll over ?
        key_state ^= i;                 // then toggle debounced state
        key_press |= key_state & i;     // 0->1: key press detect

        // key repeat detection
        if((key_state & REPEAT_MASK) == key_state)         // check repeat function
            rpt = REPEAT_START;                    // start delay
        if( --rpt == 0 )
        {
            rpt = REPEAT_NEXT;                     // repeat delay
            key_rpt |= key_state & REPEAT_MASK;
        }

Im PeDa Tasten-Interrupt werden der Eingangs-Port invertiert wird, hat 
natürlich die Wiederholungs-Behandlung
if( (key_state & REPEAT_MASK) == 0 )
nicht funktioniert, und ich habe es in
if((key_state & REPEAT_MASK) == key_state)
geändert.

Jetzt hab ich aber das Problem, dass in jedem Interrupt der Variablen 
rpt wieder REPEAT_START zugewiesen wird, also der Countdown funktioniert 
nicht.

Bei mir hats immer noch über 30° in der Wohnung, ich glaub mein Hirn ist 
etwas weichgekocht im Moment... ;)

Könnt ihr mal bitte darüberschauen, ob ihr meinen Fehler findet?
Für Lösungsvorschläge wäre ich sehr dankbar!

MfG Stefan

Autor: Stefan B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich glaub ich habs jetzt selber hinbekommen.
Zumindest im Debugger läuft es jetzt schon mal.

Was eine Nacht drüber schlafen und ein paar Grad Abkühlung doch bewirken 
können...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.