Por favor alguien me puede hacer el favor de ayudar en este proyecto, esta es mi situacion.
En la escuela me pidieron que pudiera captura los valores de un sensor formado por un arreglo de 256 pixeles de la casa hamamatsu, y que los valores de cada uno de los pixeles los captura mediante el convertidor A/D del propio PIC via el protocolo RS232,
Para ello me facilitaron el compilador de PIC en lenguaje C de CCS ver 3.11.
Los datos del sensor estan aqui;
http://usa.hamamatsu.com/hcpdf/parts_S/S8377-128BQ.pdf Para atender este proyecto, utilice el PIC16F876,por ser uno de los mas comunes entre la tiendas de electronica de Barcelona.
El trabajo lo inicie poniendo en marcha el funcionamiento del arreglo de 256 pixeles, para suy operacion se requiere de dos se;ales de reloj, una usada como disparo o periodo de integracion (SI)y la segunda como sincronismo (clk) hasta este momento todo camino bien.
Este es el codigo que genera los pulsos de operacion del arreglo.
#include <16f876.h>
#device ADC=10 // A/D Result format
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay (CLOCK=10000000)
#use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
#use fast_io (b)
#byte porta = 5
#byte portb = 6
#byte portc = 7
main()
{
int i;
set_tris_a(0x00);
set_tris_b(0x00);
portb=0;
porta=0;
Do
{
bit_set(PORTB,7); //CLK High
bit_set (PORTB,6); //SI High
bit_clear(PORTB,6); //SI High
delay_us(1);
bit_clear (PORTB,7); //CLK Low
delay_us(1);
bit_set (PORTB,6); //SI High
delay_us(1);
bit_set(PORTB,7); //CLK High
for(i=0; i<255; i++)
{
bit_clear(PORTB,7); //CLK Low
delay_us(1);
bit_set(PORTB,7); //CLK High
}
delay_ms(50);
}
while(1);
}
Con este codigo se pudo confirmar el buen funcionamiento del arreglo .
El inconveniente que se presenta y es parte de mi situacion escolar actual (por no desir que estoy reprobado) es que no soy capas de capturar los 256 pixeles o alguna serie de ellos (64 0 128 picxels) utilizando las funciones del convertidor A/D para poder enviarlo via el protocolo RS/232 y observar los resultados en la hipertimal de windows. Para despues con la hoja de Excell poder ver su dibujo, la idea es el poder improvisar un espectro segun si se incide poco o mucha luz en cada uno de los pixeles del sensor.
Me comentan mis compaeros que el pic no es el adedcuado, que tiene poca memoria que es muy lento, etc, etc..
Uno de mis amigos me propuso emplear interupciones, en lo particular no soy muy habil programandolas y creo que menos las del convertidor A/D con el lenguaje C.
Este es lo ultimo que puedo hacer en lo refernte al codigo, y observo que no funciona..
#include <16f876.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#device ADC=10
#use delay(CLOCK = 10000000)
#use rs232(BAUD = 9600, XMIT = PIN_C6, RCV = PIN_C7)
#byte porta = 5
#byte portb = 6
#byte portc = 7
unsigned char Data[64];
unsigned long indice=0;
#INT_AD
void rutina_AD()
{
Data[indice]=read_adc(ADC_READ_ONLY);
indice++;
}
void main (void)
{
long data; // Variable para los datos del A/D.
int i;
int j;
int k; // Variable para el inicio del retardo.
//analog data 1
Setup_adc_ports (RA0_RA1_RA3_ANALOG); //RA3 is Ref+ others A/D
Setup_adc (ADC_CLOCK_DIV_32); //Fosc/32 FULL speed
set_tris_a(0x00); // Los puertos a y b se configuran como salida
set_tris_b(0x00); // Si se busca que sean entradas, basta con colocar FF
portb=0; // Inicialisa el puerto "a" a cero
porta=0; // Inicialisa el puerto "b" a cero
//*** Se definen el inicio de la señal (SI) y (CLK) del S8733***//
//**********************************************************************************//
bit_set(PORTB,7); //CLK High
bit_set (PORTB,6); //SI High
bit_clear(PORTB,6); //SI High
delay_us(1);
bit_clear (PORTB,7); //CLK Low
delay_us(1);
bit_set (PORTB,6); //SI High
delay_us(1);
bit_set(PORTB,7); //CLK High
//*** Se iniciA el ciclo de captura del A/D PIC16F876 una vez en alto la señal (SI) ***//
//*****************************************************************************************/
Set_adc_channel(1); //set channel
Delay_us(10); // retardo en 1 us
enable_interrupts(INT_AD);
enable_interrupts(GLOBAL);
for(i=0; i<64; i++)
{
bit_clear(PORTB,7); //CLK Low
read_adc(ADC_START_ONLY); //iniciar conversion
bit_set(PORTB,7); //CLK High
delay_us(1);
}
delay_ms(50);
disable_interrupts(INT_AD);
//*** Se iniciA el ciclo de captura del A/D PIC16F876, e imprime los 64 valores ***//
//*****************************************************************************************/
for(K=0; k<64; k++) // Se coloca la rutina de 64 ciclos para imprimir
{
Printf ("%4LX",Data[k]);
}
}
No obsante, en opinion de mis amigos cambie de pic y pude comprar el PIC18F452, sin embargo ahora se presenta el problea que el compilador no reconoce la instruccion ADC_READ_ONLY, y ya no se que hacer,
Por favor pueden ayudarme para sacar este proyecto..
Cualquier ayuda les estare muy agradecido por ello.
Gustavo A. Mtz.