Ben nu eindelijk een beetje begonnen met pic's en aan PWM toegekomen. Heb eerst een aantal tutorials doorgeworsteld om het basis princiepe te snappen, en heb nu me eigen PWM programma geschreven ( Deels gekopieert van deze geweldige site.

;****************************************************************
; Processor: PIC16F628 at 4 MHz using internal RC oscillator    *
; Hardware:  Test Circuit V1.0                                  *
; Author:    William van den Akker, edithenwilliam@zonnet.nl    *
; Website:   http://home.versatel.nl/edithenwilliam/william.htm *
; Credit:    Lars Petersen, www.oz1bxm.dk/PIC/628LED.htm        *
;**************************************************************** 
;                                                  _____
;                                              ---| 10K |--- GND(0V)
;                         ________________     |
;                        |1 RA2 \_/ RA1 18|-------SWITCH1--- Vcc(5V)
; (0V)GND ----RESET----  |2 RA3     RA0 17|-------SWITCH2--- Vcc(5V)
;             _____   |  |3 RA4  1  RA7 16|    |   _____
; (5V)Vcc ---| 10K |-----|4 RA5  6  RA6 15|    ---| 10K |--- GND(0V)
; (0V)GND ---------------|5 GND  F  Vcc 14|----------------- Vcc(5V)
;         ---------------|6 RB0  6  RB7 13|-----------------
;         |   -----------|7 RB1  2  RB6 12|----------      |
;         |   |   -------|8 RB2  8  RB5 11|------   |      |
;         |   |   |   ---|9 RB3     RB4 10|--   |   |      |
;         |   |   |   |   ----------------  |   |   |      |
;         |   |   |   ----------      -------   |   |      |
;         |   |   -------      |      |      ----   |      |
;         |   ----      |      |      |      |      |      |
;         |      |      |      |      |      |      |      |
;        ---    ---    ---    ---    ---    ---    ---    --- 
;        |3|    |3|    |3|    |3|    |3|    |3|    |3|    |3| 
;        |3|    |3|    |3|    |3|    |3|    |3|    |3|    |3| 
;        |0|    |0|    |0|    |0|    |0|    |0|    |0|    |0| 
;        ---    ---    ---    ---    ---    ---    ---    --- 
;         |      |      |      |      |      |      |      |
;        _|_    _|_    _|_    _|_    _|_    _|_    _|_    _|_
;        \ / -> \ / -> \ / -> \ / -> \ / -> \ / -> \ / -> \ / ->
;        _V_->  _V_->  _V_->  _V_->  _V_->  _V_->  _V_->  _V_->
;         |      |      |      |      |      |      |      |
;         |      |      |      |      |      |      |      |
;       ------------------------------------------------------ GND(0V)
;        LED1   LED2   LED3   LED4   LED5   LED6   LED7   LED8
;
; Circuit description:
; The heart of this testcircuit consists of a 16F628(a) PIC microcontroller.
; Port A is used for inputs and Port B is used for outputs.
; On pin RA5 a pull-up resistor is used to get thee microcontroller running.
; With the RESET-switch(or push button) the microcontroller can be resetted.
; On Pin RA0 and RA1 pull-down resistors are used to pull inputs to ground(GND).
; When the switch(or pushbutton) is used the input will change from low to high.
; On Pin RB0 - RB7 8 LED's are connected with a resistor to ground. 
; Make sure the LED's are connected properly, otherwise the LED's won't light up.
;
; This test circuit is designed for learning Microlab ASM for PIC's.
; V1.0 can be used with the following code
; blink1.asm  - Blinking a led at pin 6(RB0) at 1Hz.
; blink2.asm  - Blinking a led at pin 6(RB0) at different speeds.
; blink3.asm  - Blinking all 8 led's with different patterns.
; walk.asm    - Walking light.
; switch1     - Control a led by using a switch( or pushbutton).
; switch2     - Control 8 leds by using 2 switches(or pushbuttons).
; cntbin.asm  - 8 bit up/down counter while key-pressed.


	; Assign your microcontroller
        LIST P=16F628

	; This include file makes programming more understandble
        include <P16F628.INC>

	; Predefine your configuration Word
	;__CONFIG 		Configuration Word
	;_CP_OFF		Code Protection 
	;_DATA_CP_OFF		EEPROM Code Protection
	;_BODEN_OFF		Under Voltage Reset
	;_MCLRE_ON		Master Clear Enable(Reset)
	;_PWRTE_ON		Powerup Timer 
	;_WDT_OFF		WatchDog Timer
	;_INTRC_OSC_NOCLKOUT	Internal RC oscilator(pins RA6/RA7 can be used voor I/O)
	;_LVP_OFF		Low Voltage Programming
	
	__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
		pwmval			; Waarde van 'duty cycle'
		pwmvalon
		pwmvaloff
        ENDC

	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1
	
	;This one is for LED
	#define	LED	PORTB,0			; LED on RB0

	;startadres of the controller
	org 0x0000

; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111111'	;
        movwf	TRISA		; PORTA = all inputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1



; main loop


main	
	movlw	0xff		; Zet een begin waarde in pwmval
	movwf   pwmval		
pwmcntr	goto 	delay_500ms
	decfsz 	pwmval, f	; Maak teller die waarde van pwmval aftelt tot 0	
	goto 	pwmcntr
	


	goto	main		; Repeat until end of days



pwm	movlw   pwmval		; Laad pwmval in W
	movwf   pwmvalon	; Laad waarde W in pwmvalon
	movwf   pwmvaloff	; Laad waarde W in pwmvaloff
	movlw	0xff		; Laad 11111111 in W
	xorwf   pwmvaloff	; Zet de XOR van W en pwmvaloff in pwmvaloff ( inversie, toch ? )
	bsf	LED 		; LED aan

dutyon	decfsz	pwmvalon, f	; Maak teller die pwmvalon aftelt
	goto	dutyon
	bcf	LED		; LED uit

dutyoff decfsz	pwmvaloff, f	; Maak teller die pwmvaloff aftelt
	goto	dutyoff
	
	return	
	 	

	

delay_500ms
	movlw	D'5'
	goto	delay	





; This code creates a delay with a multiply of 99975 instructions. 
; At 4Mhz this is approx. 100 milliseconds.
; BEWARE : If you call this routine with w = 0 then this delay is 256 x 0,1 = 25,6 seconds

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0x34
	movwf	cntr1
delay3	goto    pwm		; Ga naar pwm lus
	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
        goto	delay2
	decfsz	cntr3, f
        goto	delay1
	return
        END

Zou dit kunnen werken, of maak ik een grote denkfout ?

Zie een paar programma foutjes.
Of de pwm gaat werken weeet ik niet, maar het volgende:
Je hebt 2x dat je goto gebruikt om naar een sub routine te gaan


goto     delay_500ms
en
delay3     goto   pwm

Aan de einde van de betreffende subroutine staat dan 'return'.
Return waarheen?
Daar moet je dus geen goto gebruiken maar CALL.
Dus:


call     delay_500ms
en
delay3     call   pwm

Volgende is deze regeltje:


pwm      movlw   pwmval     ; Laad pwmval in W

'pwmval' is GEEN literal, maar een file.
Het zou dus moeten zijn:


pmw      movf   pwmval, W

Aha, mja dit zijn dus die "kleine" dingetjes die je meestal niet helemaal meekrijgt in die tutorial.

Iig we gaan het programma ff veranderen.

Bedankt alvast

Nope nogsteeds geen echt verschil te zien,.. :S.

Weet iemand misschien een goede PWM tutorial ofzo ? Of een mooi stukje voorbeeld code ?

Heb nog weer even gekeken naar je code.
Als ik je code goed versta, maak je door een andere waarde in pwmval te laden alleen de frequetie hoger of lager, in plaats van de duty cycle hoger of lager.
duty cycle blijft vast op ca. 50%
Dan kan het kloppen dat de led maar half blijft branden

/EDIT
Heb het fout gezien!!!
sorry..

Moet volgens mij wel kunnen

[Bericht gewijzigd door chipje op ]

Mijn idee was, dat je juist in pwmval de duty cylce zetten, en dan vervolgens die te verdelen over 2 variable, 1 met zelfde waarde, en een met 255 - pwmval. Zodat je frequentie gelijk blijft. Daarvoor is die XORWF.

Mja het probleem blijft geloof ik, heb nu ff die "automatische dutycycle veranderings loop" weggehaald, en 2 pic's met andere pwmval geladen. Maar blijft hetzelfde probleem.

edit Heb er ff een scoop bijgepakt, en de duty cycle blijft idd 50-50, klopt mijn denkwijze met die XORWF wel ?

[Bericht gewijzigd door Mr GAmba op ]

Ga het nu zelf ook even proberen...

main	
;	movlw	0xa3		; Zet een begin waarde in pwmval
;	movwf	pwmval	; 
	
pwmcntr	call 	pwm
	
	goto 	pwmcntr
	


	goto	main		; Repeat until end of days



pwm
;	movlw   pwmval    
;	movwf    pwmvalon	; Laad waarde W in pwmvalon
;	movwf    pwmvaloff	; Laad waarde W in pwmvaloff
;	movlw	0xff		; Laad 11111111 in W
;	xorwf   pwmvaloff	; Zet de XOR van W en pwmvaloff in pwmvaloff ( inversie, toch ? )
;	movwf	pwmvaloff
	bsf	LED 		; LED aan

	movlw	d'235'          ; Zet je deze 2 waardes andersom dan krijg je pwm signaal, andersom :P.
	movwf	pwmvalon
	movlw	d'20'
	movwf	pwmvaloff


dutyon	decfsz	pwmvalon, f	; Maak teller die pwmvalon aftelt
	goto	dutyon
	bcf	LED		; LED uit

dutyoff decfsz	pwmvaloff, f	; Maak teller die pwmvaloff aftelt
	goto	dutyoff
	return	
END

Dit werkt iig. :)

Even wat testjes gedaan.
Het terug tellen van pwmval gebeurt volgens mij te langzaam.
Van 256 tot ongeveer 128 zie ik geen verschil in helderheid, daarna wel, tot de led helemaal uit gaat.
Je gebruikt een delay van 500ms, maar call pwm komt er ook nog bij.
Ik schat dat delay nu ongeveer 700-800ms duurt(misschien wel langer).
(zal het nog wel een keer na tellen)
Dit betekend dat pwmval eens in de 700ms word verlaagd.
Van 256 tot 0 dus in bijna 3 minuten!!
Kan dus even duren voor je wat ziet veranderen.
Heb nu een wat aangepaste code die wel sichtbaar effect geeft.



        LIST P=16F628

        include <P16F628.INC>

	; Predefine your configuration Word
	
	__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
		pwmval			; Waarde van 'duty cycle'
		pwmvalon
		pwmvaloff
        ENDC

	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1
	
	;This one is for LED
	#define	LED	PORTB,7			; LED on RB0

	;startadres of the controller
	org 0x0000

; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111111'	;
        movwf	TRISA		; PORTA = all inputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1



; main loop


main	
	movlw	0xff		; Zet een begin waarde in pwmval
	movwf   pwmval		
pwmcntr	call 	delay_500ms
	decfsz 	pwmval, f	; Maak teller die waarde van pwmval aftelt tot 0	
	goto 	pwmcntr
	


	goto	main		; Repeat until end of days



pwm	movf	pwmval, W	; Laad pwmval in W
	movwf   pwmvalon	; Laad waarde W in pwmvalon
	movwf   pwmvaloff	; Laad waarde W in pwmvaloff
	movlw	0xff		; Laad 11111111 in W
	xorwf   pwmvaloff, F	; Zet de XOR van W en pwmvaloff in pwmvaloff ( inversie, toch ? )
	bsf	LED 		; LED aan

dutyon	decfsz	pwmvalon, f	; Maak teller die pwmvalon aftelt
	goto	dutyon
	bcf	LED		; LED uit

dutyoff decfsz	pwmvaloff, f	; Maak teller die pwmvaloff aftelt
	goto	dutyoff
	
	return	
	 	

	

delay_500ms
	movlw	D'1'






; This code creates a delay with a multiply of 99975 instructions. 
; At 4Mhz this is approx. 100 milliseconds.
; BEWARE : If you call this routine with w = 0 then this delay is 256 x 0,1 = 25,6 seconds

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	call	pwm
	decfsz	cntr2, f
        goto	delay2
	call	pwm
	decfsz	cntr3, f
        goto	delay1

	return
        END

Ik zou niet hierop doorgaan.
Er moet een elegantere oplossing zijn.
Mischien even zoeken op piclist

Ja idd dat d8 ik dus ook al, eleganter :P. Want als je nu nog andere dingen wil gaan doen moet je continue die delay aan gaan passen,...

Ik zie het al, die er gingen dus wat dingen mis met het W register,... En dat idee met XOR werkte dus wel :).

[Bericht gewijzigd door Mr GAmba op ]

mischien dat hier nog wat voor je staat:
http://www.piclist.com/techref/microchip/pwm.htm

Of anders de hardware pwm gebruiken.(1x op de 16f628)

Heb nu zelf even geen tijd om het door te spitten.
Succes, en laat even weten als je wat bruikbaars gevonden hebt.

Ik wist niet dat er een HW pwm op de 16f628 zat,.. Hmzz zullen we dat is bekijken :D

Zo heb ff de data sheet doorgelezen. Maar snap vrij weinig van hoe ik de interne PWM moet aanroepen.

heb een stukje code geschreven, maar dit wil niet compileren.

	; Assign your microcontroller
        LIST P=16F628

	; This include file makes programming more understandble
        include <P16F628.INC>

	; Predefine your configuration Word
	;__CONFIG 		Configuration Word
	;_CP_OFF		Code Protection 
	;_DATA_CP_OFF		EEPROM Code Protection
	;_BODEN_OFF		Under Voltage Reset
	;_MCLRE_ON		Master Clear Enable(Reset)
	;_PWRTE_ON		Powerup Timer 
	;_WDT_OFF		WatchDog Timer
	;_INTRC_OSC_NOCLKOUT	Internal RC oscilator(pins RA6/RA7 can be used voor I/O)
	;_LVP_OFF		Low Voltage Programming
	
	__CONFIG _CP_OFF & _DATA_CP_OFF & _BODEN_OFF & _MCLRE_ON & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT & _LVP_OFF

	; Disable warning : Register in operand not in bank 0
	ERRORLEVEL -302 

	; free 16F628 RAM starts at 0x20(depends on type microcontroller)
	CBLOCK 0x20
		cntr1
		cntr2
		cntr3
        ENDC

	;some define's to make things easier
	;These are for Bank Switching
	#define	BANK0	bcf	STATUS,RP0	; RAM PAGE 0
	#define	BANK1	bsf	STATUS,RP0	; RAM PAGE 1
	
	;This one is for LED
	#define	LED	PORTB,0			; LED on RB0

	;startadres of the controller
	org 0x0000

; For using A0-A3 as digital I/O 
	movlw	D'7' 		; 
        movwf	CMCON		; Comparators off, all pins digital I/O 

; Reset Port values
        clrf	PORTA	
        clrf	PORTB
        
; define your pin direction (input/output)
	BANK1			; Switch to bank 1
        movlw	b'11111111'	;
        movwf	TRISA		; PORTA = all inputs
        movlw	b'00000000'	; 
        movwf	TRISB		; PORTB = all outputs
	BANK0			; Switch to bank 1


; Initialise PWM

	PR2	0xFF
	CPP1CON b'00001100'	; 0000 LSB PWM duty cycle    ; 1100 11xx PWM mode 
	CCPR1L	b'00000000'	; PWM register 1 LSB
	CCPR1H	b'00000000'	; PWM register 1 MSB
	TMR2	b'11111111'	; Set Timer2 prescale value ?


; main loop


main
	CCPR1L	b'11111111'	
	call delay_500ms
	CCPR1L	b'00001111'
	call delay_500ms


	goto	main		; Repeat until end of days

; Delay routines


delay_500ms
	movlw	D'5'
	goto	delay	

	

; This code creates a delay with a multiply of 99975 instructions. 
; At 4Mhz this is approx. 100 milliseconds.
; BEWARE : If you call this routine with w = 0 then this delay is 256 x 0,1 = 25,6 seconds

delay	movwf	cntr3
delay1	movlw	0x82
	movwf	cntr2
delay2	movlw	0xff
	movwf	cntr1
delay3	decfsz	cntr1, f 
	goto	delay3
	decfsz	cntr2, f
        goto	delay2
	decfsz	cntr3, f
        goto	delay1
	return
        END

Heeft er iemand enig idee wat ik allemaal wel neit verkeerd doe?

[Bericht gewijzigd door Mr GAmba op ]

Op 19 januari 2006 16:49:31 schreef Mr GAmba:
Heeft er iemand enig idee wat ik allemaal wel neit verkeerd doe?

Bijna alles, probeer eerst eens een knipperledje of zo.
Je verzint ter plekke je eigen instructies, en daar heeft die PIC (en de assembler) niks mee te maken.

CCPR1L b'11111111'

dat wel erg snel !!!

movlw b'111111111'
movwf ccpr1l

en waar is je delay loop ??? en wanneer denk je dat ie stopt ??? er staat nergens stop als je op nul bent je gaat gewoon door met goto main .. dus na 0 begint ie weer op 255 of wat dan ook .....

@ JoWi, die delay enzo staan al in het programma en werken, perfect. Heb ze alleen ff weggelaten voor ruimte te besparen.

@ DUHH, idd programma loopt continue, en zou nu alleen maar zacht/hard/zacht/hard, een ledje moeten laten branden. Niet meer niet minder.

; Initialise PWM


	movlw 	0xFF
	movwf 	PR2
		
	movlw 	b'00001100'		; 0000 PWM register 1 LSB   ; 1100 11xx PWM mode
	movwf 	0x17  ; CCP1CON
	 		  
	movlw 	b'00000000'		
	movwf 	0x15  ; CCPR1L
			
	movlw 	b'00000000' 		; PWM register 1 MSB
	movwf 	0x16  ; CCPR1H
			
	movlw 	b'11111111'		; Set Timer2 prescale value ?
	movwf 	TMR2
			


; main loop


main
	movlw b'11111111'
	movwf 0x15  			; CCPR1L
	call delay_500ms
	movlw b'00000000'
	movwf 0x15  			; CCPR1L
	call delay_500ms


	goto	main		; Repeat until end of days

Zo alles ff veranderd. Maar doe ik het zo verder wel goed dan. Want snap nog steeds niet precies wat ik in die registers moet zetten.

[Bericht gewijzigd door Mr GAmba op ]

Jongens het werkt :D.

; Initialise PWM


	movlw 	0xFF
	movwf 	PR2
		
	movlw 	b'00001100'		; 0000 PWM register 1 LSB   ; 1100 11xx PWM mode
	movwf 	0x17  ; CCP1CON
	 		  
	movlw 	b'00000000'		
	movwf 	0x15  ; CCPR1L
			
	movlw 	b'00000000' 		; PWM register 1 MSB
	movwf 	0x16  ; CCPR1H
			
	movlw 	b'11111111'		; Set Timer2 prescale value ?
	movwf 	TMR2
			


; main loop
main
	btfsc	SWITCH1
	call 	onwaitoff
	
	goto main 				; Endless loop






onwaitoff

		
	movlw		0x7f			;;;;;;;;	
	movwf		cntr4			;
pwm2	movf		cntr4, W		;	Slow on
	sublw		0x7f			;
	movwf		0x15			;
	call delay_50ms				;
	decfsz		cntr4			;
	goto		pwm2			;;;;;;;;;;;;;;;;;;;;

	call 		delay_1000ms		; 	Pause

	movlw		0x7f			;;;;;;;;
	movwf		cntr4			;
pwm	movf		cntr4, W		;	Slow off
	movwf		0x15			;		
	call delay_50ms				;
	decfsz		cntr4			;
	goto		pwm			;;;;;;;;;;;;;;;;;;;;;;;;;
	return

Dit is werkende code, als je op SWITCH1 drukt wordt pin 3 langzaam hoog. blijft even hoog. en zakt weer weg. Alvast bedankt allemaal. En ik ga weer verder met knutselen.

movlw 0xFF
movwf PR2

movlw b'00001100' ; 0000 PWM register 1 LSB ; 1100 11xx PWM mode
movwf 0x17 ; CCP1CON

ik snap je niet zo waarom benoem je pr2 direkt en ccp1con niet ??? gebruikt of alleen hex adressen of gewoon de naam .... da`s dan wat duidelijker ...

probleem is dat MPLAB pr2 wel pakt, en ccp1con niet ? ook ccpr1l en ccpr1h niet ,...

gebruik je wel de juiste inc. file`s ???



list p=16f628
#include <P16f628.INC>

ERRORLEVEL      -302 



	cblock 	0x20 			;start of general purpose registers
		count1 			;used in delay routine
		counta 			;used in delay routine 
		countb 			;used in delay routine
		
		lap
		

	endc


	org 0x0000

; Voordeler op 16:1 instellen, en timer 2 inschakelen
    BSF    T2CON,T2CKPS1  ; Vorteiler 16:1
    BSF    T2CON,TMR2ON   ; Timer2 ein

; frequentie op 10khz instellen
    BSF    STATUS,RP0     ; Bank1
    MOVLW    D'125'
    MOVWF    PR2          ; 2,5 kHz
    BCF    STATUS,RP0     ; Bank1

; PWM op 0% instellen
    MOVLW    D'0'
    MOVWF    CCPR1L       ; 0% van 124

; RC2/CCP1 als uitgang instellen
    BSF    STATUS,RP0     ; Bank1
    BCF    TRISB, 3       ; Rb3: output=0
    MOVLW  b'11111111'
    MOVWF  TRISA	  ; A0 ingang
    BCF    STATUS,RP0     ; Bank 0

; PWM MODE met CCP1 initialisieren
    CLRF   CCP1CON        ; CCP1-Modus aus
    BSF    CCP1CON,CCP1M3 ; CCP1-Modus PWM-Mode
    BSF    CCP1CON,CCP1M2

;=============================================================
;MAIN LOOP
;=============================================================

loop


	MOVLW	d'124'
	MOVWF	lap


L1	Call	DELAY
	CALL	PWMINCREASE
	DECFSZ	lap,1
	GOTO	L1
	
	MOVLW	D'124'
	MOVWF	lap


L2	CALL 	DELAY
	CALL	PWMDECREASE	
	DECFSZ	lap,1
	GOTO 	L2

	GOTO loop

;===============================================================
;INSTELLEN PWM 
;===============================================================

PWMINCREASE
	MOVLW	d'1'
	ADDWF	CCPR1L,1
	retlw   0x00

PWMDECREASE
	MOVLW	d'1'
	SUBWF	CCPR1L,1
	retlw   0x00
	
;===============================================================
;VERTRAGING
;===============================================================
DELAY	movlw	d'50'			;delay 250 ms (4 MHz clock)
	movwf	count1
d1	movlw	0xC7
	movwf	counta
	movlw	0x01
	movwf	countb
Delay_0
	decfsz	counta, f
	goto	$+2
	decfsz	countb, f
	goto	Delay_0

	decfsz	count1	,f
	goto	d1
	retlw	0x00
	
	
    end 

Deze code gebruikt de interne PWM hardware om de uitgang van 0% tot 100% te faden (door 0 tot 124 in ccpr1l op te slaan), en weer terug.

Min of meer zelfde code als ik heb, alleen wat overzichtelijker geschreven ;). Heb nog n beetje moeite met asm schrijven, dit komt denk ik doordat je met goto enzo moet werken, en weinig uitgebreide functies hebt zoals een for lus. Deze moet je zelf schrijven en hier gaat nogal wat denkwerk ik zitten.

Met die include files enzo, in de tutorials die ik heb gevonden wordt hier vrij weinig over verteld, en kan je gewoon een standaard stukje header kopieeren.

Iemand miss een goede link waar dit wordt uitgelegd ?

Die for lussen kun je zelf maken.



MOVLW	d'124'
	MOVWF	lap

L1	Call	DELAY
	CALL	PWMINCREASE
	DECFSZ	lap,1
	GOTO	L1

Dit is een for lus. lap wordt op 124 gezet. Eerst wordt er een delay aangeroepen, daarna de funcie PWMINCREASE. Daarna krijgje DECFSZ. Deze trekt 1 van lap af, en kijkt als lap gelijk is aan nul. Als lap1 gelijk is aan 0, slaat hij het volgende commando over.
De eerste 123 keer zal lap niet gelijk zijn aan 0. Dus hij zal de line GOTO L1 niet overslaan.
De lus zal dus 123 keer gemaakt worden. De 124ste keer zal lap 0 worden, en dus het GOTO commando overslaan.

Dit doet dus hetzelfde als


for(int a = 124; a > 0;a--)
{ voer delay uit
  roep pwmincrease aan
}