TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: armans en 09 de Mayo de 2014, 16:10:40

Título: Ayuda con entradas digitales
Publicado por: armans en 09 de Mayo de 2014, 16:10:40
Hola, soy bastante nuevo en esto de los PICs y estoy como loco intentando tomar como datos la tensión de entrada y no lo logro.

Estoy trabajando en 2 entradas digitales con un interruptor y la historia está en que si pulso uno la salida debe de hacerme una cosa y si pulso el otro, la salida actua de otro modo (misma salida)

estoy intentandolo con esto:

    MOVF PORTA, W ; supuestamente toma los valores de las entradas predefinidas arriba como digitales
    MOVFW ENTRADA ; las guarda en una variable

    BTFSC ENTRADA, 1 ; si la entrada 1 esta activa va a la opcion1, 0 salta instruccion
    GOTO OPCION1

    BTFSC ENTRADA, 2 ; si la entrada 2 esta activa, va a la opcion2, 0 salta instruccion
    GOTO OPCION2

pero parece que no me hace caso, alguna sugerencia?

Gracias y un saludo.
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 09 de Mayo de 2014, 16:38:31
Reemplaza esto:
    MOVFW ENTRADA ; las guarda en una variable

Por esto otro

MOVWF ENTRADA ; Esto si funciona...
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 10 de Mayo de 2014, 08:18:26
vale, sí gracias, eso debe de ser parte de mi problema, pero sigue sin funcionarme :/

Código: [Seleccionar]
LIST P=16F886
    INCLUDE P16F886.INC


    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF



    CBLOCK 0X20
        ENTRADA
    ENDC


    ORG 00
    GOTO INICIO


INICIO  NOP

    ; Inicialización de los puertos
    BANKSEL TRISA ; selecciona TRISA
    ;BSF TRISA, 0 ; RA0 como entrada para conversor A/D
    BSF TRISA, 1 ; RA1 como entrada


    BANKSEL ANSEL
    ;BSF ANSEL, 0 ; RA0 como analogico
    BCF ANSEL, 1 ; RA1 como digital


    BANKSEL TRISC
    MOVLW B'00000000'
    MOVWF TRISC ; Configuro RC2 como salida


NUEVO

    MOVF PORTA, W
    MOVWF ENTRADA

    BTFSC ENTRADA, 1
    GOTO ENCIENDE

    BCF PORTC, 2

    GOTO NUEVO


ENCIENDE
    BANKSEL PORTC
    BSF PORTC, 2
    GOTO NUEVO


    END

No sé que me dejo, he reducido el planteamiento total para ver si consigo coger las entradas antes de trasladarlo a mi proyecto, asi que de ahi los config. y lo de que vaya a haber una entrada para un conversor A/D.

Un saludo.
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 10 de Mayo de 2014, 09:05:39
Hola, te está faltando apagar los comparadores al inicio.


Agrega el siguiente código, CMCON está en el banco "0"
Código: [Seleccionar]
movlw 0x07
movwf CMCON ;Apago el módulo comparador.

Saludos
HJ

Edito: También debes seleccionar el Banco de del PORT A  (banco 0) después de la etiqueta "Nuevo", ya que estas llegando allí desde las configuraciones de los TRIS en el banco 1

Agrega lo siguiente después de la etiqueta "Nuevo" .

Código: [Seleccionar]
   BANKSEL PORTA
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 10 de Mayo de 2014, 10:20:47
no sale el CMCON en el datasheelt de 16F886 :/

gracias por lo del PORTA
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 10 de Mayo de 2014, 10:31:08
no sale el CMCON en el datasheelt de 16F886 :/
Tienes razón, no se porqué se me pasó por la cabesa que estabas utilizando un 628.
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 10 de Mayo de 2014, 10:40:52
Estamos en lo mismo, lo primero de debes hacer es apagar los módulos analógicos poniendo a cero los registros ANSEL y ANSELH. siempre arrancan como analógicos después de cualquier tipo de RESET.
Si necesitas un pin analógico, ese solo lo pones a "1", ten en cuenta que no todos los ANx coinciden con los números de puerto, verifica en la hoja de datos.

Título: Re: Ayuda con entradas digitales
Publicado por: armans en 10 de Mayo de 2014, 10:56:57
Hola,

ANSELH también aunque no utilice los puertos B?
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 10 de Mayo de 2014, 11:45:28
Hola,

ANSELH también aunque no utilice los puertos B?
No es necesario, pero si es conveniente, para bajar el consumo del micro.
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 10 de Mayo de 2014, 11:47:02
ANSELH también aunque no utilice los puertos B?
No es necesario, pero si es conveniente, para bajar el consumo del micro.

Fíjate que en el mensaje anterior había puesto "0", y en realidad es "1" lo que hay que poner para que un pin sea analógico (ya lo corregí).
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 10 de Mayo de 2014, 11:53:52
Vale, muchas gracias. El Lunes intentaré probarlo en la universidad y ya comentaré si al fin consigo que funcione.

Un saludo.
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 12 de Mayo de 2014, 05:01:09
Estoy probandolo y algo se ha resuelto, es decir, cuando añado la entrada se enciende mas el led, pero aun teniendolo supuestamente apagado está encendido ¿es algun tipo de fuga en LO o tengo algo mal?

Código: [Seleccionar]
    LIST P=16F886
    INCLUDE P16F886.INC

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF

    CBLOCK 0X20
    ENTRADA
    ENDC

    ORG 00
    GOTO INICIO

INICIO  NOP
    ; Inicialización de los puertos
    BANKSEL TRISA ; selecciona TRISA
    MOVLW B'11111111'
    MOVWF TRISA   

    BANKSEL ANSEL
    MOVLW B'00000001' ; RA0 analogico, lo demás digital
    MOVWF ANSEL

    BANKSEL TRISB ; selecciona TRISB
    MOVLW B'11111111'
    MOVWF TRISB

    BANKSEL ANSELH
    MOVLW B'00000000'
    MOVWF ANSELH

    BANKSEL TRISC
    CLRF TRISC

NUEVO
    BANKSEL PORTA
    MOVF PORTA, W
    MOVWF ENTRADA

    BTFSC ENTRADA, 1
    GOTO ENCIENDE

    BANKSEL PORTC
    MOVLW B'00000000'
    MOVWF PORTC

    GOTO NUEVO

ENCIENDE
    BANKSEL PORTC
    MOVLW B'00000100'
    MOVWF PORTC
    GOTO NUEVO

    END
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 12 de Mayo de 2014, 08:17:02
No veo nada raro a simple vista.
Deberías subir el esquema que estas utilizando, y si es posible alguna foto del montaje donde se pueda ver correctamente el mismo.

Saludos
HJ
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 12 de Mayo de 2014, 09:24:46
En este ejemplito simplemente alimento el PIC, le saco de la tension otro cable a la entrada que estoy gastando y la salida va con una resistencia al LED y de ahi a masa. No tiene más. cuando lo tengo en "apagado" me da luz y cuando le conecto tambien la entrada, da ligeramente un poco más de luz.

Un saludo.
Título: Re: Ayuda con entradas digitales
Publicado por: HJG en 12 de Mayo de 2014, 10:13:25
En este ejemplito simplemente alimento el PIC, le saco de la tension otro cable a la entrada que estoy gastando y la salida va con una resistencia al LED y de ahi a masa. No tiene más. cuando lo tengo en "apagado" me da luz y cuando le conecto tambien la entrada, da ligeramente un poco más de luz.
Allí está el problema... no leo que le estés dando la referencia negativa al pin utilizado como entrada (RA1)... deberías colocarle una resistencia de 10K desde el pin a masa.

Estoy casi seguro que es eso...
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 13 de Mayo de 2014, 07:00:32
Con la resistencia y CLRF PORTA Y PORTC parece que ya ha funcionado, muchisimas gracias.

Aunque de momento vuelvo a las mismas, meto algo nuevo y vuelve a no ir, estoy intentando cambiar la simple apertura de una salida por otra por PWM. El periodo final si no lo he calculado mal es de aproximadamente de 1ms y ya que gasto PR2=15 mi pwm creo que irá de 0 a 16 inclusive. Estoy probando cosas, pero de momento no se ilumina nada.

Código: [Seleccionar]
LIST P=16F886
    INCLUDE P16F886.INC

    __CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _CPD_OFF & _BOR_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
    __CONFIG _CONFIG2, _BOR40V & _WRT_OFF

    CBLOCK 0X20
    ENTRADA
    ENDC

    ORG 00
    GOTO INICIO

INICIO  NOP
    ; Configuración del oscilador
    BANKSEL OSCCON
    MOVLW B'01001100' ; Oscilador interno a 1 MHz
    MOVWF OSCCON ; envía la instrucción de ajuste a OSCCON

    ; Inicialización de los puertos
    BANKSEL PORTA
    CLRF PORTA
    BANKSEL ANSEL
    MOVLW B'00000001' ; RA0 analogico, lo demás digital
    MOVWF ANSEL
    BANKSEL TRISA ; selecciona TRISA
    MOVLW B'11111111'
    MOVWF TRISA    

    BANKSEL PORTB
    CLRF PORTB
    BANKSEL ANSELH
    MOVLW B'00000000'
    MOVWF ANSELH
    BANKSEL TRISB ; selecciona TRISB
    MOVLW B'11111111'
    MOVWF TRISB

    BANKSEL PORTC
    CLRF PORTC
    BANKSEL TRISC
    CLRF TRISC ; Configuro RC2 como salida
    
    MOVLW .15
    MOVWF PR2
    ; con PR2 asigno el periodo
    ; La fórmula para el período es T = (PR2 + 1)*4*Tosc * Valor divisor prescaler TMR2
    ; Jugando con esos valores podemos cambiar el período (y la frecuencia)
    ; Nota: el 4*Tosc del período viene porque TMR2 funciona a un cuarto de la
    ; frecuencia del oscilador seleccionado (es decir, cuatro veces su período)

    ; Ajusta el oscilador externo con CCP1CON
    MOVLW B'00001101'
    MOVWF CCP1CON
    ; Modo PWM 1101 <3,2,1,0>, bit <5,4> en ceros
    ; La configuración activa el modo PWM, y la salida modulada es el pin P1A (pin 13)
    ; Ajusta el prescaler, que nos da el período (y por tanto, al invertirlo, la frecuencia)
    
    MOVLW B'00000110' ;
    ; A partir de la datasheet:
    ;       - bit MSB se ignora
    ;       - bits 6-3 dan el valor de división del postscaler (pasando de binario a decimal; por ejemplo, 0111 sería un postscaler de 7)
    ;       - bit 2 activa el temporizador
    ;       - bits 1-LSB indican la división del prescaler, la que parece que usa este programa:
    ; <1x> Un prescaler de 16 da un periodo apox de 4ms y una frec de 244Hz
    ; <01> Un prescaler de 4 da un periodo apox de 1ms y una frec de 1KHz
    ; <00> Un prescaler de 1 da un periodo apox de 250us y una frec de 4KHz
    MOVWF T2CON ; ajusta prescaler y activa TMR2
    CLRF CCPR1L ; Duty en cero (0)

NUEVO
    BANKSEL PORTA
    MOVF PORTA, W
    MOVWF ENTRADA

    BTFSC ENTRADA, 1
    GOTO OPCION1

    ;BTFSC ENTRADA, 2
    ;GOTO OPCION2

    CLRF CCPR1L

    GOTO NUEVO

OPCION1
    MOVLW .15
    MOVWF CCPR1L
    GOTO NUEVO

;OPCION2
;    MOVLW .10
;    MOVWF CCPR1L
;    GOTO NUEVO

    END

De momento he comentado una opcion para hacerlo más sencillo.

Un saludo.
Título: Re: Ayuda con entradas digitales
Publicado por: armans en 14 de Mayo de 2014, 07:51:15
ya me va, el problema era que portb despues de PR2 se desconfiguraba de algun modo, entonces colocandolo despues ya conserva sus valores a 1 para activar el pwm.

Un saludo y gracias por la ayuda.