Hallo,
ich stricke nun schon ne Zeit an diesem Timer0 rum. Er soll im Mode2 (CTC-Mode) alle 20µs einen Interrupt auslösen. Ist ja auch kein Thema (theoretisch) ...
- Prescaler 8
- OCR0 auf 39
- Timer/Counter0 Compare Match Interrupt
Irgendwie macht Bascom aber immer was anderes oder ich finde nicht die richtigen Befehle. Grad keine Lust das komplett in Assembler zu machen
Ich hab einige Ausgangspins als Indikatoren für interne Laufzeiten verwendet und mit dem LA8 nachgemessen. Irgendwie stellt Bascom immer die selbe Laufzeit ein. Egal ob ich nun das OCR0 ändere oder den Prescaler.
Hat schonmal einer mit dem Timer0 nen CTC-Mode gemacht? In den Büchern von Kühnel, Hoffmann, Walter hab ich auch nichts brauchbares gefunden. Hier im Forum bis jetzt auch noch nicht. Weiter hab ich noch nicht gesucht.
Ich werd jetzt erstmal Schluß machen und was abbeißen ... evtl sieht es morgen schon anders aus
Gruß
Dino
ich stricke nun schon ne Zeit an diesem Timer0 rum. Er soll im Mode2 (CTC-Mode) alle 20µs einen Interrupt auslösen. Ist ja auch kein Thema (theoretisch) ...
- Prescaler 8
- OCR0 auf 39
- Timer/Counter0 Compare Match Interrupt
Irgendwie macht Bascom aber immer was anderes oder ich finde nicht die richtigen Befehle. Grad keine Lust das komplett in Assembler zu machen
Code:
' ===== TIMER 0 =====
'
' ===== Timer Initialisieren ==================================================
Config Timer0 = Timer , Prescale = 8 ' Timer1 liefert die Basiszeit (20us)
On Oc0 Tim0_isr
'
'===== Timer/Counter Control Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TCCR0
' FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
' W R/W R/W R/W R/W R/W R/W R/W
' --- --------- --- ---------------
' \ || / |||
' \ 00 Normal Port Oper. 000 No Clock (Stopped)
' \ / 001 Clk no Prescaling
' \ / 010 Clk/8
' || 011 Clk/64
' 0 00 Normal 100 Clk/256
' 1 01 PWM, Phase Correct 101 Clk/1024
' 2 10 CTC 110 Ext T0, Clock on falling edge.
' 3 11 Fast PWM 111 Ext T0, Clock on rising edge.
'
' In Clear Timer on Compare or CTC mode (WGM01:0 = 2), the OCR0 Register is used to
' manipulate the counter resolution. In CTC mode the counter is cleared to zero when
' the counter value (TCNT0) matches the OCR0. The OCR0 defines the top value for the
' counter, hence also its resolution.
' An interrupt can be generated each time the counter value reaches the TOP value by
' using the OCF0 Flag.
'
' Mode2, Prescaler /8, NormalPortOperation
' FWCC WSSS
Tccr0 = &B0100_0010
'===== Timer/Counter Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- TCNT0
' -----------TCNT0[7:0]----------
' R/W R/W R/W R/W R/W R/W R/W R/W
'===== Output Compare Register =====
'Bit -7- -6- -5- -4- -3- -2- -1- -0- OCR0
' -----------OCR0[7:0]-----------
' R/W R/W R/W R/W R/W R/W R/W R/W
Ocr0 = 100
'===== Timer/Counter Interrupt Mask Register =====
'Bit --7-- --6-- --5--- --4--- --3--- --2-- --1-- --0-- TIMSK
' OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 OCIE0 TOIE0
' R/W R/W R/W R/W R/W R/W R/W R/W
'
'OCIEx: Timer/Counter Output Compare Match Interrupt Enable
'TOIEx: Timer/Counter Overflow Interrupt Enable
Enable Compare0
'===== Timer/Counter Interrupt Flag Register =====
'Bit --7-- --6-- --5-- --4-- --3-- --2-- --1-- --0-- TIFR
' OCF2 TOV2 ICF1 OCF1A OCF1B TOV1 OCF0 TOV0
' R/W R/W R/W R/W R/W R/W R/W R/W
' 200Hz PWM * 8Bit = 51,2kHz
' 1 / 51,2kHz = 19,5us
' Compare
' Prescaler Compare
' 8 39
' 64 4
Enable Timer0 ' Timer starten
Enable Interrupts
...
...
...
' ================================================
' ===== ISR fuer Timer0 Overflow =================
' ================================================
' Timer0 ist der Zaehler fuer die Frequenzmessung
Tim0_isr:
Incr Rampe ' Ueberlauf vom 16Bit-Timer bearbeiten
' ### Index ISR ###
$asm
sbi portb,0
sbi portb,1
$end Asm
' #################
If Pwm_w < 1 Then Goto Dim_aus
If Pwm_w < Rampe Then Goto Dim_aus
' WEISS
$asm
sbi portA,3
sbi portA,4
Sbi portA,5
$end Asm
Goto Dim_ende
Dim_aus:
' Nicht WEISS
$asm
Cbi portA,3
Cbi portA,4
Cbi portA,5
$end Asm
Dim_ende:
' ### Ende ISR ###
$asm
Cbi portb,0
Cbi portb,1
$end Asm
' #################
Return
Ich hab einige Ausgangspins als Indikatoren für interne Laufzeiten verwendet und mit dem LA8 nachgemessen. Irgendwie stellt Bascom immer die selbe Laufzeit ein. Egal ob ich nun das OCR0 ändere oder den Prescaler.
Hat schonmal einer mit dem Timer0 nen CTC-Mode gemacht? In den Büchern von Kühnel, Hoffmann, Walter hab ich auch nichts brauchbares gefunden. Hier im Forum bis jetzt auch noch nicht. Weiter hab ich noch nicht gesucht.
Ich werd jetzt erstmal Schluß machen und was abbeißen ... evtl sieht es morgen schon anders aus
Gruß
Dino