Forum: Mikrocontroller und Digitale Elektronik MCP23008 Taster entprellen


von HG (Gast)


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?

von Peter D. (peda)


Lesenswert?

Du kannst im 10ms Timerinterrupt den Chip einlesen und dann entprellen.

von HG (Gast)


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;

von Peter D. (peda)


Lesenswert?

HG schrieb:
> Sind die 10ms zu kurz, um
> die i2c Verbindung vollständig abzuschließen?

Bei 100kHz I2C-Takt sollten 2 Byte (I2C-Adresse+Datenbyte) etwa 0,2ms 
dauern. Der MCP23008 kann aber auch 400kHz.

Lies aber den Chip erstmal im Main aus und gib die 8 Inputs über LEDs, 
LCD oder UART aus, ob Du ihn überhaupt richtig konfiguriert hast.

von HG (Gast)


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

von Bad U. (bad_urban)


Lesenswert?

Ich nutze bei einem Projekt den MCP23017, ist ja im Prinzip das selbe, 
nur in 16 Bit. Zwei davon werden im 10ms Raster abgefragt. Das geht ohne 
Probleme. An der Zeit kanns nicht liegen.
Oder läuft dein uC auf einem extrem niedrigen Takt?

von Peter D. (peda)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.