blueroomelectronics
Well-Known Member
They do make smaller SOIC PICs
Follow along with the video below to see how to install our site as a web app on your home screen.
Note: This feature may not be available in some browsers.
Buy a **broken link removed**. I routinely use **broken link removed** ones with 40-pin chips. The **broken link removed** ones are nice too. How small is yours?The PIC16F877 is so big that it doesn't easily fit or can't even fit to the breadboard.
Any ideas?
Is the 16F876 PIC an option.?
bsf STATUS,RP0
bcf STATUS,RP1
bsf STATUS,IRP
radix dec
cblock 20h
OnTime:2
OffTime:2
endc
;*******************************************************************
; 16F877 PWM Program
;*******************************************************************
include "p16f877.inc"
errorlevel -302
radix dec
__CONFIG _CP_OFF & _DEBUG_ON & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF
cblock 20h
OnTime:2
OffTime:2
endc
cblock 71h
int_work
int_status
int_pclath
endc
org 0h
nop
goto start
nop
nop
interupt movwf int_work
swapf STATUS,W
movwf int_status
bcf STATUS,RP0
bcf STATUS,RP1
movfw PCLATH
movwf int_pclath
clrf PCLATH
btfsc PORTB,0
goto TurnOff
; turn on the output and write the on time
nop; delay to make both path identical
bsf PORTB,0;<<<<<<<<<< Break Point
movfw OnTime+1
movwf CCPR1H
movfw OnTime
movwf CCPR1L
goto DonePWM
TurnOff bcf PORTB,0;<<<<<<<<<< Break Point
movfw OffTime+1
movwf CCPR1H
movfw OffTime
movwf CCPR1L
DonePWM
bcf PIR1,CCP1IF; reset special event trigger interupt
movfw int_pclath
movwf PCLATH
swapf int_status,W
movwf STATUS
swapf int_work,F; swap to file
swapf int_work,W; swap to work
retfie
start bsf STATUS,RP0
bcf STATUS,RP1
bsf STATUS,IRP; all indirest access is to 100h - 1ffh
movlw (0<<NOT_RBPU|0<<INTEDG|0<<T0CS|0<<T0SE|0<<PSA|B'000'<<PS0)
movwf OPTION_REG
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0
movlw (b'01'<<T1CKPS0|0<<T1OSCEN|0<<NOT_T1SYNC|0<<TMR1CS|1<<TMR1ON)
movwf T1CON; enable timer 1
movlw low(45000)
movwf CCPR1L
movwf OnTime
movlw high(45000)
movwf CCPR1H
movwf OnTime+1
movlw low(5000)
movwf OffTime
movlw high(5000)
movwf OffTime+1
movlw (0<<CCP1X|0<<CCP1Y|b'1011'<<CCP1M0); enable special event trigger on CCP1
movwf CCP1CON;
bsf STATUS,RP0
bsf PIE1,CCP1IE; enable CCP1 interupt
bcf STATUS,RP0
movlw (1<<GIE|1<<PEIE|0<<T0IE|0<<INTE|0<<RBIE|0<<T0IF|0<<INTF|0<<RBIF)
movwf INTCON; enable Peripheral interupts
Loop
goto Loop
END
nop
nop
interupt movwf int_work
swapf STATUS,W
movwf int_status
bcf STATUS,RP0
bcf STATUS,RP1
movfw PCLATH
movwf int_pclath
clrf PCLATH
btfsc PORTB,0
goto TurnOff
; turn on the output and write the on time
nop; delay to make both path identical
bsf PORTB,0;<<<<<<<<<< Break Point
movfw OnTime+1
movwf CCPR1H
movfw OnTime
movwf CCPR1L
goto DonePWM
TurnOff bcf PORTB,0;<<<<<<<<<< Break Point
movfw OffTime+1
movwf CCPR1H
movfw OffTime
movwf CCPR1L
DonePWM
bcf PIR1,CCP1IF; reset special event trigger interupt
movfw int_pclath
movwf PCLATH
swapf int_status,W
movwf STATUS
swapf int_work,F; swap to file
swapf int_work,W; swap to work
retfie
I understand indirect addressing, but I don't know what IRP is for. I never diddle those bits directly. I let the assembler do it for me by using the banksel directive. Like this:First question about STATUS register.
Code:bsf STATUS,RP0 bcf STATUS,RP1 bsf STATUS,IRP
Here we set bank 1 for direct addressing and IRP which is bit 7 of status to 1 which mean bank 2, 3 which is indirect addressing.
Q1> What is the different between direct and indirect addressing?
org 0x0000
init
banksel TRISB ;bank 1
movlw 0x06 ;configure all pins
movwf ADCON1 ;as digital inputs
clrf TRISB
banksel PORTA ;bank 0
main bsf PORTB,0
call delayc
call delay
goto main
The radix sets which numbering system you want to be default. With the above line you've set the radix to decimal. So any number you use with no prefix or suffix (0x or h) is automatically understood to be in decimal. If you don't put any radix definition line in your source the default (I believe) is hexadecimal. I could be wrong. Test it and you'll soon know for sure.Q2> what is the meaning of this?Code:radix dec
In the cblock you're allocating space in RAM for two variables, OnTime and OffTime. The :2 tells the assembler to reserve 2 bytes for each variable instead of the usual 1 byte.I am using PIC16F877 FYI, and here we r setting OnTime and OffTime in the general purpose resistor then we are adding :2?Code:cblock 20h OnTime:2 OffTime:2 endc
Can you explain this line too.
Microchip says to connect all VDD and VSS pins.PIC 16F877 has two VDD and VSS.
Do I need to connect 5V and ground to each one? Or one is enough?
;*******************************************************************
; 16F877 PWM Program
;*******************************************************************
include "p16f877.inc"
errorlevel -302
radix dec
__CONFIG _CP_OFF & _DEBUG_ON & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF
cblock 20h
OnTime:2
OffTime:2
endc
cblock 71h
int_work
int_status
int_pclath
endc
org 0h
nop
goto start
nop
nop
interupt movwf int_work
swapf STATUS,W
movwf int_status
bcf STATUS,RP0
bcf STATUS,RP1
movfw PCLATH
movwf int_pclath
clrf PCLATH
btfsc PORTB,0
goto TurnOff
; turn on the output and write the on time
nop; delay to make both path identical
bsf PORTB,0;<<<<<<<<<< Break Point
movfw OnTime+1
movwf CCPR1H
movfw OnTime
movwf CCPR1L
goto DonePWM
TurnOff bcf PORTB,0;<<<<<<<<<< Break Point
movfw OffTime+1
movwf CCPR1H
movfw OffTime
movwf CCPR1L
DonePWM
bcf PIR1,CCP1IF; reset special event trigger interupt
movfw int_pclath
movwf PCLATH
swapf int_status,W
movwf STATUS
swapf int_work,F; swap to file
swapf int_work,W; swap to work
retfie
start bsf STATUS,RP0
bcf STATUS,RP1
bsf STATUS,IRP; all indirest access is to 100h - 1ffh
movlw (0<<NOT_RBPU|0<<INTEDG|0<<T0CS|0<<T0SE|0<<PSA|B'000'<<PS0)
movwf OPTION_REG
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0
movlw (b'01'<<T1CKPS0|0<<T1OSCEN|0<<NOT_T1SYNC|0<<TMR1CS|1<<TMR1ON)
movwf T1CON; enable timer 1
movlw low(45000)
movwf CCPR1L
movwf OnTime
movlw high(45000)
movwf CCPR1H
movwf OnTime+1
movlw low(5000)
movwf OffTime
movlw high(5000)
movwf OffTime+1
movlw (0<<CCP1X|0<<CCP1Y|b'1011'<<CCP1M0); enable special event trigger on CCP1
movwf CCP1CON;
bsf STATUS,RP0
bsf PIE1,CCP1IE; enable CCP1 interupt
bcf STATUS,RP0
movlw (1<<GIE|1<<PEIE|0<<T0IE|0<<INTE|0<<RBIE|0<<T0IF|0<<INTF|0<<RBIF)
movwf INTCON; enable Peripheral interupts
Loop
goto Loop
END
;*******************************************************************
; 16F877 PWM Program
;*******************************************************************
include "p16f877.inc"
errorlevel -302
radix dec
__CONFIG _CP_OFF & _DEBUG_ON & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _LVP_OFF & _CPD_OFF
cblock 20h
OnTime:2
OffTime:2
endc
cblock 71h
int_work
int_status
int_pclath
endc
org 0h
nop
goto start
nop
nop
org 04h
goto interupt
interupt movwf int_work
swapf STATUS,W
movwf int_status
bcf STATUS,RP0
bcf STATUS,RP1
movfw PCLATH
movwf int_pclath
clrf PCLATH
btfsc PORTB,0
goto TurnOff
; turn on the output and write the on time
nop; delay to make both path identical
bsf PORTB,0;<<<<<<<<<< Break Point
movfw OnTime+1
movwf CCPR1H
movfw OnTime
movwf CCPR1L
goto DonePWM
TurnOff bcf PORTB,0;<<<<<<<<<< Break Point
movfw OffTime+1
movwf CCPR1H
movfw OffTime
movwf CCPR1L
DonePWM
bcf PIR1,CCP1IF; reset special event trigger interupt
movfw int_pclath
movwf PCLATH
swapf int_status,W
movwf STATUS
swapf int_work,F; swap to file
swapf int_work,W; swap to work
retfie
start bsf STATUS,RP0
bcf STATUS,RP1
bsf STATUS,IRP; all indirest access is to 100h - 1ffh
movlw (0<<NOT_RBPU|0<<INTEDG|0<<T0CS|0<<T0SE|0<<PSA|B'000'<<PS0)
movwf OPTION_REG
movlw b'11111110'
movwf TRISB
bcf STATUS,RP0
movlw (b'01'<<T1CKPS0|0<<T1OSCEN|0<<NOT_T1SYNC|0<<TMR1CS|1<<TMR1ON)
movwf T1CON; enable timer 1
movlw low(45000)
movwf CCPR1L
movwf OnTime
movlw high(45000)
movwf CCPR1H
movwf OnTime+1
movlw low(5000)
movwf OffTime
movlw high(5000)
movwf OffTime+1
movlw (0<<CCP1X|0<<CCP1Y|b'1011'<<CCP1M0); enable special event trigger on CCP1
movwf CCP1CON;
bsf STATUS,RP0
bsf PIE1,CCP1IE; enable CCP1 interupt
bcf STATUS,RP0
movlw (1<<GIE|1<<PEIE|0<<T0IE|0<<INTE|0<<RBIE|0<<T0IF|0<<INTF|0<<RBIF)
movwf INTCON; enable Peripheral interupts
Loop
goto Loop
END
org 04h
goto interupt
To use the code you would set On_Time and Off_Time in the empty Loop (2500=1mS).
you mean STATUS? or STATE because i can't find STATE in the register file map?STATE
Interesting,
hi eric
you mean STATUS? or STATE because i can't find STATE in the register file map?
Thanks in advance
movfw PCLATH
movwf int_pclath
clrf PCLATH
Sorry for keep asking questions about these codes.Code:movfw PCLATH movwf int_pclath clrf PCLATH
Q1> PCLATH what is PCLATH?
Q2> Why we are interested in saving it value i mean stacking it up and then poping it again?
I understand that PCLATH has something to do with 2k pages? But i couldn't understand it well any help here?
Thanks in advance