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.
Soy principiante y no se si esta muy bien hecho el programa. Me prestan un poco de ayuda? Muchas gracias!
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: