Mathias O. wrote:
> Hallo,
>
> ich möchte gerne die Entprellroutine von Peter D. verwenden. Aber wie
> füge ich die bei mir ein. Kann man mehrere ISR in einem Code verwenden,
> weil ich hab schon eine und in der Entprellroutine ist ja auch eine?
Du musst 2 Fälle unterscheiden:
* wenn deine Timereinstellung (Vorteiler) gravierend von der der
Entprellerei abweicht, dann muss eines der beiden Subsysteme auf einen
anderen Timer ausweichen. Das ist aber nur notwendig, wenn die
Overflowzeiten gravierend voneinander abweichen.
* Wenn die Einstellungen so halbwegs zusammenpassen, und das tun sie
eigentlich meistens bis oft, dann führst du ganz einfach die Inhalte
deiner ISR und der 'Entprell'-ISR zusammen. Unter Umständen musst du die
Berechnung des Preload anpassen. Ob die ISR alle 10ms oder alle 8 oder 5
oder 15 aufgerufen wird, ist für die Entprellung relativ egal.
1 | ISR(TIMER0_OVF_vect)
|
2 | {
|
3 | //
|
4 | // der Teil, der für die Entprellung zuständig ist
|
5 | //
|
6 | static uint8_t ct0, ct1, rpt;
|
7 | uint8_t i;
|
8 |
|
9 | TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5); // preload for 10ms
|
10 |
|
11 | i = key_state ^ ~KEY_PIN; // key changed ?
|
12 | ct0 = ~( ct0 & i ); // reset or count ct0
|
13 | ct1 = ct0 ^ (ct1 & i); // reset or count ct1
|
14 | i &= ct0 & ct1; // count until roll over ?
|
15 | key_state ^= i; // then toggle debounced state
|
16 | key_press |= key_state & i; // 0->1: key press detect
|
17 |
|
18 | if( (key_state & REPEAT_MASK) == 0 ) // check repeat function
|
19 | rpt = REPEAT_START; // start delay
|
20 | if( --rpt == 0 ){
|
21 | rpt = REPEAT_NEXT; // repeat delay
|
22 | key_rpt |= key_state & REPEAT_MASK;
|
23 | }
|
24 |
|
25 | //
|
26 | // und was sonst noch in dieser ISR zu geschehen hat
|
27 | //
|
28 | PORTA = 0xff;
|
29 | }
|