www.mikrocontroller.net

Forum: Compiler & IDEs Petder Daneggers Debounce Verständnis


Autor: x5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

bei der Debounce Methode für Taster von Peter Danegger gibt es folgende 
ISR
ISR (SIG_OVERFLOW0)      // every 10ms
{
  
    
  static u8 ct0, ct1, rpt;
  u8 i;

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

  i = key_state ^ KEY_PIN;    // key changed ?
  ct0 = ~( ct0 & i );      // reset or count ct0
  ct1 = ct0 ^ (ct1 & i);    // reset or count ct1
  i &= ct0 & ct1;      // count until roll over ?
  key_state ^= i;      // then toggle debounced state
  key_press |= key_state & i;    // 0->1: key press detect

  if( (key_state & REPEAT_MASK) == 0 )  // check repeat function
     rpt = REPEAT_START;    // start delay
  if( --rpt == 0 ){
    rpt = REPEAT_NEXT;      // repeat delay
    key_rpt |= key_state & REPEAT_MASK;
  }
}


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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: x5 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.