8Bit Timmer verständinis Frage

Gast #2541035
Lesenswert?

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
#2541047
Lesenswert?

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.
#2541052
Lesenswert?

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.
#2541066
Lesenswert?

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)
Gast #2541100
Lesenswert?

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?
Gast #2541165
Lesenswert?

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
#2541172
Lesenswert?

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.
Gast #2541190
Lesenswert?

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
#2541199
Lesenswert?

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.
Gast #2541468
Lesenswert?

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?

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