Timing-Problem

Gast #6327320
Lesenswert?

Hallo,
ich habe ein timer-problem, verstehe es aber nicht warum und hoffe hier 
die lösung zu finden.
Ich habe ein Atmega328 mit einem externen Quarz (8MHz).

Den Timer initialisiere ich:
1
  /* 20 ms */
2
  TCCR1B = (1 << WGM12) | (1 << CS11) | (1 << CS10); // CTC-Mode clkIO/64
3
  OCR1A = (2500-1);
4
  TIMSK1 = (1 << OCIE1A);

in der ISR lasse ich ein Pin toggeln und messe die Zeit.
es waren 160 ms.
1
ISR (TIMER1_COMPA_vect)
2
{
3
  PORTB ^= (1 << PINB2);
4
}
Dann habe ich die fuses gelesen:
lfuse: 0x62
hfuse: 0xD9
efuse: 0x07

Damit wurde der takt durch 8 dividiert. Dann passt es mit den 160 ms.
habe die lfuse umgeschrieben auf 0xE2. Diese gibt der controller mir 
auch beim Auslesen wieder aus.
allerdings toggelt der pin immer noch alle 160 ms.
Als ob die Änderung nicht angenommen wurde.

Gibt es noch eine Stellschraube um den Takt anzupassen? Ist es möglich, 
dass die Änderung der fuses nicht übernommen worden sind? Habe auch die 
Spannung vom Controller abgezogen und neu gestartet.
Gast #6327333
Lesenswert?

MaWin O. schrieb:
> Deine Fuses konfigurieren den internen 8MHz Osc mit 8x-Teiler.

Gerade auch aufgefallen.
lfuse habe ich jetzt auf 0xFD geändert. 
(https://www.engbedded.com/fusecalc/)
allerdings hat sich das Timing immer noch geändert

MaWin O. schrieb:
> Johannes schrieb:
>> lfuse umgeschrieben auf 0xE2
>
> Damit sollte es eigentlich auf internen 8MHz laufen (=ohne Teiler)

Ob jetzt intern oder extern. Grob sollte es trotzdem alle 20ms toggeln, 
was es nicht tut
Gast #6327402
Lesenswert?

ROFL!

... jedesmal wieder wenn jemand daherkommt und kryptische
Hexzahlen in den Raum wirft um seine Fuses zu zeigen bzw
die Rechnung dazu darzulegen.

Dabei ist es soooo einfach wenn man die Original Tools von
Atmel benutzt. Die Hexzahlen werden nach einleuchtenden
verbalen Vorgaben von der Programier-GUI berechnet und man
macht dadurch fast automatisch alles richtig. Auch bekommt
man sofort nach Programmierung ein optisches Feedback über
Erfolg oder Misserfolg.

Ich programmiere jetzt seit mindesten 10 Jahren mit AVR
Controllern und habe die Fuses niemals selbst berechnet,
immer praktisch "im Schlaf" den Controller richtig
programmiert. Dabei hab ich natürlich verpasst mir durch
Kauf von China-Ware sieben Euro fuffzich zu sparen. Das
bereue ich sehr, denn das hätte sich wirklich gelohnt.

Atmel mag auch nicht immer alles richtig gemacht haben,
beim Programmieren der Fuses haben sie jedenfalls Nägel
mit Köpfen gemacht.

Ich freue mich schon auf das nächste Hex-Zahlen-Gefecht
mit den AVR-Fuses. Wenn sich die geplagten User und die
Helfer sich gegenseitig die Hex-Würschte um die Ohren
hauen. Immer wieder lustig.
#6327411
Lesenswert?

Peter D. schrieb:
> Nirgends. Man kann es nur ausprobieren.

Wenig glaubwürdig.

> Z.B schreib ein Blinkprogramm, was nach je 10s den CPU-Prescaler
> umschaltet.
> Dann drück irgendwann die Resettaste und es blinkt mit dem letzten Takt
> weiter.

Kann ich nicht nachvollziehen. Ich habe wie gesagt noch nie einen POR 
nach Fuse-write gemacht. Nur den vom Programmer generierten externen 
RST.

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