Este secuenciador tiene seis modos de secuencia diferentes, que se seleccionan con un pulsador. Para cambiar de secuencia se deja presionado el pulsador hasta que esta cambie.
El programa se hizo de dos formas diferentes, en la primera forma se usa en cada secuencia una rutina para mostrarla, lo que da como resultado un programa mas o menos largo y la segunda forma nos ahorra unas cuantas lineas de código (como 40 lineas) usamos una sola rutina para todas las secuencias.
Video del circuito:
VIDEO
Voy a publicar las dos formas para que se analicen las diferencias y se vea la ventaja de usar subrrutinas.
Primera forma:
LIST
P=16F886
INCLUDE
P16F886.INC
ERRORLEVEL
-302
__CONFIG
_CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
CBLOCK
0X20
CUENTA, VALORAD, d1, d2, MODO
ENDC
ORG
0X00
GOTO
CONFIGURA
RET_300MS
;199998 cycles
movlw
0x3F
movwf
d1
movlw
0x9D
movwf
d2
Delay_0
decfsz
d1, f
goto
$+2
decfsz
d2, f
goto
Delay_0
;2 cycles
goto
$+1
RETURN
SEC0
ADDWF
PCL,F
RETLW
B'10000000'
RETLW
B'01000000'
RETLW
B'00100000'
RETLW
B'00010000'
RETLW
B'00001000'
RETLW
B'00000100'
RETLW
B'00000010'
RETLW
B'00000001'
RETLW
B'00000010'
RETLW
B'00000100'
RETLW
B'00001000'
RETLW
B'00010000'
RETLW
B'00100000'
RETLW
B'01000000'
RETLW
B'10000000';14
SEC1
RETLW
B'10000001'
RETLW
B'01000010'
RETLW
B'00100100'
RETLW
B'00011000'
RETLW
B'00100100'
RETLW
B'01000010';20
SEC2
RETLW
B'11000011'
RETLW
B'11100111'
RETLW
B'11111111'
RETLW
B'01111110'
RETLW
B'00111100'
RETLW
B'00011000'
RETLW
B'00100100'
RETLW
B'01000010'
RETLW
B'10000001';29
SEC3
RETLW
B'10000000'
RETLW
B'11000000'
RETLW
B'11100000'
RETLW
B'11110000'
RETLW
B'11111000'
RETLW
B'11111100'
RETLW
B'11111110'
RETLW
B'11111111'
RETLW
B'01111111'
RETLW
B'00111111'
RETLW
B'00011111'
RETLW
B'00001111'
RETLW
B'00000111'
RETLW
B'00000011'
RETLW
B'00000001';44
SEC4
RETLW
B'10000000'
RETLW
B'10000001'
RETLW
B'10000010'
RETLW
B'10000100'
RETLW
B'10001000'
RETLW
B'10010000'
RETLW
B'10100000'
RETLW
B'11000001'
RETLW
B'11000010'
RETLW
B'11000100'
RETLW
B'11001000'
RETLW
B'11010000'
RETLW
B'11100001'
RETLW
B'11100010'
RETLW
B'11100100'
RETLW
B'11101000'
RETLW
B'11110001'
RETLW
B'11110010'
RETLW
B'11110100'
RETLW
B'11111001'
RETLW
B'11111010'
RETLW
B'11111101'
RETLW
B'11111110'
RETLW
B'11111111';68
SEC5
RETLW
B'11111111'
RETLW
B'11111101'
RETLW
B'11111011'
RETLW
B'11110111'
RETLW
B'11101111'
RETLW
B'11011111'
RETLW
B'10111111'
RETLW
B'01111110'
RETLW
B'01111101'
RETLW
B'01111011'
RETLW
B'01110111'
RETLW
B'01101111'
RETLW
B'01011111'
RETLW
B'00111110'
RETLW
B'00111101'
RETLW
B'00111011'
RETLW
B'00110111'
RETLW
B'00101111'
RETLW
B'00011110'
RETLW
B'00011101'
RETLW
B'00011011'
RETLW
B'00010111'
RETLW
B'00001110'
RETLW
B'00001101'
RETLW
B'00001011'
RETLW
B'00000110'
RETLW
B'00000101'
RETLW
B'00000010'
RETLW
B'00000001'
RETLW
B'00000000';98
CONFIGURA
CLRF
PORTB
BANKSEL
OSCCON
MOVLW
B'01101100'
MOVWF
OSCCON
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
MOVLW
.1
MOVWF
TRISA
CLRF
TRISB
CLRF
TRISC
BANKSEL
PORTB
CLRF
PORTA
CLRF
PORTB
CLRF
PORTC
CLRF
MODO
NUEVO
CLRF
CUENTA
INICIO
BTFSS
PORTA,0
GOTO
SECUENCIAS
CALL
RET_300MS
INCF
MODO,F
MOVLW
.6
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
SECUENCIAS
CLRF
MODO
;=================================================
SECUENCIAS
CLRW
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
UNO
CLRF
CUENTA
OTRO
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.14
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO
;=================================================
UNO
MOVLW
.1
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
DOS
MOVLW
.15
MOVWF
CUENTA
OTRO1
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.21
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO1
;=================================================
DOS
MOVLW
.2
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
TRES
MOVLW
.21
MOVWF
CUENTA
OTRO2
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.30
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO2
;=================================================
TRES
MOVLW
.3
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
CUATRO
MOVLW
.30
MOVWF
CUENTA
OTRO3
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.45
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO3
;=================================================
CUATRO
MOVLW
.4
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
CINCO
MOVLW
.45
MOVWF
CUENTA
OTRO4
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.69
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO4
;=================================================
CINCO
MOVLW
.5
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
INICIO
MOVLW
.69
MOVWF
CUENTA
OTRO5
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVLW
.99
XORWF
CUENTA,W
BTFSC
STATUS,Z
GOTO
INICIO
GOTO
OTRO5
;=================================================
END
Segunda forma:
LIST
P=16F886
INCLUDE
P16F886.INC
ERRORLEVEL
-302
__CONFIG
_CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG
_CONFIG2, _BOR40V & _WRT_OFF
CBLOCK
0X20
CUENTA, VALORAD, d1, d2, MODO, OFFSET
ENDC
ORG
0X00
GOTO
CONFIGURA
RET_300MS
;199998 cycles
movlw
0x02;0x3F
movwf
d1
movlw
0x5D;0x9D
movwf
d2
Delay_0
decfsz
d1, f
goto
$+2
decfsz
d2, f
goto
Delay_0
;2 cycles
goto
$+1
RETURN
SEC0
ADDWF
PCL,F
RETLW
B'10000000'
RETLW
B'01000000'
RETLW
B'00100000'
RETLW
B'00010000'
RETLW
B'00001000'
RETLW
B'00000100'
RETLW
B'00000010'
RETLW
B'00000001'
RETLW
B'00000010'
RETLW
B'00000100'
RETLW
B'00001000'
RETLW
B'00010000'
RETLW
B'00100000'
RETLW
B'01000000'
RETLW
B'10000000';14
SEC1
RETLW
B'10000001'
RETLW
B'01000010'
RETLW
B'00100100'
RETLW
B'00011000'
RETLW
B'00100100'
RETLW
B'01000010';20
SEC2
RETLW
B'11000011'
RETLW
B'11100111'
RETLW
B'11111111'
RETLW
B'01111110'
RETLW
B'00111100'
RETLW
B'00011000'
RETLW
B'00100100'
RETLW
B'01000010'
RETLW
B'10000001';29
SEC3
RETLW
B'10000000'
RETLW
B'11000000'
RETLW
B'11100000'
RETLW
B'11110000'
RETLW
B'11111000'
RETLW
B'11111100'
RETLW
B'11111110'
RETLW
B'11111111'
RETLW
B'01111111'
RETLW
B'00111111'
RETLW
B'00011111'
RETLW
B'00001111'
RETLW
B'00000111'
RETLW
B'00000011'
RETLW
B'00000001';44
SEC4
RETLW
B'10000000'
RETLW
B'10000001'
RETLW
B'10000010'
RETLW
B'10000100'
RETLW
B'10001000'
RETLW
B'10010000'
RETLW
B'10100000'
RETLW
B'11000001'
RETLW
B'11000010'
RETLW
B'11000100'
RETLW
B'11001000'
RETLW
B'11010000'
RETLW
B'11100001'
RETLW
B'11100010'
RETLW
B'11100100'
RETLW
B'11101000'
RETLW
B'11110001'
RETLW
B'11110010'
RETLW
B'11110100'
RETLW
B'11111001'
RETLW
B'11111010'
RETLW
B'11111101'
RETLW
B'11111110'
RETLW
B'11111111';68
SEC5
RETLW
B'11111111'
RETLW
B'11111101'
RETLW
B'11111011'
RETLW
B'11110111'
RETLW
B'11101111'
RETLW
B'11011111'
RETLW
B'10111111'
RETLW
B'01111110'
RETLW
B'01111101'
RETLW
B'01111011'
RETLW
B'01110111'
RETLW
B'01101111'
RETLW
B'01011111'
RETLW
B'00111110'
RETLW
B'00111101'
RETLW
B'00111011'
RETLW
B'00110111'
RETLW
B'00101111'
RETLW
B'00011110'
RETLW
B'00011101'
RETLW
B'00011011'
RETLW
B'00010111'
RETLW
B'00001110'
RETLW
B'00001101'
RETLW
B'00001011'
RETLW
B'00000110'
RETLW
B'00000101'
RETLW
B'00000010'
RETLW
B'00000001'
RETLW
B'00000000';98
MOSTRAR
MOVF
CUENTA,W
CALL
SEC0
MOVWF
PORTB
CALL
RET_300MS
INCF
CUENTA,F
MOVF
OFFSET,W
XORWF
CUENTA,W
BTFSC
STATUS,Z
RETURN
GOTO
MOSTRAR
CONFIGURA
CLRF
PORTB
BANKSEL
OSCCON
MOVLW
B'01101100'
MOVWF
OSCCON
BANKSEL
ANSEL
CLRF
ANSEL
CLRF
ANSELH
BANKSEL
TRISB
MOVLW
.1
MOVWF
TRISA
CLRF
TRISB
CLRF
TRISC
BANKSEL
PORTB
CLRF
PORTA
CLRF
PORTB
CLRF
PORTC
CLRF
MODO
NUEVO
CLRF
CUENTA
INICIO
BTFSS
PORTA,0
GOTO
SECUENCIAS
CALL
RET_300MS
INCF
MODO,F
MOVLW
.6
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
SECUENCIAS
CLRF
MODO
;=================================================
SECUENCIAS
CLRW
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
UNO
CLRF
CUENTA
MOVLW
.14
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
UNO
MOVLW
.1
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
DOS
MOVLW
.15
MOVWF
CUENTA
MOVLW
.21
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
DOS
MOVLW
.2
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
TRES
MOVLW
.21
MOVWF
CUENTA
MOVLW
.30
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
TRES
MOVLW
.3
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
CUATRO
MOVLW
.30
MOVWF
CUENTA
MOVLW
.45
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
CUATRO
MOVLW
.4
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
CINCO
MOVLW
.45
MOVWF
CUENTA
MOVLW
.69
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
CINCO
MOVLW
.5
XORWF
MODO,W
BTFSS
STATUS,Z
GOTO
INICIO
MOVLW
.69
MOVWF
CUENTA
MOVLW
.99
MOVWF
OFFSET
CALL
MOSTRAR
GOTO
INICIO
;=================================================
END
Circuito:
Copyright 2012 edwtron
Este DOCUMENTO es un DOCUMENTO LIBRE, usted puede redistribuirlo y/o modificarlo bajo los terminos de la GNU FDL tal y como es publicada por la fundacion de software libre; bajo la version 1.3 de la licencia, o una version superior.
Leer la licencia GNU gpl para mas detalles.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3
or any later version published by the Free Software Foundation;
with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
A copy of the license is included in the section entitled "GNU
Free Documentation License".