Warhammer trollkarl på skiva med Magnetically-Coupled Motor och lysdioder (2 / 4 steg)
Steg 2: kod
För att få batteriet senast så länge som möjligt, kretsen var tvungen att använda minst energi jag kunde lista, samtidigt hålla tanken vid liv. Så, jag bestämde mig att minska den ursprungliga verksamheten i genomsnitt 1 LED-blixt eller motor flytta var 6 sekunder.
Koden har 12 random "aktiviteter", från 1 LED tända, motorn slås på i olika tidsperioder eller riktningar, till ett slumpmässigt vänta staten. Händelser varierar från 3 sekunder isär till mer än 40 sekunder ifrån varandra, baserat på en slumpmässig händelse genereras.
KODEN
;===============================================================================
-Skiva Controller
;
; -----------
; VCC -> |1 8| <-Vss
; M <> - GPIO5 |2 7| GPIO0---> LED1
; M <> - GPIO4 |3 6| GPIO1---> LED2
; GPIO3 -> |4 5| GPIO2---> LED3
; -----------
;
;===============================================================================
; Revisionen historia & anteckningar:
; V1.0 första Header, kod 5/19/09
;
;
(C) 5/2009
; Denna kod kan användas för personliga lärande/programmodifieringar.
; All användning av denna kod i kommersiella produkter bryter mot denna freeware version.
; För frågor och kommentarer, kontakta krets dot mage på yahoo dot com.
;-------------------------------------------------------------------------------
#include P12C672. INC
;===============================================================================
; Definierar
;-------------------------------------------------------------------------------
;===============================================================================
; Data
;-------------------------------------------------------------------------------
; Tid hålla variabler
count1 equ 20
count2 equ 21
dröjsmål equ 22
Randlo equ 23
Randhi equ 24
Wtemp equ 25
Temp2 equ 26
rand equ 27
count3 equ 28
;===============================================================================
; Återställa vektorer
;
; KOLLA CONFIG. BITAR INNAN DU BRÄNNER!!!
; INTOSC
; MCLR: AKTIVERAD
; PWRUP: AKTIVERAD
; ALLA ANDRA: INAKTIVERA!
;
;-------------------------------------------------------------------------------
RESET_ADDR EQU 0X00
org RESET_ADDR
gå till start
;===============================================================================
; Börja här!
;-------------------------------------------------------------------------------
Start
; Config/o-portar
BCF STATUS, RP1
BSF STATUS, RP0
movlw h '08'; RA < 0-7 > utgångar, PGIO3 alltid ingång
tris GPIO
movlw h '07'; Ställ in GPIO till Digital-läget
movwf ADCON1
; Ställ in inre timer
movlw h'CF'; Tmr0 inre källa, prescale TMR0 1:256
movwf OPTION_REG
movlw h '00'
movwf INTCON; Inaktivera TMR0 avbrott,
BCF STATUS, RP0
; Initiera register
clrf GPIO
clrf count1
clrf count2
movlw 045h
movwf Randlo
movlw 030h
movwf Randhi
; vänta 1 SEK.
Ring debounce; 0.2 sek
Ring debounce
Ring debounce
Ring debounce
Ring debounce
;===============================================================================
; Main
;-------------------------------------------------------------------------------
huvudsakliga
kalla twosec; 2 SEK min mellan varje åtgärd
RRF Randhi, W
xorwf Randlo, W
movwf Wtemp
swapf Wtemp
Lantbrukarnas Riksförbund Randhi, W
xorwf Randhi, W; LSB = xorwf(Q12,Q3)
xorwf Wtemp
Lantbrukarnas Riksförbund Wtemp
Lantbrukarnas Riksförbund Randlo
Lantbrukarnas Riksförbund Randhi
movfw Wtemp; strip slumpmässiga 16 ner till 7
andlw 0x0F
movwf rand
; slumpmässigt rutinmässigt urval
xorlw 0x00; 0?
btfsc STATUS, Z
gå till flash1; Ja. Ring 0.
movfw rand
xorlw 0x01; 1?
btfsc STATUS, Z
gå till flash2; Ja. Ring 1.
movfw rand
xorlw 0x02; 2?
btfsc STATUS, Z
gå till flash3; Ja. Ring 2.
movfw rand
xorlw 0x03; 3?
btfsc STATUS, Z
gå till flashall; Ja. Ring 3.
movfw rand
xorlw 0x04; 4?
btfsc STATUS, Z
gå till movels; Ja. Ring 4.
movfw rand
xorlw 0x05; 5?
btfsc STATUS, Z
gå till movell; Ja. Ring 5.
movfw rand
xorlw 0x06; 6?
btfsc STATUS, Z
gå till movers; Ja. Ring 6
movfw rand
xorlw 0x07; 7?
btfsc STATUS, Z
gå till moverl; Ja. Ring 7
movfw rand
xorlw 0x08; 8?
btfsc STATUS, Z
gå till moveburst; Ja. Ring 8.
movfw rand
xorlw 0x09; 9?
btfsc STATUS, Z
gå till Wait1; Ja. Ring 9
movfw rand
xorlw 0x0A; A?
btfsc STATUS, Z
gå till Wait2; Ja. Ring Ath
movfw rand
xorlw 0x0B; B?
btfsc STATUS, Z
gå till Wait3; Ja. Ring Bth
gå till ingenting; 1/4 tiden, gör ingenting för 10 SEK.
flash1
BSF GPIO, 0
Ring debounce
BCF GPIO, 0
gå till största
flash2
BSF GPIO, 1
Ring debounce
BCF GPIO, 1
gå till största
flash3
BSF GPIO, 2
Ring debounce
BCF GPIO, 2
gå till största
flashall
BSF GPIO, 0
BSF GPIO, 1
BSF GPIO, 2
Ring debounce
Ring debounce
BCF GPIO, 0
BCF GPIO, 1
BCF GPIO, 2
gå till största
movels
BSF GPIO, 4
BCF GPIO, 5
Ring debounce
BCF GPIO, 4
gå till största
movell
BSF GPIO, 4
BCF GPIO, 5
Ring debounce
Ring debounce
BCF GPIO, 4
gå till största
Movers
BCF GPIO, 4
BSF GPIO, 5
Ring debounce
BCF GPIO, 5
gå till största
moverl
BCF GPIO, 4
BSF GPIO, 5
Ring debounce
Ring debounce
BCF GPIO, 5
gå till största
moveburst
BCF GPIO, 4
BSF GPIO, 5
Ring debounce; flytta höger 3 gånger, korta skurar.
BCF GPIO, 5
Ring debounce
Ring debounce
BSF GPIO, 5
Ring debounce
Ring debounce
BCF GPIO, 5
Ring debounce
Ring debounce
BSF GPIO, 5
Ring debounce
BCF GPIO, 5
Ring debounce
Ring debounce
Ring debounce
Ring debounce
BSF GPIO, 4. flytta vänster 3 gånger, korta skurar.
BCF GPIO, 5
Ring debounce
Ring debounce
BCF GPIO, 4
Ring debounce
Ring debounce
BSF GPIO, 4
Ring debounce
Ring debounce
BCF GPIO, 4
Ring debounce
Ring debounce
BSF GPIO, 4
Ring debounce
Ring debounce
BCF GPIO, 4
Ring debounce
Ring debounce
gå till största
Wait1; Vänta 1 sekunder
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
gå till största
Wait2; Vänta 0,6 sekunder
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
gå till största
Wait3; Vänta 4 sekunder
kalla twosec
kalla twosec
gå till största
ingenting
movlw.50; Fördröjning på 10 sekunder totalt
movwf count3
nothing_loop
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
decfsz count3, F
gå till nothing_loop
gå till största
;===============================================================================
; 2 andra vänta
;-------------------------------------------------------------------------------
twosec
movlw.10; Fördröjning för 2 sekunder totalt
movwf count3
twosec_loop
movlw 255; Fördröjning för 2/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
decfsz count3, F
gå till twosec_loop
returnera
;===============================================================================
; Debounce signal
; 4 cykler att ladda och ring, 2 cykler för att återvända.
; 4 Mhz Tc:: count2 = 255 -> 0.2 sek
;-------------------------------------------------------------------------------
Debounce
movlw.127; Fördröjning för 1/10 sekund Dämpningstid.
movwf count2
kalla pon_wait
returnera
;-------------------------------------------------------------------------------
; count1 = 255 d:: 775 cykler 0 + 3 cykler att återvända.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw 255
movwf count1
short_loopS
decfsz count1, F
gå till short_loopS
decfsz count2, F
gå till big_loopS
returnera
slutet