Comparador de datos en pic16F688

El programa que se adjunta tiene la siguiente mision:

Tomar un dato analogico de RA0 , convertirlo a digital y guardarlo.
Tomar un dato analogico de RA1, convertirlo a digital y guardarlo.

Comparar los dos datos.


  • Si dato RA0>RA1 activamos la salida digital del puerto c RC1

    Si dato RA1>RA1 activamos la salida digital del puerto c RC0


Soy principiante y no se si esta muy bien hecho el programa. Me prestan un poco de ayuda? Muchas gracias! :)

Código:
list     p=16f688 ;indica el tipo de micro utilizado

#include <p16f688.inc> ;incluye elm fichero donde se indican los registros del  propio micro

__CONFIG _CP_OFF & _CPD_OFF & _BOD_OFF & _PWRTE_OFF & _WDT_OFF &_INTRC_OSC_NOCLKOUT & _MCLRE_OFF & _FCMEN_OFF & _IESO_OFF ;opciones de configuración del micro (.inc file)



;*****************************************************************
;         Variables
;*****************************************************************

; <label> EQU <expr> , asigna el valor expr a la etiqueta label. En este caso son registros a los que se les asigna una dirección de memoria
   
 dato0 EQU   0X61
 dato1  EQU   0X62

;*****************************************************************
;         Inicio
;*****************************************************************

;garantiza las condiciones de inicio del programa


org   0x000 ;resetear el procesador
nop ;no operation (no hace nada)
clrf  PCLATH ;borra el registro desde donde se carga el contador de programa
goto  Initialize ;ir a una dirección: “Initialize”
ORG   004h ;interrumpe la localización de vectores
retfie ;vuelve de la interrupción

;*****************************************************************
;          Initialize I/O ports and peripherals
;*****************************************************************

;se habilitan todas las entradas y salidas (E/S) y periféricos
Initialize


bsf      STATUS, RP0 ; cambio al banco1. En el registro STATUS se guarda el resultado de la ALU. Bsf=Pone en un bit 1(01).
movlw    B'11111111' ;mover al registro W un binario (B)
movwf    TRISA ; 1 = PORTA pin configured as an input  Todas las entradas del puerto A se ponen como entradas.
movlw    B'00000000'
movwf    TRISC ;configuramos como salidas todo los pines del puerto C
movlw    B'00000000'
movwf    OPTION_REG ;configuramos opciones de timer0 y del puerto A


bcf      STATUS, RP0; bank0
movlw    B'00000000'
movwf    PORTC
movlw    B'00000000'
movwf    PORTA
; borramos todos los bits de los puertos A y C




;*****************************************************************
;           Setup A/D converter
;*****************************************************************

;cargar el conversor analógico-digital

movlw    B'00000001'
movlw    B'01010000'
movwf    ADCON1 ;se selecciona el reloj de conversión  101 = FOSC/16 (16Mhz)
bcf      STATUS, RP0 ;cambio al banco0. Pone en un bit 0 (00).
movlw    03h
movwf    ADCON0;activa el modulo de conversión



;*****************************************************************
;                Rutina principal
;*****************************************************************

;se establece como entrada analógica la correspondiente al bit que lleva un 1  RA0 (bit 0 del portA)  de ahí tomamos la señal.

bsf      STATUS, RP0 ; cambio al banco1
movlw    B'00000001'
movwf    ANSEL

; convertimos este dato a digital
movlw ’10000001’ ;Right justify,
movwf ADCON0 ;Vdd Vref, AN0, On
bsf ADCON0,GO ;Start conversion
btfsc ADCON0,GO ;Is conversion done?
goto $-1 ;No, test again

;el dato se guarda en ADRESH y ADRESL.


bcf      STATUS, RP0; bank0
movf     ADRESH, W ;mueve el dato del fichero ADRESH a W
movwf  dato1 ;mueve el dato en w a dato1

;se establece como entrada analógica la correspondiente al bit que lleva un 1  RA1 (bit 1 del portA)  de ahí tomamos la segunda señal.

bsf      STATUS, RP0 ; cambio al banco1
movlw    B'00000010'
movwf    ANSEL

 ; convertimos este dato a digital
movlw ’10000001’ ;Right justify,
movwf ADCON0 ;Vdd Vref, AN0, On
bsf ADCON0,GO ;Start conversion
btfsc ADCON0,GO ;Is conversion done?
goto $-1 ;No, test again


bcf      STATUS, RP0; bank0
movf     ADRESH, W ;mueve el dato del fichero ADRESH a W
movwf  dato2 ;mueve el dato en w a dato2

;tenemos los dos datos (entrada) en dato1 y dato2
;procedemos a compararlos

movlw dato0>dato1


btfss    STATUS, Z ; Si el bit Z en Status es 0 (Z=0) (la operación ha resultado ser TRUE=1), se ejecuta la siguiente; si no la siguiente instrucción se la salta(nop).


;deseamos que se active la salida correspondiente al menor valor (RC0 oRC1)
;en el caso de que dato0>dato1
goto ENCIENDE1

;en el caso de que dato1>dato0
goto ENCIENDE0

ENCIENDE0:

Bsf PORTC,0
Clrwdt ;refresca el watchdog

ENCIENDE1:

Bsf PORTC,1
Clrwdt ;refresca el watchdog
	
END
 

Adjuntos

  • micro1.doc
    34.5 KB · Visitas: 3
Última edición por un moderador:
Me temo que

movlw dato0>dato1

no es una instrucción válida.

Lo que debes hacer es cargar uno de los datos en W, y luego restarle (subwf) el valor del otro dato. Según se ponga el valor del flag C, sabrás si son iguales o uno menor que el otro.

Atención... hay otro problema... El conversor A/D es de 10 bits... así que tienes también mal esa parte del programa: no estás leyendo ADRESL (ver página 68 de la hoja de datos). Eso implica que la conversión "cabe" en dos bytes, no uno. Y también implica que hay que hacer dos comparaciones, para comparar los cuatro bytes, dos a dos.
 
Última edición por un moderador:
Otro detalle que acabo de darme cuenta: en las líneas del código que no contienen una etiqueta, deben comenzar con al menos un espacio en blanco, porque si no, el ensamblador las tomará como etiquetas.
 
En ensamblador, si una línea comienza con un literal, el ensamblador lo toma como una etiqueta, es decir: asocia el valor actual del PC a ese símbolo.

De la Wikipedia, Lenguaje ensamblador, Directivas del ensamblador:
Los ensambladores simbólicos le permiten a los programadores asociar nombres arbitrarios (etiquetas o símbolos) a posiciones de memoria. Usualmente, cada constante y variable tiene un nombre para que las instrucciones pueden referir a esas ubicaciones por nombre, así promoviendo el código autodocumentado. En el código ejecutable, el nombre de cada subprograma es asociado a su punto de entrada, así que cualquier llamada a un subprograma puede usar su nombre. Dentro de subprogramas, a los destinos GOTO se le dan etiquetas. Algunos ensambladores soportan símbolos locales que son léxicamente distintos de los símbolos normales (ej, el uso de "10$" como un destino GOTO).
 
Atrás
Arriba