Ich bin gerade dabei das Tut hier im Forum durchzuarbeiten und bin jetzt
beim Thema Taster entprellen etc.
Jetzt bin ich bei dieser ISR angekommen aber verstehe nicht was genau da
passiert:
1 | ISR( TIMER0_OVF_vect ) // every 10ms
|
2 | {
|
3 | static uint8_t ct0, ct1, rpt;
|
4 | uint8_t i;
|
5 |
|
6 | TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5); // preload for 10ms
|
7 |
|
8 | i = key_state ^ ~KEY_PIN; // key changed ?
|
9 | ct0 = ~( ct0 & i ); // reset or count ct0
|
10 | ct1 = ct0 ^ (ct1 & i); // reset or count ct1
|
11 | i &= ct0 & ct1; // count until roll over ?
|
12 | key_state ^= i; // then toggle debounced state
|
13 | key_press |= key_state & i; // 0->1: key press detect
|
14 |
|
15 | if( (key_state & REPEAT_MASK) == 0 ) // check repeat function
|
16 | rpt = REPEAT_START; // start delay
|
17 | if( --rpt == 0 ){
|
18 | rpt = REPEAT_NEXT; // repeat delay
|
19 | key_rpt |= key_state & REPEAT_MASK;
|
20 | }
|
21 | }
|
Diese ISR erledigt zwei Dinge oder? zum einen fragt sie bei jedem timer
overflow den status der Taster ab und zum anderen entprellt sie die
Taster. Stimmt das oder liege ich da komplett falsch??
es wär super wenn jemand so geduldig wär mir den code schritt für
schritt zu erklären.
mfg