www.mikrocontroller.net

Forum: Compiler & IDEs Problem mit timer0


Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???


Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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:
  uint8_t i;
  for (i = 0; i < 100; i++)
    _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.

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)
{

}
}

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher AVR ist das denn?

Oliver

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, was hast du denn daraus gelernt?

Oluver

Autor: Roland (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

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

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.