Hallo Leute,
ich möchte mit dem ATTiny2313 mit dem Timer1 impulse ausgeben, bloß
irgendwie scheitert das Vorhaben bei der Initialisierung:
1
outTCCR1C,temp0
2
lditemp0,(3<<WGM12)|(5<<CS10);Vorteilerauf1024
3
outTCCR1B,temp0
4
lditemp0,(1<<WGM11);Timer1konfigurieren(Fast-PWM)
5
outTCCR1A,temp0
6
7
lditemp0,(1<<TOIE1);Overflow-Interruptaktivieren
8
outTIMSK,temp0
9
10
lditemp0,0b00100000
11
outICR1H,temp0
12
clrtemp0
13
outICR1L,temp0
das ganze soll einen Interrupt auslösen. Für's erste zum kontrollieren
wollt ich mir am Oszi Impulse ausgeben.
Solange ich die Begrenzung des Zählers über das ICR weglasse, krieg ich
meine Impulse, aber warum nicht mit?
-Tom-Tom- schrieb:> ich möchte mit dem ATTiny2313 mit dem Timer1 impulse ausgeben,
^^^^^^
dann benutze als Vergleichsregister OCR1AH und OCR1AL.
ICR1L und ICR1H sind für die Input-Capture-Unit.
Ja genau da ist der Hacken,
an die Pins kann ich nicht ran, weil wegen dem Layout schon anders
belegt sind.
Außerdem will ich den 16bit Timer hauptsächlich wegen der Zeit.
Das eigentliche Problem ist ja, dass der Interrupt nicht funktioniert
...
-Tom-Tom- schrieb:> Das eigentliche Problem ist ja, dass der Interrupt nicht funktioniert
Mal langsam zum mitdenken:
Du stellst in deinem Programm eine Fast-PWM ein, naja eigentlich nicht:
-Tom-Tom- schrieb:> ldi temp0, (3<<WGM12)|(5<<CS10) ;Vorteiler auf 1024
wenn schon, dann (1<<WGM12)|(1<<CS10).
Deaktivierst aber deine PWM-Ausgänge (wo willst du dein Signal raus
haben).
dann stellst du einen Timeroverflow interrupt ein.
Pfuscht noch kurz im Input-Capture-Ergebnis-Register und wunderst dich,
dass nichts geht (was überhaupt)?
Poste mal schaltplan und kompletten Code, ansonsten siehe:
http://www.mikrocontroller.net/articles/AVR-Tutorial:_Timer
Oke, vielleicht versuch ich mal zu erklären, auf was das ganze
rauslaufen soll, sry dass ich das davor noch nicht hab ...
unterm Strich möchte ich eine variable Pausenzeit zwischen 0,05s und
1,6s haben. Das ganze soll den AVR so wenig wie möglich belasten, weil
der nebenbei ja noch ein DMX-signal auswertet und ein paar andere sachen
macht.
Deswegen war meine Idee den Timer 1 mit seinen 16bit zu nehmen.
Und da es ja die Möglichkeit gibt mit ICR1 eine Obergrenze festzulegen,
wie weit der zählt, wollte ich dies nutzen, dass ich variabel das ICR1
einstelle und dann halt nach ablauf der Zeit einen Overflow-Interrupt
auslöse.
Wollte ja den normalen Timer-Modus nehmen, aber bei dem geht ja das mit
der Obergrenze nicht.
-Tom-Tom- schrieb:> Und da es ja die Möglichkeit gibt mit ICR1 eine Obergrenze festzulegen,> wie weit der zählt, wollte ich dies nutzen, dass ich variabel das ICR1> einstelle und dann halt nach ablauf der Zeit einen Overflow-Interrupt
So hier sind die Verständnisfehler :-)
Die PWM-Einstellungen haust du raus, nur CTC (Clear timer on compare
match) bleibt drin.
Mit dem Registerpaar OCR1AH und ORC1AL stellst du deine Obergrenze ein.
Dann benutzt du nicht den Timer-Overflow, sondern den
Timer-Compare-MAtch A interrupt.
Dieser wird ausgelöst, sobald der Zählwert im Timer gleich der
Einstellung im OCR1A ist. Die CTC-Einstellung löscht dir bei
erfolgreichem Vergleich auch gleich den Timer-Wert, damit er wieder von
vorne anfängt.
:-)
Hi
>Und da es ja die Möglichkeit gibt mit ICR1 eine Obergrenze festzulegen,>wie weit der zählt, wollte ich dies nutzen, dass ich variabel das ICR1>einstelle und dann halt nach ablauf der Zeit einen Overflow-Interrupt>auslöse.
Dann nimm den Timer-Mode 15 und den OCR1A-Interrupt. Der
Overflow-Interrupt wird mit ICR1 als Top nicht ausgelöst, weil ein
Overflow nicht erreicht wird.
MfG Spess
Floh schrieb:> So hier sind die Verständnisfehler :-)> Die PWM-Einstellungen haust du raus, nur CTC (Clear timer on compare> match) bleibt drin.> Mit dem Registerpaar OCR1AH und ORC1AL stellst du deine Obergrenze ein.> Dann benutzt du nicht den Timer-Overflow, sondern den> Timer-Compare-MAtch A interrupt.
Danke :)
aber ganz funktionierts noch nicht: