Author: Not specified Language: c
Description: Not specified Timestamp: 2018-06-22 22:24:04 +0000
View raw paste Reply
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 8000000 //8MHz
#include "flex_lcd.h"

// CONFIG1
#pragma config FOSC = INTRC_CLKOUT// Oscillator Selection bits (INTOSC oscillator: CLKOUT function on RA6/OSC2/CLKOUT pin, I/O function on RA7/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = ON       // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown Out Reset Selection bits (BOR enabled)
#pragma config IESO = OFF       // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF        // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)

// CONFIG2
#pragma config BOR4V = BOR40V   // Brown-out Reset Selection bit (Brown-out Reset set to 4.0V)
#pragma config WRT = OFF

int main(void) {
    TXSTAbits.TXEN = 1;
    TXSTAbits.BRGH = 1;
    RCSTAbits.SPEN = 1;
    RCSTAbits.CREN = 1;
    SPBRG = 25;
    ADCON1bits.VCFG0 = 1; //Voltaje de referencia tomado de Vref+
    ADCON1bits.VCFG1 = 1; //Voltaje de referencia tomado de Vref-
    int adc = 0; //variable 16 bits para guradar lectura
    int adc1 = 0; //variable 16 bits para guradar lectura
    char buffer_temp[20]; //string para guradar mensajes de lcd
    char serial_temp[3]; //string para guradar mensajes de lcd
    char buffer_temp_1[20]; //string para guradar mensajes de lcd
    char serial_temp_1[3]; //string para guradar mensajes de lcd
    char buffer0[20]; //string para guradar mensajes de lcd
    int entero = 0;
    int entero_1 = 0;
    float temp1 = 0; //variable para guradar la conversión a voltaje
    float temp = 0; //variable para guradar la conversión a tempetatura
    Lcd_Init();
    while (1) {
        ANSEL = 0; //seleccionamos los puertos como digitales
        ANSELH = 0;
        TRISA = 0xff; //todo el puerto A como entrada
        ANSELbits.ANS3 = 1; //seleccionamos el canal AN3 como entrada ADC

        ADCON0bits.ADCS0 = 0; //seleccionamos periodo de conversion TaD
        ADCON0bits.ADCS1 = 0;

        ADCON0bits.CHS0 = 0; //Seleccionamos el canal 4
        ADCON0bits.CHS1 = 0;
        ADCON0bits.CHS2 = 1;
        ADCON0bits.CHS3 = 0;

        ADCON1bits.ADFM = 1; //resultado justificado a la derecha
        ADCON0bits.ADON = 1; //encendemos ADC
        __delay_ms(1); //esperamos a que cargue
        ADCON0bits.GO = 1; //lanzamos la conversión
        while (ADCON0bits.GO); //esperamos a que acabe la conversión
        ADCON0bits.ADON = 0; //apagamos el ADC
        __delay_ms(1);
        adc = ADRESH; //guardamos la parte alta del resultado
        adc = adc << 8; //recorremos los bits a la derecha
        adc = adc + ADRESL; //añadimos la parte alta del resultado
        temp = ((float) adc / 1023.00) * 50.00;
        entero = temp;
        temp -= entero;
        if (temp >= .5) {
            //printf("%d.5\n", entero);
            sprintf(buffer_temp, "TEMP = %d.5 oC   ", entero); //guardamos el mensaje a desplegar
        } else {
            sprintf(buffer_temp, "TEMP = %d.0 oC   ", entero); //guardamos el mensaje a desplegar
        }
        //sprintf(buffer_temp, "TEMP = %.02f oC   ", temp); //guardamos el mensaje a desplegar
        sprintf(serial_temp, "%d", ((int) entero)); //guardamos el mensaje a desplegar
        for (int i = 0; i < 3; i++) {
            while (PIR1bits.TXIF != 1);
            TXREG = serial_temp[i];
        }
        TXREG = ','; // Mandamos una , para poder separar los valores de la lectura serial

        ADCON0bits.CHS0 = 1; //Seleccionamos el canal 1
        ADCON0bits.CHS1 = 0;
        ADCON0bits.CHS2 = 0;
        ADCON0bits.CHS3 = 0;

        ADCON1bits.ADFM = 1; //resultado justificado a la derecha
        ADCON0bits.ADON = 1; //encendemos ADC
        __delay_ms(1); //esperamos a que cargue
        ADCON0bits.GO = 1; //lanzamos la conversión
        while (ADCON0bits.GO); //esperamos a que acabe la conversión
        ADCON0bits.ADON = 0; //apagamos el ADC
        __delay_ms(1);
        adc1 = ADRESH; //guardamos la parte alta del resultado
        adc1 = adc1 << 8; //recorremos los bits a la derecha
        adc1 = adc1 + ADRESL; //añadimos la parte alta del resultado
        temp1 = ((float) adc1 / 1023.00) * 50.00;
        entero_1 = temp1;
        temp1 -= entero_1;
        if (temp1 >= .5) {
            //printf("%d.5\n", entero);
            sprintf(buffer_temp_1, "TEMP1 = %d.5 oC   ", entero_1); //guardamos el mensaje a desplegar
        } else {
            sprintf(buffer_temp_1, "TEMP1 = %d.0 oC   ", entero_1); //guardamos el mensaje a desplegar
        }
        //sprintf(buffer_temp_1, "TEMP1 = %.02f oC   ", temp1); //guardamos el mensaje a desplegar
        sprintf(serial_temp_1, "%d", ((int) entero_1)); //guardamos el mensaje a desplegar

        for (int i = 0; i < 3; i++) {
            while (PIR1bits.TXIF != 1);
            TXREG = serial_temp_1[i];
        }
        TXREG = '\n';
        Lcd_Out(1, 0, buffer_temp); //desplegamos el valor del temp
        __delay_ms(10);
        Lcd_Out2(2, 0, buffer_temp_1); //desplegamos el valor del temp1
        __delay_ms(10);
    }

    return 0;
}
View raw paste Reply