Sida 2 av 3

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 15:49:26
av sodjan
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...

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 16:47:07
av bearing
Å 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?

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 17:02:55
av bearing
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)

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 17:48:04
av vfr
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...

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 17:53:34
av bearing
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.

Postat: 20 april 2009, 18:00:06
av sodjan
>...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... :roll:

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 18:03:08
av bearing
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/

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 18:04:56
av vfr
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. :)

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 18:46:18
av PopUnoNkoK
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

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 19:53:17
av bearing
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)

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 23:08:07
av PopUnoNkoK
> 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

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 20 april 2009, 23:26:25
av sodjan
> 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 ?

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 21 april 2009, 00:34:12
av PopUnoNkoK
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

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 21 april 2009, 02:49:28
av bearing
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:

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
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.)

Re: Är detta rätt tänkt angående CCP module, PWM läge.

Postat: 21 april 2009, 15:08:32
av PopUnoNkoK
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. :oops: 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.

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