TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: polo1984 en 06 de Marzo de 2007, 16:08:59
-
hola a todos!
estoy intentando comunicarme con el MAX1270, que es un adc de 12 bits, con rangos de entrada que se pueden configurar a traves de un micro. adjunto el cronograma que tengo que dan las hojas caracteristicas y el programa que tengo hecho y que no me funciona, ya que siempre visualizo un 0 en el display.
La señal de reloj del adc segun hojas caracteristicas debe estar entre 2mhz y 0,1mhz. tambien se puede usar el spi cone l max1270...pero no tengo ni idea y me estoy volviendo loco simplemente con el reloj externo
#include "D:\PROGRAMACION PROYECTO\PROGRAMACION\ADC\max1270-1.h"
#include "lcd.c"
#use fast_io(B)
#use fast_io(A)
/* pines
A0=sck
A1=cs
A2=din (dato de entrada del MAX1270, salida en el micro)
A3=dout (dato de salida del MAX1270, entrada en el micro)
A4=sstrb (en el programa no lo uso para nada)
*/
void main()
{
int config=0b10000001; //saldra el LSB el primero,
int i=0,j=0;
int16 dato_adq=0;
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
// TODO: USER CODE!!
set_tris_a(0b00011000); //sck, cs, din pines de salida; dout,sstrb pines de entrada
output_high(PIN_A1); //configuracion inicial del puerto A cs=1
output_low(PIN_A0); //sck=0
output_low(PIN_A2); //din=0
lcd_init();
output_low(PIN_A1); //activamos cs MAX1270
delay_us(2); //esperamos tiempo activacion de sobra-->Tsdv=200n (espero 2us)
for(j=0;j<30;j++){ //para tomar 30 muestras
// This shifts 8 bits out PIN_A2, LSB first.
for(i=0;i<8;++i)
{
output_bit(PIN_A2,shift_right(&config,1,0)); //sacamos dato por PIN_A2
output_high(PIN_A0); //subimos reloj, adquiere datos el ADC
delay_us(2); //esperamos tiempo nivel alto reloj 250khz aproximadamente
output_low(PIN_A0); //bajamos reloj
delay_us(2); //esperamos tiempo nivel bajo reloj
}
for(i=0;i<5;i++)
{
output_high(PIN_A0);
delay_us(2); //esperamos tiempo nivel alto reloj
output_low(PIN_A0); //bajamos reloj
delay_us(2); //esperamos tiempo nivel bajo reloj
}
for(i=0;i<12;i++)
{
shift_left(dato_adq,2,input(PIN_A3)); //leemos datos de entrada dout
output_high(PIN_A0); //subimos reloj
delay_us(2); //esperamos tiempo nivel alto reloj
output_low(PIN_A0); //bajamos reloj
delay_us(2); //esperamos tiempo nivel bajo reloj
}
printf(lcd_putc,"\f"); //borramos display
printf(lcd_putc,"dato %u\n%Lu",j,dato_adq); //escribimos datos en el lcd
delay_ms(3000); //esperamos 3 segundos-->se toma nueva muestra
}
for(;;) {}
}
seguire probando pero la verdad que despues de 4 dias no consigo ver nada...
por cierto la parte de codigo que contiene shift_right y shift_left las saque de la ayuda del ccs o del foro (no me acuerdo muy bien) pero no llego a comprender todos los parametros.
alguien ve algun fallo entre el cronograma y el codigo o algo relevante por lo que no me funcionaria??
bueno un saludo a todos y gracias
-
hola de neuvo a todos
el programa que puse arriba no me funciona, me he inventado una forma de ver los datos que van saliendo un poco mala pero creo que me servira ante la falta de un osciloscopio, conectar las salidas en serie del micro a un puerto vacio y visualizar un 1 o un 0 segun el nivel de la salida que tendria que ir al adc.
el problema que veo es que no se sacar datos serie...no me funciona, porngo la parte de programa:
for(j=0;j<8;j++) //envia datos
{
printf(lcd_putc, "%u%u",j, config_a[j]); //visualizo el nº del bit serie a mandar y si es 1 o 0
output_low(SCK); //bajo reloj
if(input(PIN_A2)==0){printf(lcd_putc,"_");} //a2 conectado a la señal SCK
if(input(PIN_A2)==1){printf(lcd_putc,"-");}
delay_us(1);
output_bit(DIN, config_a[j]); //saco dato por el pin
delay_us(1);
if(input(PIN_A3)==1){ printf(lcd_putc,"1");} //a3 conectado al pin DIN
if(input(PIN_A3)==0){ printf(lcd_putc,"0");}
output_high(SCK); //subo reloj (el adc adquiere el dato en el flanco de subida)
if(input(PIN_A2)==0){printf(lcd_putc,"_");}
if(input(PIN_A2)==1){printf(lcd_putc,"-");}
delay_us(2);
if(j==2)
{
printf(lcd_putc,"\n");
}
}
while(1){}
la variable config_a la he declarado de la siguiente manera:
int1 config_a[]={1,0,1,0,1,0,1,0};
el problema que tengo es que esos datos no se visualizan en el lcd como deberia salir, segun se visualiza son todos 0, por lo que no saca bien los datos por el pin, ¿alguien ve algun fallo o ha sacado datos via serie por un pin? porque estoy un poco perdido y veo que no avanzo...si tuviesen un ejemplillo sencillo con las variables declaradas me serviria d emucha ayuda
gracias por todo