8Bit Timmer verständinis Frage

Gast #2541035
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
Gast
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.
Gast
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.
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
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
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.
Gast
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
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
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.