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 ?
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
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,..
.
Weet iemand misschien een goede PWM tutorial ofzo ? Of een mooi stukje voorbeeld code ?
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
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 ]
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
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
ENDDit werkt iig. 
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
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
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
Ja idd dat d8 ik dus ook al, eleganter
. 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 ]
chipje
Why do people spend money they don't have, to buy things they don't need, to impress people they don't like...? .-.-.-.-. Wie zich gelukkig voelt met het geluk van anderen, bezit een rijkdom zonder grenzen.
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.
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
.
; 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 ;;;;;;;;;;;;;;;;;;;;;;;;;
returnDit 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 ...
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
}