Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

01/10/2014 #1


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
01/10/2014 #2

Avatar de JoaquinFerrero

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.
01/10/2014 #3

Avatar de Daniel Meza

Aparte de el comentario del amigo Joaquín no está por demás sugerirte que mejor uses para esa acción el módulo comparador analógico que trae internamente ese PIC, claro está si es que sólo quieres hacer la comparación y no hacer más con las muestras.

Consulta la hoja de datos del PIC para más info del módulo que te menciono

http://ww1.microchip.com/downloads/e...Doc/41203D.pdf

Saludos
02/10/2014 #4

Avatar de JoaquinFerrero

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.
02/10/2014 #5


JoaquinFerrero dijo: Ver Mensaje
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.

A que te refieres con etiqueta?

Muchisimas gracias!!
02/10/2014 #6

Avatar de JoaquinFerrero

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).
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.