Uhrenquarz an Atmega8

Gast #2696401
Hallo,

Ich habe ein Problem mit der Nutzung eines Uhrenquarzes 32...kHz

Habe Prescaler und TCNT2 auf gegebene Werte gesetzt sowie das Bit AS2 im 
Register ASSR. Habe keine Kondensatoren an den Eingängen, das Bit für 
die internen Kondensatoren ist doch standardmäßig gesetzt?

Habe ich etwas vergessen oder warum läuft der Timer noch nicht einmal 
an???

Danke im Voraus.
Gast
void isr_init(void)
{
  ASSR = (1<<AS2);
  TIMSK |= (1<<TOIE2);
  TCCR2 = (1<<CS22)|(1<<CS21);
  sei();

}

//.....


ISR(TIMER2_OVF_vect)
{
  TCNT2 = 128;
//.......Minute erhöhen
}
Gast
Hi

Sieh dir mal die Umschaltung in den Async Mode im Datenblatt an:

Asynchronous
Operation of
Timer/Counter2

....
1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2
2. Select clock source by setting AS2 as appropriate
3. Write new values to TCNT2, OCR2, and TCCR2
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and 
TCR2UB
5. Clear the Timer/Counter2 Interrupt Flags
6. Enable interrupts, if needed
.....

MfG spess
Gast
void isr_init(void)
{
  //OCIE2 and TOIE2 bereits 0
  ASSR = (1<<AS2);

  TCCR2 = (1<<CS22)|(1<<CS21);
  TCNT2 = 128;

  while((1<<TCN2UB)||(1<<OCR2UB)||(1<<TCR2UB)){} //Warten

  TIMSK |= (1<<TOIE2);
  sei();

}

So geht es immer noch nicht.
Gast
> while((1<<TCN2UB)||(1<<OCR2UB)||(1<<TCR2UB)){} //Warten
Das ist zu 99,9% Unfug. Es soll wohl
while(REGISTER&(1<<TCN2UB) || REGISTER&....);
heissen.
Gast
void isr_init(void)
{
  //OCIE2 and TOIE2 bereits 0
  ASSR = (1<<AS2);

  TCCR2 = (1<<CS22)|(1<<CS21);
  TCNT2 = 128;
  while((ASSR &(1<<TCN2UB))||(ASSR &(1<<OCR2UB))||(ASSR &(1<<TCR2UB))){} 
//Warten

  TIMSK |= (1<<TOIE2);
  sei();
}

Nun scheint er dauerhaft in der Warteschleife hängen zu bleiben, auch 
wenn ich die 3 Bedingungen negiere.
Gast
Meine Güte, habe es nun alles nach Anleitung wie folgt im Programm:

void isr_init(void)
{
    //Disable timer2 interrupts
    TIMSK  = 0;
    //Enable asynchronous mode
    ASSR  = (1<<AS2);
    //set initial counter value
    TCNT2=0;
    //set prescaler
    TCCR2 = (1<<CS22)|(1<<CS21);
    //wait for registers update
    while (!(ASSR & ((1<<TCN2UB)|(1<<TCR2UB))));
    //clear interrupt flags
    TIFR  = (1<<TOV2);
    //enable TOV2 interrupt

TIMSK |= (1<<TOIE2);
sei();

}

Er zählt trotzdem noch nicht!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.