Tiny85 CTC Interrupt + OVF Interrupt @ TIMER1

Gast #5183298
Lesenswert?

Hallo,

ich weiß nicht was das bei mir ist. Ich nutze den Tiny85, PLL auf 16 Mhz 
intern. Der Timer 0 wird zur Signalerfassung an einem I/O genutzt.

Der Timer1 soll Systemtakte erzeugen.
1
TCCR1 |= (1<<CS10)|(1<<CS11)|(1<<CS12);    //prescaler 64
2
  TIMSK |= (1<<TOIE1)|(1<<OCIE1A);      //TOIE ==> ~1 kHz, OCR1A = 125 kHz
3
  OCR1A = 2;
4
sei();


ISR(TIMER1_OVF_vect) erzeugt mir 1 Khz Takt. Passt also.

ISR(TIMER1_COMPA_vect) erzeugt mir auch 1 kHz Takt?! Warum? Da müsste 
125 kHz sein.
Gast #5183332
Lesenswert?

Patrick J. schrieb:
> Hi
>
> Ohne jetzt ins DaBla reingeschaut zu haben - der Timer1 wird beim Match
> nicht resettet, wodurch Er immer bis 255 hoch läuft und erst nach dem
> Überlauf wieder auf die 2 kommt, wo der nächste Interrupt ausgelöst
> wird.
> Denke, Du suchst nach CTC.
>
> Dann hast Du aber keinen OVF-Interrupt mehr :/
>
> MfG

Ja, stimmt, da habe ich einen Gedankenfehler. Stimmt, dann macht bei 
beiden 1 kHz auch sinn. Da der Tiny nur 2 Timer hat (blöd) wollte ich 
jetzt folgendes haben:

1. Timer (Timer0) ist weg für die Signaldetection (da muss das TCNT 
Register immer resettet werden, daher kann man da nichts mehr mit 
machen, ist auch unregelmäßig).

2. Timer (Timer1) soll 1ms Takt OVF generieren um die Systemzeiten zu 
erzeugen. Außerdem soll er im CTC 125 kHz erzeugen, geht das dann 
überhaupt mit beiden?


Mist. Wo war ich denn da mit meinen Gedanken. Hat jmd. ne Idee wie ich 
die Kuh vom Eis bekomme?
#5183359
Lesenswert?

MOBA 2. schrieb:
> Hat jmd. ne Idee wie ich
> die Kuh vom Eis bekomme?

Du hast noch 2 weitere Timer.

Erstens kannst du den Watchdog als Timer laufen lassen. Der ist 
allerdings recht langsam. Kürzeste Zeit 16ms.

Zweitens kannst du den ADC im Free Running Mode laufen lassen. Der 
generiert dann je nach Vorteiler einen exakten Takt. Daß er dabei 
irgendwas wandelt, stört keinen großen Geist. Mit dem kommst du auch 
einigermaßen an 1KHz ran. Hab jetzt keine Lust das auszurechnen. Wohl 
nicht genau, aber das muß ja meistens gar nicht sein. Hauptsache 
regelmäßig.



batman schrieb:
> Laß den Timer doch ne ISR mit 125kHz takten und darin noch nen Zähler
> auf 125:1 für den 1kHz runterteilen.

Damit der Ausgangspin mit 125KHz wackelt, muß der Timer mit 250KHz 
takten. Das ergibt dann alle 32 Takte einen Interrupt bei 8MHz. Könnte, 
vorsichtig ausgedrückt, knapp werden.
Gast #5183361
Lesenswert?

Thomas E. schrieb:
> MOBA 2. schrieb:
>> Hat jmd. ne Idee wie ich
>> die Kuh vom Eis bekomme?
> Zweitens kannst du den ADC im Free Running Mode laufen lassen. Der
> generiert dann je nach Vorteiler einen exakten Takt. Daß er dabei
> irgendwas wandelt, stört keinen großen Geist. Mit dem kommst du auch
> einigermaßen an 1KHz ran. Hab jetzt keine Lust das auszurechnen. Wohl
> nicht genau, aber das muß ja meistens gar nicht sein. Hauptsache
> regelmäßig.
>
>
>
> batman schrieb:
>> Laß den Timer doch ne ISR mit 125kHz takten und darin noch nen Zähler
>> auf 125:1 für den 1kHz runterteilen.
>
> Damit der Ausgangspin mit 125KHz wackelt, muß der Timer mit 250KHz
> takten. Das ergibt dann alle 32 Takte einen Interrupt bei 8MHz. Könnte,
> vorsichtig ausgedrückt, knapp werden.


Nene 16 MHz habe ich uns mit reichen die 125khz ist klar das das die 
halbe frequency ist.

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