Autor Tema: Por favor pueden ayudarme con este proyecto.  (Leído 1842 veces)

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

Desconectado gamch2004

  • PIC10
  • *
  • Mensajes: 11
Por favor pueden ayudarme con este proyecto.
« en: 11 de Septiembre de 2004, 05:15:00 »
Reciban un cordila saludo, mi nombre es Gustavo Martinez, estudiante de la U.P.C. en Barcelona y como podran darse cuenta nuevo en este foro.

El motivo de mi mensaje es el de pedirle por favor su opinion y de no tener inconveniente su ayuda, entorno a un problema que me sucito durante uno de los proyectos de microntroladores, y que a la fecha sigo sin poder resolver, y se relaciona con el uso de algun tipo de PIc.

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]);

}

}


Por favor pueden ayudarme para sacar este proyecto..

Cualquier ayuda les estare muy agradecido por ello.



Gustavo A. Mtz.
E_mail: gamartinezch@yahoo.com
 
 

Desconectado cucaracha

  • PIC24H
  • ******
  • Mensajes: 1409
    • CUCAWEB
RE: Por favor pueden ayudarme con este proyecto.
« Respuesta #1 en: 11 de Septiembre de 2004, 07:27:00 »
Sólo he mirado el código por encima...

No veo que guardes los datos leídos por el AD en data[indice].
Revisa la configuración del AD. Por encima, si vas a usar Vref en Ra3 no es como pones. Sería por ejm  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);. Mira de todos modos en el .c del micro, en las definiciones de éste, que ahí viene. Yo lo he cortado de un programa para 18f452 que tengo, y quizás cambie, pero creo que no. Yo lo tengo configurado, como ejemplo:
Codigo:
  setup_adc_ports(RA0_RA1_ANALOG_RA3_REF);
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(1);

luego simplemente para adquirir:
      lectura=read_adc();



De todos modos es sólo como ejemplo, no digo que sea así como debe ser. Simplemente te digo que revises esa parte.

Empieza por ahí...
Interesante proyecto, sí...
Saludos!
Saludos desde Huelva (ESPAÑA)