Paso 2: código
Para tener la batería última tanto como sea posible, el circuito que use la menor cantidad de energía que podría figura, manteniendo la idea viva. Así que, decidí reducir la actividad inicial a un promedio de 1 flash LED o motor Mueva cada 6 segundos.
El código tiene 12 al azar «actividades», que van desde 1 LED de encendido, el motor encendido para diferentes períodos de tiempo o direcciones, esperar al azar estado. Eventos varían de 3 segundos de diferencia a más de 40 segundos de diferencia, basado en el evento aleatorio generado.
CÓDIGO
;===============================================================================
Controlador de disco
;
; -----------
; VCC -> |1 8| <-Vss
; M <> – GPIO5 |2 7| GPIO0---> LED1
; M <> – GPIO4 |3 6| GPIO1---> LED2
; GPIO3 -> |4 5| GPIO2---> LED3
; -----------
;
;===============================================================================
; Historia de revisión y notas:
; Cabecera inicial v1.0, Código 19/05/09
;
;
; (C) 5/2009
; Este código puede usarse para aprendizaje/uso/modificación de personal.
; Cualquier uso de este código en productos comerciales viola esta versión freeware.
; Para preguntas o comentarios, póngase en contacto con el circuito punto mago arroba yahoo punto com.
;-------------------------------------------------------------------------------
#include P12C672. INC
;===============================================================================
; Define
;-------------------------------------------------------------------------------
;===============================================================================
; Datos
;-------------------------------------------------------------------------------
; Variables de tiempo de mantenimiento
count1 equ 20
count2 equ 21
retardo equ 22
Randlo equ 23
Randhi equ 24
Wtemp equ 25
Temp2 equ 26
Rand equ 27
count3 equ 28
;===============================================================================
; Vectores de RESET
;
; COMPRUEBE LA CONFIGURACIÓN. PEDACITOS ANTES DE GRABAR!!!!!!
; INTOSC
; MCLR: HABILITADO
; PWRUP: HABILITADO
; TODOS LOS DEMÁS: DESACTIVAR!!!!
;
;-------------------------------------------------------------------------------
RESET_ADDR EQU 0 X 00
org RESET_ADDR
Goto Inicio
;===============================================================================
; ¡ Comience aquí!
;-------------------------------------------------------------------------------
Inicio
; Puertos de la entrada-salida de config
BCF STATUS, RP1
bsf STATUS, RP0
movlw h '08'; RA < 0-7 > salidas, PGIO3 siempre de entrada
Tris GPIO
movlw h '07'; Set GPIO a modo Digital
movwf ADCON1
; Sistema temporizador interno
movlw h'CF'; Fuente interna de Tmr0, prescale 1:256 TMR0
movwf OPTION_REG
movlw h '00'
movwf INTCON; Deshabilitar interrupciones de TMR0,
BCF STATUS, RP0
; Inicializar los registros
clrf GPIO
clrf count1
clrf count2
movlw h 045
movwf Randlo
movlw h 030
movwf Randhi
; espera 1 segundo.
debounce llamada; 0,2 seg.
llamada debounce
llamada debounce
llamada debounce
llamada debounce
;===============================================================================
; Principal
;-------------------------------------------------------------------------------
principal
Call twosec; min 2 segundos entre cada acción
RRF Randhi, W
xorwf Randlo, W
movwf Wtemp
swapf Wtemp
RLF Randhi, W
xorwf Randhi, W; LSB = xorwf(Q12,Q3)
xorwf Wtemp
RLF Wtemp
RLF Randlo
RLF Randhi
movfw Wtemp; tira al azar 16 a 7
andlw 0x0F
movwf rand
; selección aleatoria sistemática
xorlw 0 x 00; ¿0?
btfsc STATUS, Z
Goto flash1; Sí. Llame al 0
movfw rand
xorlw 0 x 01; ¿1?
btfsc STATUS, Z
Goto flash2; Sí. Llame al 1
movfw rand
xorlw 0 x 02; ¿2?
btfsc STATUS, Z
Goto flash3; Sí. Llame al 2 º
movfw rand
xorlw 0 x 03; ¿3?
btfsc STATUS, Z
Goto flashall; Sí. Llame al 3 º
movfw rand
xorlw 0 x 04; ¿4?
btfsc STATUS, Z
Goto movels; Sí. Llame al 4 º
movfw rand
xorlw 0 x 05; ¿5?
btfsc STATUS, Z
Goto movell; Sí. Llame a 5
movfw rand
xorlw 0 x 06; ¿6?
btfsc STATUS, Z
Goto movers; Sí. Llamar al 6 º
movfw rand
xorlw 0x07; ¿7?
btfsc STATUS, Z
Goto moverl; Sí. Llame al 7
movfw rand
xorlw 0x08; ¿8?
btfsc STATUS, Z
Goto moveburst; Sí. Llamar 8
movfw rand
xorlw 0 x 09; ¿9?
btfsc STATUS, Z
Goto Wait1; Sí. Llamar al 9
movfw rand
xorlw 0x0A; ¿A?
btfsc STATUS, Z
Goto Wait2; Sí. Llame a Ath
movfw rand
xorlw 0x0B; ¿B?
btfsc STATUS, Z
Goto Wait3; Sí. Llamada Bth
Goto nada; 1/4 del tiempo, nada durante 10 segundos.
flash1
BSF GPIO, 0
llamada debounce
BCF GPIO, 0
Goto principal
flash2
BSF GPIO, 1
llamada debounce
BCF GPIO, 1
Goto principal
Flash3
BSF GPIO, 2
llamada debounce
BCF GPIO, 2
Goto principal
flashall
BSF GPIO, 0
BSF GPIO, 1
BSF GPIO, 2
llamada debounce
llamada debounce
BCF GPIO, 0
BCF GPIO, 1
BCF GPIO, 2
Goto principal
movels
BSF GPIO, 4
BCF GPIO, 5
llamada debounce
BCF GPIO, 4
Goto principal
movell
BSF GPIO, 4
BCF GPIO, 5
llamada debounce
llamada debounce
BCF GPIO, 4
Goto principal
Movers
BCF GPIO, 4
BSF GPIO, 5
llamada debounce
BCF GPIO, 5
Goto principal
moverl
BCF GPIO, 4
BSF GPIO, 5
llamada debounce
llamada debounce
BCF GPIO, 5
Goto principal
moveburst
BCF GPIO, 4
BSF GPIO, 5
debounce llamada; mover derecha 3 veces, ráfagas de corta.
BCF GPIO, 5
llamada debounce
llamada debounce
BSF GPIO, 5
llamada debounce
llamada debounce
BCF GPIO, 5
llamada debounce
llamada debounce
BSF GPIO, 5
llamada debounce
BCF GPIO, 5
llamada debounce
llamada debounce
llamada debounce
llamada debounce
BSF GPIO, 4; mover izquierdas 3 veces, breves ráfagas.
BCF GPIO, 5
llamada debounce
llamada debounce
BCF GPIO, 4
llamada debounce
llamada debounce
BSF GPIO, 4
llamada debounce
llamada debounce
BCF GPIO, 4
llamada debounce
llamada debounce
BSF GPIO, 4
llamada debounce
llamada debounce
BCF GPIO, 4
llamada debounce
llamada debounce
Goto principal
Wait1; Espere segundos 1
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
Goto principal
Wait2; Espere 0,6 segundos
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
Goto principal
Wait3; Espere 4 segundos
llamar al twosec
llamar al twosec
Goto principal
nada
movlw.50; Demora 10 segundos Total
movwf count3
nothing_loop
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
decfsz count3, F
Goto nothing_loop
Goto principal
;===============================================================================
; esperar 2 segundos
;-------------------------------------------------------------------------------
twosec
movlw.10; Retardo de 2 segundos Total
movwf count3
twosec_loop
movlw.255; Retardo de 2/10 de segundo debounce.
movwf count2
llamar al pon_wait
decfsz count3, F
Goto twosec_loop
volver
;===============================================================================
; Debounce señal
; 4 ciclos de carga y llamar, 2 ciclos para volver.
; 4 Tc Mhz:: count2 = 255 -> 0,2 seg.
;-------------------------------------------------------------------------------
Debounce
movlw.127; Retardo de 1/10 segundo debounce.
movwf count2
llamar al pon_wait
volver
;-------------------------------------------------------------------------------
; count1 = d:: 775 255 ciclos ciclos 0, + 3 para volver.
;-------------------------------------------------------------------------------
pon_wait
big_loopS
movlw.255
movwf count1
short_loopS
decfsz count1, F
Goto short_loopS
decfsz count2, F
Goto big_loopS
volver
final