PIC12F683-based electronic die

How it works.
The PIC runs at 8 MHz using the internal oscillator
and TMR2 increments every 500 ns (it runs as fast
as possible,prescaler=1, postscaler= 1). When the
button is pressed, TMR2 is read and tha value is stored
in a register. Then a number from 1 to 6 is calculated by a
simple routine (with a high-level language you would simply
calculate the reminder after division by 6, plus 1). LEDs are
lit accordingly, till the button is pressed.
The numbers can be considered reasonably
random. Note that the PIR2 register is loaded with 251 (0xFB)
to ensure that the six numbers have equal probability.
Schematic
(png)
Part list
(txt)
Low-res video (mpg)
; --------------------------------------------- ; Schematic: http://www.eeng.biz/files/edie.png ; Part list: http://www.eeng.biz/files/edie.txt
; Picture: http://www.eeng.biz/files/edie.jpg ; Video: http://www.eeng.biz/files/edie.mpg
; --------------------------------------------- ; Revision: July 25th, 2007 ; ---------------------------------------------
list p=12F683 include "p12F683.inc"
__CONFIG _INTOSCIO & _MCLRE_OFF & _FCMEM_OFF & _IESO_OFF & _WDT_OFF & _CP_OFF & _CPD_OFF & _PWRTE_ON & _BOD_OFF cblock 0x20 v1 v2 d1 d2 endc org 0x000 Start movlw 0x3F movwf GPIO movlw 0x07 movwf CMCON0 ;turn comparators off bsf STATUS,RP0 ;bank 1 clrf ANSEL movlw b'011000' ;GPIO0,1,2,5 as outputs movwf TRISIO ;GPIO4 as input movlw b'00010000' ;pull-up resistor on GPIO4 movwf WPU movlw b'00001000' ;pull-up resistor enabled movwf OPTION_REG movlw 0xFB ;251 movwf PR2 movwf b'01110001' ;8 MHz movwf OSCCON Osctest btfss OSCCON, HTS ;oscillator stable? goto Osctest bcf STATUS,RP0 ;bank 0 movlw b'00000100' ;enable TMR2 movwf T2CON Main btfss GPIO, 4 ;switch pressed? call B0 movlw 0x3F movwf GPIO ;LEDs off goto Main B0 movf TMR2, w ;read TMR2 movwf v1 movwf v2 call Delay20m ;simple debounce btfsc GPIO, 4 ;still pressed? return B1 movlw 0x06 subwf v1, w ;v1-6 -> W btfss STATUS, C ;if C=0 goto B2 goto B2 movwf v1 movwf v2 goto B1 B2 ;1<= v2 <=6 movf v2, w call Table movwf GPIO ;turn LEDs on B3 btfsc GPIO, 4 ;still pressed? return goto B3 Table ADDWF PCL, f retlw 0x07 retlw 0x23 retlw 0x03 retlw 0x21 retlw 0x01 retlw 0x20
Delay20m ;about 20 ms movlw 0x3E movwf d1 movlw 0x20 movwf d2 Delay20_1 decfsz d1, f goto $+2 decfsz d2, f goto Delay20_1 return end
Enjoy building your PIC-based electronic dice! |