Professional Documents
Culture Documents
home |
Some PIC Programmers can't rewrite the PIC12F675 microchip after first programming (the code use INTRC_OSC and MCLR_OFF) .
In this case try to use:
;----------------------------------------------------------------------
; Configurare
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _CPD_OFF
and a pullup resistor (1 .. 10k ohm ) to Vdd for -MCLR pin (GP3).
instead:
;----------------------------------------------------------------------
; Configurare
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF
;----------------------------------------------------------------------
; NAME: Flash Led for PIC 12F675
; BY: Adrian Bergthaller
; WEB: http://www.bertys.ro
;----------------------------------------------------------------------
;****************************************************************************
;* 12F675 * *
;* -----uu----- *
;* +5 V ----| vdd vss |---- Gnd *
;* led1 <---| gp5 gp0 |---> led4 *
;* led2 <---| gp4 gp1 |---> led3 *
;* switch --->| gp3 gp2 |<--- NC *
;* ------------ *
;* *
;****************************************************************************
;----------------------------------------------------------------------
; Configurare
__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF
ERRORLEVEL -302
;----------------------------------------------------------------------
;----------------------------------------------------------------------
; Constant define
;----------------------------------------------------------------------
#define Led4 GPIO,0 ; (o) led yellow / gelb / galben
#define Led3 GPIO,1 ; (o) led red / rot / rosu
;----------------------------------------------------------------------
; RAM VARIABLES DEFINITIONS
;----------------------------------------------------------------------
; Bank0 = 20h-5Fh
CBLOCK 0x020
; -------------------
; delays
delayCnt: 1 ; contor delay 100uS
ENDC
;----------------------------------------------------------------------
; MACRO DEFINITIONS
;----------------------------------------------------------------------
; Selects register bank 0
BANK0 MACRO
BCF STATUS,RP0 ; clear bank select bits
ENDM
;----------------------------------------------------------------------
; Selects register bank 1
BANK1 MACRO
BSF STATUS,RP0 ;
ENDM
;----------------------------------------------------------------------
; disable global irq
DISABLE_IRQ MACRO
LOCAL STOP_INT
STOP_INT
BCF INTCON,GIE ; Disable global interrupt
BTFSC INTCON,GIE ; check if disabled
GOTO STOP_INT ; nope, try again
ENDM
;----------------------------------------------------------------------
; enable global irq
ENABLE_IRQ MACRO
LOCAL START_INT
START_INT
BSF INTCON,GIE ; Enable global interrupt
BTFSS INTCON,GIE ; check if disabled
GOTO START_INT ; nope, try again
ENDM
;----------------------------------------------------------------------
; macro definitions / comands / comenzi ..
Led1_ON MACRO
bsf Led1
nop
ENDM
Led1_OFF MACRO
bcf Led1
nop
ENDM
Led2_ON MACRO
bsf Led2
nop
ENDM
Led2_OFF MACRO
bcf Led2
nop
ENDM
Led3_ON MACRO
bsf Led3
nop
ENDM
Led3_OFF MACRO
bcf Led3
nop
ENDM
Led4_ON MACRO
bsf Led4
nop
ENDM
Led4_OFF MACRO
bcf Led4
nop
ENDM
;----------------------------------------------------------------------
; END macro definitions
;----------------------------------------------------------------------
;**********************************************************************
; PROGRAMUL
;**********************************************************************
ORG 0x000 ; processor reset vector
goto MAIN ; go to beginning of program
;-----------------------------------------------------------------------------
; Interrupt service routine
;-----------------------------------------------------------------------------
ORG 0x004 ; interrupt vector location
RETFIE ; return from interrupt
;-----------------------------------------------------------------------------
; MAIN ROUTINE START HERE
;-----------------------------------------------------------------------------
ORG 0x010
MAIN:
;-----------------------------------------------------------------------------
; Init_Prog
; - Initialize program & setups
; - Initilaize all ports to known state before setup routines are called
;-----------------------------------------------------------------------------
Init_Prog:
; int osc calibration / Calibrarea oscilatorului intern de 4 Mhz
BANK1
call 0x3FF ; get the calibration value
movwf OSCCAL
BANK0
; disable irqs / dezactivare intreruperi
DISABLE_IRQ
; ports init / initializare porturi
call Init_Ports
; leds off / initializari leduri
call Init_Led
; init.end / ok, la munca!
;-----------------------------------------------------------------------------
; Program loop start here (forever_loop)
;-----------------------------------------------------------------------------
Prog_Loop:
; back to BANK0 / revin la Bank-ul 0
BANK0
movlw 0x05
movwf cntFlash
Led2_ON
call Delay_100mS
Led2_OFF
call Delay_100mS
Led3_ON
call Delay_100mS
Led3_OFF
call Delay_100mS
Led4_ON
call Delay_100mS
Led4_OFF
call Delay_100mS
Led4_ON
call Delay_100mS
Led4_OFF
call Delay_100mS
Led3_ON
call Delay_100mS
Led3_OFF
call Delay_100mS
Led2_ON
call Delay_100mS
Led2_OFF
call Delay_100mS
Led1_ON
call Delay_100mS
Led1_OFF
call Delay_100mS
decfsz cntFlash, f
goto flash1
; end 1
call Init_Led
call Delay_100mS
movlw 0x10
movwf cntFlash
flash2 ; flash mode 2
Led1_ON
Led4_ON
call Delay_100mS
Led1_OFF
Led4_OFF
call Delay_10mS
Led1_ON
Led4_ON
call Delay_100mS
Led1_OFF
Led4_OFF
call Delay_10mS
call Delay_10mS
Led2_ON
Led3_ON
call Delay_100mS
Led2_OFF
Led3_OFF
call Delay_10mS
Led2_ON
Led3_ON
call Delay_100mS
Led2_OFF
Led3_OFF
call Delay_10mS
call Delay_10mS
decfsz cntFlash, f
goto flash2
; end 2
call Init_Led
call Delay_100mS
movlw 0x10
movwf cntFlash
Led1_OFF
Led3_OFF
call Delay_10mS
Led1_ON
Led3_ON
call Delay_100mS
Led1_OFF
Led3_OFF
call Delay_10mS
call Delay_10mS
Led2_ON
Led4_ON
call Delay_100mS
Led2_OFF
Led4_OFF
call Delay_10mS
Led2_ON
Led4_ON
call Delay_100mS
Led2_OFF
Led4_OFF
call Delay_10mS
call Delay_10mS
decfsz cntFlash, f
goto flash3
; end 3
goto Prog_Loop
;-----------------------------------------------------------------------------
; Library / PROCEDURI
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Delay 1S
;-----------------------------------------------------------------------------
Delay_1S: ; Call = 2 cycles
movlw d'100' ; 1 cycles
movwf delayCnt2 ; 1 cycles
Delay_1S_1:
call Delay_10mS ; 2 cycles
decfsz delayCnt2,f ;
goto Delay_1S_1 ; 1+2 cycles
return
;-----------------------------------------------------------------------------
; Delay 100 mS
;-----------------------------------------------------------------------------
Delay_100mS: ; Call = 2 cycles
movlw d'10' ; 1 cycles
movwf delayCnt2 ; 1 cycles
Delay_100mS_1:
call Delay_10mS ; 2 cycles
decfsz delayCnt2,f ;
goto Delay_100mS_1 ; 1+2 cycles
return
;-----------------------------------------------------------------------------
; Delay 10 mS
;-----------------------------------------------------------------------------
Delay_10mS: ; Call = 2 cycles
movlw d'100' ; 1 cycles
movwf delayCnt1 ; 1 cycles
Delay_10mS_1:
call Delay_100uS ; 2 cycles
decfsz delayCnt1,f ;
goto Delay_10mS_1 ; 1+2 cycles
return
;-----------------------------------------------------------------------------
; Delay 100 uS = (5+(3*Constant))*OSC/4
;-----------------------------------------------------------------------------
Delay_100uS: ; Call = 2 cycles
movlw d'31' ; 1 cycle
movwf delayCnt ; 1 cycle
decfsz delayCnt,f ;
goto $-1 ; 1+2 cycles
return ; 2 cycles
;-----------------------------------------------------------------------------
; Port init / Initialize Port
;-----------------------------------------------------------------------------
Init_Ports:
BANK0 ; Bank 0
clrf GPIO ; 1)Status of pins: GPIO (GPIO=0 <ViL, =1 >ViH)
movlw b'00000111' ; 2)Comparator configuration
movwf CMCON ; Set GP<2:0> digital IO (comparator Off)
BANK1 ; Bank 1
bcf OPTION_REG,5 ; 3)TMR0 clock source select: Internal instruction cycle clock (CLKOUT)
bsf OPTION_REG,7 ; 4)GPIO pull-ups: is disabled
clrf WPU ; 5)Clear weak pull-up register
clrf IOC ; 6)Clear Interrupt-on-change register
;-----------------------------------------------------------------------------
; Port setup GP0-GP5
;-----------------------------------------------------------------------------
;GP0 (Led Y) act as output
;GP1 (Led R) act as output (eventual rezerva)
;GP2 (NC) act as input - rezerva
;GP3 (switch) can be input only
;GP4 (Led R) act as output
;GP5 (Led Y) act as output
;-----------------------------------------------------------------------------
;-----------------------------------------------------------------------------
; Initialize Leduri
;-----------------------------------------------------------------------------
Init_Led:
Led1_OFF
Led2_OFF
Led3_OFF
Led4_OFF
return
;-----------------------------------------------------------------------------
; calibrarea oscilator intern
;-----------------------------------------------------------------------------
org 3FFh
; [34]9Ch for pic 12F675
retlw 0x9C ;
;-----------------------------------------------------------------------------
END ; directive 'end of program'
;-----------------------------------------------------------------------------