Forum: Compiler & IDEs Petder Daneggers Debounce Verständnis


von x5 (Gast)


Lesenswert?

Guten Tag,

bei der Debounce Methode für Taster von Peter Danegger gibt es folgende 
ISR
1
ISR (SIG_OVERFLOW0)      // every 10ms
2
{
3
  
4
    
5
  static u8 ct0, ct1, rpt;
6
  u8 i;
7
8
  TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5);  // preload for 10ms
9
10
  i = key_state ^ KEY_PIN;    // key changed ?
11
  ct0 = ~( ct0 & i );      // reset or count ct0
12
  ct1 = ct0 ^ (ct1 & i);    // reset or count ct1
13
  i &= ct0 & ct1;      // count until roll over ?
14
  key_state ^= i;      // then toggle debounced state
15
  key_press |= key_state & i;    // 0->1: key press detect
16
17
  if( (key_state & REPEAT_MASK) == 0 )  // check repeat function
18
     rpt = REPEAT_START;    // start delay
19
  if( --rpt == 0 ){
20
    rpt = REPEAT_NEXT;      // repeat delay
21
    key_rpt |= key_state & REPEAT_MASK;
22
  }
23
}


bei folgender Zeile:
TCNT0 = (u8)(s16)-(XTAL / 1024 * 10e-3 + 0.5);  // preload for 10ms

wird ja der Timerinhalt berechnet um den T0 mit einem Wert vorzuladen. 
Hier wird bei einer XTAL Frequenz von 1Mhz ausgegangen. Muss ich die 
Formel irgendwie anpassen wenn mein µC mit 8Mhz läuft?

Wenn die die Simulation auf 1 Mhz stelle und XTAL auf 1Mhz stelle dann 
wird mit in der Simulation angezeigt das die ISR nur 0,09ms braucht. 
aber wenn ich die formel selbst mitm Taschenrechnerausrechne komme ich 
auf die 10ms.


Wo liegt hier mein Denkfehler ?


Gruß
x5

von Karl H. (kbuchegg)


Lesenswert?

x5 schrieb:

> Wenn die die Simulation auf 1 Mhz stelle und XTAL auf 1Mhz stelle dann
> wird mit in der Simulation angezeigt das die ISR nur 0,09ms braucht.

Das ist als Diskrepanz ziemlich gross.
Hast du auch sicher das richtige gemessen? Es geht darum: In welchen 
Zeitabständen wird die ISR aufgerufen.
Es geht nicht darum, wie lange die ISR selber braucht.


> Muss ich die
> Formel irgendwie anpassen wenn mein µC mit 8Mhz läuft?

In die Formel geht ja XTAL mit ein.
Wobei: Solange sich die Interruptaufrufe im Bereich ca. 5 bis vielleicht 
30 oder 40ms bewegen, und du rein durch den Vorteiler des Timers in 
diesen Bereich kommst, kannst du das Vorladen des Timers auch einfach 
rauswerfen.

Das ist alles nicht wirklich zeitkritisch, solange man sich in gewissen 
Grenzen bewegt. Zu kurz darf es nicht sein, weil man dann schon in den 
Bereich kommt, in dem Tastenprellen stattfindet. Zu lang darf es nicht 
sein, weil sich sonst die Tastenbetätigung 'zäh' anfühlt: Man drückt und 
die Aktion passiert erst einen merkbaren Augenblick später.

Aber in diesem Bereich kannst du mit so ziemlich jeder Zeitdauer 
operieren, die dir genehm ist. Da musst du dir keinen Kopf darüber 
zerbrechen, wie du genau exakt 10ms hinkriegst.

von x5 (Gast)


Lesenswert?

Achso die 10 ms sind nicht so kritisch.

Also die 0,09ms zeigt mir die Simulation an und zwar ist das die zeit 
von einem ISR aufruf bis zum nächsten aufruf der ISR. Die ISR selbst 
braucht 0,04ms.


dann versuche ich das mal ein bisschen anzupassen - vielen Dank für 
deine antwort =)

von Peter D. (peda)


Lesenswert?

x5 schrieb:
> wird mit in der Simulation angezeigt das die ISR nur 0,09ms braucht.

<Rumgerate ein>
Prescaler nicht auf 1024 gesetzt?
<Rumgerate aus>


Peter

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.