Forum: Mikrocontroller und Digitale Elektronik Problem mit 16it Zugriff des Timers und Tasterentprellen


von Stephan Plaschke (Gast)


Lesenswert?

Zum Anfang das ganze wird ein Tacho fürs Motorrad. Zum ersten Problem.
Ich wollte der Einfachheit halber mit dem Codevision den 16bit Zugriff
auf das Timerregister nutzen. Hab da etwas probiert und gemerkt das das
beim Codevision noch nicht vordefiniert ist. Hab dann schnell die
Headerdatei des Atmega32 umgeschrieben und dachte nun geht es.
Umgeschrieben habe ich es so:
....
sfrb ICR1L=0x26;
sfrb ICR1H=0x27;
sfrb ICR1=0x26;   // 16 bit access
sfrb OCR1BL=0x28;
sfrb OCR1BH=0x29;
sfrw OCR1B=0x28;  // 16 bit access
sfrb OCR1AL=0x2a;
sfrb OCR1AH=0x2b;
...
Nun dachte ich kann ich einfach:
....
word startwert=0, endwert=0;
byte i=2;
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
  i^=3;
  if (i==1) startwert = (word)ICR1;
  else endwert = (word)ICR1;
}
....
das so auslesen und es funktioniert. Nur leider tut es das nicht
bekomme nur die Lowbits. Mache ich etwas falsch??

So und zum zweiten Problem. Ich habe einen Reedkontakt der leider stark
nach prellt. Bekomme da anstatt einen Captureinterrupt leider zwei pro
Umdrehung. Habs mir mit dem Oszi angeschaut und wirklich es isnd zwei
Impulse. Dachte nun ich mache einfach einen Tiefpass vor dem Eingang
des μC. Erwarte nur eine Frequenz von unter 50Hz. Funzt nun auch
super nur stelle ich fest das sich hier der Kondensator dauerhaft über
den Port des μC lädt. Obwohl dieser ja als Eingang definiert ist.
Meine Frage ist nun wie gut das für den μC ist?? Oder sollte man
dann lieber einen Hochpass nehmen ??

Vielen Dank schon mal
Stephan

von crazy horse (Gast)


Lesenswert?

im Prinzip geht das so, wie du es dir gedacht hast - Schreibfehler. Du
musst
sfrw ICR1=0x26;   // 16 bit access
schreiben, beim OCR hast du es ja richtig gemacht.

Entprellen:
Auf jeden Fall per Software machen.
-Timer durchlaufen lassen
-die Zeiten als Differenz zwischen 2 ICP-Ereignissen berechnen
-beim ICR-Interrupt diesen Sperren, den ICP-Wert + x (Prellzeit
+Reserve) in ein OCR-Register laden
-der OCR-Int gibt dann den ICP wieder frei.

von Stephan Plaschke (Gast)


Lesenswert?

Ah hast recht. Dummer Fehler nu seh ich das auch mit dem w.
Aber wenn ich nun das per Hardware machen will wie wäre das.
Oder soll ich ein Flipflop oder so vorsetzen mit der zeit von
2 Impulsen. Wäre dann ja auch ein sauberes Signal.

von Stephan Plaschke (Gast)


Lesenswert?

So ich habe das so jetzt mal probiert.

// Timer 1 input capture interrupt service routine
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
  TIMSK=0x10;
  OCR1A = ((word)ICR1) + 10;
}

interrupt [TIM1_COMPA] void  timer1_compa_isr(void)
{
  TIMSK=0x20;
}

Es will aber nicht so wie ich es will. Die +10 habe ich nur mal zum
ausprobieren genommen. Ist da nun ein Fehler, denn ich bekomme immer
noch 2 Capture Events. Der dritte lässt dann richtig lange auf sich
warten. Sind dann bestimmt ein paar sek.
Kann ich so die Interrupts nicht ausstellen ? Oder warum will das nicht
so laufen wie ich will.

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.