Problem mit timer0

Gast #538911
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????
Gast #539068
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.
Gast #539415
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???

Moderator Persönliche Seite #539420
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.
Gast #539453
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)
{

}
}
Gast #539483
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
Gast #539494
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren