ist enable interrupts eingeschaltet?
was macht das prog denn, bzw. welche spannung kannst du messen?
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:
1. zwischen OC0 und GND müsste ich doch jetzt etwa 2v messen können?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
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.?
ist enable interrupts eingeschaltet?
was macht das prog denn, bzw. welche spannung kannst du messen?
Mein Hexapod im Detail auf www.vreal.de
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:
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.Code:Tccr0 = &B00110101
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.
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.
danke für eure HilfeCode:$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
Lesezeichen