Autor Tema: Comparar variable si es uno o cero  (Leído 3371 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jpalcaraz

  • PIC10
  • *
  • Mensajes: 5
Comparar variable si es uno o cero
« en: 11 de Febrero de 2016, 12:29:11 »
Hola, necesito hacer un código con el que me vaya activando varias salidas secuencialmente a traves de un pulso por una entrada. El problema es que yo asigno a diez variables el numero 1 y le voy restando un 1 y comprobando con btfsc para que dispare una cada vez que se activa y así, salta las puertas disparadas. Es decir, necesito saber si una variable tiene el valor 1 ó 0 y saltar o no una linea

Código: [Seleccionar]

List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
                   

temp equ 0x28
cuenta equ 0x29
cuenta1 equ 0x30
cuenta1min equ 0x31
B1              equ 0x32
B2              equ 0x33
B3              equ 0x34
B4              equ 0x35
B5              equ 0x36
B6              equ 0x37
B7              equ 0x38
B8              equ 0x39
B9              equ 0x40
B10             equ 0x41



__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC

org 0x00 ;Vector de RESET
goto Inicio
org 0x04


Inicio
bsf STATUS,RP0 ;Selecciona banco 1


movlw b'00000000'
movwf TRISC ;Puerta C se configura como salida, RC6/Tx comunicacion a PC

movlw b'10010011'
movwf TRISB

movlw b'10000111'
movwf OPTION_REG ;Preescaler de 256 para el TMR0


bcf STATUS,RP0 ;Selecciona banco 0


clrf PORTA
clrf PORTB
            clrf PORTC

            movlw b'00000000' ;Sacamos por los pines correspondientes las señales
movwf PORTB

movlw b'00000000' ;Sacamos por los pines correspondientes las señales
movwf PORTC ; RB6: de 0v->5v, RB5: de 5v->0v
        movlw 0x01
        movwf B1
        movlw 0x01
        movwf B2
        movlw 0x01
        movwf B3
        movlw 0x01
        movwf B4
        movlw 0x01
        movwf B5
        movlw 0x01
        movwf B6
        movlw 0x01
        movwf B7
        movlw 0x01
        movwf B8
        movlw 0x01
        movwf B9
        movlw 0x01
        movwf B10

esperandoalto
inicio1
        bcf PORTB,2
        btfss PORTB,1 ;armado
        goto inicio1
        bsf PORTB,2
        btfss PORTB,0 ;pulso en entrada 0
        goto puerta4
        call secuenciadorde6
        goto inicio1
puerta4 btfss PORTB,4 ;pulso en entrada 4
        goto inicio1
        call secuenciadorde4

 
secuenciadorde6
        btfsc B1,0
        call disparar1
        btfsc B2,0
        call disparar2
        btfsc B3,0
        call disparar3
        btfsc B4,0
        call disparar4
        btfsc B5,0
        call disparar5
        btfsc B6,0
        call disparar6

cambiopulso
        bcf PORTB,2
        btfss PORTB,1 ;armado
        goto cambiopulso
        bsf PORTB,2
        btfsc PORTB,0
        goto cambiopulso
        goto esperandoalto

secuenciadorde4
        btfsc B7,0
        call disparar7
        btfsc B8,0
        call disparar8
        btfsc B9,0
        call disparar9
        btfsc B10,0
        call disparar10

cambiopulso2
        bcf PORTB,2
        btfss PORTB,1 ;armado
        goto cambiopulso2
        bsf PORTB,2
        btfsc PORTB,4
        goto cambiopulso2
        goto esperandoalto  ;cambiaresperandobajo

disparar1
        bsf PORTC,0
        call unsegundo
        bcf PORTC,0
        movlw 0x00
        movwf B1
        return

disparar2
        bsf PORTC,1
        call unsegundo
        bcf PORTC,1
        movlw 0x00
        movwf B2
        return

disparar3
        bsf PORTC,2
        call unsegundo
        bcf PORTC,2
        movlw 0x00
        movwf B3
        return

disparar4
        bsf PORTC,3
        call unsegundo
        bcf PORTC,3
        movlw 0x00
        movwf B4
        return

disparar5
        bsf PORTC,4
        call unsegundo
        bcf PORTC,4
        movlw 0x00
        movwf B5
        return

disparar6
        bsf PORTC,5
        call unsegundo
        bcf PORTC,5
        movlw 0x01
        movwf B1
        movlw 0x01
        movwf B2
        movlw 0x01
        movwf B3
        movlw 0x01
        movwf B4
        movlw 0x01
        movwf B5
        return

disparar7
        bsf PORTC,6
        call unsegundo
        bcf PORTC,6
        movlw 0x00
        movwf B7
        return

disparar8
        bsf PORTC,7
        call unsegundo
        bcf PORTC,7
        movlw 0x00
        movwf B8
        return
;poner otra puerta
disparar9
        bsf PORTB,6
        call unsegundo
        bcf PORTB,6
        movlw 0x00
        movwf B9
        return
disparar10
        bsf PORTB,5
        call unsegundo
        bcf PORTB,5
        movlw 0x01
        movwf B7
        movlw 0x01
        movwf B8
        movlw 0x01
        movwf B9
        return

unsegundo

movlw 0xF
movwf cuenta
temp1s
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
clrf TMR0


sge btfss INTCON,T0IF ;Rebasamiento del TMR0 ??
goto sge ;Todavía no
decfsz cuenta
goto temp1s
return


end ;Fin del programa fuente

Como se puede ver, yo creo la variable B1,B2... hasta B10 y le asigno el valor 1, y una vez disparadas mediante la puertaB0, le asigno el valor 0. Pero no funciona bien el comando BTFSC. ¿se haría de otra manera?
Gracias
« Última modificación: 11 de Febrero de 2016, 12:53:40 por jpalcaraz »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comparar variable si es uno o cero
« Respuesta #1 en: 11 de Febrero de 2016, 13:12:24 »
Yo creo que estas haciendo 7/8 veces el codigo necesario para hacer lo que estas pidiendo.

Pero podrias explicar mas un paso a paso lo que debe hacer el programa ?, y tambien que son cada entrada salida?, ejemplo RB0 es la entrada del pulso, y luego encendes RB1, Rb2 , RB3 etc etc.
Hay un tiempo entre uno u otro ?.

Esto es para mejorar el programa. Si queres saber si una variable es 1 o 0, es muy simple.
Para saber si es 0:

Código: ASM
  1. MOVF    Variable,W
  2. BTFSS   STATUS, Z
  3. ; NO es cero
  4. ; Es cero

Para saber si es cualquier valor en este caso 1.

Código: ASM
  1. MOVLW   0x01
  2. SUBWF   Variable,W
  3. BTFSS   STATUS, Z
  4. ; NO es igual
  5. ; Es igual

Y de todas formas antes de usar 8 variables para tener un 1 o un 0, podrias usar los 8 bits de una variable. Es decir,, en ves de tener:

B1 , B2 , B3 , B4 ..... B10

Podrias tener:

Var,0  ; Var,1 ; Var,2 ; Var,3 .... etc

Si lo unico que vas a variar es 0 o 1.
« Última modificación: 11 de Febrero de 2016, 13:30:56 por KILLERJC »

Desconectado jpalcaraz

  • PIC10
  • *
  • Mensajes: 5
Re:Comparar variable si es uno o cero
« Respuesta #2 en: 12 de Febrero de 2016, 04:32:39 »
Gracias por la respuesta.Explico un poco el codigo:

RB0-->Pulsos.
RB1--> Armado
RB2--> led armado

RC0-7 Salidas.

Las condiciones es que se dan pulsos por RB0 y es condicion indispensable que el pin RB1 este en alto, si RB1 esta en bajo y se dan pulsos en RB0,no haría nada.
RB2 es para saber si RB1 está en alto mediante un led.
Una vez que se cumple las dos condiciones, es decir, que se de un pulso en alto en RB0 y que RB1 esté en alto, se llamará a la funcion disparo1 y pondrá en alto, en este caso RC0 durante 1 segundo. Por consiguiente, se debe esperar a que RB0 esté en bajo para que no se activen dos disparos seguidos.

Encontré información por internet y he modificado el código.El problema que tengo ahora es que se activan todos los disparos con un solo pulso y creo que es debido al bit Z.
Código: [Seleccionar]

List p=16F876 ;Tipo de procesador
include "P16F876.INC" ;Definiciones de registros internos
                   

temp equ 0x28
cuenta equ 0x29
cuenta1 equ 0x30
cuenta1min equ 0x31
B1              equ 0x32
B2              equ 0x33
B3              equ 0x34
B4              equ 0x35
B5              equ 0x36
B6              equ 0x37
B7              equ 0x38
B8              equ 0x39
B9              equ 0x40
B10             equ 0x41

;####  TRAMA DE SINCRONISMO A TRANSMITIR ######

; 0x01 0x84 0x7A 0x61 0xC5 0xA4 0x84 0x03


;Ajusta los valores de la palabra de configuración durante el ensamblaje:
;protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT

__config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC

org 0x00 ;Vector de RESET
goto Inicio
org 0x04
; goto interrupcion
; org 0x05
;include "LCD_cxx.inc" ;Incluye las rutinas de manejo del LCD

Inicio
bsf STATUS,RP0 ;Selecciona banco 1


movlw b'00000000'
movwf TRISC ;Puerta C se configura como salida, RC6/Tx comunicacion a PC

movlw b'10010011'
movwf TRISB

movlw b'10000111'
movwf OPTION_REG ;Preescaler de 256 para el TMR0

;movlw b'01100100'
;movwf TXSTA ;TX en On, modo asíncrono con 8 bits, alta velocidad y activamos noveno bit para paridad
;movlw b'00100100'
;movwf TXSTA ;TX en On, modo asíncrono con 8 bits, alta velocidad y desactivamos noveno bit para paridad
;movlw .12
;movwf SPBRG ;19200 baudios con Fosc=4MHz

bcf STATUS,RP0 ;Selecciona banco 0

;movlw b'10000000' ;Activamos la comunicacion serie(PORTB<7> Rx y PORTB<6> Tx
;movwf RCSTA

clrf PORTA
clrf PORTB
            clrf PORTC

            movlw b'00000000' ;Sacamos por los pines correspondientes las señales
movwf PORTB

movlw b'00000000' ;Sacamos por los pines correspondientes las señales
movwf PORTC ; RB6: de 0v->5v, RB5: de 5v->0v
        movlw 0x01
        movwf B1
        movlw 0x01
        movwf B2
        movlw 0x01
        movwf B3
        movlw 0x01
        movwf B4
        movlw 0x01
        movwf B5
        movlw 0x01
        movwf B6
        movlw 0x01
        movwf B7
        movlw 0x01
        movwf B8

esperandoalto
inicio1
        bcf PORTB,2
        btfss PORTB,1 ;armado
        goto inicio1
        bsf PORTB,2
        btfss PORTB,0 ;pulso en entrada 0
        goto inicio1
        call secuenciadorde6
        goto inicio1
 
secuenciadorde6
        BCF STATUS,Z
        movlw 0x01
        subwf B1,0
        btfsc STATUS,Z
        call disparar1
        BCF STATUS,Z
         movlw 0x01
        subwf B2,0
        btfsc STATUS,Z
        call disparar2
        BCF STATUS,Z
        movlw 0x01
        subwf B3,0
        btfsc STATUS,Z
        call disparar3
        BCF STATUS,Z
         movlw 0x01
        subwf B4,0
        btfsc STATUS,Z
        call disparar4
        BCF STATUS,Z
         movlw 0x01
        subwf B5,0
        btfsc STATUS,Z
        call disparar5
        BCF STATUS,Z
        movlw 0x01
        subwf B6,0
        btfsc STATUS,Z
        call disparar6
cambiopulso
        bcf PORTB,2
        btfss PORTB,1 ;armado
        goto cambiopulso
        bsf PORTB,2
        btfsc PORTB,0
        goto cambiopulso
        goto esperandoalto

disparar1
        bsf PORTC,0
        call unsegundo
        bcf PORTC,0
        movlw 0x00
        movwf B1
        return

disparar2
        bsf PORTC,1
        call unsegundo
        bcf PORTC,1
        movlw 0x00
        movwf B2
        return

disparar3
        bsf PORTC,2
        call unsegundo
        bcf PORTC,2
        movlw 0x00
        movwf B3
        return

disparar4
        bsf PORTC,3
        call unsegundo
        bcf PORTC,3
        movlw 0x00
        movwf B4
        return

disparar5
        bsf PORTC,4
        call unsegundo
        bcf PORTC,4
        movlw 0x00
        movwf B5
        return

disparar6
     
          bsf PORTC,5
        call unsegundo
        bcf PORTC,5
        movlw 0x00
        movwf B6
        return
disparar7
        bsf PORTC,6
        call unsegundo
        bcf PORTC,6
        movlw 0x00
        movwf B7
        return

disparar8
   bsf PORTC,7
        call unsegundo
        bcf PORTC,7
        movlw 0x01
        movwf B1
        movlw 0x01
        movwf B2
        movlw 0x01
        movwf B3
        movlw 0x01
        movwf B4
        movlw 0x01
        movwf B5
        movlw 0x01
        movwf B6
        movlw 0x01
        movwf B7
        movlw 0x01
        movwf B8
        return
;poner otra puerta


unsegundo

movlw 0xF
movwf cuenta
temp1s
bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
clrf TMR0


sge btfss INTCON,T0IF ;Rebasamiento del TMR0 ??
goto sge ;Todavía no
decfsz cuenta
goto temp1s
return


end ;Fin del programa fuente

Voy a intentarlo como has dicho con una variable y cambiando sus 8 bits.
Gracias

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Comparar variable si es uno o cero
« Respuesta #3 en: 12 de Febrero de 2016, 14:46:09 »
Código: ASM
  1. List    p=16F876                ;Tipo de procesador
  2.         include "P16F876.INC"   ;Definiciones de registros internos
  3.                                
  4.  
  5.         CBLOCK 0x28
  6.         temp            ;0x28
  7.         cuenta          ;0x29
  8.         cuenta1         ;0x30
  9.         cuenta1min      ;0x31
  10.         B0              ;0x32
  11.         AUX             ;0x33
  12.         TempB           ;0x34
  13.         Contador        ;0x35
  14.         ENDC
  15.  
  16.  
  17. ;####  TRAMA DE SINCRONISMO A TRANSMITIR ######
  18.  
  19. ; 0x01 0x84 0x7A 0x61 0xC5 0xA4 0x84 0x03
  20.  
  21.  
  22. ;Ajusta los valores de la palabra de configuración durante el ensamblaje:
  23. ;protección de código y datos=OFF, LVP=OFF, WDT=OFF y OSC=XT
  24.  
  25.         __config _CP_OFF&_CPD_OFF&_LVP_OFF&_WDT_OFF&_XT_OSC
  26.  
  27.         org     0x00                            ;Vector de RESET       
  28.         goto    Configuracion
  29.         org     0x04
  30.         return
  31.         ;goto   interrupcion
  32.  
  33.         ;include        "LCD_cxx.inc"   ;Incluye las rutinas de manejo del LCD
  34.  
  35. Configuracion          
  36.  
  37.         bsf             STATUS,RP0      ;Selecciona banco 1
  38.  
  39.         movlw   b'00000000'
  40.         movwf   TRISC           ;Puerta C se configura como salida, RC6/Tx comunicacion a PC
  41.  
  42.         movlw   b'10010011'
  43.         movwf   TRISB
  44.  
  45.         movlw   b'10000111'
  46.         movwf   OPTION_REG      ;Preescaler de 256 para el TMR0
  47.  
  48.         ;movlw  b'01100100'
  49.         ;movwf  TXSTA           ;TX en On, modo asíncrono con 8 bits,
  50.                                 ; alta velocidad y activamos noveno bit para paridad
  51.         ;movlw  b'00100100'
  52.         ;movwf  TXSTA           ; TX en On, modo asíncrono con 8 bits,
  53.                                 ; alta velocidad y desactivamos noveno bit para paridad
  54.         ;movlw  .12            
  55.         ;movwf  SPBRG           ;19200 baudios con Fosc=4MHz
  56.  
  57.         bcf             STATUS,RP0      ;Selecciona banco 0    
  58.  
  59.         ;movlw  b'10000000'     ;Activamos la comunicacion serie(PORTB<7> Rx y PORTB<6> Tx
  60.         ;movwf  RCSTA  
  61.                        
  62.         clrf    PORTA
  63.         clrf    PORTB
  64.         clrf    PORTC
  65.  
  66.         movlw   b'00000000'     ;Sacamos por los pines correspondientes las señales
  67.         movwf   PORTB          
  68.  
  69.         movlw   b'00000000'     ;Sacamos por los pines correspondientes las señales
  70.         movwf   PORTC           ; RB6: de 0v->5v, RB5: de 5v->0v
  71.        
  72. LoopPrincipal
  73.         bcf     PORTB,2         ; Led indicador de Armado
  74.         btfss   PORTB,1         ; Armado
  75.         goto    LoopPrincipal
  76.         bsf     PORTB,2         ; Led indicadando que esta Armado
  77.         btfss   PORTB,0         ; Pulso en entrada 0, Apenas se ponga en 1 va a secuenciadorde6
  78.         goto    LoopPrincipal
  79.         call    secuenciadorde6
  80. Esperobajo
  81.         BTFSC   PORTB,0         ; Terminada la animacion espero que RB0 se ponga en bajo para continuar
  82.         GOTO    EsperoBajo
  83.         goto    LoopPrincipal
  84.  
  85.  
  86. secuenciadorde6
  87.         MOVLW   0x01            ; Cargo 0000 0001 Que luego lo voy a usar para rotar e ir cargando
  88.         MOVWF   AUX             ; los bits al PORTC, es decir voy moviendo es 1
  89.         MOVF    B0, W           ; Guardo el valor de B0 en otro registro, asi puede modificarlo sin
  90.         MOVWF   TempB           ; modificar B0
  91.         MOVLW   0x07            ; Cargo la cantidad de numeros
  92.         MOVWF   Contador
  93. Loop
  94.         RRF     TempB, F        ; Comienzo rotando, asi siempre el bit de la derecha termina en
  95.         BTFSS   STATUS,C        ; el carry, para saber si es 1 o 0
  96.         GOTO    NoActivar       ; En caso que es 0 sigo adelante
  97.         MOVF    AUX, W          ; En caso de ser 1, procedo a hacer una OR con el puerto
  98.         IORWF   PORTC, F        ; Como va a ir rotando, primero cambia el bit 0, luego el 1 y asi ..
  99.         CALL    unsegundo       ; La demora
  100. NoActivar
  101.         BCF     STATUS,C        ; Pongo en 0 el carry para poder rotar y solo tenga un solo 1 en aux
  102.         RLF     AUX, F          ; Roto izquierda, voy moviendo el uno hacia la izquierda
  103.         DECFSZ  Contador, F     ; Descuento Contador, que es la cantida de bits
  104.         GOTO    Loop            ; No llego a 0? Repito todo lo anterior
  105.         RETURN                  ; LLego a 0 y salgo
  106.  
  107.  
  108. ;poner otra puerta
  109.  
  110.  
  111. unsegundo
  112.         movlw   0xF
  113.         movwf   cuenta
  114.         clrf    TMR0            ; Primero pongo a 0 el timer y luego limpio flag
  115. temp1s
  116.         bcf     INTCON,T0IF     ;Desconecta el flag de rebosamiento
  117. sge
  118.         btfss   INTCON,T0IF     ;Rebasamiento del TMR0 ??
  119.         goto    sge             ;Todavía no           
  120.         decfsz  cuenta
  121.         goto    temp1s
  122.         return
  123.  
  124.  
  125.         end                     ;Fin del programa fuente

Te dejo el programa de ejemplo.. Cambie lo siguiente:

- Cambie todas las subrutinas: secuenciadorde6, disparo xxx . Por una sola rutina de secuenciadorde6.
- Tambien quite lo del cambio de pulso, por una simple pregunta hasta que RB0 se ponga en 0, luego del call.
- Movi el CLRF TMR0 afuera del loop, por que no tiene sentido, ya cuando se produce el overflow ( se activa el flag ) es por que el timer paso de 0xFF a 0x00, por lo que ya esta en 0, solamente se necesita por primera ves.
- Cambie los EQU por un CLBLOCK, asi agregas "variables" y solo el programa va acomodandolos, observaras que puse CBLOCK 0x28, para que el primer comienze con 0x28 y vaya sumando 1 a 1. Comente los valores que tendrian.
- Agrege un RETURN a el vector de interrupcion. Mientras no lo uses mejor asi.
- Nunca pongas ORG 0x05, deja que solo el compilador va a saber como acomodarlos.
- Tal ves cambie algunas etiquetas como Configuacion y LoopPrincipal


 

anything