Hallo zusammen ich hab einen ATmega 90USB1287 Ich benutze da eine 8 Bit timmer der mir als Zeitzähler dient. Kurz mal die Initialisierung TCCR0B |=1<<CS02 |1<<CS00; //Normaler Timmer mit 1024 Teiler TCNT0=-156; //Counter Register Laden 156,25 =10ms TIMSK0=1<<TOIE0; //Einschalten des Interrupt Über den Interrupt vom Timmer las ich eine Led blinken aber sie blink nicht in den takt wie ich es ausgerechnet habe Nach meiner Berechnung sollte der Interrupt alle 10ms auslösen aber das tut er nicht die zeit ist viel länger mindestens das 10 fache Ach ja ich hab einen 16MHz Quarz wieso was ist falsch
Bin mir nicht sicher, aber sowas habe ich noch nie gesehen TCNT0=-156; //Counter Register Laden 156,25 =10ms Kann man ein Register negativ Vorladen??
michi schrieb: > Nach meiner Berechnung sollte der Interrupt alle 10ms auslösen > aber das tut er nicht die zeit ist viel länger mindestens das 10 fache Und wie sieht deine Berechnung aus? > Ach ja ich hab einen 16MHz Quarz Hast du kontrolliert, ob der Quarz auch benutzt wird? Den Quarz an den µC einfach nur anzuschliessen reicht nicht. Man muss auch Fuses umstellen, damit der Quarz benutzt wird.
Ja so wurde es mir in der Schule erklärt das das geht das heist das 255-156=99 das das Register immer bei 99 los geht also ich glaub das das schon stimmt oder?
Christian B. schrieb: > Bin mir nicht sicher, aber sowas habe ich noch nie gesehen > > TCNT0=-156; //Counter Register Laden 156,25 =10ms > > Kann man ein Register negativ Vorladen?? Die Register sind unsigned. Und auch eine negative Zahl hat ein Bitmuster. Es wird einfach das Bitmuster geladen. Der praktische Effekt besteht darin, dass durch diese Schreibweise es einfach ist, im Programm zu sagen: 156 Timertakte bis zum Überlauf.
meine Berechnung wäre so 16MHz/1024=15624 15624/100=156,25 Takte pro 10ms Ich muss ja nur das Fuses Bit CKout setzen oder?
michi schrieb: > Ich muss ja nur das Fuses Bit CKout setzen oder? Nö. Du musst die CKSEL Fuses umstellen. Wenn du das nicht getan hast, dann läuft dein µC mit 1Mhz, also einem Faktor 16 zu langsam, was deinem Faktor "die zeit ist viel länger mindestens das 10 fache" ziemlich nahe kommt. Du kannst das aber ganz leicht testen
1 | #define F_CPU 16000000
|
2 | |
3 | #include <avr/io.> |
4 | #include <utils/delay.h> |
5 | |
6 | #define LED_DDR DDRB
|
7 | #define LED_PORT PORTB
|
8 | #defein LED_BIT PB1
|
9 | |
10 | int main() |
11 | {
|
12 | LED_DDR |= ( 1 << LED_BIT ); |
13 | |
14 | while( 1 ) { |
15 | LED_PORT |= ( 1 << LED_BIT ); |
16 | _delay_ms( 1000 ); |
17 | LED_PORT &= ~( 1 << LED_BIT ); |
18 | _delay_ms( 1000 ); |
19 | }
|
20 | }
|
wenn die 16Mhz tatsächlich stimmen, dann blinkt die LED mit 1 Sekunde an / 1 Sekunde aus. WEnn der µC mit 1 Mhz läuft (das ist der Default, wenn der Quarz nicht benutzt wird), dann sind es 16 Sekunden ein / 16 Sekunden aus. Den Unterschied siehst du auch mit freiem Auge. (Beim Compilieren nicht vergessen den Optimizer einzuschalten)
Ich hab das jetzt ausprobiert und die Led leuchtet immer 8 sekunden also heißt das das ich auf 8MHz eingestellt bin. ich hab jetzt auch beit SUT_CKsel nach geschaut da steht auf EXTXOSC_8MHZ_XX_256CK_65. kann mir jemand erklären was das alles bedeutet 256CK_65 aber ich kann da garnicht 16MHz auswähel warum nicht?
michi schrieb: > TCNT0=-156; //Counter Register Laden 156,25 =10ms Das bestimmt nur die Zeit bis zum ersten Interrupt, also nicht die Interruptrate. Du mußt den CTC-Modus nehmen. Peter
Ich hab im Datenblatt nach gelesen ich find da keine CTC Mode wie kann ich das verstehen bitte um Erklärung. Aber ich glaub das mein Takt nicht richtig eingestellt ist wie ich vorher herausgefunden hab nur weiß ich nicht wie ich bei dem AVR Studio den einstelle weil ich bei den Fuses Bit kein 16Mhz Quarz auswählen kann
michi schrieb: > Ich hab das jetzt ausprobiert und die Led leuchtet immer 8 sekunden Dann ist mit deiner Taktversorgung etwas faul. > aber ich kann da garnicht 16MHz auswähel warum nicht? Weil in dieser Auswahl mit Sicherheit nicht alle Quarzfrequenzen aufgeführt sind, die es überhaupt gibt. Dann wäre die Liste nämlich ein bischen lang. Die 8Mhz bedeuten hier: Du hast einen Quarz mit mehr als 8Mhz. An dieser Stelle ist nämlich eine technologische Grenze. Quarze mit weniger als 8Mhz werden elektrisch ein wenig anders angesschaltet als Quarze mit mehr als 8Mhz.
michi schrieb: > Ich hab im Datenblatt nach gelesen ich find da keine CTC Mode Table 13-7. Waveform Generation Mode Bit Description Mode 2. Peter
Ok dann frag ich mal ganz doff kann mir jemand die Fuses Bits kontrolieren ob das alles stimmt das wäre echt super weil langsamm glaub ich das da was falsch ist und ich komm damit nicdht ganz zurecht hab da schon viel in Foren gelesen und versteh es immer noch nicht ganz :( BODLEVEL ->2V6 HWBE ->Hacken OCDEN ->Hacken JTAGEN ->Hacken SPien ->Hacken WDTON ->kein Hacken EESAVE ->kein Hacken BOOTSZ ->4096W_FooD BOOTRST ->kein Hacken CKDIV8 ->Hacken CKOUT ->kein Hacken SUT_CKSEL->EXTXOSC_8MHZ_XX_256CK_65 stimmt das wenn ich eine 16MHz Quarz dran hab? und echt danke das ihr mir da helfts
Hi
>CKDIV8 ->Hacken
Damit wird der Takt durch 8 geteilt. Also weg damit.
Übrigens heißt es Haken .
MfG Spess
michi schrieb: > Ich hab das jetzt ausprobiert und die Led leuchtet immer 8 sekunden > > also heißt das das ich auf 8MHz eingestellt bin. Überleg noch mal. Wenn die 16 Mhz stimmen würden, dann würde die LED 1 Sekunde an sein. Wenn der µC mit 1Mhz läuft, dann wäre die LED 16 Sekunden an. Deine LED ist aber 8 Sekunden an. Das können nicht 8Mhz sein, sondern sind 2Mhz. Damit wische ich deine Aussage von "mindestens um das 10 fache langsamer" beiseite und behaupte mal es ist ein Faktor 8. Was uns zur CKDIV8 Fuse bringt, die den Takt um genau den Faktor 8 runterteilt.
yip das war das problem danke das ihr mir da so gut geholfen habts aber warum ist der CKDIV8 gesetzt ich hab den nicht gesetzt :) und für was braucht man den eigendlich ich wähle ja doch nicht mein Quarz zu groß aus und setzt ihn dann wider runter das macht doch kein Sinn oder?
Hi
>aber warum ist der CKDIV8 gesetzt ich hab den nicht gesetzt :)
Das ist der Auslieferzustand.
MfG Spess
spess53 schrieb: > Hi > >>CKDIV8 ->Hacken > > Damit wird der Takt durch 8 geteilt. Also weg damit. > > Übrigens heißt es Haken . > > MfG Spess Es heißt ja auch nicht "Timmer" und trotzdem schreibt er es jedesmal falsch. Eventuell wäre ein Deutschkurs angebrachter als Microcontroller Nachhilfe. gruß cyblord
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.