mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Die genaue Sekunde zu schnell


Autor: CuBiC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe gestern angefangen mich mit dem Code von Peter Dannegger zu 
befassen:
http://www.mikrocontroller.net/articles/AVR_-_Die_...

Mein Problem ist jetzt allerdings, dass meine Sekunde zu schnell gezählt 
wird! Das heißt in meinem Programm vergehen in einer realen Sekunde ca. 
4-5min!

Das zweite Mysterium ist der XTAL Wert. Ich kann ihn beliebig ändern, 
ohne das er Auswirkungen auf meinen Timer hat.

Mein Code:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define XTAL    16000000L  // after measuring deviation: 1.5s/d

#define DEBOUNCE  256L    // debounce clock (256Hz = 4msec)

#define uchar unsigned char
#define uint unsigned int

uchar prescaler;
uchar volatile second;      // count seconds


SIGNAL (SIG_OUTPUT_COMPARE1A)
{
#if XTAL % DEBOUNCE
  OCR1A = XTAL / DEBOUNCE - 1;    // compare DEBOUNCE - 1 times
#endif
  if( --prescaler == 0 ){
    prescaler = (uchar)DEBOUNCE;
    second++;        // exact one second over
#if XTAL % DEBOUNCE      // handle remainder
    OCR1A = XTAL / DEBOUNCE + XTAL % DEBOUNCE - 1; // compare once per second
#endif
  }
}

void setup()
{
  Serial.begin(115200);
  
  TCCR1B = 1<<WGM12^1<<CS10;    // divide by 1
          // clear on compare
  OCR1A = XTAL / DEBOUNCE - 1;
  TCNT1 = 0;
  second = 0;
  prescaler = (uchar)DEBOUNCE;

  TIMSK1 = 1<<OCIE1A;
  sei();
}

void loop()
{
  if( second == 60 )
  {
      second = 0;
      Serial.println(second, DEC);
  }
}

Meine Hardware ist ein Arduino-Board mit einem Mega168 und 16MHz Clock.
Serial.println(second, DEC);
Sollte jede Minute eine 0 dem Code nach ausgeben. Ausgabe kommt jedoch, 
wie oben schon erwähnt, ca. 4-5mal pro Sekunde.

Hoffe mir kann jemand helfen.

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>TCCR1B = 1<<WGM12^1<<CS10;    // divide by 1
Probier mal:
TCCR1B = (1<<WGM12) | (1<<CS10;)    // divide by 1

MW

Autor: CuBiC (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich nichts geändert! Das selbe Spiel =/

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.