TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juanez en 24 de Febrero de 2008, 11:46:16

Título: One wire pic a pic
Publicado por: juanez en 24 de Febrero de 2008, 11:46:16
Hola, acabo de migrar del PBP al CCS y estoy intentando hacer una comunicacion one wire entre 2 pics,

El primer pic es un 18f1320 es el pic emisor y quiero que se conecte mediante un cable solamente al pic receptor 18f2550, quiero hacerlo mediante un cable solamente por que cuando funcione quiero sustituir ese cable por unos modulos RF.

En el emisor quiero usar el oscilador interno a ser posible, ya que quiero reducir el tamaño del pcb del emisor lo maximo posible.

El codigo del emisor:
-----------------------------------------------------------------------------------------------------------------------
#include <18f1320.h>
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(CLOCK=8000000)
#use rs232(baud=2400, xmit=PIN_B1, rcv=PIN_B4)

void main()
{
 delay_ms(300);
   do{
      putc(5);
     }
   while(true);
}   
-----------------------------------------------------------------------------------------------------------------------------------------------

No se que es lo que falla, hago la simulacion en Proteus 7.2 SP2 y el emisor no envia nada de nada.

Saludos
Título: Re: One wire pic a pic
Publicado por: pocher en 25 de Febrero de 2008, 06:44:49
Prueba así: putc('5');
Título: Re: One wire pic a pic
Publicado por: juanez en 25 de Febrero de 2008, 14:26:01
Ya esta resuelto, ya me transmite.

Lo que quiero hacer ahora es mandar la lectura del canal analogico A0, si configuro el ADC a 8 bits no hay problema, pero a 10bits no se como mandarla, supongo que tendre que mandar primero el byte alto y luego el byte bajo que es lo que hacia en el PBP, pero en CCS no se como se hace.

Saludos
Título: Re: One wire pic a pic
Publicado por: pocher en 26 de Febrero de 2008, 10:00:09
Solo tienes que añadir #device adc=10
Título: Re: One wire pic a pic
Publicado por: DarkVect en 27 de Febrero de 2008, 14:30:06
Además de incluir el #device adc=10 debes hacer la lectura del adc así:

int16 valor_adc;
int msb;
int lsb;

valor_adc=read_adc();
msb=valor_adc >> 8;                //leer MSB
lsb=valor_adc & 0xFF;                //leer LSB
Título: Re: One wire pic a pic
Publicado por: IOIO en 28 de Febrero de 2008, 00:09:23
Hola a todos.
Juanez, siguiendo con el ejemplo de DarkVect, tambien puedes hacerlo un poco mas eficiente de la siguiente manera:

//****************************************
int16 valor_adc;
int msb;
int lsb;

valor_adc=read_adc();
msb=make8(valor_adc,1);              //leer MSB
lsb=make8(valor_adc,0);                //leer LSB
//****************************************
 
la sintaxis de make8 es:
i8 = MAKE8(var, offset)

La instrucción make8 extrae los bytes de manera mas eficiente, dado que no realiza ninguna operación aritmética ni lógica, simplemente toma el byte que le indiques de " valor_adc " y lo copia a la variable destino (msb o lsb en estos casos). por otro lado la forma de guardar las variables en CCS es el byte LSB primero y luego el MSB, por eso como offset se le pasa 1 y 0.



El código completo que envía el valor del ADC cada 300ms quedaría:

#include <18f1320.h>
#device adc=10
#fuses HS,MCLR,NOWDT,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP,NOCPD,NODEBUG,NOWRT
#use delay(CLOCK=8000000)
#use rs232(baud=2400, xmit=PIN_B1, rcv=PIN_B4)

int16 valor_adc;
int msb;
int lsb;

void main()
{
   setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc_ports( ALL_ANALOG );
   set_adc_channel(0);
   do{
        delay_ms(300);
        valor_adc=read_adc();
        msb=make8(valor_adc,1);              //leer MSB
        putc(msb);
        lsb=make8(valor_adc,0);                //leer LSB
        putc(lsb);
     }
   while(true);
}   

Saludo y cualquier duda a tus ordenes
Título: Re: One wire pic a pic
Publicado por: juanez en 29 de Febrero de 2008, 17:00:05
Gracias a todos por sus repuestas, ahora ya lo tengo controlado.

Saludos