TODOPIC
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.
¿Perdiste tu email de activación?
30 de Septiembre de 2014, 08:48:15

Ingresar con nombre de usuario, contraseña y duración de la sesión
Buscar:     Búsqueda Avanzada
349287 Mensajes en 39186 Temas por 40874 Usuarios
Último usuario: eec0
* Inicio Ayuda Buscar Calendario Ingresar Registrarse
Buscar en TodoPIC
+  TODOPIC
|-+  Microcontroladores PIC
| |-+  Todo en microcontroladores PIC (Moderadores: marmatar, maunix, MGLSOFT, Modulay, pocher, Sasián, Suky)
| | |-+  AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88
0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] 2 Marcar como favorito Imprimir
Autor Tema: AYUDA PARA COMUNICACION BIDIRECCIONAL RS232 Y SPI EN PIC 16F88  (Leído 4600 veces)
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« : 14 de Julio de 2011, 11:42:04 »

Buenas soy nuevo en el foro! rebotando 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, Confused Sad Sad 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
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #1 : 16 de Julio de 2011, 14:09:34 »

ALGUIEN PUEDE DARME UNA MANOOOOOOOO  EN ESTE TEMA POR FAVOR:shock:  GRACIAS
En línea
cristian_elect
PIC18
****
Desconectado Desconectado

Peru Peru

Mensajes: 344


« Respuesta #2 : 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.
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #3 : 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
En línea
NoSepComo
PIC18
****
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 290

Nada vale tanto


« Respuesta #4 : 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 Razz, pero también se puede).
Saludos!
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #5 : 18 de Julio de 2011, 13:17:34 »

Buenas Volviiiiii!!!gracias a los que han estado leyendo mi duda y estan dispuestos ayudarme!!!! rebotando rebotando 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 Embarassed :oops:Muchas gracias!!! Smile Smile

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);}
           
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #6 : 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.
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #7 : 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
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #8 : 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.
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #9 : 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
En línea
Maxtronic
PIC10
*
Desconectado Desconectado

Peru Peru

Mensajes: 27


« Respuesta #10 : 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.
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #11 : 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.
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #12 : 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  rebotando 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 rebotando rebotando rebotando rebotando lol
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #13 : 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
En línea
Maxtronic
PIC10
*
Desconectado Desconectado

Peru Peru

Mensajes: 27


« Respuesta #14 : 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.
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #15 : 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!!! rebotando rebotando Smile
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #16 : 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???? Confused Confused Shocked Shocked
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #17 : 26 de Julio de 2011, 12:46:07 »

Listo Problema resueltoooooo!!! rebotando rebotando Lo que sucedia es que no habia convigurado el integrado Max 232 en Virtual Terminal en Inverted!!! ahora funciona de maravillas!! lol lol
En línea
JSP10
PIC10
*
Desconectado Desconectado

Argentina Argentina

Mensajes: 13


« Respuesta #18 : 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 rebotando rebotando
En línea
PacoP
PIC10
*
Desconectado Desconectado

España España

Mensajes: 20


« Respuesta #19 : 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.
En línea
TODOPIC
   

 En línea
Páginas: [1] 2 Imprimir 
« anterior próximo »
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines XHTML 1.0 válido! CSS válido!
Página creada en 0.159 segundos con 23 consultas.