Autor Tema: problemas de comunicacion entre pic16f876a y max1270  (Leído 1861 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado polo1984

  • PIC10
  • *
  • Mensajes: 13
problemas de comunicacion entre pic16f876a y max1270
« 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

Código: [Seleccionar]
#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



Desconectado polo1984

  • PIC10
  • *
  • Mensajes: 13
Re: problemas de comunicacion entre pic16f876a y max1270
« Respuesta #1 en: 11 de Marzo de 2007, 12:49:48 »
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



 

anything