Autor Tema: AYUDA, POR FAVOR , ARRAY Y PIC18F452  (Leído 2394 veces)

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

Desconectado gamch2004

  • PIC10
  • *
  • Mensajes: 11
AYUDA, POR FAVOR , ARRAY Y PIC18F452
« en: 22 de Septiembre de 2004, 09:27:00 »
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.


Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2568
RE: AYUDA, POR FAVOR , ARRAY Y PIC18F452
« Respuesta #1 en: 22 de Septiembre de 2004, 11:49:00 »
A ver varias cosas.

- Cambiar de PIC, no creo que sea necesario, con el 876 vas que te matas para lo que quieres hacer.

- De poner un PIC18 no tiene porqué darte error en eso que dices.

- De querer cambiar de PIC, no te lo compres, pídelo como samples a Microchip (a no ser que te urgiera comprobar el funcionamiento)

- Conforme tienes el programa dá error en el Printf ("%4LXr",Data[k]); último ¿no dices nada de esto?

- El funcionamiento del sensor no me lo he mirado, supongo que la programación para él estará bien.

- En el bucle for para la toma de datos tienes un delay_us(1); Esto es muy poco y no le va a dar tiempo a tomar las 64 muestras, ponle 100us, por ejemplo.

- Y ahora lo más importante, ten en cuenta que para transmitir, se transmiten caracteres de 8 bits, no números enteros. Te las tienes que apañar para que el resultado de la conversión sean caracteres, no un número entero, y una vez lo tengas pasado a caracteres podrás enviarlo RS232.

- Si quieres particionar el problema para hacerlo por partes puedes añadir una LCD y comprobar primero en ella que la conversión A/D funciona, luego la quitas y pruebas la comunicación RS232.

- Si todas estas pruebas las puedes hacer en el PROTEUS ganarás tiempo.

Un saludo

Desconectado gamch2004

  • PIC10
  • *
  • Mensajes: 11
RE: AYUDA, POR FAVOR , ARRAY Y PIC18F452
« Respuesta #2 en: 23 de Septiembre de 2004, 05:24:00 »
GRACIAS AMIGO PORCHE, EN VERDAD TE ESTOY MU AGRADECIDO POR LA AYUDA, SI ME LO PERMITES TE PUEDO COMENTAR QUE EN EFECTO EL PIC18  NO PUDE UTILIZARLO, POR TAL RAZON ME TUVE QUE CONFORMAR CON EL PIC16F876. SIN EMBARGO Y EN OPINION DE MI PROFESOR EMPEZE DE NUEVO, CONSIDERANDO AHORA EL PIC16F874 PENSANDO EN  EL HECHO QUE HACIA  FALTA RECURSOS DE MEMORIA, ADQUIRI EL PIC16F874, HASTA ESTE MOMENTO,  HEMOS CONINCIDIDO EN QUE EL TIEMPO DE DURACION  DE LA  SEÑAL  DE CLK SI ES MUY PEQUEÑA ,YA QUE DEPENDIENDO DEL VALOR EN ALTO DEL CLK, ES POSIBLE EL DAR MAYOR TIEMPO AL CONVERTIDOR PARA CAPTURAR CADA PIXEL.

POR LO QUE ESTUVE PROBANDO CON EL ARREGLO EL MEJOR INTERVALO DE TIEMPO  PARA  LA SEÑAL DE CLK PERMITA QUE EL SENSOR FUNCIONE LO MAS LENTO POSIBLE, Y ESTABLECI QUE EL TIEMPO DE RETARDO SERIA DE 3ms Y NO 1us  COMO ESTABA INICIALMENTE, POR LO QE EL PROGRAMA PROBADO PARA EL SESNOR QUEDO ASI:

include <16f874.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT

#use delay (CLOCK=20000000)
#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++)
{
delay_ms(3);
bit_clear(PORTB,7); //CLK Low
delay_ms(3);
bit_set(PORTB,7); //CLK High
}
delay_ms(75);
}
while(1);
}

LO QUE AHORA NO SE, ES COMO MANEJAR EL CONVERTIDO A/D PARA PODER CAPTURAR CADA  PIXEL Y SOBRE COMO INTEGRAR EL PROGRAMA PARA GENERAR LOS PULSOS, EL CONVERTIDOR A/D  Y SU ENVIO RS-232.

PARA ESTE ULTIMO DEL RS-232  NO SE SI ES CONVENIENTE EL GURDAR LOS DATOS DEL CONVERTIDOR A/D EN UN ARREGLO Y POTERIORMENTE INVIARLOS TODOS, O BIEN ENVIAR UNO A UNO  CADA UNO DE LO VALORES DE VOLTAJE DE LOS PIXELES COMO SEVAN LEYENDO.

HASTA ESTE MOMENTO ESLO QUE HE PODIDO HACER, SI ME LO PERMITES TE ANEXO EL ARCHIVO DE LO QUE SE QUIERE HACER,
UN SALUDO Y AGRADEZCO CUALQUIER AYUDA QE PUEDAN .


GRACIAS

 

Desconectado pacalaconcurso

  • PIC24F
  • *****
  • Mensajes: 718
RE: AYUDA, POR FAVOR , ARRAY Y PIC18F452
« Respuesta #3 en: 23 de Septiembre de 2004, 07:58:00 »
me acorde de tu proyecto al leer este artículo...
no he profundizado en el tema, pero parece que es muy similar a lo que necesitas.

pulsa aqui

saludos

Desconectado gamch2004

  • PIC10
  • *
  • Mensajes: 11
RE: AYUDA, POR FAVOR , ARRAY Y PIC18F452
« Respuesta #4 en: 25 de Septiembre de 2004, 04:59:00 »
Gracias amigos  y en este caso amigo palo solo, sigo trabajando y el proyecto es muy interesante la información que me has mostrado,en lo particular  me es confudo pues no entiendo el ingles, y creo que tan slolo comenta muy general su proyecto el amigo victor, de antemano muchas gracias por la información,

No obstante, cualquier otra ayuda que me puedan proporcionar, yo les estare muy agradecido, porque digo esto. Pues ya me reprobe, y ahora por puro orgullointentare sacar este proyecto, por lo que les pido nuevamente su ayuda.

Muchas gracias una vez mas amigos de este foro.

Desconectado gamch2004

  • PIC10
  • *
  • Mensajes: 11
RE: AYUDA, POR FAVOR , ARRAY Y PIC18F452
« Respuesta #5 en: 28 de Septiembre de 2004, 11:18:00 »
Que tal amigos  espero que todas las actividades se esten efectuando de la mejor manera posible. En esta ocasión me permito escribirte a efecto de pedir una vez mas su valiosa opinión en cuanto a lo que me ha pasado en el proyecto del sensor array

El amigo palo me recomendo observar este proyecto.

http://www.smithstuff.net/image/Imagecap.htm

La idea principal  que se obtuvo de este caso es que el tiempo requerido por el convertidor a/d del pic16f877 es de almenos 80mseg, (tiempo que es muy lento como para el tiempo del orden de miccrosegundo que utilisa cada pixel del arreglo del sensor.) y que recomendaba convertidores externos como exemplo ADC0820CN que es un convertidor tipo flash y cuyo tiempo de conversion es de 1.5 microsegundos.

Por lo que retome la idea, pero en este caso  se utiizo el converidor LTC1298 que tiene una resolución de12 bits y que su tiempo de convesion es de 50 microsegundos, la aplicación se encuentra dentro del propio compilador CCS.

Con esta información y con la experiencia obtenida en que el tiempo mas largo con que  puede operar el sensor, fue del orden de 3milisegundos, y cuyo codigo es el siguiente:


include <16f874.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT

#use delay (CLOCK=20000000)
#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++)
{
delay_ms(3);
bit_clear(PORTB,7); //CLK Low
delay_ms(3);
bit_set(PORTB,7); //CLK High
}
delay_ms(75);
}
while(1);
}

Se decidio conjuntar las dos aplicaciones  tanto el convertir ltc1298 y la del operacion del arreglo de pixeles, y esto fue el resultado.

/////////////////////////////////////////////////////////////////////////
////                          EX_AD12.C                              ////
////                                                                 ////
////  This program will read two A/D channels and display the        ////
////  results as both a voltage and raw hex number over the RS-232.  ////
////  A reading is taken every second. This can be done using either ////
////  the LTC1298 chip or the MCP3208 chip.                          ////
////                                                                 ////
////  Configure the CCS prototype card as follows:                   ////
////                                                                 ////
////     Using the LTC1298:                                          ////
////     LTC1298    Protoboard                                       ////
////         1           50  B3                                      ////
////         2            9  analog-1                                ////
////         3           10  analog-2                                ////
////         4           27  gnd                                     ////
////         5           49  B2                                      ////
////         6           48  B1                                      ////
////         7           47  B0                                      ////
////         8           28  +5V                                     ////
////                                                                 ////
////     Using the MCP3208:                                          ////
////     MCP3208    Protoboard                                       ////
////         1            9  analog-1                                ////
////         2           10  analog-2                                ////
////         3..8        Not Connected                               ////
////         9           27  gnd                                     ////
////        10           50  B3                                      ////
////        11           49  B2                                      ////
////        12           48  B1                                      ////
////        13           47  B0                                      ////
////        14           27  gnd                                     ////
////        15           28  +5V                                     ////
////        16           28  +5V                                     ////
////                                                                 ////
////     See additional connections below.                           ////

#include <16F874.h>
#fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay(clock=20000000)          // Crystal on the realer Hardware 10 Mhz
#use rs232 (BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)

#include <ltc1298.c>

#use fast_io (b)
#byte porta = 5
#byte portb = 6
#byte portc = 7

void display_data( long int data )
{

  char volt_string[6];
   convert_to_volts( data, volt_string );
    printf(volt_string);

}


Void main()
 {

 int i;
   int  cuenta;
     long int value;
  set_tris_a(0x00);
  set_tris_b(0x00);

   portb=0;
   porta=0;

     cuenta=0;

    adc_init();



if (cuenta<1);

   {

 bit_set(PORTB,7);    //CLK High
    bit_set (PORTB,6);    //SI High

     bit_clear(PORTB,6);    //SI High
     delay_ms(1);
     bit_clear (PORTB,7);    //CLK Low

         delay_ms(1);
         bit_set (PORTB,6);    //SI High
         delay_us(1);
         bit_set(PORTB,7);    //CLK High

         for(i=0; i<255; i++)
        {
            delay_ms(1);
            bit_clear(PORTB,7);    //CLK Low
            value = read_analog(0);
              printf("
";
                   display_data( value );
            delay_ms(1);
            bit_set(PORTB,7);    //CLK High
        }

       ++cuenta;

      }

}

Este codigo funciona y si obtengo lecturas de voltaje en la hiperterminal de windows, ahora lo que me esta pasando es que el convertidor captura demasiado rapido, por lo que el sensor es muy lento,

Por esta razón quisiera pedir su opinión, si en verdad me  encuentro leyendo valores de voltaje de cada pixel, o bien estoy leyendo otra cosa,

Creo que lo que hace falta, es poder sincronizar el tiempo de captura del convertidor con el que utiiza el propio arreglo de pixeles.

Por favor, me pudiera dar su valiosa opinón.


 

anything