PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Timer0



frankne
09.08.2007, 16:10
Hallo,

ich hab mir heute ein kleines Programm zusammen geschrieben, welches mit Timer0 laufen soll. Ausgabe soll über OC0 und Terminalprogramm laufen.
Ich sitze jetzt hier schon ne ganze Weile dran, kann aber den Fehler nicht finden, wäre nett wenn sich jemand von euch das mal anschaut.

Hier der Code:


$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32


$crystal = 16000000 'Quarzfrequenz
$baud = 9600

Sreg.7 = 1
'Interruptsglobal zulassen
On Timer0 Timerisr

Tccr0.foc0 = 0 'force output compare deaktiv
Tccr0.wgm00 = 0 'CTC-Mode
Tccr0.wgm01 = 1 'clear timer on compare
Tccr0.com00 = 1 'OC0 umschalten sobald
Tccr0.com01 = 0 'TCNT0 = OCR0
Tccr0.cs02 = 1 'clk/1024 Prescaler
Tccr0.cs01 = 0
Tccr0.cs00 = 1

Timsk.ocie0 = 1 'aktiv compare match interrupt
Timsk.toie0 = 1 'aktiv Timer0 Overflow interrupt

Ocr0 = 100
Ddrb.3 = 1

Do
Print "lebe noch"
Print Tccr0
Print Timsk
Print Ocr0
Wait 2
Loop
End


Timerisr:

Print Ocr0

Return


1. zwischen OC0 und GND müsste ich doch jetzt etwa 2v messen können?
2. es müsste mir sehr oft der wert von OCR0 übers terminalprogramm ausgegeben werden

Extra-Frage: im handbuch hat der Timer0 2 interrupt, bei bascom hab ich aber immer nur den IR: Timer0 gefunden was ist mit dem 2.?

MeckPommER
09.08.2007, 16:30
ist enable interrupts eingeschaltet?

was macht das prog denn, bzw. welche spannung kannst du messen?

linux_80
09.08.2007, 18:31
Hallo,

es ist besser das Register als ganzes zu setzen, und nicht jedes Bit einzeln, denn in der Zeit macht der Timer evtl. schon allesmögliche, bis alle 8Bit durch sind. Etwa so:

Tccr0 = &B00110101

Zum nächsten Register, es werden beide IRQs aktiviert, aber nur für einen die ISR angelegt, deswegen wird der AVR innerhalb kürzester Zeit einen Reset ausführen wenn der nicht benutzte IRQ auftritt.

In der Hilfe zu On stehen ein paar Möglichkeiten der ISR-Namen, ich denke COMPARE0 sollte hier passen, oder auch OC0, ist dasselbe.

Und wie im anderen Thread schon angemerkt, statt Sreg.7 "Enable Interrupts" verwenden, dann kennt sich gleich jeder aus.

frankne
09.08.2007, 22:53
Ok hab das programm umgeschrieben, dass die ISR nicht gestartet ist lag daran dass die mit IR von Timer0 verbunden war. und ich wollte ja OC0 nutzen. :)
Und zum 2. Problem ich wollte ja eine veränderliche Spannung am Ausgang
Und diese ist ja abhängig von der relativen Einschaltdauer, das Problem bei CTC mit Toggle OC0 ist, dass die Einschaltdauer immer bei 50% ist.
Zum Sreg.7 das liegt daran, dass ich heute mit dem Handbuch gearbeitet habe und mit den Befehlen von Bascom noch nicht so vertraut bin. Ich werds aber versuchen hier im Forum zubeachten.

So und als Beweiß mein PWM-Programm:
die Ocisr ist nicht nötig und hat im Fast-PWM-Modus die selbe Periodendauer wie die Timerisr, nur um OCR0 phasenverschoben.



$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32


$crystal = 16000000 'Quarzfrequenz
$baud = 9600
Dim I As Integer
Dim J As Integer


Enable Interrupts 'interrupts global zulassen


On Oc0 Ocisr 'Interrupt bei compare match OCR0=TCNT0
'On Timer0 Timerisr
Tccr0 = &B01101101
'FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
'WGM=3 Fast PWM
'COM=2 Clear OC0 on compare match
'CS0=5 prescaler 1024

Timsk.ocie0 = 1 'aktiv compare match interrupt
Timsk.toie0 = 0 'deaktiv Timer0 Overflow interrupt

Ocr0 = 200
Ddrb.3 = 1

Do

Loop
End

Ocisr:
J = J + 1
J = J Mod 1000

If J = 0 Then
Print "interrupt oc" 'ausgabe aller 2^8*1000*1024/16Mhz
End If

Return


'Timerisr:
'I = I + 1
'I = I Mod 1000
'If I = 0 Then
' Print "interrupt timer"
'End If
'Return


danke für eure Hilfe :)