This is where you start with
programming.
Build the
PIC Programmer MkV
and build the World's Simplest
circuit on a PC board for a PIC12F629 chip, LED and resistor.
When the World's Simplest Program is "burnt" into the chip, the LED will
flash.
This is not a "normal" program as the Watch-Dog Timer has been turned
ON
and after 18mS it resets the chip to "org 0X00" and the program executes
the 8 instructions again.
At the 6th and 7th instruction, the state of GP4 will change from HIGH
to LOW or LOW to HIGH and this will toggle the LED.
At the 8th instruction the micro will go to sleep and after about 18,000
microseconds, it will be woken up by the watch-dog timer and go to
location 0x00.
At instruction 3, we have added a pre-scaler to the WDT to extend its
timing to 18mS x 8 = 0.144Secs. You can change this value and note the
different flash-rate.
Making bit 3 of the option_reg = 0 will produce a very fast flash-rate
as the prescaler will be removed from the WDT.
This program tests your programmer and the chip you are burning as well
as the circuit containing the LED.
It also shows the function of the watch-dog timer.
Normally, when the WDT is turned ON, it must be periodically cleared
(reset) via
the instruction clrwdt so that it does not come into operation.
For instance, before entering a delay loop, the WDT is reset.
If not, it may reset your program and you will be wondering why your
project does not work.
Go to
PIC12F629 data
and read page 12: OPTION Register. It shows how the bits are
allocated to the WDT. Change these bits and see how the flash-rate
changes.
Here are the files:
World'sSimplest.asm
World'sSimplest.hex
;*************************************
;WORLDS SIMPLEST PROGRAM *
; 18-5-2010 *
; *
;************************************
list p=12F629
radix dec
include "p12f629.inc"
__CONFIG _MCLRE_OFF & _CP_OFF &
_WDT_ON & _INTRC_OSC_NOCLKOUT ;Internal osc.
;************************************
;Beginning of program
;************************************
org 0x00
bsf status, rp0 ;bank 1
bcf TRISIO,4 ;GP4 output
movlw b'00001011' ;bit3=1=WDT 011=/8 WDT=18mSx8=0.144Sec
movwf option_reg ;must be in bank 1
bcf status, rp0 ;bank 0
movlw b'00010000' ;to toggle GP4
xorwf GPIO,f
sleep
END
|
Here are some changes you can make to see the differing flash-rates:
change
sleep
to:
goto $
change
movlw b'00001011'
movwf option_reg
to:
movlw b'00001111'
movwf option_reg
or
to:
movlw b'00000111'
movwf option_reg
11/5/2010
|