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?
Du kannst im 10ms Timerinterrupt den Chip einlesen und dann entprellen.
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; |
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.
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.