Comparador de datos en pic16F688

#1
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

Última edición por un moderador:
#2
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:
#4
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.
 
#6
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).
 

Temas similares

Arriba