Är detta rätt tänkt angående CCP module, PWM läge.
Re: Är detta rätt tänkt angående CCP module, PWM läge.
När jag gjorde något liknande så väntade jag på en "överflow" från TMR2
först innan jag stoppade det hela. Sannolikt gjorde det att den alltid stängdes
av med dioden släckt. Annars kanske man kan släcka dioden för hand efter att
stängt av TMR2, det är ju bara att prova. MPSIM borde kunna verifiera hur
det fungerar...
först innan jag stoppade det hela. Sannolikt gjorde det att den alltid stängdes
av med dioden släckt. Annars kanske man kan släcka dioden för hand efter att
stängt av TMR2, det är ju bara att prova. MPSIM borde kunna verifiera hur
det fungerar...
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Å andra sidan borde det vara enklare att bara sätta duty till 0 eftersom man då inte behöver tänka något mer på det.
Fast... möjligtvis blir "verkliga duty" aldrig helt 0 (alltså det som kommer på pinnen). På en PIC har jag aldrig verifierat det, men på en ATmega jag mätt på kom alltid en liten spik (kortare än 1 bit) i början av varje period, även om duty var noll. Den lilla spiken kanske räcker för att trigga kameran om IR-dioden är stark och hålls nära sensorn.
Så, om du inte kan verifiera detta med oscilloskåp är det kanske bäst att stänga av på något säkrare sätt. Göra pinnen till ingång?
Fast... möjligtvis blir "verkliga duty" aldrig helt 0 (alltså det som kommer på pinnen). På en PIC har jag aldrig verifierat det, men på en ATmega jag mätt på kom alltid en liten spik (kortare än 1 bit) i början av varje period, även om duty var noll. Den lilla spiken kanske räcker för att trigga kameran om IR-dioden är stark och hålls nära sensorn.
Så, om du inte kan verifiera detta med oscilloskåp är det kanske bäst att stänga av på något säkrare sätt. Göra pinnen till ingång?
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Ett tips angående pulsgenereringen. Förmodligen är de ojämna sifforna i bilden bara mätfel. Den egentliga sekvensen ska nog vara:
- Wait for a start pulse (2000 usec)
- There must be no pulse for 28000 usec (pause)
- Receive a pulse (400 usec)
- Pause (1600 usec)
- Receive a second pulse (400 usec)
- Longer pause (3600 usec)
- Receive the last pulse (400 usec)
- The same waveform is repeated a second time after about 65536 usec.
Den kortaste tidsenheten är alltså 400 usec, och resten är jämna multipler av det. Borde vara lätt att få till med interrupt var 400:de usec. (Förutom den längsta pausen som är längden av en 16-bit variabel som slår runt, och den pausen går nog bra att avrunda till jämnt 400-tal)
- Wait for a start pulse (2000 usec)
- There must be no pulse for 28000 usec (pause)
- Receive a pulse (400 usec)
- Pause (1600 usec)
- Receive a second pulse (400 usec)
- Longer pause (3600 usec)
- Receive the last pulse (400 usec)
- The same waveform is repeated a second time after about 65536 usec.
Den kortaste tidsenheten är alltså 400 usec, och resten är jämna multipler av det. Borde vara lätt att få till med interrupt var 400:de usec. (Förutom den längsta pausen som är längden av en 16-bit variabel som slår runt, och den pausen går nog bra att avrunda till jämnt 400-tal)
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Det borde inte vara något problem med någon enstaka puls extra när den skall vara avstängd. Förmodligen behövs någon form av mera rejält pulståg med 38kHz för att få mottagaren att detektera.
Om det nu blir någon sån puls...
Om det nu blir någon sån puls...
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Om du syftar på spiken så kom den varje period på ATMegan; 38.4Khz-frekvensen skulle aldrig slutat, bara moduleras om.
Re: Är detta rätt tänkt angående CCP module, PWM läge.
>...Förmodligen är de ojämna sifforna i bilden bara mätfel.
Mätfel !?
Jag utgick ifrån att tiderna var hämtade ur någon specifikation/dokumentation
inte uppmätta/uppskattade från en bild...
Mätfel !?
Jag utgick ifrån att tiderna var hämtade ur någon specifikation/dokumentation
inte uppmätta/uppskattade från en bild...

Re: Är detta rätt tänkt angående CCP module, PWM läge.
Enligt sidan är bilden gjord från data av folk som "reverse enginerat" en fjärrkontroll. De har helt enkelt kopplat ett oscilloskåp till en IR-detektor och tryckt på fjärrkontrollen, som jag förstod det.
EDIT: ja just det, han hade inte länkat till sidan, adressen är: http://www.bigmike.it/ircontrol/
EDIT: ja just det, han hade inte länkat till sidan, adressen är: http://www.bigmike.it/ircontrol/
Senast redigerad av bearing 20 april 2009, 18:10:06, redigerad totalt 1 gång.
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Om du syftar på spiken så kom den varje period på ATMegan; 38.4Khz-frekvensen skulle aldrig slutat, bara moduleras om.
Ok. Då får du en lite konstig dutycykle med väldigt kort tilltid. Frågan är om mottagaren verkligen skulle reagera på den. Visst blir det rätt frekvens, men jag misstänker att dutyn ändå skulle ställa till det om till-tiden blir väldigt mycket kortare än från-tiden. Skit samma, det var lite hypotetisk tanke.
Ok. Då får du en lite konstig dutycykle med väldigt kort tilltid. Frågan är om mottagaren verkligen skulle reagera på den. Visst blir det rätt frekvens, men jag misstänker att dutyn ändå skulle ställa till det om till-tiden blir väldigt mycket kortare än från-tiden. Skit samma, det var lite hypotetisk tanke.

-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Anledningen till att jag skulle vilja slå av Dioden med en BIT är Xor funktionen som jag gillar.
Jag vet inte om Diagrammet är från ett datablad eller avläsning från ett osiloscop, det kommer från en sida där man byggt en fjärrkontroll men använtsig av mjukvarudelay och det fungerar inte med mitt slutmål. (Därför kan jag inte använda resten av informationen på sidan)
Låter riktigt bra om det fungerar med 400 som bas, ska nog prova med det först.
Sitter på fikarast på jobbet, därför är jag lite kortfattad.
TAck för svaren
MVH Peter F

Jag vet inte om Diagrammet är från ett datablad eller avläsning från ett osiloscop, det kommer från en sida där man byggt en fjärrkontroll men använtsig av mjukvarudelay och det fungerar inte med mitt slutmål. (Därför kan jag inte använda resten av informationen på sidan)
Låter riktigt bra om det fungerar med 400 som bas, ska nog prova med det först.
Sitter på fikarast på jobbet, därför är jag lite kortfattad.
TAck för svaren
MVH Peter F
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Det finns en ännu enklare instruktion i så fall =) den heter BCF.
Så, enklaste säkra sättet att slå av den är nog att skriva BCF TRISx, #. (i rätt bank)
Så, enklaste säkra sättet att slå av den är nog att skriva BCF TRISx, #. (i rätt bank)
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Är detta rätt tänkt angående CCP module, PWM läge.
> Det finns en ännu enklare instruktion i så fall =) den heter BCF.
Jo förvisso men jag vill kunna använda samma subrutin för att både "tända" och "släcka" IR dioden. Alltså mellan de olika pulserna, "Signal" och "Paus".
Men det är klart, det är ju bara att ha två olika subrutiner, en för hög och en för låg. Och i den som är till för pauserna så lägger man till att den ska sätta diodenPinnen låg.
MVH Peter F
Jo förvisso men jag vill kunna använda samma subrutin för att både "tända" och "släcka" IR dioden. Alltså mellan de olika pulserna, "Signal" och "Paus".
Men det är klart, det är ju bara att ha två olika subrutiner, en för hög och en för låg. Och i den som är till för pauserna så lägger man till att den ska sätta diodenPinnen låg.
MVH Peter F
Re: Är detta rätt tänkt angående CCP module, PWM läge.
> Men det är klart, det är ju bara att ha två olika subrutiner, en för hög och en för låg.
Inte mycket till subrutin, bara en instruktion ?
Är det många platser där du anropar dessa (eller denna) subrutin ?
Och dessutom, om du använder PWM-modulens utgång direkt så behöver
du ju inte dessa rutiner alls, eller ?
Inte mycket till subrutin, bara en instruktion ?
Är det många platser där du anropar dessa (eller denna) subrutin ?
Och dessutom, om du använder PWM-modulens utgång direkt så behöver
du ju inte dessa rutiner alls, eller ?
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Sodjan:
Mmm, jag tänker nog att det kanske blir ett par instruktioner till, men du kan ha rätt, det kanske bara blir en instruktion.
Jo jag använder PWM-modulens utgång men det är inte till den 38,4kHz frekvensen jag pratar om nu utan den ojämna sekvensen i bilden här uppe. Då tänker jag att jag stänger av Tmr2 och sedan sätter PWM-modulens utgång till låg för att fösäkra mig om att Dioden är släckt.
Sedan när paustiden är klar så startar jag bara Tmr2 igen, fins juh ingen anledning att sätta pinne hög då i och med att PWM-modulen sköter det i "aktivt läge".
MVH Peter F
Mmm, jag tänker nog att det kanske blir ett par instruktioner till, men du kan ha rätt, det kanske bara blir en instruktion.
Jo jag använder PWM-modulens utgång men det är inte till den 38,4kHz frekvensen jag pratar om nu utan den ojämna sekvensen i bilden här uppe. Då tänker jag att jag stänger av Tmr2 och sedan sätter PWM-modulens utgång till låg för att fösäkra mig om att Dioden är släckt.
Sedan när paustiden är klar så startar jag bara Tmr2 igen, fins juh ingen anledning att sätta pinne hög då i och med att PWM-modulen sköter det i "aktivt läge".
MVH Peter F
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Jag håller just på med en PIC16 och PWM. Passade på att kontrollera resultatet från olika sätt att stänga av.
Resultat:
Att stänga av TMR2 och sedan skriva 0 till PORTB.3 ger alltså inte önskat resultat eftersom PORTB.3 inte påverkar utgången.
CCPR1L=0 fungerar utan spikar och stänger av först när perioden är slut.
Har inte kunna se om CCP1CON=0 stänger av direkt eller när perioden är slut. Antar att den stänger av direkt.
Genom att stänga av med CCP1CON=0 kan tomgångsläget vara hög om så önskas.
Det går inte att få 100% duty om PR2 = 0xFF, men går om PR2 <= 0xFE;
Slutsatsen är att CCP1CON är bästa metoden att stänga av/sätta på. (Ganska självklart egentligen eftersom det är det det registret som kontrollerar PWM-modulen.)
Resultat:
Kod: Markera allt
CCP1CON=0; //PWM av - utgång som PORTB.3
T2CON=0; //Utgång som när den lämnades oavsett PORTB.3
CCPR1L:CCP1CON<4:5> = 0 //Utgång låg
PR2=0xFF;
CCPR1L:CCP1CON<5:4> = 0x3FF //Utgång hög, spikar mot jord
PR2=0x7F;
CCPR1L:CCP1CON<5:4> >= 0x200 //Utgång hög
TRISB.3=1; //Ingång; driver ej lysdiod
CCPR1L=0 fungerar utan spikar och stänger av först när perioden är slut.
Har inte kunna se om CCP1CON=0 stänger av direkt eller när perioden är slut. Antar att den stänger av direkt.
Genom att stänga av med CCP1CON=0 kan tomgångsläget vara hög om så önskas.
Det går inte att få 100% duty om PR2 = 0xFF, men går om PR2 <= 0xFE;
Slutsatsen är att CCP1CON är bästa metoden att stänga av/sätta på. (Ganska självklart egentligen eftersom det är det det registret som kontrollerar PWM-modulen.)
-
- Inlägg: 789
- Blev medlem: 10 december 2007, 12:40:08
- Ort: Piteå
Re: Är detta rätt tänkt angående CCP module, PWM läge.
Ja nu har jag lyckats generera den puls som det står i schemat jag bifogade innan. I alla fall om man ska tro på simulatorn MPLAB SIM.
Från början lyckades jag att komma nära med bara tmr0 och lite "räkneverk". Men det fungerade inte, så då gjorde jag det förbjudna och la in Delay rutiner i Interrupt servise rutinen.
Men då lyckades jag pricka sekvensen på pricken i simulatorn.
Det fungerar i alla fall inte.
PICEN jag använder är PIC16F628A. Jag har testat att kameran fungerar då jag redan har en köpes irfjärrkontrol.
IR dioden lyser juh fruktansvärt svagt. Alltså redan med grundpulsen på 38,4Khz så lyser den med halva styrkan, och sedan är den oregelbundna pulsen mycket mer "av" än "på". Detta resulterar i att när jag tar kort på dioden eller om jag har den kopplad till en vanlig diod så är det bara ett svagt svagt sken.
Men om jag tar kort på orginal fjärrkontrollen så lyser den mycket starkare.
Detta känns som ett problem.
Ir Dioden är en sådan här:
http://www.upplyst.se/product_info.php? ... cts_id=142
Och den är kopplad med ett 82Ohm s motstånd, enligt en LEDkalkulator.
Koden ser ut så här ifall någon vill kasta ett getöga på den.
Jag vet att det är illa med delay i ISRen men jag vill testa ifall det var timingen som var fel. Samtidigt kan jag tänka mig att en delay rutin kanske inte heller är det mest exakta.
Någon som har nåt tips?
MVH Peter F
Från början lyckades jag att komma nära med bara tmr0 och lite "räkneverk". Men det fungerade inte, så då gjorde jag det förbjudna och la in Delay rutiner i Interrupt servise rutinen.

Det fungerar i alla fall inte.
PICEN jag använder är PIC16F628A. Jag har testat att kameran fungerar då jag redan har en köpes irfjärrkontrol.
IR dioden lyser juh fruktansvärt svagt. Alltså redan med grundpulsen på 38,4Khz så lyser den med halva styrkan, och sedan är den oregelbundna pulsen mycket mer "av" än "på". Detta resulterar i att när jag tar kort på dioden eller om jag har den kopplad till en vanlig diod så är det bara ett svagt svagt sken.
Men om jag tar kort på orginal fjärrkontrollen så lyser den mycket starkare.
Detta känns som ett problem.
Ir Dioden är en sådan här:
http://www.upplyst.se/product_info.php? ... cts_id=142
Och den är kopplad med ett 82Ohm s motstånd, enligt en LEDkalkulator.
Koden ser ut så här ifall någon vill kasta ett getöga på den.
Kod: Markera allt
;************************************************************************
; Processor: 16F628a *
; *
;************************************************************************
; *
; *
; *
; *
;************************************************************************
processor 16f628a
include <p16f628a.inc>
;**** CONFIGURATION
__config _INTOSC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _LVP_OFF
errorlevel -302 ; no "register not in bank 0" warnings
errorlevel -312 ; no "page or bank selection not needed for this device" messages
;=====================================================================
; File register use
;=====================================================================
cblock H'20'
; variables used for context saving
cs_W
cs_STATUS
timer_0
puls_1
puls_2
puls_3
puls_4
puls_5
puls_6
puls_7
puls_8
flagga ;flagga för att välja puls
d1
endc
;=====================================================================
; Konstanta värden
;=====================================================================
timer_0_konst equ .190 ;194 Med 4Mhz, för interrupt var 400uSec
period equ .25 ;25 = 38,4Khz med 4Mhz klocka
duty equ .12 ;Procentuell av Perioden
puls_1_konst equ .5 ; Interrupt var 400usec
puls_2_konst equ .71 ; Dessa värden alltså ggr 400
puls_3_konst equ .1 ;
puls_4_konst equ .4 ;
puls_5_konst equ .1 ;
puls_6_konst equ .9 ;
puls_7_konst equ .1 ;
puls_8_konst equ .162 ;
goto Start
;=====================================================================
; INTERRUPT SERVICE ROUTINE
;=====================================================================
ISR ORG 0004h
; save context
movwf cs_W ; save W
movf STATUS,w ; save STATUS
movwf cs_STATUS
; service Timer0 interrupt
bcf INTCON,T0IF ; clear interrupt flag
movlw .255-timer_0_konst
movwf TMR0
; If satserna
bcf STATUS, Z
movlw d'0' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pre_paus ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'1' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsEtt ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'2' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsTva ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'3' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsTre ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'4' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsFyra ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'5' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsFem ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'6' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsSex ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'7' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsSju ; Nej, fortsätt testa...
bcf STATUS, Z
movlw d'8' ; Vilken puls ska köras ?
subwf flagga, W ; -"-
btfsc STATUS, Z ; -"-
goto pulsAtta ; Nej, fortsätt testa...
;-------- tidtagningen -------------
pulsEtt decfsz puls_1
goto isr_end
movlw puls_1_konst
movwf puls_1
call delay_5u
call delay_5u
call delay_5u
call blinka
movlw .2
movwf flagga
goto isr_end
pulsTva decfsz puls_2
goto isr_end
movlw puls_2_konst
movwf puls_2
call delay_5u
call delay_5u
nop
nop
nop
nop
nop
call blinka
movlw .3
movwf flagga
goto isr_end
pulsTre decfsz puls_3
goto isr_end
movlw puls_3_konst
movwf puls_3
call delay_5u
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
call blinka
movlw .4
movwf flagga
goto isr_end
pulsFyra decfsz puls_4
goto isr_end
movlw puls_4_konst
movwf puls_4
call delay_5u
call delay_5u
nop
nop
nop
nop
nop
call blinka
movlw .5
movwf flagga
goto isr_end
pulsFem decfsz puls_5
goto isr_end
movlw puls_5_konst
movwf puls_5
call delay_5u
call delay_5u
call delay_5u
nop
nop
nop
nop
nop
nop
call blinka
movlw .6
movwf flagga
goto isr_end
pulsSex decfsz puls_6
goto isr_end
movlw puls_6_konst
movwf puls_6
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
nop
nop
nop
nop
nop
call blinka
movlw .7
movwf flagga
goto isr_end
pulsSju decfsz puls_7
goto isr_end
movlw puls_7_konst
movwf puls_7
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
call delay_5u
nop
nop
nop
nop
nop
nop
nop
nop
call blinka
movlw .8
movwf flagga
goto isr_end
pulsAtta decfsz puls_8
goto isr_end
movlw puls_8_konst
movwf puls_8
call blinka
movlw .1
movwf flagga
goto isr_end
pre_paus
call blinka
movlw .1
movwf flagga
goto isr_end
;Första pulsen
isr_end ; restore context then return
movf cs_STATUS,w ; restore STATUS
movwf STATUS
swapf cs_W,f ; restore W
swapf cs_W,w
retfie
;***** MAIN PROGRAM
Start
;---------------------------------------------------------------------
; Set up I/O
;---------------------------------------------------------------------
banksel TRISB ;
clrw ; Make all PORTB bits output
movwf TRISB
movwf TRISA ;
banksel PORTA ; Back to bank 0
;movlw b'11111111'
movwf PORTB ;Avstängda
movlw puls_1_konst
movwf puls_1
movlw puls_2_konst
movwf puls_2
movlw puls_3_konst
movwf puls_3
movlw puls_4_konst
movwf puls_4
movlw puls_5_konst
movwf puls_5
movlw puls_6_konst
movwf puls_6
movlw puls_7_konst
movwf puls_7
movlw puls_8_konst
movwf puls_8
CLRW
movwf flagga
;Ställer in inputs
;MOVLW 0x07 ;Turn comparators off and
;MOVWF CMCON ;enable pins
; configure Timer0
movlw b'00000000' ; Prescaler = Ingen
Banksel OPTION_REG ;
movwf OPTION_REG ;
banksel PORTA ; Back to bank 0
;---------------------------------------------------------------------
; Initialize memory
;---------------------------------------------------------------------
; configure interrupts
bsf INTCON, GIE
bsf INTCON, T0IE
bsf INTCON, PEIE
;---------------------------------------------
banksel CCP1CON
CLRF CCP1CON ; CCP Module is off
CLRF TMR2 ; Clear Timer2
MOVLW period ;
MOVWF PR2 ; PWM Perioden
banksel CCPR1L
MOVLW duty ;
MOVWF CCPR1L ; PWM Duty Cycle
BSF STATUS, RP0 ; Bank1
BCF STATUS, RP0 ; Bank0
CLRF PIR1 ; Clear peripheral interrupts Flags
;MOVLW b'00001100' ; PWM mode, 2 LSbs of Duty cycle = 00
;MOVWF CCP1CON ;
BSF T2CON, TMR2ON ; Timer2 starts to increment
BSF PORTB,0 ;Led för att jämföra styrkan med
;---------------------------------------------------------------
;---------------------------------------------------------------------
; Main loop
;---------------------------------------------------------------------
loop
goto loop
;=====================================================================
; Subroutines
;=====================================================================
blinka
MOVLW b'00001100' ;0x2C PWM mode, 2 LSbs of Duty cycle = 10
xorwf CCP1CON,F ; XORing with current state
nop
return
tand
MOVLW .12 ;
MOVWF CCPR1L ; Duty Cycle is 50% of PWM Period
return
slack
MOVLW .0 ;
MOVWF CCPR1L ; Duty Cycle is 0% of PWM Period
return
delay_5u
banksel PORTA
; Delay = 0.0005 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.00005 seconds
; Error = 0 %
goto $+1
goto $+1
nop
nop
return
nop
END
Jag vet att det är illa med delay i ISRen men jag vill testa ifall det var timingen som var fel. Samtidigt kan jag tänka mig att en delay rutin kanske inte heller är det mest exakta.
Någon som har nåt tips?
MVH Peter F