Hola muy buenas,
Ya llevo dos semanas intentando configurar mi PIC16F877 y mi conversor ADC, MAX187 de 12 bits. El problema esta en que el dato que leo a través de mi display 16x2, es el doble del valor que realmente estoy midiendo con mi tester. Después de modificar un driver de los que aporta el compilador CCS C, que es el que estoy utilizando, concretamente el del ADS8320.c, no hay forma de que me de el valor real. Hace unos días conseguí que el valor sea estable, ya que tenía oscilaciones. Leyendo el datasheet del MAX187, en modo SPI, me pide que lea los 12 bits en dos byte, pero no hay forma. ¿Alguien me puede ayudar?
Este es le código del programa principal:
#include "C:\Program Files C\20060405_prueba_spi.h"
#include <max187.c>
#include <lcd.c>
#include <math.h>
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use fast_io (E)
#byte port_a=0X05
#byte port_b=0X06
#byte port_c=0X07
#byte port_d=0X08
#byte port_e=0X09
#ifndef MAX4534_EN
#define MAX4534_A0 PIN_A0
#define MAX4534_A1 PIN_A1
#define MAX4534_EN PIN_A2
#endif
void main()
{
float value;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
set_tris_a(0x00); //Puerto A como salida
set_tris_b(0x00); //Puerto B como salida
set_tris_c(0b11010111); //Puerto C como entrada/salida
set_tris_d(0xFF); //RD0...RD7 salidas
set_tris_e(0x00); //RE0...RE2 entradas
port_b=0;
port_a=0;
/*Inicializamos LCD*/
lcd_init(); //Inicia LCD
lcd_putc(" Tension de\n"); //Saca texto
lcd_putc(" Referencia"); //Saca texto
delay_ms(2000);
lcd_putc("\f"); //Limpia pantalla
lcd_putc("Valor\n"); //Saca texto
lcd_putc("actual"); //Saca texto
delay_ms(2000);
lcd_gotoxy(14,2); //Acomoda cursor LCD
lcd_putc("V");
while (1)
{
output_high(MAX4534_EN); //Inicializamos multiplexor MAX4534
output_low(MAX4534_A1); //Salidas para ver la tensión de referencia
output_high(MAX4534_A0);
init_ext_adc(); //Inicializamos MAX187
value = read_ext_adc(); //Leemos el valor del AD
lcd_gotoxy(8,2); //Acomoda cursor LCD
lcd_putc(" "); //Limpia ese sector de pantalla
lcd_gotoxy(8,2); //Acomoda cursor LCD
printf(lcd_putc,"%03.2f",value); //Tension en [V]
delay_ms (2000);
value=0;
}
}
Y este el driver del MAX187:
//////////////// Driver for MAX187 A/D Converter ///////////////////////
//// ////
//// init_ext_adc() Call after power up ////
//// ////
//// value = read_ext_adc() Converts to digital number ////
//// and sends to MCU ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#ifndef MAX187_CS
#define MAX187_DOUT PIN_C4
#define MAX187_SCLK PIN_C3
#define MAX187_CS PIN_C2
#endif
void init_ext_adc() {
output_low(MAX187_CS);
output_low(MAX187_SCLK);
}
long read_ext_adc() {
int i;
long data;
data=0;
delay_us(86); //Espero 86 us, para iniciar la conversion (tCONV)
output_low(MAX187_CS);
for(i=0;i<13;++i) { // send sample over spi
output_low(MAX187_SCLK);
delay_us(1);
shift_left(&data,2,input(MAX187_DOUT)); //Leo en dos byte la salida del conversor
output_high(MAX187_SCLK);
delay_us(1);
}
delay_us(10);
output_high(MAX187_CS);
return(data);
}
float convert_to_volts(long data) {
return ((float)data*5.0/0xFFFF);
}
Muchas gracias de antemano