Forum: Mikrocontroller und Digitale Elektronik 8Bit Timmer verständinis Frage


von michi (Gast)


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

von Christian B. (Gast)


Lesenswert?

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??

von Karl H. (kbuchegg)


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.

von michi (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


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.

von michi (Gast)


Lesenswert?

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?

von Karl H. (kbuchegg)


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)

von michi (Gast)


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?

von Peter D. (peda)


Lesenswert?

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

von michi (Gast)


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

von Karl H. (kbuchegg)


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.

von Peter D. (peda)


Lesenswert?

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

von michi (Gast)


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

von michi (Gast)


Lesenswert?

oh doof natürlioch so :D

von spess53 (Gast)


Lesenswert?

Hi

>CKDIV8   ->Hacken

Damit wird der Takt durch 8 geteilt. Also weg damit.

Übrigens heißt es Haken .

MfG Spess

von Karl H. (kbuchegg)


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.

von michi (Gast)


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?

von spess53 (Gast)


Lesenswert?

Hi

>aber warum ist der CKDIV8 gesetzt ich hab den nicht gesetzt :)

Das ist der Auslieferzustand.

MfG Spess

von Cyblord -. (cyblord)


Lesenswert?

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
Noch kein Account? Hier anmelden.