Forum: Compiler & IDEs Problem mit timer0


von Roland (Gast)


Lesenswert?

Habe ein Problem mit Timer 0 aber erst seit heute.

Kein Code geändert nur den AVR mal eingeschaltet und er bleibt nach T4 
hängen.

In der While schleife.


void init_timer0()
{
  int temp0,temp1;
   for(temp0=0;temp0<0x0040;temp0++)   // Wait for external clock 
crystal to stabilize
    {
        for(temp1=0;temp1<0xFFFF;temp1++);
    }
   // DDRB=0xFF;

  send_UART("T1\r\n");
  TIMSK &=~((1<<TOIE0)|(1<<OCIE0));     //Disable TC0 interrupt
  send_UART("T2\r\n");
    ASSR |= (1<<AS0);           //set Timer/Counter0 to be asynchronous 
from the CPU clock
      send_UART("T3\r\n"); 
//with a second external clock(32,768kHz)driving it.
    TCNT0 = 0x00;
    TCCR0 = 0x05;                 //prescale the timer to be clock 
source / 128 to make it
send_UART("T4\r\n");                             //exactly 1 second for 
every overflow to occur
    while(ASSR&0x07);           //Wait until TC0 is updated
    TIMSK |= (1<<TOIE0);        //set 8-bit Timer/Counter0 Overflow 
Interrupt Enable
  send_UART("T5\r\n");
}


Deswieteren habe ich ein Problem wenn ich den AVR einschalte zeigt er 
manchmal müll auf dem display und wenn ich ihn nochmals aus/einschalte 
ist es Ok.

aber das Problem mit dem TImer habe ich erst seit heute.

Hat jemand eine Idee???

AVR kaputt????

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Je nach Compiler und Optimierung ist deine Warteschleife für'n Pops.
Unter Umständen passiert da einfach gar nichts, weil der Compiler
merkt, dass da nichts passiert. ;-)

Ansonsten: ein 32768-Hz-Quarz braucht bis zu einer Sekunde, bevor
er stabil läuft.

Dein nicht mit c-Tags versehenes Programm ist praktisch nicht lesbar.

von Rolf Magnus (Gast)


Lesenswert?

Ja, die Warteschleife wird mit ziemlicher Sicherheit komplett 
wegoptimiert. Der Compiler sieht, daß die Schleife nix macht, woraufhin 
der Optimizer entscheidet, daß er nichts auch schneller machen kann.
Deshalb gibt's ja in der avr-libc die delay-Funktionen.

von Roland (Gast)


Lesenswert?

Hallo

also ich verstehe das nicht in allen beispielen wo auf den Uhrenquarz 
zugegriffen wird ist diese while schleife drin.


mit _delay_ms(x) //x egal was

macht mein AVR einen dauerreset.

nur es ging mit der definition über 3 Monate hat sich der quarz 
verabschiedet???


von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> mit _delay_ms(x) //x egal was

> macht mein AVR einen dauerreset.

Dann tust du was flasch.  Das Ding ist nicht viel mehr als eine simple
in inline asm geschriebene Zählschleife.

Um eine ganze Sekunde zu warten, machst du sowas hier:
1
  uint8_t i;
2
  for (i = 0; i < 100; i++)
3
    _delay_ms(10);

Damit wird der Wertebereich garantiert eingehalten.

Die Compileroptimierungen hast du aber eingeschaltet, ja?  Nicht dass
der Code einfach nur zu groß wurde.

> nur es ging mit der definition über 3 Monate

Sonst nichts geändert?  Neuer Compiler, andere Compileroptionen als
früher?

> hat sich der quarz
> verabschiedet?

Nicht auszuschließen, aber wenig wahrscheinlich.

von Roland (Gast)


Lesenswert?

Quartz aus gelötet und neuen rein jetzt habe ich das Problem das wenn 
der Interupt das erste mal auslöst mein AVR Abstürzt und nichts geht 
mehr.

SIGNAL (SIG_OUTPUT_COMPARE0A)   // Sekundentimer
{


send_UART("HALLO!111");

}

das Hallo!111 kommt nicht mehr.


in der main ist nur


void main(void)
{
init_timer0();
while(1)
{

}
}

von Oliver (Gast)


Lesenswert?

Welcher AVR ist das denn?

Oliver

von Roland (Gast)


Lesenswert?

Hallo ein Mega 128 mit 16Mhz und Uhrenquarz.

ist es möglich einen timer 2 z.b alle 100ms einen Interrupt 
auszulösen???

Mit dem Timern komme ich nicht klar.

von Oliver (Gast)


Lesenswert?

Und welche gcc /avrlibc-Version?

Meine zumindest meckert: (nebem dem zu erwartenden 
c:/programme/winavr/bin/../avr/include/avr/signal.h:36:2: warning: 
#warning "This header file is obsolete.  Use <avr/interrupt.h>.")

../Main.c:31: warning: 'SIG_OUTPUT_COMPARE0A' appears to be a misspelled 
signal handler

Villleicht hängst du mal den kompletten Sourcecode an.

Oliver

von Roland (Gast)


Lesenswert?

Hallo

Problem erledigt fragt mich nicht warum es vorher ging.


Zuerst initialiesiere ich die RS232 mit interrupt für empfang.

cli();
initrs232();
sei();
und dann erst

init_timer0();


jezt habe ich
cli();
initrs232();
init_timer0();
sei();

und nun spuckt er alle 1 sekunde.

Vielen dank man lernt nie aus.

Aber wie gesagt aus fehlern lernt man.

Danke

von Oliver (Gast)


Lesenswert?

So, was hast du denn daraus gelernt?

Oluver

von Roland (Gast)


Lesenswert?

Hallo

Man sollte doch erst alle interrupot deaktivieren mit cli() dann 
definieren und dann einschalten sei();

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.