Hi Leuts, ich versuche hier mit CodeVision auf einem Mega16 einen Timer von 10 ms hinzubekommen. Also alle 10 ms soll ein Interrupt ausgelöst werden. Zu Testzwecken will ich da bis 100 zählen und dann eine Led blinken lassen. Die sollte also im Sekundentakt blinken. Aber hier bei mir dauert das 3 Sekunden. Hat einer eine Idee woran das liegt ? Overhead von C ? Quarzfrequenz = 4,194304 MHz Codeauszug: Init: // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x04; TCCR1A=0x00; TCCR1B=0x01; TCNT1H=0x63; TCNT1L=0xC0; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { // Reinitialize Timer 1 value TCNT1H=0xC0; TCNT1L=0x63; // Place your code here if (j < 100) { j++; } else { ++i; PORTC = ~i; j=0; } }
...... ++i; PORTC = ~i; hohohoho, was ist denn das? :))) an welchem pin hast du denn die led angeschlossen? schreib' doch z.b.: if (PORTC.X) PORTC.X=0 else PORTC.X=1; somit "toggle-st" du den PORT.X pin...
sorry, muss natürlich: if (PORTC.X) PORTC.X=0; else PORTC.X=1; heissen...
Naja, das Problem ist ja nicht das toggeln der LD, sondern die Timerzeit. Die sollte eigentlich bei 1 Sekunde liegen, liegt aber aber ca. 3 Sekunde. Warum ?
Also Reload im Interrupt ist schon mal ganz ungenau. Vor allem, weil T1 ja schon selber sowas kann (Mode 4, OCR1A als Endwert). Und wenn man dazu auch noch in Kopfrechnen schwach ist, dann laß das mal lieber den Compiler rechnen: #define XTAL 4.194304e6 // 4,194304 MHz #define T1_INTERVAL 100 // 100Hz OCR1A = (unsigned int)(XTAL / T1_INTERVAL - 1); Nur noch Mode 4 einstellen und fertig. Peter
das problem liegt genau beim "toggeln", wie du es jetzt "realisiert" hast; bedenk' mal, was du eigentlich machst mit: ++i; PORTC = ~i; :))
sorry emil, aber deine änderung bewirkt leidern ichts. immer noch ca. 3.3 sekunden. also klemm ich mich mal an peters idee trotzdem thanks a lot
Aber trotzdem, irgendwo ist da wohl noch ein Denkfehler von mir drin. Also: Ich habe einen Quarz mit 4,194304 MHz. Nun stelle ich einen Prescaler von 1024 ein (TCCR0 = 5), ergibt eine Frequenz von 4096 Hz. Also wird der Zähler alle 244 µs inkrementiert. Nun will ich alle 20 ms einen Overflow, ergibt also 20 ms / 244 µs = 81,90 (82) Zählschritte. Da er immer bis 256 zählt, alde ich einen Vorwahlwert von 256 - 82 = 174 nach TCNT0. In der Interruptroutine zähle ich jetzt nochmals von 0-50 und dann toggle ich ein Bit. das Bit müßte also alle 50 x 20 ms = 1s wechseln. Tut es aber nicht, es wechselt ca. alle 3 Sekunden. Woran kann das liegen ? Ich kann mir einfach nicht vorstellen, dass Codevision da was vermurkst.
vielleicht postest du hier endlich dein gesamtes programm? wie jemand hier zu sagen pflegt: die glaskugel wird gerade repariert...
..."TCNT0=178;" ich weiss nicht, ob es so funktioniert, vielleicht ja, vielleicht nein; ich würde den timer mit TCNT0=0xB2 aufladen, (178 DEC=B2 HEX), weiss nicht, ob der compiler in diesem fall auch DEC zahlen versteht
Danke für den Hinweis, aber die Änderung bringt nichts. Ich habe auch mal im Listfile geguckt, die Zahl wird schon richtig übersetzt. Greetings Karlheinz
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.