Forum: Mikrocontroller und Digitale Elektronik Uhrenquarz an Atmega8


von Jabu (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

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

Wie wäre es mit der vollständigen Initialisierung?

MfG Spess

von Hilfreicher Helfer (Gast)


Lesenswert?

500 g   Nudeln (z. B. Penne)
2 Bündel   Radieschen

von Roger die Made (Gast)


Lesenswert?

Schaltplan?
Quellcode?

von Jabu (Gast)


Lesenswert?

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
}

von Jabu (Gast)


Lesenswert?

*Sekunde und nicht Minute

Der Uhrenquarz ist einfach zwischen PB6 und PB7 geschaltet.

von Floh (Gast)


Lesenswert?

Woran erkennst du, dass der Timer nicht läuft?

von Jabu (Gast)


Lesenswert?

LED blinkt nur mit Timer auf Einstellung "interner Quarz"

von spess53 (Gast)


Lesenswert?

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

von error (Gast)


Lesenswert?

>das Bit für die internen Kondensatoren ist doch standardmäßig gesetzt?
Nein, die CKOPT Fuse ist ab Werk nicht gesetzt.

von Jabu (Gast)


Lesenswert?

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.

von perlbastel (Gast)


Lesenswert?

> while((1<<TCN2UB)||(1<<OCR2UB)||(1<<TCR2UB)){} //Warten
Das ist zu 99,9% Unfug. Es soll wohl
while(REGISTER&(1<<TCN2UB) || REGISTER&....);
heissen.

von Jabu (Gast)


Lesenswert?

ja sry habe es schon korrigiert, teste es kurz /-:

von Jabu (Gast)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?


von Jabu (Gast)


Lesenswert?

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!

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.