Forum: Compiler & IDEs 1 Mhz mit ATMega8 erzeugen


von Bilbo Beutlin (Gast)


Lesenswert?

Hallo,

ich möchte ein 1 Mhz Rechtecksignal mit einem ATmega8 erzeugen, der mit 
der internen Taktfrequenz von ebenfalls einem Mhz läuft.
Dazu verwende ich den Timer0 ohne Prescaler und lade ihn auf 255 vor. In 
der Interruptroutine wird dann ein Pin getogglet.
1
 
2
TCCR0 |= (1<<CS00);
3
TIMSK |= (1<<TOIE0);
4
sei();
5
ISR(TIMER0_OVF_vect)        
6
{ 
7
  TCNT0 = 254;
8
  PORTC ^= (1<<PC5);
9
}
Die gemessene Frequenz beträgt allerdings nur 12.5Khz. Was läuft hier 
falsch?

Beste Grüße,

Bilbo

von holger (Gast)


Lesenswert?

>ich möchte ein 1 Mhz Rechtecksignal mit einem ATmega8 erzeugen, der mit
>der internen Taktfrequenz von ebenfalls einem Mhz läuft.

Das geht nicht. Wenn der ATMega mit 8MHz läuft könntest
du über SPI ein 1MHz Signal erzeugen, aber auch nicht
kontinuierlich.

von Bilbo Beutlin (Gast)


Lesenswert?

Könntest du kurz erklären warum das nicht geht?

von Sascha K. (kuschelganxta)


Lesenswert?

Bilbo Beutlin schrieb:
> 1 Mhz Rechtecksignal mit einem ATmega8 erzeugen, der mit
> der internen Taktfrequenz von ebenfalls einem Mhz läuft.

Dann wäre keine Zeit mehr für andere Befehle. Lass die Fuse CLKDIV/8 weg 
und lass den AVR mit 8 MHz laufen. Dann kannst du mit einem Timer einen 
ziemlich konstanten 1 MHz Takt erzeugen.

von Bilbo Beutlin (Gast)


Lesenswert?

Ok. Hab den Takt nun auf 8Mhz umgestellt, mit obigem Code erhalte ich 
nun 25khz. Was muss ich ändern?

von mahlzeit (Gast)


Lesenswert?

Bilbo Beutlin schrieb:
> Was muss ich ändern?

statt fragen das Datenblatt lesen...!

von Felix P. (fixxl)


Lesenswert?

Welchen Takt erhältst du, wenn du den Pin nicht per Interrupt und Timer, 
sondern direkt in der Hauptschleife mittels
1
PINC = 1<<PC5

togglest? Geht das schneller?

von Thomas W. (ratos)


Lesenswert?

Geht denn nicht Timer1 im CTC-Modus mit Hardware-Pintogglen?

von Bla (Gast)


Lesenswert?

Sollte auch mit Timer0 gehen. CTC einschalten, Prescaler 1, OCR0A auf 3 
stellen. Bei 8 MHz Chiptakt ergibt das eigentlich 1 MHz, wenn mich nicht 
alles täuscht...

von Malte S. (maltest)


Lesenswert?

Dafür gibt es doch die CKOUT Fuse oder wie der Name genau war (werde das 
DB jetzt nicht am Handy durchwühlen) dann kriegst du den Takt direkt von 
der Hardware geliefert. Und selbst ohne das, was soll der Quatsch, den 
Pin in der ISR zu wackeln, wenn es die Compare-Outputs gibt? Bei 1 MHz 
Takt geht das eh nicht und einfach mal hochtakten, weil die Software 
schrottig ist, ist leider sehr beliebt. rolleyes

von Bilbo Beutlin (Gast)


Lesenswert?

Danke für die viele Hilfe, hab es mit CTC hinbekommen. Hinzu kam noch 
ein Bedienfehler des Oszis, Timer0 schafft ca. 100khz mit der 
ursprünglichen Methode. Nochmals Danke!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Thomas W. schrieb:
> Geht denn nicht Timer1 im CTC-Modus mit Hardware-Pintogglen?

Ja, damit kommt man bis maximal fCPU/2.  (So funktionierte der
Software-gesteuerte Taktgenerator auf dem STK500.)

Malte S. schrieb:
> Dafür gibt es doch die CKOUT Fuse oder wie der Name genau war

Hat der ATmega8 meiner Erinnerung nach noch nicht, erst die
Nachfolger ATmega88 & Co.

von Malte S. (maltest)


Lesenswert?

Jörg Wunsch schrieb:
> Hat der ATmega8 meiner Erinnerung nach noch nicht, erst die
> Nachfolger ATmega88 & Co.

Okay, sorry. Also genau der richtige Moment zum Umstieg ;)

Aber sehe ein, dass es weitere Gründe für eine CTC/PWM-Lösung gibt, z.B. 
bessere Ausnutzung der Pins, Signal zur Laufzeit änder- und abschaltbar 
etc.

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.