TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: agauss en 04 de Marzo de 2010, 18:28:09
-
Pasa lo siguiente, estoy tratando de simular el ADC del PIC16F77/74/76/73 en PROTEUS y sucede que al revisar el registro de resultado del PIC (ADRES) este varia segun el voltaje ingresado por un potenciometro lineal colocado sobre el canal analogico AN0, pero al tratar de leer este registro para tomar el dato y enviarlo por un puerto o bien procesar de alguna forma el dato, pues no sucede nada, es decir, no puedo leer este registro, la pregunta es: ¿sera un error del simulador?. He de señalar que el PIC16F77 no existe en version F en PROTEUS por lo cual tengo que usar la version C (PIC16C77) ¿sera por ahi el problema?
En fin espero que alguien pueda ayudarme con esto ya que no he dado con la solucion en el tiempo que he dedicado.
P.D. Se que otros modelos de PIC funcionan sin problema (877A, 2550, etc), pero yo tengo algunos de estos modelos (16F77) y megustaria dar con la solucion.
-
En espera de que alguien te conteste si hay cambios de c a f (creo que si) por que no lo pruebas en una placa de prototipos.
-
Gracias por responder...
Resulta que he trabajado fisicamente con este PIC y se que funciona perfectamente, solo que cuando quiero simular algun programa que involucra al ADC me topo con este problema. En fin, si alguien tiene algo le agradeceria compartir en el foro.
Saludos...
-
Saludos
Por que no pones el còdigo y el esquemàtico para empezar a descartar los posibles errores
-
Pues, que sepa, la diferencia es que los C se pueden programar una sola vez, mientras que los F pueden ser programados muchas veces.
-
El codigo fuente es este...
title "PIC16F77, test.asm"
list p=16f77, f=inhx8m
#include <p16f77.inc>
__Config _XT & _WDT_OFF & _CP_OFF & _PWRTE_ON
STATUS equ 0x03
PORTA equ 0x05
PORTB equ 0x06
ADRES equ 0x1E
ADCON equ 0x1F
org 0x00
goto inicio
org 0x04
goto rsi
org 0x05
inicio: bsf STATUS,RP0
movlw 0x00
movwf ADCON
movwf 0x00
movwf PORTB
bcf STATUS,RP0
movlw 0x41
movwf ADCON
main: call T100ms
bsf ADCON,1
busy: btfss ADCON,1
goto busy
movf ADRES,0
movwf PORTB
goto main
T100ms: movlw 0x1F
movwf PDelT
DLoop: decfsz PDelT,1
goto DLoop
nop
nop
return
rsi: retfie
end
Espero sus comentarios, saludos....
-
Simplemente coloco un potenciometro lineal sobre el canal analogico 0 del PIC, sobre el visualizador de registros del PROTEUS coloco los registros ADRES y PORTB. En el ADRES puedo ver que conforme vario el POT varia el dato en el ADRES, pero al tratar de mandar este dato al PORTB no pasa nada. Nuevamente señalo que uso el PIC16C77 ya que no se dispone de la version F en PROTEUS. Espero sus comentarios compañeros...
-
Hola, ¿qué justificación le das a la conversión ADC? ¿Izquierda o derecha?
¿Configuraste el puerto B como salida? TRISB=0x00
-
El ADC de este micro es de solo 8 bits, por lo tanto no aplica lo de la justificacion izquierda/derecha. El puerto B esta configurado como salidas totalmente.
bsf STATUS,RP0
movlw 0x00
movwf ADCON
movlw 0x00 ; Configuro todo el puerto B
movwf PORTB ; como salidas.
bcf STATUS,RP0
Trato de evitar el uso de TRISB debido a un ¡WARNING! que se genera al compilar.
-
El ADC de este micro es de solo 8 bits, por lo tanto no aplica lo de la justificacion izquierda/derecha. El puerto B esta configurado como salidas totalmente.
bsf STATUS,RP0
movlw 0x00
movwf ADCON
movlw 0x00 ; Configuro todo el puerto B
movwf PORTB ; como salidas.
bcf STATUS,RP0
Trato de evitar el uso de TRISB debido a un ¡WARNING! que se genera al compilar.
Debes configurar el TRISB para las direcciones, no el PORTB.
movlw 0x00 ; Configuro todo el puerto B
movwf TRISB ; como salidas.
-
Escribir en el PORTB estando en el banco 1 es equivalente a escribir sobre el TRISB. Trata a probar con el codigo que puse y veras que es correcto. Cualquier simulacion con el PIC16F77 que he realizado en PROTEUS ha sido exitosa, el unico detalle que he encontrado es con el ADC.
Saludos...
-
Sí es cierto, disculpa, estaba pensando en PIC18.
Talvez si adjuntas el archivo de proteus se pueda encontrar el problema. Yo no pude encontrar algo raro en el asm.
-
Ustedes disculparan mi torpeza caballeros pero no pude subir el esquematico al foro, a lo mas que logre es a ponerlo como un adjunto, apenas empiezo asi que... sorry.
En fin, espero que esta imagen sea util... saludos!!!
-
Hola, puedes comprimir el archivo en un zip o rar y adjuntarlo.
Sobre la imagen que pones, no encontré problemas de conexión.
-
Antes que nada agradezco el interes y el seguimiento que ha dado a este tema migsantiago. Pues bien, he agregado los archivos necesarios para que verifiquen el problema al que me refiero. Sobre el visor de registros de PROTEUS coloco los registros ADRES, ADATO y PORTB, como podran ver el dato en ADRES (el cual si cambia) no se transfiere ni al registro de usuario (ADATO) ni al puerto.
Cabe mencionar que utilizo la version 7.6 de PROTEUS y el compilador MPASMwin v5.20. Espero sus valiosos comentarios, saludos!!!
-
Hola, ya lo probé y encontré el problema pero no la solución.
Corriéndolo paso a paso el programa hace todo bien hasta aquí:
movf ADRES,0
movwf ADATO
movwf PORTB
Cuando ADRES debe pasar a W el valor de W se pone a 0x00... no entiendo el porqué.
Debe ser un bug de proteus. Prueba con un protoboard y un juego de leds.
-
Hay alguna manera de corregir el error (en caso de que asi sea) accediendo a las librerias del PROTEUS?, es eso posible?
-
He visto que son DLL las encargadas de simular cada PIC. Lo veo complicado.