Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Hola, como estan? Alguien sabra como hacer la conversion digital/analogico con ese pic? Recuerdo que cuando vi la materia de microcontroladores el profesor dijo que aunque el pic no tenga ese modulo, se le puede "manipular" para que lo haga
Oye.. yo estoy en eso ahorita mismo... la unica manera de hacer una conevercion DIGIAL/ANALOGICA que consegui es con un chip externo, ya sea de comunicacion serial SPI como el TLC5615, o el DAC0800 o DAC0808 de comunicacion paralela..
hola fernandopos
gracias por ves el proyecto y me parece bn que te interese esto de los pic
en cuanto a tu duda, quiero pedir disculpas por no habr quitado las variables N1, N2, entrar, ya que no las uso, las tenia alli por que estaba implementado control desde el pc, que se realizara lo mismo que con los pulsadores pero de una forma grafica mas amigable,,,,,, en cuanto a lo de las otras variables, puedes ver que la configuracion se realiza en una secuencia, luego de entrar al menu de configuracion empiezas con var1 que indica la temperatura inferior minima, sigue var2 (temp superior maxima), var3 temp muy muy baja y var4 temp muy muy alta, y como aprecias en el main se trabaja en base a estas para prender o apagar dispositivos que controlaran la temperatura
cualquier duda o sugerencia es bienvenida,,
nota: termine lo de la comunicacion con el pc, espero pronto subirlo, no he tenido mucho tiempo de volver a retomar estos temas,,,,,,,
#include <p16F690.inc>
__config (_INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOR_OFF & _IESO_OFF & _FCMEN_OFF)
cblock 0x20
Sensor
Comandament
Delay
Delay1 ; Assign an address to label Delay1
Delay2
Delay11
Delay22
Delay111
Delay222
Display ; define a variable to hold the diplay
resultat
endc
org 0
Start:
bsf STATUS,RP0 ; select Register Page 1
movlw 0x1F
movwf TRISA ; part baixa port A entrada, part alta, sortida
clrf TRISC ; Make PortC all output
movlw 0x10 ; A2D Clock Fosc/8
movwf ADCON1
bcf STATUS,RP0 ; back to Register Page 0
bsf STATUS,RP1 ; address Register Page 2
movlw 0xFF
movwf ANSEL
bcf STATUS,RP0 ; address Register Page 0
bcf STATUS,RP1
MainLoop:
; Conversio canal del sensor
movlw 0x09
movwf ADCON0 ; configure A2D for Channel 2 (RA2)
nop ; wait 10uS for A2D amp to settle and capacitor to charge.
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
bsf ADCON0,1 ; start conversion
btfss ADCON0,1 ; this bit will change to zero when the conversion is complete
goto $-1
movf ADRESH,w
movwf Sensor
swapf ADRESH,w
movwf PORTC
; Conversio canal del comandament
movlw 0x0D
movwf ADCON0 ; configure A2D for Channel 3 (RA4), Left justified, and turn on the A2D modul
nop ; wait 10uS for A2D amp to settle and capacitor to charge.
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
nop ; wait 1uS
bsf ADCON0,1 ; start conversion
btfss ADCON0,1 ; this bit will change to zero when the conversion is complete
goto $-1
movf ADRESH,w
movwf Comandament
;swapf ADRESH,w
;movwf PORTC
;subwf Comandament,w ;restam comandament menys sensor, el resultat queda a w. si surt negatiu, el bit carry sera 0
;btfss STATUS,C
;goto MainLoop
movlw 0xFF
movwf Delay2
;movf Delay2,w
;sublw 0xFF
;movwf Delay1
;movwf Delay11
;Parpadeig
bsf PORTA,5
OndelayLoop:
movlw 0x01
movwf Delay11
;movwf Delay22
On:
decfsz Delay11,f
goto On
decfsz Delay111,f
goto OndelayLoop
decfsz Delay1,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto OndelayLoop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
bcf PORTA,5
OffDelayLoop:
movlw 0x01
;movwf Delay11
movwf Delay22
Off:
decfsz Delay22,f
goto Off
decfsz Delay222,f
goto OffDelayLoop
decfsz Delay2,f
goto OffDelayLoop
goto MainLoop
end
una pregunta si algien me puede ayudar
Necesito crear un programa con el pic 16f877a y el lm35 dond el pic reconozca la variacion del voltaje que emite el lm35 i la transforme en una salida diguital para encender un led
el proyecto es un termometro que te de la lectura en leds de colores asi x ejemplo: 35° se enciende un led verde; 36° se enciende un led naranja
y asiii entoncs algien sabe kuantas entradas analogicas necesitaria i cuantas salidas digitales tiene este pic xfavor
ahh... asi es entoncs jajaja
i asta kuantas salidas digitales tengo con ese pic?
la verdad no he trabajo con este pic i nose como programarlo mui bn el programa q uso es microcode y para cargar la programacion uso el PICKIT2 pero nose si soolo cargar la programacion puesto que kuando trabajaba con el 16f628A cambiaba la configuracion a 2154 para cargarle la programacion derepente conoces si ay que realizar algun cambio antes de cargarle la programacion?
Hola a todos. Soy nuevo en el foro. He intentado no preguntar y aprender de los posts que la gente ha enviado anteriormente. Con ello (y otras cosas, claro) he conseguido hacer funcionar el ADC de mi pic16f690 ( Naguk10, esto te interesa), pero ahora me encuentro con un escollo que no soy capaz de superar.
El tema es el siguiente:
Tengo conectados dos potenciometros entre VDD y GND con los que puedo hacer variar la tensi'on en los pines correspondientes a AN2 y AN3 (RA2 y RA4, respectivamente). Soy capaz de leer la tensi'on de cada uno de ellos por separado y pasar la parte alta de ADRESH a los 4 bits de menor peso del puerto C (donde tengo sendos leds conectados).
Si leo solo un canal, todo va de lujo, los leds van mostrando la secuencia en biario del 0 al 16, lo cual es maravilloso jeje. Esto con cualquiera de los dos canales por separado.
Ahora bien, cuando quiero leer los dos canales de manera secuencial, solo me lee el segundo (o eso creo). En el codigo adjunto podeis ver lo que hago. El tema es que cuando quiero poner en los leds el resultado del primer canal muestreado, me sale siempre el segundo!! cuando los cambio de orden en el codigo, pasa lo mismo.
Ha quedado un poco descolocado, pero supongo que se puede ver igual. Lo del parpadeo es para controlar una resistencia mediante un optoacoplador y un triac mediante pulsos.
Los comentarios en ingles son de partes de codigo de micrichip.
Por favor, alguien puede ayudarme?
;******************************************************************************************************************************************
; PRACTICA PARA EL ADC, UTILIZO UN POTENCIOMETRO EN RA0 Y EL VALOR EN BINARIO LO VISUALIZO EN LA LCD
;
;
;
;******************************************************************************************************************************************
INCLUDE <P16F877A.INC>
LIST P=16F877A
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BOREN_ON & _LVP_OFF
;REDIFINICION DE NOMBRE
#DEFINE PUERTO_A PORTA
#DEFINE PUERTO_B PORTB
#DEFINE PUERTO_C PORTC
#DEFINE LCD_RS PORTC,7
#DEFINE LCD_RW PORTC,6
#DEFINE LCD_E PORTC,5
#DEFINE LCD_PUERTO PORTB
CBLOCK H'20' ;BLOQUE DE VARIABLES O REGISTROS
CONT1
CONT2
CONT3
BINARIO_B
BINARIO_A
DECENAMIL
UNIDADMIL
CENTENA
DECENA
UNIDAD
ENDC
ORG H'00'
GOTO COMIENZO
ORG H'100'
COMIENZO CALL PUERTO ;LLAMDA A PUERTO.
CALL CONFIG_LCD ;LLAMO A CONFIGURACION DE LCD
CALL RETARDO3 ;ESPERA DE 3 SEGUNDOS
CALL VISUALIZAR_LCD ;VISUALIZO EN LA L1 "ING. MECATRONICA"
CICLO CALL CONFIG_ADC ;CONFIGURACION DE ADCON 0
CALL ADC ;CONFIGURO
CALL VALOR_ADC
GOTO CICLO
;*****************************************************************************************************************************************
; BLOQUE DE RUTINAS BLOQUE DE RUTINAS
;*****************************************************************************************************************************************
PUERTO BSF STATUS,RP0
BCF STATUS,RP1
MOVLW B'111111'
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB
MOVLW B'00000000'
MOVWF TRISC
MOVLW B'00000000'
MOVWF TRISD
MOVLW B'111'
MOVWF TRISE
CLRF OPTION_REG
NOP
MOVLW B'10000000'
MOVWF ADCON1 ;1PARA ADRSH=2 Y ADRESL=8,0 OSCILADO/8,TODOS ANALOGICOS
BCF PIE1,ADIE ;DESABILITO LA INTERRUPCION DE CONVERSIOB
BCF STATUS,RP0 ;VUELVO AL BANCO 0
MOVLW B'00000000'
MOVWF INTCON
RETURN
;******************************************************************************************************************************************
;RUTINA PARA LA CONFIGURACION DE LAS OPERACIONES DE LA LCD
CONFIG_LCD MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X06 ;CONFIGURA EL MODO DE ENTRADA COMO EL INCREMENTO DEL CURSOR Y MODO NORMAL(AQUIPUEDOACTIVAR DESZPLAZAMIENTO)
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X0F ;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=ON,PARPADEO DEL CURSOR=ON
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X38 ;FUNCTION SET:BUS DE 8 BIT,LCD DE 2 LINEAS,CARACTER DE 5X7 PUNTOS
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
MOVLW 0X01 ;EQUIVALENTE A BORRAR LA LCD
CALL CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
RETURN
;******************************************************************************************************************************************
;RUTINIA DE HABILATACION DE CONTROL Y DATOS PARA LA CONFIGURACION DEL LCD
CONTROL_LCD MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE EL CONTROL AL PUERTO PARA CONFIGURARLO
BCF LCD_RW ;COLOCO RW=0 PARA ACTIVAR LA ESCRITURA
BCF LCD_RS ;COLOCO RS=0 PARA ACTIVAR EL CONTROL
SALTOX BSF LCD_E ;COLOCO E=0 PARA DAR EL PULSO
NOP
NOP
BCF LCD_E ;PARA DAR POR TERMINADO EL PULSO
BCF LCD_RW ;PARA LIMPIARLO
BCF LCD_RS ;PARA LIMPIARLO
GOTO RETARDO1 ;VOY AL RETARDO DE 5m SEGUNDOS PARA LA ESPERA DE LA LCD
DATO_LCD MOVWF LCD_PUERTO ;MUEVO EL VALOR DE W QUE POSEE EL DATO A VISUALIZAR EN LA LCD
BCF LCD_RW ;COLOCO RW=0 PARA LA ESCRITURA
BSF LCD_RS ;COLOCO RS=1 PARA ACTIVAR EL MODO DE DATOS
GOTO SALTOX ;ME VOY A SALTOX PARA DAR EL PULSO DE ACTIVACION Y LIMPIAR LOS REGISTROS
;******************************************************************************************************************************************
VISUALIZAR_LCD CALL BORRAR_LCD ;BORRO LA LCD POR SI TENGO ALGO EN ELLA
MOVLW 'I' ;SEGMENTO 1 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 2 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'G' ;SEGMENTO 3 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '.' ;SEGMENTO 4 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'M' ;SEGMENTO 6 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'E' ;SEGMENTO 7 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 8 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 9 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'T' ;SEGMENTO 10 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'R' ;SEGMENTO 11 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'O' ;SEGMENTO 12 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'N' ;SEGMENTO 13 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'I' ;SEGMENTO 14 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 15 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'A' ;SEGMENTO 16 LINEA 1
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 0XC0 ;LO UTILIZO PARA MOVERME A LA LINEA 2
CALL CONTROL_LCD ;HABILITACION DE CONTROL
MOVLW 'A' ;SEGMENTO 1 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'D' ;SEGMENTO 2 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW 'C' ;SEGMENTO 3 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW '=' ;SEGMENTO 4 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITACION DE DATOS
MOVLW ' ' ;SEGMENTO 5 LINEA 2
CALL DATO_LCD ;LLAMO LA HABILITAION DE DATOS
RETURN
;******************************************************************************************************************************************
;RUTINA PARA BORRAR LA LCD
BORRAR_LCD MOVLW 0X01 ;EQUIVALENTE AL CONTROL BORRAR LCD
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;******************************************************************************************************************************************
;RUTINA PARA REGRESAR EL CURSOR AL INICIO
REGRESAR_LCD MOVLW 0X02 ;EQUIVALENTE A RETORDAR EL CURSOR AL INICIO
GOTO CONTROL_LCD ;LLAMO LA HABILITACION DE CONTROL
;******************************************************************************************************************************************
CONFIG_ADC MOVWF B'01000001'
MOVWF ADCON0 ;CONFIGURO OSCILADO/8,CANAL 0, GO, ENCIENDO
GOTO RETARDO5 ;ESPERA EL TIEMPO DE ADQUISICION 25uS
;******************************************************************************************************************************************
ADC BSF ADCON0,GO ;INICIA EL PROCESO
CALL RETARDO5 ;ESPERA DE ADQUISICION
REPETIR BTFSC ADCON0,2 ;CHEQUEO SI LA CONVERSION TERMINO
GOTO REPETIR
MOVFW ADRESH ;MUEVO LOS 2 BITS MAS SIGNIFICATIVOS A W
MOVWF BINARIO_B ;CARGO LOS 2 BITS MAS SIGNIFICATVIOS A BINARIO_B
BANKSEL ADRESL ;ME MUEVO AL BANCO 1 DONDE ESTA EL ADRESL
MOVFW ADRESL ;CARGO EN W EL VALOR DE ADRESL
BANKSEL BINARIO_A ;ME MUEVO AL BANCO 0 DONDE ESTA BINARIO_A
MOVWF BINARIO_A ;CARGO EL BINARIO_A CON EL VALOR DE 2 QUE VIENE DEL ADRESL
GOTO BIN_BCD ;VOY A LA SUBRUTINA BIN_BCD, YA QUE TENGO LOS VALORES DELCONVERTIDOR
;****************************************************************************************************************************************
BIN_BCD SWAPF BINARIO_B,W
ANDLW 0X0F
ADDLW 0XF0
MOVWF UNIDADMIL
ADDWF UNIDADMIL,F
ADDLW 0XE2
MOVWF CENTENA
ADDLW 0X32
MOVWF UNIDAD
MOVF BINARIO_B,W
ANDLW 0X0F
ADDWF CENTENA,F
ADDWF CENTENA,F
ADDWF UNIDAD,F
ADDLW 0XE9
MOVWF DECENA
ADDWF DECENA,F
ADDWF DECENA,F
SWAPF BINARIO_A,W
ANDLW 0X0F
ADDWF DECENA,F
ADDWF UNIDAD,F
RLF DECENA,F
RLF UNIDAD,F
COMF UNIDAD,F
RLF UNIDAD,F
MOVF BINARIO_A,W
ANDLW 0X0F
ADDWF UNIDAD,F
RLF UNIDADMIL,F
MOVLW 0X07
MOVWF DECENAMIL
MOVLW 0X0A
LB1 ADDWF UNIDAD,F
DECF DECENA,F
BTFSS STATUS,C
GOTO LB1
LB2 ADDWF DECENA,F
DECF CENTENA,F
BTFSS STATUS,C
GOTO LB2
LB3 ADDWF CENTENA,F
DECF UNIDADMIL,F
BTFSS STATUS,C
GOTO LB3
LB4 ADDWF UNIDADMIL,F
DECF DECENAMIL,F
BTFSS STATUS,C
GOTO LB4
RETURN
;****************************************************************************************************************************************
VALOR_ADC MOVLW 0X30
ADDWF DECENAMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF UNIDADMIL,W
CALL DATO_LCD
MOVLW 0X30
ADDWF CENTENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF DECENA,W
CALL DATO_LCD
MOVLW 0X30
ADDWF UNIDAD,W
CALL DATO_LCD
MOVLW 0X0C ;COFIG DISPLAY CONTROL: DISPALY=ON,CURSOR=OFF,PARPADEO DEL CURSOR=OFF
CALL CONTROL_LCD
MOVLW B'11000101' ;POSICIONO EL CURSOR EN LA SEGUNDA FILA POSICION 5
GOTO CONTROL_LCD
;******************************************************************************************************************************************
RETARDO1 MOVLW .41 ;RETARDO DE 5MILISEGUNDOS
MOVWF CONT1
MOVlW .41
MOVWF CONT2
DEMORA1 DECFSZ CONT1,F
GOTO DEMORA1
DECFSZ CONT2,F
GOTO DEMORA1
RETURN
;****************************************************************************************************************************************
RETARDO2 MOVLW .183 ;RETARDO DE 1 SEGUNDOS
MOVWF CONT1
MOVlW .183
MOVWF CONT2
MOVLW .11
MOVWF CONT3
DEMORA2 DECFSZ CONT1,F
GOTO DEMORA2
DECFSZ CONT2,F
GOTO DEMORA2
DECFSZ CONT3,F
GOTO DEMORA2
RETURN
;****************************************************************************************************************************************
RETARDO3 CLRF CONT1 ;RETARDO DE 3 SEGUNDOS PARA MOSTRAR EL NUMERO
CLRF CONT2
MOVLW .16
MOVWF CONT3
DEMORA3 DECFSZ CONT1,F
GOTO DEMORA3
DECFSZ CONT2,F
GOTO DEMORA3
DECFSZ CONT3,F
GOTO DEMORA3
RETURN
;****************************************************************************************************************************************
RETARDO4 MOVLW .18 ;RETARDO DE 1MILISEGUNDOS
MOVWF CONT1
MOVlW .18
MOVWF CONT2
DEMORA4 DECFSZ CONT1,F
GOTO DEMORA4
DECFSZ CONT2,F
GOTO DEMORA4
RETURN
;****************************************************************************************************************************************
RETARDO5 MOVLW .8 ;RETARDO DE 25u SEGUNDOS
MOVWF CONT1
DEMORA5 DECFSZ CONT1,F
GOTO DEMORA5
RETURN
;****************************************************************************************************************************************
END