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????
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.
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.
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???
> 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.
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) { } }
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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.