Autor Tema: ¡ayuda! a/d en el pic 12f675  (Leído 4885 veces)

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

Desconectado THEFENIX

  • PIC10
  • *
  • Mensajes: 4
¡ayuda! a/d en el pic 12f675
« en: 03 de Marzo de 2003, 08:32:00 »
estimados amigos:

le he dado vueltas a los registros y no logro hacer funcionar un solo canal a/d.

serian tan amables de decirme como configurarlo.

yo manejo el mplab de microchip.

gracias por anticipado y felicidades por este foro.

charly

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #1 en: 03 de Marzo de 2003, 23:31:00 »
Hola THEFENIX.

No he programado nunca el conversor del 12F625 pero una vez se programa uno todos los demás son parecidos.

Estos son los pasos que debes efectuar para realizar una conversión A/D.

1º Configurar el módulo CAD

- Configurar las patitas que actuaran como entradas analógicas, las que trabajaran como E/S digitales y las usadas para la tensión de referencia
- Seleccionar el canal de entrada A/D (ADCON0)
- Seleccionar el reloj de la conversión (ADCON0)
- Activar el módulo AD (ADCON0)

2º Activar, si se desea, la interrupción escribiendo sobre PIE1

- Borrar el bit ADIF
- Poner a 1 el bit ADIE
- Poner a 1 el bit GIE

3º Tiempo de espera para que transcurra el tiempo de adquisición

4º Inicio de la conversión

- Poner a 1 el bit GO/DONE# (ADCON0)

5º Tiempo de espera para completar la conversión AD que puede saberse:

- Por la exploración del bit GO/DONE# que al completarse la conversión pasa a valer 0

- Esperando a que se produzca la interrupción si se ha programado, que se produce al finalizar la conversión

6º Leer el resultado en los 10 bits válidos de ADRESH-L y borrar el flag ADIF

7º Para una nueva conversión regresar al paso 1 o al 2

- El tiempo de conversión por bit está definido por TAD. Se exige esperar un mínimo de 2·TAD para reiniciar una nueva conversión

Si sigues teniendo problemas manda el programa.

Un saludo



Desconectado THEFENIX

  • PIC10
  • *
  • Mensajes: 4
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #2 en: 04 de Marzo de 2003, 08:25:00 »
amigo mio:

ante todo mil gracias por tu respuesta,te envio el archivo y te comento que asi lo he hecho pero igual ya estoy tan saturado del asunto que no logro ver mi error u omision,asi mismo te comento que ya he programado en otros micros y nunca tuve tantos problemas como con este tan sencillo en apariencia,recibe un saludo y nuevamente gracias.

por ultimo te comento que este programa lee un canal a/d (an0) y el resultado lo envia como salida analogica  a traves de a2 (pwm).

the fenix


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #3 en: 05 de Marzo de 2003, 00:37:00 »
Hola THEFENIX.

Busqué en el datasheet y saqué por impresora todos los registros del PIC12F675. Estudié el programa visualmente y no ví el (los) errores (ya te comenté que no había trabajado nunca con este micro y con sus registros). Fuí a intentar depurarlo con MPLAB 5.6.2 y este micro no está contemplado (conviene elegir uno del cual luego se puedan corregir los errores de programa, ¡¡ que todos tenemos !!) Támpoco está en el PROTEUS 5.20.06.

Haber si esta tarde tengo otro rato ...

A bote pronto el PIN2 lo estas programando como entrada analógica ¿no debiera ser salida PWM?

Otro apunte que supongo sabrás : generas el PWM mediante sotfware, hay otros micros que ya llevan implementado el software para calcular tanto el periodo como el Duty (por ejemplo el 16F628A, sin A/D y con PWM o el 16F873, con A/D y PWM)

Un saludo

Desconectado THEFENIX

  • PIC10
  • *
  • Mensajes: 4
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #4 en: 05 de Marzo de 2003, 08:56:00 »
amigo mio:

nuevamente gracias y te comento que he estado haciendo varias pruebas y tal vez omiti volver a configurar el pin como salida,de hecho cheque el circuito teniendo solamente la salida pwm asignando un dato por default en duty_lo y duty_hi y aunque este valor es fijo si funciono perfectamente, de ahi mis sospechas de que algo falta para que funcione el a/d, te comento que para poder editar,compilar,simular y programar este micro baje la version 6.10.10.0  la cual soporta este micro y el 16f877a que tengo para otro proyecto ya por concluir; con el 16f877 ni con el 16c71 he tenido los problemas que he tenido con el 16f675.

y tienes razon con lo de que otros poseen por software el pwm pero para la aplicacion que necesito es mas que suficiente con este micro.

mi proyecto es el siguiente:

con el 16f877=>16f877A  realice un voltmetro de 4 digitos y 2 alarmas de control.

como la salida analogica es opcional decidi hacerla con el 16f675 en forma independiente al 16f877 (aunque se que trae integrada la funcion pwm).

    bien amigo espero me orientes y estaremos en contacto gracias otra vez recibe un saludo.

the fenix

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #5 en: 05 de Marzo de 2003, 13:53:00 »
Hola THEFENIX.

Creo que el error está en lo mismo que había visto esta mañana:

MOVLW B"00101001"
MOVWF GPIO_TRISIO   ;Entradas:A0,A3,A5          Salidas:A1,A2,A4

MOVLW B"00010101"
MOVWF ADCON0_ANSEL   ;FOSC/8, Entradas analógicas:A0,A2   I/O digitales:A1,A3

Si utilizas posteriormente en el programa A2 como salida digital PWM debería estar configurada como salida digital y lo está como entrada analógica (cambiar el ADCON0 a 00010001).

Porque no pruebas a chequear el bit ADIF del PIR1 en lugar del GO/DONE" del ADCON0 (no es error)

Intercambia de posición las líneas BCF STATUS,5 con la línea MOVWF DUTI_LO (no es error)

La rutina de salida PWM creo que está bien, además ya la probaste (sin A/D) con un dato fijo cargado en DUTY_LO+DUTY_HI

Prueba y ya me cuentas.

Un saludo


Desconectado THEFENIX

  • PIC10
  • *
  • Mensajes: 4
RE: ¡ayuda! a/d en el pic 12f675
« Respuesta #6 en: 12 de Marzo de 2003, 17:16:00 »
AMIGO POCHER:

SOLO DARTE LAS GRACIAS POR TU AYUDA, TE COMENTO QUE HE SOLUCIONADO EL PROBLEMA Y ENVIO COMO REFERENCIA EL ARCHIVO (AUN NO ESTA TERMINADO) PARA ALGUNO QUE TUVIERA EL MISMO PROBLEMA.

EL ARCHIVO LEE UN CANAL A/D  (AN0)Y EL RESULTADO (10 BITS) LO ENVIA A UNA SALIDA (A2) EN FORMA PWM, EL VOLTAJE DE REFERENCIA ES EXTERNO (VREF) EN A1.

NUEVAMENTE GRACIAS.

THE FENIX

Desconectado LEVIATAN

  • PIC10
  • *
  • Mensajes: 1
Re: ¡ayuda! a/d en el pic 12f675
« Respuesta #7 en: 20 de Febrero de 2012, 09:27:51 »
hola...
cual pic me recomiendan qeu tenga ADC y tambien usart...pero de 8 patitas!!!
hay alguno?

Desconectado Diego E.

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1086
Re: ¡ayuda! a/d en el pic 12f675
« Respuesta #8 en: 20 de Febrero de 2012, 10:24:55 »
Hola, pero si utilizas CCS por ejemplo es fácil configurar el módulo USART, o si es assembler una rutina de comunicación es igualmente simple.

este es un ejemplo del conversor AD a PC

Código: [Seleccionar]

TITLE" CONVERSOR AD DE 0 A 999 "
     
     
LIST   P=12f675

;REGISTROS DE USO ESPECIFICO

dir_ind equ 00 ;direccionamiento indirecto de la RAM
rtcc equ 01 ;reloj de tiempo real
pcl equ 02 ;contador de programa
status equ 03 ;registro de estado de la ALU
fsr equ 04 ;datos de la RAM
gpio equ 05 ;dato del puerto a
intcon equ 0b ;registro de interrupciones
pie1 equ 0c ;registro de interrupciones perifericas
tmr1l equ 0e ;parte baja del tmr1
tmr1h equ 0f ;parte alta del tmr1
t1con equ 10 ;configuracion del tmr1
adresl equ 1e
adresh equ 1e
adcon0 equ 1f
ansel equ 1f
cmcon equ 19

;REGISTROS EN LA PAGINA 1

p_option        equ     1 ;registro de config. del rtcc
trisio          equ     05    ;registro de config. del puerto a
pir1 equ 0c ;registro de interrupciones perifericas

;REGISTROS DE USO GENERAL

conta equ 20
conta1 equ 21
unidades equ 22
decenas equ 23
centenas equ 24
uni_mil equ 25
dec_mil equ 26
bandera equ 27
registro1_l equ 28
registro1_h equ 29
conta2 equ 2a
res_w equ 2b
con_tiem equ 2c
respaldo equ 2d
;===========================================================================

;BANDERAS UTILIZADAS DEL REGISTRO STATUS

c               equ     0x00 ;carry
z               equ     0x02 ;cero
rp0             equ     0x05 ;seleccion de pagina uno

;CONSTANTES DE PROGRAMACION

w               equ     00
f               equ     01
;============================================================================
;PUERTO A

;GPO ENTRADA ANALOGA
;GP1 SALIDA LED PILOTO
;GP2 SALIDA PARA TRANSMICION TX
;GP3 PIN LIBRE
;GP4 PIN LIBRE
;GP5 PIN LIBRE
;===========================================================================
org 0x00
goto inicio
;==============================================================================
org 0x04 ;VECTOR DE LA INTERRUPCION
;POR RTCC 1 Sgdo
movwf res_w
nop ;INSTRUCCIONES NO OPERE PARA AJUSTAR
nop ;UN TIEMPO EXACTO
nop
movlw 0x0b
movwf tmr1h
movlw 0xdd ;SE CARGA NUEVAMENTE EL TMR1
movwf tmr1l

bsf bandera,0 ;BANDERA QUE INDICA 0.5 SEG

incf con_tiem,f
movlw d'2'
xorwf con_tiem,w
btfss status,z
goto fin_int

movlw 0x02
movwf con_tiem

bsf bandera,1 ;BANDERA QUE INDICA 1Sgd
;===============
fin_int movf res_w,w
bcf pir1,0

retfie
;===========================================================================
conversion bsf adcon0,1 ;RUTINA GENERAL DE CONVERSION A/D

btfsc adcon0,1 ;INICIO DE LA CONVERSION
goto $-1

bsf status,rp0
movf adresl,w
bcf status,rp0

movwf registro1_l
movf adresh,w
movwf registro1_h

;==================
clrf dec_mil
clrf uni_mil ;RUTINA QUE CONVIERTE UN NUMERO BINARIO
clrf centenas ;DE 16 BIT A BCD (CUATRO DIGITOS)
clrf decenas
clrf unidades ;TIEMPO APROXIMADO 440 Ms
;==================
res_dec_mil movlw b'00010000' ;AL NUMERO BINARIO SE LE RESTA 10000
subwf registro1_l,f ;LUEGO SE LE RESTA 1000
btfsc status,c ;LUEGO SE LE RESTA 100
goto $+5 ;LUEGO SE LE RESTA 10
movlw b'00000001' ;EL NUMERO RESTANTE SON LAS UNIDADES
subwf registro1_h,f
btfss status,c
goto res_uni_mil
bsf bandera,2
movlw b'00100111'
subwf registro1_h,f
btfss status,c
goto res_uni_mil

bcf bandera,2
incf dec_mil,f
goto res_dec_mil
;==================
res_uni_mil movlw b'00010000'
addwf registro1_l,f
btfsc status,c
incf registro1_h,f
btfss bandera,2
goto $+3
movlw b'00100111'
addwf registro1_h,f
bcf bandera,2

res_ot_uni_mil movlw b'11101000'
subwf registro1_l,f
btfsc status,c
goto $+5
movlw b'00000001'
subwf registro1_h,f
btfss status,c
goto res_centenas
bsf bandera,2
movlw b'00000011'
subwf registro1_h,f
btfss status,c
goto res_centenas

bcf bandera,2
incf uni_mil,f
goto res_ot_uni_mil
;==================
res_centenas movlw b'11101000'
addwf registro1_l,f
btfsc status,c
incf registro1_h,f
btfss bandera,2
goto $+3
movlw b'00000011'
addwf registro1_h,f

res_otra_cent movlw d'100'
subwf registro1_l,f
btfsc status,c
goto $+5
movlw d'1'
subwf registro1_h,f
btfss status,c
goto res_decenas

incf centenas,f
goto res_otra_cent

res_decenas movlw d'100'
addwf registro1_l,f
btfsc status,c
incf registro1_h,f
;==================
res_otra_dec movlw d'10'
subwf registro1_l,f
btfss status,c
goto $+3

incf decenas,f
goto res_otra_dec

movlw d'10'
addwf registro1_l,f

movf registro1_l,w
movwf unidades
;==================
return
;===========================================================================
osc_led btfss gpio,1 ;LED PILOTO QUE INDICA QUE ESTA
goto $+3 ;REALIZANDO LA OPERACION
bcf gpio,1
return
bsf gpio,1
return
;===========================================================================
;==============================================================================
t_208Ms movlw d'50' ;RETARDO DE 208 Ms PARA LA COMUNICAION
movwf conta ;CON EL PC A 4800 BPS

nop
decfsz conta,f
goto $-2

nop
nop
return
;==============================================================================
enviar movwf respaldo ;RUTINA GENERAL DE COMUNICACION CON
;EL PC
movlw d'8'
movwf conta1 ;NUMERO DE BITS

bcf gpio,2 ;BIT DE INICIO
call t_208Ms

en_otro_bit rrf respaldo,f ;SE ROTAN LOS OCHO BIT DE DATO
btfss status,c
bcf gpio,2
btfsc status,c
bsf gpio,2

call t_208Ms

decfsz conta1,f
goto en_otro_bit

bsf gpio,2 ;BIT DE PARADA
call t_208Ms

return
;===========================================================================
transmite movlw h'30'
addwf uni_mil,w
call enviar

movlw h'30'
addwf centenas,w
call enviar

movlw h'30'
addwf decenas,w
call enviar

movlw h'30'
addwf unidades,w
call enviar

movlw h'0d'
call enviar

return
;===========================================================================
programa btfss bandera,0
goto programa
bcf bandera,0

call osc_led

call conversion

call transmite

goto programa
;===========================================================================
inicio bsf status,rp0 ;SE SELECCIONA LA PAGINA 1 DE LA RAM
;NECESARIA PARA LA CONFIGURACION GRAL.
movlw b'11111001'
movwf trisio

movlw b'00000001' ;SE SELEECIONA EL RA3 COMO ENTRADA
movwf ansel ;ANALOGA

bsf pie1,0 ;SE HABILITA INTERRUPCION POR SOBREFLUJO
;EN EL TMR1
movlw h'c0' ;SE HABILITA TODAS LAS INTERRUPCIONES
movwf intcon

bcf status,rp0 ;SE RETORNA A LA PAGINA 0 DE LA RAM

movlw b'00000111' ;EL MODULO DE COMPARACION SE CONFIGURA
movwf cmcon ;COMO PINES DIGITALES GENERALES

movlw b'10000001'
movwf adcon0

movlw b'00110101' ;SE HABILITA EL TMR1
        movwf t1con
       
        bcf gpio,1
        bsf gpio,2
;===========================================================================
movlw 0x21 ;BORRADO DE LA MEMORIA RAM
movwf fsr ;DEL MICRO-CONTROLADOR

movlw 0x1f
movwf conta

borre clrf dir_ind
incf fsr,f
decfsz conta,f
goto borre
;===========================================================================
goto programa
;===========================================================================

end




Saludos