MCP23008 Taster entprellen

Gast #4614546
Lesenswert?

Hallo,

ich habe folgendes Problem: Ich habe einen MCP23008 über I2C an einen 
Atmega128 angeschlossen. Zudem nutze ich die library von Peter Danegger 
zum Entprellen. Die Ansteuerung des MCP23008 funktioniert. Nun möchte 
ich gerne die Entprell-routinen nutzen, um die Taster vom MCP23008 
abzufragen. Hat hier schonmal jemand was gemacht?
Ich möchte keinen vollständigen Quelltext, ein paar Denkanstöße würden 
mir reichen. Ich habe schon ein wenig rum probiert. Zum Beispiel habe 
ich den interrupt Ausgang des MCP23008 genutzt, um diesen als "Taster" 
an die Enptrell-routine zu übergeben (Der Interrupt Ausgang wird 
gesetzt, wenn am MCP ein Eingang gesetzt wurde und bleibt solange, bis 
der MCP abgefragt wurde). Wenn der "Taster" also high ist, werden die 
Eingänge abgefragt. Ist dieser Ansatz grundsätzlich machbar oder gibt es 
bessere Alternativen?
Gast #4615742
Lesenswert?

Danke.

so vielleicht?
1
     
2
  uint8_t i;
3
  uint8_t readByte;
4
  static uint8_t ct2, ct3;
5
    
6
  ... //hier wird das GPIO Register des MCP23008 abgefragt und in "readbyte" gespeichert
7
  
8
  i= key_state_mcp ^~readByte;
9
  
10
  ct2 = ~( ct2 & i );                             // reset or count ct0
11
  ct3 = ct2 ^ (ct3 & i);                          // reset or count ct1
12
  i &= ct2 & ct3;                                 // count until roll over ?
13
  key_state_mcp ^= i;                                 // then toggle debounced state
14
  key_press_mcp |= key_state_mcp & i;

leider reagiert nun mein prgramm nicht mehr. Sind die 10ms zu kurz, um 
die i2c Verbindung vollständig abzuschließen?

Anmerkung: die variablen sind wie folgt vorher deklariert:
1
volatile uint8_t key_state_mcp; 
2
volatile uint8_t key_press_mcp;
Gast #4615872
Lesenswert?

danke für die schnelle Antwort.

Das habe ich schon getan. Ich lese den Chip aus und gebe den Wert von 
readbyte auf einem Display aus. Dieser ändert sich, je nachdem, welche 
Taste gedrückt ist.

also z.b. kein Taster: 240
taster 8 gedrückt (MSB): 112

Anmerkung: 4 sind als Ausgäng definiert, daher sind diese immer 0
#4616472
Lesenswert?

Es darf natürlich nicht zu einem Konflikt des I2C mit dem Main kommen.
Wird I2C im Main und im Interrupt benutzt, ist es im Main atomar zu 
kapseln (von Start bis Stop).
Dem 10ms Timerinterrupt tut es nicht weh, wenn er mal etwas Jitter hat.
Sind noch andere kritische Interrupts nötig, dann muß statt atomar nur 
der 10ms Timerinterrupt gesperrt werden.
Oder man macht den Interrupt per SW-I2C mit getrennten Pins.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren