mikrocontroller.net

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


Autor: Stephan Plaschke (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Stephan Plaschke (Gast)
Datum:

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

Autor: Stephan Plaschke (Gast)
Datum:

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

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.