Translate, Traductor

viernes, 6 de julio de 2012

Secuenciador con 6 modos

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:



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".  


No hay comentarios:

Publicar un comentario