;;
;;
;; random.asm, a PIC 16C84 (or PIC 16F84) program to randomly switch on
;; and off a LED.
;; Copyright (C) 2000 Geert Van Espen (geert.van.espen@bigfoot.com)
;;
;; The LED stays on for a minimum of 8 minutes and a maximum of 15
;; minutes, then it stays of for a minimum of 16 minutes and a maximum
;; of 31 minutes. Thus the average on-time is 11 minutes 30 seconds,
;; and the average off time is 23 minutes 30 seconds.
;;
;; The LED should be connected at RB0 (pin 6) with a series resistor of
;; 470 Ohm (at Vdd = 5V).
;;
;; I actually replaced the LED with a transistor, relay (and protection
;; diode). In this way I switch on and off my 220V aquarium lights in a
;; random fashion.
;;
;; This program uses the watchdog feature of the PIC, in combination
;; with the SLEEP command for timing purposes. If you are using
;; a home-made programmer for programming the device, you must use
;; a command like this to do it right:
;;
;; TOPIC -RWG random.hex
;;
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the11-1307 USA
;;
processor 16c84
include "p16c84.inc"
; general purpose register allocation
werk equ 0x0c ; werkregister
ddd equ 0x14 ; debug only
t1 equ 0x0d ; telwerk 1
t2 equ 0x0e ; telwerk 2
ranl equ 0x10 ; 24-bit random number
ranm equ 0x11
ranh equ 0x12
m_input equ b'00000000' ; input mask, which bits are input
org 0x00 ; reset vector
goto main
dt "2000-06-04 geert.van.espen@bigfoot.com random"
reinitialise: ; set up ports
;clrf TMR0
;bsf STATUS,RP0 ; select register bank 1
bcf STATUS,RP1
bsf STATUS,RP0
clrwdt
movlw b'00000000' ; assign 1:1 prescaler to WDT
movwf OPTION_REG
movlw m_input
movwf TRISB
bcf STATUS,RP0 ; select register bank 0
clrf PORTB ; LED uit
; LED even aan en uit laten knipperen om te laten zien dat het
; apparaat werkt
movlw 0xff
movwf PORTB
movf ranl,w ; knipper willekeurig aantal keer
andlw 7 ; knipper max. 8 keer
movwf t1
incf t1,f
movwf ddd ; debug only
functiontest:
movlw 0x19 ; 25 x 20 ms = 0.5 seconde periodetijd
movwf t2
functiontest1:
sleep ;
decfsz t2,f ;
goto functiontest1 ;
movlw 0xff ;
btfsc PORTB,0 ;
movlw 0 ;
movwf PORTB ;
decfsz t1,f ;
goto functiontest ;
clrf PORTB ;
retlw 0 ; return with 0 in w
initialise: ; clear the random number seed
;movlw 0xa5
movf PORTA,w ; zet ongeinitialiseerd register in w
movwf ranh ;
movwf ranm ;
movwf ranl ;
retlw 0 ; return with 0 in w
zet_aan:
movlw 0xff ; LED aan
movwf PORTB ;
movf ranl,w ; haal random waarde op en zet in w
andlw 7 ; beperk 0 -> 7
addlw 8 ; 8 -> 15
call wachtlus ;
retlw 0 ; return with 0 in w
zet_uit:
clrf PORTB ; LED uit
movf ranl,w ; haal random waarde op en zet in w
andlw 0xf ; beperk 0 -> 15
addlw 0x10 ; 8 -> 15
call wachtlus ;
retlw 0 ; return with 0 in w
wachtlus:
; wacht x minuten, met x in w
movwf werk ; zet w in werk
movwf ddd ; debug purposes
slaper:
movlw 0x65 ;
movwf t1 ;
slapertje:
movlw 0x1f ;
movwf t2 ;
slapertje2:
sleep
decfsz t2,f ;
goto slapertje2 ;
decfsz t1,f ;
goto slapertje ;
decfsz werk,f ;
goto slaper ;
retlw 0 ; return with 0 in w
random: ; find next random number
movf ranl,w ; check total value zero
iorwf ranh,w ;
btfsc STATUS,Z ;
comf ranh,f ; invert some bits if so
movlw 0x80 ;
btfsc ranh,6 ;
xorwf ranh,f ;
btfsc ranh,4 ;
xorwf ranh,f ;
btfsc ranl,3 ;
xorwf ranh,f ;
bcf STATUS,C ; clear the carry flag
btfsc ranh,7 ; if the high bit is set ...
bsf STATUS,C ; ... set also the carry flag
rlf ranl,f ;
rlf ranm,f ;
rlf ranh,f ;
retlw 0 ; return with 0 in w
main:
;btfsc STATUS,NOT_TO ; if this is a reset or power-up ...
call initialise ; ... clear random number seed
call reinitialise ; set port drivers and WDT prescaler
main_1:
call random ; find next random number
call zet_aan ; LED aan zetten gedurende willek. tijd
call random ; find next random number
call zet_uit ; LED uit zetten gedurende willek. tijd
goto main_1 ; en weer opnieuw!
;;
;;
end
Foto van het afgewerkte apparaat.