TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado 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.
-
Reemplaza esto:
MOVFW ENTRADA ; las guarda en una variable
Por esto otro
MOVWF ENTRADA ; Esto si funciona...
-
vale, sí gracias, eso debe de ser parte de mi problema, pero sigue sin funcionarme :/
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.
-
Hola, te está faltando apagar los comparadores al inicio.
Agrega el siguiente código, CMCON está en el banco "0"
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" .
BANKSEL PORTA
-
no sale el CMCON en el datasheelt de 16F886 :/
gracias por lo del PORTA
-
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.
-
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.
-
Hola,
ANSELH también aunque no utilice los puertos B?
-
Hola,
ANSELH también aunque no utilice los puertos B?
No es necesario, pero si es conveniente, para bajar el consumo del micro.
-
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í).
-
Vale, muchas gracias. El Lunes intentaré probarlo en la universidad y ya comentaré si al fin consigo que funcione.
Un saludo.
-
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?
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
-
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
-
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.
-
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...
-
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.
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.
-
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.