TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: JSP10 en 14 de Julio de 2011, 11:42:04

Título: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 14 de Julio de 2011, 11:42:04
Buenas soy nuevo en el foro! :-/ y necesitaria una ayuda con mi proyecto, el cual consiste en la comunicación de un sensor el cual envia datos en protocolo SPI de 16 bits, y debo recibirlos en la pc, con RS232, osea el pic debe hacer la conversion de los datos de SPI a RS232 para la recepción y de RS232 a SPI para poder pedir el dato que quiero que me envie el sensor.La situacion es la siguiente, el pic a utilizar es el 16f88 en el cual ya he probado la parte de RS232 y funciona sin ningun problema, hasta simulada en Proteus, pero cuando quize hacer algo con SPI no se por donde empezar, :? :( :( vi que proteus tiene un debugger de spi lo conecte he intente enviar algun dato a ese dispositivo pero no pasa nada.Necesitaria que alguien me de una mano con este proyecto por favor. El sensor del cual debo tomar datos es ADIS 16405!!!! , por si algun interesado quiere mirar un poco,para orientarme como debo hacerlo.Desde ya muchas gracias
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 16 de Julio de 2011, 14:09:34
ALGUIEN PUEDE DARME UNA MANOOOOOOOO  EN ESTE TEMA POR FAVOR:shock:  GRACIAS
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: cristian_elect en 16 de Julio de 2011, 15:18:41
Pro no mandas tu avance en ISIS si ya lo tienes a ver si se puede hacer algo.
Pero tu problema no es complicado, sera configurar bien el SPI.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 17 de Julio de 2011, 16:48:46
Buenas,
Esto de cambiar de un protocolo a otro es muy facil.
Tan solo tienes que leer los datos SPI, obtener la información que quieres devolver por RS232 y enviarla en el formato que más te guste por este puerto.
Con los datos que das del proyecto, como que no se te puede ayudar mucho.
Un saludo
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: NoSepComo en 18 de Julio de 2011, 04:30:47
También depende del compilador que uses, si utilizas uno como el CCS ya tiene funciones implementadas para extraer los datos de ambos protocolos de comunicación y enviarlos, lo cual te simplifica muho la tarea, si no lo que tienes que hacer es implementarte tu el protocolo "a pelo" en el PIC y desmenuzar las tramas para recoger los datos del SPI y componerlas para mandarlos por RS232, un poco más coñazo pero se puede hacer bien.
Si necesitas ayuda más específica cuelga tu código o dinos que lenguaje usas, etc. (si es asembler entonces si que será un buen coñazo :P, pero también se puede).
Saludos!
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 18 de Julio de 2011, 13:17:34
Buenas Volviiiiii!!!gracias a los que han estado leyendo mi duda y estan dispuestos ayudarme!!!! :-/ :-/ ahi subi en esquematico en proteus y estoy usando ccs para programar los pic 16f88, la idea seria enviar un dato(dato de 16 bits) desde el pic U3 al U1 en SPI y del U1 a la PC, el pic U3 representaria el sensor ADIS 16405 (a los que les guste la electronica vean la hoja de datos de este bichito) es un sensor de navegacion inercial el cual consta de un magnetometro de 3 ejes un giroscopor de 3 ejes y en aceleromerto de 3 ejes, y esas son las lecturas que debo obtener en la pc.
                   Quisiera comentarles que estuve, en principio intentando comunicar 2 pic (16f88) entre si pero no logré hacerlo.subo el codigo para que lo vean quizas encuentren mi error o mis errores :oops: :oops:Muchas gracias!!! :) :)

PARA EL MAESTRO
#include <16f88.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
int dato=0,valor=1;
void main()
{
set_tris_b(0x02);
setup_spi(SPI_MASTER | SPI_l_TO_h | SPI_CLK_DIV_16);
     spi_write( valor );
     delay_ms(500);
     dato = spi_read();
 
}

PARA EL ESCLAVO

#include <16f88.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)

int nuevodato;
void main(){
set_tris_b(0xf2);
do{

setup_spi(spi_slave | spi_l_to_h | spi_clk_div_16);     //configurar spi como esclavo
   
      if(spi_data_is_in()){    //si hay un dato en el spi
         nuevodato = spi_read();
           if(nuevodato==1){
           
              output_low(pin_b6);
              delay_ms(3000);
              output_high(pin_b6);
              delay_ms(3500);}
     
      }while(true);}
           
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 18 de Julio de 2011, 17:28:21
Mir este link, igual te aclaras un poco.
http://www.wikiteka.com/trabajos/gestion-del-bus-spi-desde-c/
Puede que te fallen un poco las mayusculas y minusculas del código.
En MikroC son un fastidio.
Por otra parte, le estas definiendo la velocidad del reloj al esclavo, y creo que la velocidad la define el maestro.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 19 de Julio de 2011, 12:12:12
Hola PacoP!! ingrese al link que me dejaste, y probé lo de las mayusculas y minisculas, lei bien lo que decia , pero no he podido hacerlo funcionar aun, podrias probar en mismo codigo para que veas que es lo que tiene mal y porque no funciona.Muchas gracias

PD: cualquier interesado que desee ayudarme se muy agredecido de mi parte
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 21 de Julio de 2011, 14:41:18
Hola.
No noto nada raro en el código, salvo que no usas el puerto serie que  viene implementado en hardware sino que usas el puerto A.
En el Pic 16f88, hay que definir muy bien el puerto A como analógico o digital para que funcione, si lo dejas sin definir da problemas.
Prueba a cargar esos programas para la simulación el el 16f876 a ver si te funcionan. Yo lo uso como último recurso cuando el 16f88 me hace cosas raras.
Un saludo.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 22 de Julio de 2011, 04:18:54
Mira este hilo del foro.
http://www.todopic.com.ar/foros/index.php?topic=30247.0
Aparte te subo un manual de ccs. En la página 49 tienes información sobre la configuración de los puertos analógicos.
Un saludo
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: Maxtronic en 23 de Julio de 2011, 03:15:35
El problema es que te siñes al CCS te alejas del hardware de los pic, por buscar lo facil no sale aveces rapido; hay un ejemplo de microchip http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf
Hay esta la configuracion del spi segun manual.
No hay que tomar constumbre con el CCS ese compilador tiene errores para saber si el compilador esta mal se ve el pdf del chip y en la simulacion se ve si el compilador configuro bien.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 24 de Julio de 2011, 03:46:52
http://jftrujilloa.wordpress.com/2011/01/23/comunicacion-spi-entre-pics-18f4550/

Proyecto genial y bien explicado. Ale, a ver si te vale.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 24 de Julio de 2011, 13:57:31
SEÑORES!!!!Muchas gracias por su ayuda hasta el momento los avances en el proyecto han dado fruto, pude comunicar 2 pic mediante SPI costo pero lo logre jaja  :-/ ahora estoy intentando que el dato recibido en el esclavo, sea enviado via RS232 y visto por Virtual Terminal (en proteus), una vez logrado eso quedará enviar y recibir datos de 16 bits, con eso finalizaria la parte de software que estoy trabajando sobre el pic (hasta el momento), prometo subir todo en cuanto este bien depurado y funcionando. Gracias por sus ayudas nuevamente y cualquier nueva duda los estaré consultando es se los aseguro jaja :-/ :-/ :-/ :-/ :D
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 25 de Julio de 2011, 20:35:31
Buenas Noche caballeros!!!Muy Bien estos son los resultado de la comunicación en spi a spi con pic 16f88, el codigo funcionando es el siguiente

para el maestro

#include <16f88.h>
#fuses XT, NOWDT, NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
int dato=0,valor=4;
void main()
{

set_tris_b(0x02);
set_tris_a(0xff);
setup_spi(SPI_MASTER | SPI_l_TO_h | SPI_CLK_DIV_16);
while(1){
     spi_write( valor );
     delay_ms(500);
     dato = spi_read();
}
}

para el esclavo

#include <16f88.h>
#fuses XT, NOPROTECT
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
#use rs232(baud=9600, xmit=PIN_A0,rcv=PIN_A1, stop=1,BITS=8)

//======================
int dato=0,valor=0;
void main(){
//SETUP_PORT_A(0XFF);
set_tris_b(0x12);
setup_spi(SPI_slave | SPI_l_TO_h | SPI_CLK_DIV_16|SPI_XMIT_L_TO_H);// Configuracion del protocolo spi
//setup_adc_ports(ALL_ANALOG);
//setup_spi(SPI_SS_DISABLED);
 
 While(1){
     
        if(spi_data_is_in()){    //si hay un dato en el spi
         dato = spi_read();      // almaceno el dato recibido en la vble Dato
         //delay_ms(500);
         
         //for(i=0;i<5;i++){
         if(dato==valor){          // Comparo con la vble Valor
             output_low(PIN_B6);
             output_high(PIN_B7);
             delay_ms(200);
             output_low(PIN_B7);
            delay_ms(200);
             printf("El valor enviado por el Pic 16F88 Maestro es:%d",valor);}

            if(dato!=valor){
                 output_low(PIN_B7);   
                 output_low(PIN_B6);
                 delay_ms(700);
                 output_high(PIN_B6);
                 delay_ms(700);
                valor=valor+1;
            }}
            }
        }

muy bien ahora el problema es que no puedo sacar el dato por rs232, osea una vez que encuentro el dato en el pic esclavo quiero enviarlo via rs 232 a la pc (parte del codigo que esta en otro color), y verlo en virtual terminal de proteus, pero no consigo enviar nada el dato es un entero, alguien me ayuda con eso por favor
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: Maxtronic en 25 de Julio de 2011, 20:54:39
Los pines del SPI tambien son de UART si tu usas el SPI  el uart queda fuera la otra forma es crearla por software.
#use rs232(baud=9600, xmit=PIN_A2,rcv=PIN_A3,FORCE_SW,STREAM=serie)


fprintf(serie,"dato=%d\n\r",dato);

Estos ejemplos hay mucho en el foro busca para que veas mas.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 26 de Julio de 2011, 09:39:14
Maxtronic !!Muchas Gracias por tu informacion!!!sigo leyendo todo el foro una y mil veces (no creas que pregunto solo para que me resuelvan las cosas sin haberlas estudiado un poco antes ni heberme informado,pero como todos supongo hay muchas cosas que se me pasan o no las entiendo),volviendo al tema que es lo mas importante tu ayuda me vino de 10 logre mostrar algo no es el dato precisamente sino una serie de caracteres ascii que deben representar el nnumero me imagino yo.
Pregunto: Porque podrá ser eso??si el dato es entero, y fprintf(serie,"dato=%d\n\r",dato); y por tal motivo lleva %d.
Bueno nuevamente muchas gracias por tu ayuda y la de todos los que estan predispuestos a darme una mano es este proyecto!!! :-/ :-/ :)
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 26 de Julio de 2011, 12:34:34
Volvi para ser mas especifico en lo dicho anteriormente, en la pantalla del Virtual Terminal de Proteus me aparece esto ¢ORÚTÊäÙ½!»¹ß· y en realidad deberia aparecer lo que dice el codigo que adjunto:

#include <16f88.h>
#fuses XT,NOWDT,PUT,BROWNOUT,NOPROTECT,MCLR,NOLVP,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
#use rs232(baud=9600, xmit=PIN_A1,rcv=PIN_A2,FORCE_SW,bits=8, parity=N, STREAM=serie)

//======================
int dato=0,valor=2;

void main(){
//SETUP_PORT_A(0XFF);
set_tris_b(0x12);
set_tris_a(0x04);
setup_spi(SPI_slave | SPI_l_TO_h | SPI_CLK_DIV_16|SPI_XMIT_L_TO_H);// Configuracion del protocolo spi
//setup_adc_ports(ALL_ANALOG);
//setup_spi(SPI_SS_DISABLED);
 
 While(1){
     
        if(spi_data_is_in()){    //si hay un dato en el spi
         dato = spi_read();      // almaceno el dato recibido en la vble Dato
         //delay_ms(500);
         
         //for(i=0;i<5;i++){
         if(dato==valor){          // Comparo con la vble Valor
             output_low(PIN_B6);
             output_high(PIN_B7);
             delay_ms(200);
             output_low(PIN_B7);
             delay_ms(200);
             fputs("Encendido!\n\r",serie);
             fprintf(serie,"valores%d\n",valor);
             printf(serie,"dato=%d\n\r",dato);}      
            if(dato!=valor){
                 output_low(PIN_B7);   
                 output_low(PIN_B6);
                 delay_ms(500);
                 output_high(PIN_B6);
                 delay_ms(500);
                valor=valor+1;
            }}
            }
        }

que puede estar pasando???? :? :? :shock: :shock:
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 26 de Julio de 2011, 12:46:07
Listo Problema resueltoooooo!!! :-/ :-/ Lo que sucedia es que no habia convigurado el integrado Max 232 en Virtual Terminal en Inverted!!! ahora funciona de maravillas!! :D :D
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 27 de Julio de 2011, 12:42:31
Bueno bueno!!!Otra vez por aca, con nuevos problemas,hasta ayer todo funcionaba perfecto, la comunicacion desde SPI maestro al SPI esclavo y luego de este a la PC via rs232  pero; solo para datos de 8 bits, y lo que necesito es utilizar datos de 16 bits.Leyendo un poco el foro y demas, encontre que la solucion esta en usar SPI por Software es decir utilizar con la intruccion
#use spi(master, DI=PIN_B1, DO=PIN_B2, CLK=PIN_B4), en vez de usar Setup_spi, y al usar esta funcion me permite utilizar spi_xfer con la cual puedo enviar 16 bits. Ahora viene los resultados y las preguntas.
1_ Utilice #use spi, pero no logro comunicar los 2 pic ni enviar el dato, que puede estar faltando en dicha instruccion???
2_ Para enviar un dato desde el mastro al esclavo uso spi_xfer(stream,dato,16); eso es correcto???
 creo que hasta ahi es todo???si alguien puede ayudarme se lo agredezco :-/ :-/
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: PacoP en 28 de Julio de 2011, 06:13:14
Y si usas dos instrucciones de lectura seguidas, no te vale?
Despues montas el número entero en una variable tipo long y creo que te puede valer.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 28 de Julio de 2011, 09:52:15
Hola PacoP!! Respecto a tu respuesta he probado de la siguiente manera:

if(spi_data_is_in()){    //si hay un dato en el spi
        dato1 = spi_read();
        delay_us(20);
        dato2 = spi_read();
        delay_us(20);
       
         dato=dato2+dato1;     

es lo que he probado pero no he conseguido recepcionar el dato.
Eso es lo que tu decias???
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 28 de Julio de 2011, 20:25:09
Hola Gente!!! Acabo de encontrar en error de porque no podia leer el dato de 16 bits, el problema era el siguiente if(spi_data_is_in()){    //si hay un dato en el spi este bucle estaba antes de la intrucción spi_xfre(stream,data,bits), por lo que al enviar un dato de 16 bits nunca permitia entrar al bucle para almacenar el dato, ya que spi_data_is_in es solo para 8 bits, asique lo saque y santo remedio todo funciona de maravillas hasta ahora en un solo sentido, mi proximo paso es realizarlo en un experimentor y conectarlo a la PC para asi poder recibir los datos en Matlab y desde alli enviarle información al pic.En cuanto este listo lo subo!!!!Gracias por la ayuda a todos los interesados.
Título: Re: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
Publicado por: JSP10 en 30 de Julio de 2011, 12:55:36
Nuevo problema la simulacion funciona espectacular pero cuando lo implemente no funciona!!!!que puede ser queeste pasando?????