www.mikrocontroller.net

Forum: Compiler & IDEs Entprellroutine von Peter in Code einfügen, aber wie?


Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?
// ATmega16 @ 16MHz

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define Taster_1 (PIND&(1<<PD2))
#define Taster_2 (PIND&(1<<PD3))
#define Taster_3 (PIND&(1<<PD4))

uint8_t var1 = 0;
uint8_t var2 = 0;

ISR(TIMER0_OVF_vect)
{  
  PORTA = 0xff;
}


int main(void)
{
    
  DDRA = 0b11111111;
  DDRB = 0b11111111;
  DDRC = 0b11111111;
  DDRD = 0b11100011;
  
  TCCR0 |= (1<<CS02);      // Prescaler: 256
  //TCCR0 |= (1<<CS00)|(1<<CS02);  // Prescaler: 1024
  TIMSK |= (1<<TOIE0);
  
  sei();

  while(1)
  {     
    if (Taster_1 && TCNT0 == 255)
    {
    var2++;
    if (var2 == 50)
    {
      var1++;
      var2 = 0;
    }
    }
    
    if (TCNT0 == var1) 
    {
      PORTA = 0x00;
    }
      
    }
}

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

Bewertung
0 lesenswert
nicht lesenswert
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.
ISR(TIMER0_OVF_vect)
{
  //
  // der Teil, der für die Entprellung zuständig ist
  //
  static uint8_t ct0, ct1, rpt;
  uint8_t i;
 
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 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;
  }

  //
  // und was sonst noch in dieser ISR zu geschehen hat
  //
   PORTA = 0xff;
}

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Anderer Timer heißt dann Timer1?

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Anderer Timer heißt dann Timer1?
Oder Timer 2, oder ...
In welchem Intervall wird denn deine
ISR(TIMER0_OVF_vect)
aufgerufen?

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

Bewertung
0 lesenswert
nicht lesenswert
Micha wrote:
>>Anderer Timer heißt dann Timer1?
> Oder Timer 2, oder ...
> In welchem Intervall wird denn deine
>
ISR(TIMER0_OVF_vect)
> aufgerufen?

Du bist gemein :-)
Wäre ja auch zu einfach, diese Zeit einfach mal auszurechnen.

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich jetzt genau gerechnet habe, mit 16 MHz und einen Prescaler von 
256, habe ich 4080µs pro Intervall von 0 bis 255.

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

Bewertung
0 lesenswert
nicht lesenswert
Gut. Auf diesen Zahlenwert bin ich auch gekommen.
4080 µs sind knapp 4ms. Was sagt dir das zum Thema Entprellung?

Hinweis: Schmeiss den Timer Reload auf 10ms in der ISR raus und alles 
ist gut.

Autor: Mathias O. (m-obi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du meinst also ich soll dies
TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms
rausnehmen und den Rest einfach übernehmen?

Kann mir denn jemand auchmal erklären was der Code macht? Ich hab ja mal 
gelernt, Punktrechnung geht vor Strichrechnung...

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du bist gemein :-)
Nö. Nur zu faul... ;-)

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Du meinst also ich soll dies
>TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms
>rausnehmen und den Rest einfach übernehmen?
Jep.

>Kann mir denn jemand auchmal erklären was der Code macht?
Das wird in dem Thread, aus dem du den Code hast (weiter unten) erklärt.

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

Bewertung
0 lesenswert
nicht lesenswert
Mathias O. wrote:

> Kann mir denn jemand auchmal erklären was der Code macht? Ich hab ja mal
> gelernt, Punktrechnung geht vor Strichrechnung...

Ja.
Genau das macht er. Punkt vor Strich rechnen.
Schmeis den Taschenrechner an, setz deine Zahlenwerte ein und sieh nach 
was rauskommt. Dann überleg dir was es wohl für den nächsten Überlauf 
des Timers zeitmässig bedeuten könnte, wenn man diesen Wert in das 
Timerregister lädt und den Timer von dort wegzählen lässt.
Hinweis: Du brauchst dazu das wissen wie lange es dauert, bis der Timer 
um 1 weitergezählt hat. Und du brauchst das Wissen, das für den Timer -1 
dasselbe ist wie 254, -2 dasselbe wie 253, -3 dasselbe wie 252 etc.

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.