TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Enigma en 03 de Febrero de 2008, 18:18:07

Título: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: Enigma en 03 de Febrero de 2008, 18:18:07
Hola chamos, siguiendo en mi aprendizaje de los recursos del Pic 18F4550 y del lenguaje C, pues despues de manejar los timer y los modulos CCP, gracias a la ayuda de muchos de ustedes... Pues he decidido meterme con la comunicación Serial, y el modulo EUSART...

He hecho un pequeño programita para mandar un número via hypertermnal, y bueno, quizá cometi una burrada, me he guiado de ejemplos y lecturas que he hecho.... no se si está bien, bueno creo que no lo esta puesto que en la simulación no me muestra el número que mando a mostrar... En fin aquí está el programita, si alguien le echa un ojito a ver donde está mi error!!! se los agradeceria....

#include <18f4550.h>
#fuses NOWDT,NOPROTECT,NOCPD,NOLVP,INTRC_IO,NOMCLR,CCP2C1,NOPBADEN
#use fast_io (A)
#use fast_io (B)
#use fast_io (C)
#use fast_io (D)
#use fast_io (E)
#use delay(clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#byte RCON=0xFD0
#bit POR=RCON.1                                                // Bit de la bandera del Power On Reset
#byte RCSTA=0xFAB
#bit SPEN=RCSTA.7
#bit CREN=RCSTA.7
#byte TXSTA=0xFAC
#bit TXEN=TXSTA.5
#bit SYNC=TXSTA.4
#byte PIR1=0xF9E
#bit RCIF=PIR1.5
#byte STATUS=0xFD8


int dato=0;

void main(void)
{

          set_tris_d (0b00000001);                        // Configura puerto d como salida y entrada

            while(true)
            {
                output_low(PIN_D1);
               if(input(PIN_D0)==0)
                  {
                     dato=0xF9;                           // Mandamos el dato (1)
                     dato=getc();
                     printf("dato");         //mensaje por v.terminal
                  }
               else
               {
                     output_high(PIN_D1);
               }

            }
}


PD: Algún dia les recompensaré tanta ayuda que me hab brindado, y de alguna forma les pagaré todo el fastidio que le he hecho pasar con mis preguntas!!1 jjrjrjr :?

Atte: Enigma... La llanerita de Guayana :)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 03 de Febrero de 2008, 18:24:08
Para enviar un dato tienes que emplear:

putc(0xF9);

ó

printf("%c",0xF9);

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 03 de Febrero de 2008, 18:32:45
Ummm y no se puede enviar a través de una variable??? como la variable "dato", que puse allí??
Es que también lo puse así enviar el dato directamente y no lo muestra!!! no se si me falta chequear algo, configurar algún bit de los registros correspondientes a esta función

Otra preguntica que se me olvido hacer, saben que en ASM uno activaba todo los bits del txsta y el RCsta manualmente, que si activando la transmisión, la recepción, chequeando el buffer y todo eso.... En C es necesario hacer todo eso???



Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 03 de Febrero de 2008, 18:40:40
Si queremos utilizar una variable, simplemente ponemos:

dato=0xF9;

putc(dato);

ó

printf("%c",dato);

Si pones:

printf("%s", "Hola Mundo");

Te enviará toda la cadena.

Para configurar el puerto es suficiente con la declaración que pusiste:

#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

La recepción de los caracteres hay que hacerla (para optimizarlo) mediante una interrupción.

¿Estas simulando en Proteus?. Pon la simulación y el programa para ver que ocurre.

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 03 de Febrero de 2008, 18:48:48
Si, estoy simulando en proteus!!!
Pero eso fue lo que coloque, el printf("%c",dato); y no lo hace, por eso crei que era algún problema en la configuarción de algún bit!!! :?

Umm.... despues que le doy al pulsador, creo que se queda pegado en el If, puesto que cuando suelto al mismo pulsador pues el led se me queda apagado!!!!

Aqui está el DSN y el .C

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: RedPic en 03 de Febrero de 2008, 18:52:22
Te pongo una serie de hilos en el Foro en los que se usa una comunicación serie bidireccional entre el PIC y el PC, y van de lo muy, muy sencillo a lo mas o menos complejo. Mira a ver si te sirve para aclarar ideas.


Lo mínimo para comunicarnos vía RS232 Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=4620.0)
Rastreando un Teclado Matricial 4x4 y enviando a la RS232 (http://www.todopic.com.ar/foros/index.php?topic=4807.0)
Cómo variar un ancho de pulso generado con RTCC mediante la RS232 (http://www.todopic.com.ar/foros/index.php?topic=4813.0)
Traductor RS232 a Morse (Sonoro y visual) (http://www.todopic.com.ar/foros/index.php?topic=12717.0)
El RS485, un Relé en la lejanía: Hardware y Software (http://www.todopic.com.ar/foros/index.php?topic=19057.0)
Medidor de distancias mediante Ultrasonidos SFR04 (http://www.todopic.com.ar/foros/index.php?topic=10892.0)
Recibiendo del RS232 sobre un Buffer y procesandolo posteriormente. (http://www.todopic.com.ar/foros/index.php?topic=4573.0)
Desde el PC a una EEPROM I2C y viseversa a través de mi PIC (http://www.todopic.com.ar/foros/index.php?topic=4783.0)
Controlando un SERVO con el PIC desde nuestro PC (http://www.todopic.com.ar/foros/index.php?topic=4629.0)
La EEPROM interna puesta a nuestro servicio. (http://www.todopic.com.ar/foros/index.php?topic=4639.0)

Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 03 de Febrero de 2008, 19:00:58
Gracias redpic, ya habia revisado algunos de esos ejemplos, los más sencillos por supuesto y bueno por allí fue que me guie para hacer mi diminuto programa, pero no se, hice (creo) todo lo que debi hacer y pos no funciona, por eso acudi aquí, porque ha de ser que me falto algo, o estoy haciendo algo más, lo cual trae como cponsecuencia el que no me funcione!!! :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 03 de Febrero de 2008, 21:36:25
Una preguntica... Será que hay algo malo con estás instrucciones:

                      dato=0x40;
                      dato=getc();
                      printf("%c",dato);                   //mensaje por v.terminal

Es que estoy haciendo unas pruebas y bueno, hice esto:

                     dato=0x40;                     
                     dato=getc();
                     output_high(PIN_D2);
                     printf("%c",dato);                   //mensaje por v.terminal

Mande a encender un led, justamente en está linea, my bueno al parecer el programa se queda colgado en la instrucción dato=getc();... porque el led nunca me enciende....

He modificado el programa y antes de mandar a Dato, mande un mesaje en la pantalla y si lo muestra... pero cuando llega a la instrucción que les mensioné anteriormente, se queda como pegado allí... como si estuviera esperando el dato o no se...

Entonces bueno quisiera saber si hay algo de mala en ese pedacito de instruccción....

Si quieren ver el programa modificado, aquí está...

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 03 de Febrero de 2008, 23:53:25
En esa instrucción se queda el micro esperando un carácter por el puerto RS232. Esa instrucción debe de estar dentro de la interrupción del puerto RS232.

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 04 de Febrero de 2008, 00:03:30
Pero es que no entiendo....  :? si le estoy mandando el caracter, porque no lo agarra???... dentro de la interrupción....? pero es que como en la interrupción.... Por fa si puedes ser un poco más explicito te lo agradeceria en el alma!!!   Se que tiene que ver con algo en la recepción, pero no logro entender que es!!!! :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 04 de Febrero de 2008, 00:10:48
La instrucción getc() lee un carácter del puerto serie y la instrucción putc() coloca un carácter en el puerto. Por lo tanto con getc() el micro se queda esperando a recibir  un carácter y hasta que no lo recibe no sale de su espera. Para evitar esto hay una interrupción que es la #INT_RDA que se activa cuando se recibe un carácter, de esta forma al llamar a getc() en la interrupción, nos aseguramos que haya efectivamente un carácter y que el programa no se pare.

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 04 de Febrero de 2008, 00:22:08
Aja... no es que te quiera contradecir ni nada por el estilo, primero porque no tengo los conocimientos suficientes para poder discutirte eso.... y segundo pues no es mi intención discutir por ello... Pero.... Porque en los ejemplos que he visitado por allí no tienen ninguna interrupción, es decir, ellos envian un caracter y ya, sin llamar o declarar la interrupción que planteas!!! he visto muuuchos ejemplos tratando de resolver mi pequeño gran problema y pues en ninguno he visto la #INT_RDA...  :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 04 de Febrero de 2008, 00:33:12
getc() lo que hace es recibir un carácter. Por lo tanto estas esperando recibir un carácter y NO LO ESTAS ENVIANDO. Para enviarlo se utiliza putc().

Seguramente en los ejemplos que has visto se está realizando un ECO para que todo lo que se reciba se reenvíe por el puerto.

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 04 de Febrero de 2008, 00:45:59
Ahhh o.k... :(... si pero no te enojes!!!! :oops:   :cry:

Dios.... bueno seguiré en mi busqueda a ver si me da el bendito programa ese!!! ya estoy así  :z)... es dificil desarrollar algo cuando no posees los conocimientos necesarios y suficientes, y cuando las fuentes son tan escasas!!! estoy como quien dice: tirando flechas!!!!

Atte: Enigma... LA llanerita de Guayana :z)
Título: Re: RS232 - Comunicación serial
Publicado por: jfh900 en 04 de Febrero de 2008, 00:49:26
Tranquila, no me enfado ni me enojo por eso, ni muchísimo menos. Lo que quería era llamar tu atención sobre ese punto en concreto y creo que lo he conseguido. Por otra parte estas aprendiendo muy a fondo los micros con los programas de ejemplos que estas abordando y creo sinceramente que vas por muy buen camino.

un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 04 de Febrero de 2008, 01:25:15
 :shock:

No se que carajo hice, pero hice que funcionara!!!!!! :lol:

aaaaaaaaaaaaaaaaaaaaaaaa!!!!!!!!!!!!!!!!!!!  :D  :D  :D  :D  :D  :D  :D  :D  QUE FELICIDAD!!!!!!!!!!!!!!!!!!!!!1 :D

DIOSSSSSSS NO LO PUEDO CREER!1 DESPUES DE PASAR TODO UN DIA TRATANDO DE ENVIAR UN SOLITO MISERO CARACTER POR EL HYPERTERMINAL.. LO LOGREEEEEEEEEE!!!! NO LO PUEDO CREER!!!!!!1 QUE FELIZ SOY!!!!!!!!!1 :D :D :D.....Graciasssssssssss JFH900.......mil gracias!!!! que felicidad se me vio un caracter!!!!!! siiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii :mrgreen:

Jejeje bueno ahora a seguir con la otra parte del programa.... hacer que el caracter varie!!!

Si mandar un caracter me llevo todo un dia... Dios mandar uno que varie... cuanto me tomará!!!!!! :?

pero antes trataré de analizar y entender que hice!!!! :?

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: Nocturno en 04 de Febrero de 2008, 08:29:06
Qué alegría da cuando se ven las cosas funcionando. Ea, ya has cumplido por hoy y te puedes ir a descansar. Recuerda apartar las resistencias y los transistores antes, que pinchan.
Título: Re: RS232 - Comunicación serial
Publicado por: Enigma en 04 de Febrero de 2008, 14:01:12
Jajajaja si vale que alegria!!!! Tranquilo que como medio ordene la habitación pues ya no tengo los componentes tan regados por ahi... aunque ya no tardan en estar, puesto que está volviendo el desorden....  :?

Ahora a seguir con la otra parte del programa :mrgreen:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial
Publicado por: huichoman en 07 de Febrero de 2008, 03:56:24
Hola Enigma, hice pequeñas modificaciones a tu programa.

Código: [Seleccionar]
#include <18f4550.h>
#fuses NOWDT,NOPROTECT,NOCPD,NOLVP,INTRC_IO,NOMCLR,CCP2C1,NOPBADEN
#use delay(clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)


char dato_e='H',dato_r;

void main(void)
{

       
            while(true)
            {
                output_low(PIN_D1);
               if(input(PIN_D0)==0)
                  {
           
                     dato_r=getc();
                     printf("dato_e :%c  dato_r %c",dato_e,dato_r);        //mensaje por v.terminal
                  }
               else
               {
                     output_high(PIN_D1);
               }

            }
}



Al pulsar el push. El pic espera a que le envies un caracter, en la pantalla de la virtual terminal teclea un caracter cualquiera, para que el pic lo reciba, al hacerlo este envia un mensaje con el valor que tiene la variable dato_e  y la variable dato_r, en esta última se guardó el caracter que enviaste.

(http://hostfile.org/enigmaH.png)


Te adjunto el .c  y el dsn.

P.D
Citar
DIOSSSSSSS NO LO PUEDO CREER!1 DESPUES DE PASAR TODO UN DIA TRATANDO DE ENVIAR UN SOLITO MISERO CARACTER POR EL HYPERTERMINAL..

getc();  te sirve para recibir un caracter, de otro pic, de una pc, etc. Si solo deseas enviar datos, no utilices esa instrucción.



Saludos.

Ganbatte kudasai.

Título: Re: RS232 - Comunicación serial
Publicado por: pocher en 07 de Febrero de 2008, 08:49:26
Bien está que para empezar lo hayas hecho con el get en el while, pero cuando puedas estudiate la recepción de caracteres por interrupción.

Es más aconsejable, ya que si la recepción de datos es muy grande el uso de get en el while dá problemas (comprobado).

Dentro de la interrupción haz las menos operaciones posibles, recibe el caracter, guárdalo en una variable y salte.

Un saludo
Título: Re: RS232 - Comunicación serial
Publicado por: COMBAT en 07 de Febrero de 2008, 13:59:08

     Bueno el post.... alguién tendría más información de esto para novatos ?  8)
Título: Re: RS232 - Comunicación serial (Solucionado)
Publicado por: Enigma en 09 de Febrero de 2008, 15:23:02
Hola Chiiiicos traigo excelentes Noticias Bueno p`rimero que nada agradezco los aportes, huichoman ese programa está bastante sencillo y didactico, bueno para empezar la comunicación serial!!!! :mrgreen:

Bueno les cuento que ya he logrado hacer mni proyecto ekl cual trata de lo siguiente:

Realizar el diseño de un programa con circuiteria externa el cual permita controlar la velocidad de un motor a través del teclado númerico del computador. En pantalla (hyperterminal) se tiene que visualizar los siguientes datos del motor: Hora, fecha y velocidad del mismo. Dichos datos pueden ser visto en pantalla cuando el usuario lo desee aún despues de haber apagado el sistema, para ello se tiene que guardar un registro de la actividad del motor en una memoria EEPROM 24C512, la base de tiempo será de 1 segundo y dicho tiempo ser5á medido por un Reloj de tiempo Real DS1307. En pantalla se tiene que desplegar un menú con las siguientes opciones:

A) Modificar velocidad del motor
B) Programar fecha
c) Ver datos del Motor
D) Guardar datos del motor en memoria
E) Ver registro del motor (guardado en memoria)

Bueno muchachos ese fué mi programa, sencillo para los más expertos :P, pero para mi que estoy empezando en este Mundo de C y del PIC 18F4550 pues me costo un mundo hacerlo :?, dias sin dormir, noches sin cenar y muuuucho cansancio!!!! :(

 :8}

Cualquier cosa que lo quieran ver pues me dicen y lo publico!!!! Saludos y un beso!!!! Gracias por toda su colaboración!!!! Un besote!!!!!! :mrgreen:

Atte: Enigma... La llanerita de Guayana :-)
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: stk500 en 09 de Febrero de 2008, 15:38:58
 :-/ :-/ Miss Enigma, por favor publicalo  :-/ :-/ :-/ :-/ que yo he seguido todos tus mensaje  :-/ :-/ :-/ y quiero aprender como tu  :-/ :-/ :-/  :lol: :lol: :lol:
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: Nocturno en 09 de Febrero de 2008, 18:04:34
Enhorabuena miss Enigma. No nos dejes con la miel en los labios y publícalo, anda.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: huichoman en 09 de Febrero de 2008, 20:52:32
Felicidades Enigma.  :-/  Cuando se hace el mejor esfuerzo, la gratificación es enorme. ;-)
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: Enigma en 13 de Febrero de 2008, 23:14:55
Hola muchachos gracias por todo la verdad que ustedes ayudarón en gran parte con sus sugerencias a desarrolar mis conocimientos para este proyecto!!!!

Disculpen la tardanza es que no tenia internet.... jejejeje!! :mrgreen:

Bueno como lo prometido es deuda aquí les dejo mi programa, espero que sea mucho de provecho!!!! Un beso a todos!!!  :D

Atte: Enigma... La llanerita de Guayana  :D
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: quirogaareal en 22 de Febrero de 2008, 10:08:46
Buenas:

Aprovecho este tema para no abrir otro nuevo . Estoy empezando un programa y lo primero que tengo que probar es rs232 he leido vario ejemplitos sencillos y consigo ..en simulacion que me anden 2 de 3 teclas del teclado , mi problemas radica en que no puedo hacer encender un led desde el teclado .
Algun tip que me puedan dar? aca se los adjunto.

PD: Ignoren la parte de can ...es es aun ..otra historia ...para mas adelante
La simulacion va adjuntada en el archivo



#include <18F258.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES xt                       //High speed osc with HW enabled 4X PLL
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NOOSCSEN                 //Oscillator switching is disabled, main oscillator is source
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES BORV20                   //Brownout reset at 2.0V
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOCPD                    //No EE protection
#FUSES STVREN                   //Stack full/underflow will cause reset
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOWRT                    //Program memory not write protected
#FUSES NOWRTD                   //Data EEPROM not write protected
#FUSES NOWRTB                   //Boot block not write protected
#FUSES NOCPB                    //No Boot Block code protection
#FUSES NOWRTC                   //configuration not registers write protected
#FUSES NOEBTR                   //Memory not protected from table reads
#FUSES NOEBTRB                  //Boot block not protected from table reads

#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
#define CAN_USE_EXTENDED_ID TRUE
#include <can-18xxx8.c>
#include <flex_lcd1.c> //libreria para lcd
#use fast_io (C)
//#use fast_io (A)
#use fast_io (B)

#use fixed_io(a_outputs=PIN_A4)
//char Keypress;

#int_rda
void rda_isr()
 {   
 
 switch(getc())
     
     {
     case'1':  lcd_putc("bit enviado");
     output_high(PIN_A4);
     delay_ms(1000);
     output_low(PIN_A4);
     lcd_putc("\f");
     break;
     
     case'2':lcd_putc("Info \n ready PLC");
     delay_ms(3000);
     lcd_putc("\f");
     break;
     
     case'3': if(!input(PIN_B0)) puts("PRESIONADO");
               else  puts("suelto");
               break;
     } 
     
 }




/*

#int_EXT1
void  EXT1_isr(void)
{

}

#int_EXT2
void  EXT2_isr(void)
{

}

*/

/*

#int_canrx0
void canrx0_int ( ) {
   // TODO: add CAN recieve code here
}
#int_canrx1
void canrx1_int ( ) {
   // TODO: add CAN recieve code here
}
#int_cantx0
void cantx0_int ( ) {
   // TODO: add CAN transmit code here
}
#int_cantx1
void cantx1_int ( ) {
   // TODO: add CAN transmit code here
}
#int_cantx2
void cantx2_int ( ) {
   // TODO: add CAN transmit code here
}

*/


void main()
{
 // can_init();
   lcd_init();
   

  //can_set_mode(CAN_OP_CONFIG);
  /*
   BRGCON1.brp=4;
   BRGCON1.sjw=0;
   BRGCON2.prseg=2;
   BRGCON2.seg1ph=5;
   BRGCON2.sam=FALSE;
   BRGCON2.seg2phts=FALSE; 
   BRGCON3.seg2ph=5;
   BRGCON3.wakfil=TRUE;

   can_set_mode(CAN_OP_NORMAL);
   
   enable_interrupts(int_canrx0);
   enable_interrupts(int_canrx1);
   enable_interrupts(int_cantx0);
   enable_interrupts(int_cantx1);
   enable_interrupts(int_cantx2);
*/

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_spi(SPI_SS_DISABLED);
   setup_wdt(WDT_OFF);
   setup_timer_0(RTCC_INTERNAL);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   enable_interrupts(INT_EXT1);
   enable_interrupts(INT_EXT2);
   enable_interrupts(GLOBAL);
   setup_low_volt_detect(FALSE);
   enable_interrupts(int_rda);
 set_tris_c(0xFC);                               // Puerto C entradas
//Setup_Oscillator parameter not selected from Intr Oscillator Config tab

   // TODO: USER CODE!!




       printf("\f");                                                                    // Limpio pantalla
       printf("****************************************** \n\r");
       printf("             ESCOJA UNA OPCION             \n\r");
       printf("(1)ENCIENDE APAGA BACKLIGHT                \n\r");
       printf("(2)IMPRIME CARTEL                          \n\r");
       printf("(3)DETECTA PULSADOR                        \n\r");
       printf("****************************************** \n\r");

 

while(true)
   {
 
 

 
 
     }
       
}
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: quirogaareal en 23 de Febrero de 2008, 21:46:59
Buenas:

Me autorespondo, el problema estaba en la habilitacion del puerto con la funcion tris  y en la activacion de las pullups.
por lo menos en similacion consegui lo buscado que seria a travez de rs232 lo siguiente
1- encender el backlight del display
2-imprimir un cartel en el display
3-checkar el estado de una llave cerrada o abierta.

Se que es sencillo pero espero que a alguno le sea de ayuda .

A continuacion les dejo los archivos para descargar(versiones ccs4.065 y proteus 7.1sp2) 
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: papinolmedo en 27 de Febrero de 2008, 07:31:21
Estimados:

Me ocurre algo similar a lo de quirogaareal, esoy trabajando con el pic18f258 en una aplicación muy simple para realizar comunicación serial via rs232 con el pc. Con la transmisión de datos del pic al pc no se presentan problemas, pero cuando intento  enviar un dato del pc al pic, este ultimo no lo recibe. He revisado el circuito de la MAX2323 y funciona sin problemas. El mismo error se genera cuando pruebo el programa con otro pic18f258. Comienzo a pensar que el error pueda estar en el HW más que en SW.

Adjunto el código en CCS para ver si alguien me puede ayudar. Espero que alguien de los que ha trabajado con este pic pueda responder y comentar su experiencia. De antemano, gracias.

Sañudos cordiales.


Código: CSS
  1. #include <18F258.h>
  2. #fuses HS, NOPROTECT, NOWDT
  3. #use delay(clock=20000000)
  4. #use rs232(baud=19200, parity=N, xmit=PIN_C6, rcv=PIN_C7, bits=8)
  5.  
  6. #use fast_io(A)      //configura puerto A como I/O digital
  7. #use fast_io(B)      //configura puerto B como I/O digital
  8.  
  9.  
  10. char cmd;
  11.  
  12.  
  13. void main() {
  14.  
  15.    setup_adc_ports(NO_ANALOGS);
  16.    setup_adc(ADC_OFF);
  17.    setup_spi(SPI_SS_DISABLED);
  18.    setup_wdt(WDT_OFF);
  19.    setup_timer_0(RTCC_INTERNAL);
  20.    setup_timer_1(T1_DISABLED);
  21.    setup_timer_2(T2_DISABLED,0,1);
  22.    setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
  23.    setup_low_volt_detect(FALSE);
  24.    
  25.    set_tris_a(0xFF);    //configura puerto a como entrada
  26.    set_tris_b(0x00);    //configura puerto b como salida
  27.    
  28.    OUTPUT_B(0x00);      //puerto B inicialmente en bajo  
  29.  
  30.    while(true){
  31.      
  32.       if (kbhit()) {
  33.          cmd = getc();
  34.          printf("%c",cmd);
  35.          if(cmd == 'a'){ output_high(PIN_B7);}
  36.          if(cmd == 's'){ output_low(PIN_B7); }
  37.          }
  38.      
  39.      
  40.       if (input(PIN_A1)==1) { output_high(PIN_B6); printf("  pin_A1 alto");}
  41.       else { output_low(PIN_B6); }
  42.      
  43.       if (input(PIN_A2)==1) { output_high(PIN_B5); printf("  pin_A2 alto");}    
  44.       else { output_low(PIN_B5); }
  45.      
  46.       if (input(PIN_A3)==1) { output_high(PIN_B4); printf("  pin_A3 alto");}    
  47.       else { output_low(PIN_B4); }
  48.      
  49.       if (input(PIN_A4)==1) { output_high(PIN_B3); printf("  pin_A4 alto");}    
  50.       else { output_low(PIN_B3); }
  51.      
  52.       if (input(PIN_A5)==1) { output_high(PIN_B2); printf("  pin_A5 alto");}    
  53.       else { output_low(PIN_B2); }
  54.      
  55.                
  56.       }     //fin while
  57.  
  58. }  //fin programa principal
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: quirogaareal en 27 de Febrero de 2008, 09:16:04
Hola :

Mira lo que yo hice aun esta de simulador, como sabes entre simulador y circuito real hay diferencia, sin embargo proba de habilitar las pullup del puerto b , tambien proba de cambiar el clock(si estas en simulacion ) 4mhz y y el respectivo fuse a xt, tambien podes probar de meter  el codigo en la  interrupcion en rs232,  veo que tenes pocos fuses proba de usar el pic wizar y agrgar algunos mas , tambien puede ser eso.

No cuento con la increible experiencia de los programadores del foro pero me baso en el programa con el que tuve inconvenientes, proba y despues contanos.

Saludos

desde Cordoba Argentina

 
Título: Re: RS232 - Comunicación serial
Publicado por: gu1llermo en 27 de Febrero de 2008, 12:25:45
Hola, yo también estoy dando mis primeros pasos en la comunicación rs232 bajo C e hice una pequeña modificación al programa de huichoman (http://www.todopic.com.ar/foros/index.php?topic=20346.0) y guiándome un poco con el trabajo de Nocturno (http://www.todopic.com.ar/foros/index.php?topic=19672.msg143301#msg143301)

1ero: Cambié el pulsador del proteus y le coloqué un switch

2do: El programa quedó así:

#include <18f4550.h>
#fuses NOWDT,NOPROTECT,NOCPD,NOLVP,INTRC_IO,NOMCLR,CCP2C1,NOPBADEN
#use delay(clock=4000000)
#USE RS232 (baud=9600,bits=8,parity=N,xmit=PIN_C6,rcv=PIN_C7)

#byte RCREG=             0xFAE       // Aquí se recibe el dato de la usart

char dato_e='H',dato_r;

void main(void)
{
   int8 aux; /* Lo uso para descargar el buffer de recepción y así evitar el error de overrun
y que se cuelgue el pic*/


            while(true)
            {

                output_low(PIN_D1);
               if(input(PIN_D0)==0)
                  {
           
                     dato_r=getc();
                     printf("dato_e :%c  dato_r : %c  ",dato_e,dato_r);        //mensaje por v.terminal
                  }
               else
               {
                     output_high(PIN_D1);
                     aux=RCREG;
               }

            }
}
///////////////////////////////

En negrita e resaltado los cambios, esto lo hice porque el pic se me quedaba colgado si recibía más de 2 datos sin haberlos procesado previamente, y esto ocurría justo cuando se le enviaban datos teniendo el pulsador o switch abierto, claro también pude trabajar con CREN y detectar el overrun, pero para éste caso en particular lo más sencillo que ví fué esto.

Lo quise compartir porque para mí es muy útil y quizás a otra persona que se esté iniciando también les sea de utilidad.

PD1: Todo esto es posible gracias a las contribuciones de todos nosotros

PD2: Me gusta mucho el foro  :mrgreen: , la gente comparte sus conocimientos de una manera excepcional y todos estamos dispuestos a ayudar al prójimo que en verdad quiera aprender y ser ayudado claro!  :wink:

Saludos.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: gu1llermo en 27 de Febrero de 2008, 12:36:36
papinolmedo verifica la conexión del MAX232 fíjate que todas las señales esté correctamente conectadas, porque puede ser que se te haya pasado una conexión y no te hayas dado cuenta, a mí me a pasado y casi e podido jurar que todo estaba bien conectado  :D  :z) bueno así aprendemos.

PD: Yo también creo que puede ser un problema de Hardware.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: pocher en 27 de Febrero de 2008, 14:43:48
El programa con el simulador va bien.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: papinolmedo en 27 de Febrero de 2008, 19:57:16
Estimados, he probado las sugerencias que me han dado.

Mira lo que yo hice aun esta de simulador, como sabes entre simulador y circuito real hay diferencia, sin embargo proba de habilitar las pullup del puerto b , tambien proba de cambiar el clock(si estas en simulacion ) 4mhz y y el respectivo fuse a xt, tambien podes probar de meter  el codigo en la  interrupcion en rs232,  veo que tenes pocos fuses proba de usar el pic wizar y agrgar algunos mas , tambien puede ser eso.

Amigo quirogaareal, no estoy simulando, estoy trabajando directamente con el pic, pero cuento con los materiales para cambiar el Xtal, lo he hecho y he probado con distintas velocidades de transmisión y en todas tengo el mismo problema. El problema no esta en el puerto B, de hecho cuando intento capturar el caracter y hacer eco de lo que recibo, no se obtiene nada. Gracias por tus sugerencias.


papinolmedo verifica la conexión del MAX232 fíjate que todas las señales esté correctamente conectadas, porque puede ser que se te haya pasado una conexión y no te hayas dado cuenta, a mí me a pasado y casi e podido jurar que todo estaba bien conectado  :D  :z) bueno así aprendemos.

PD: Yo también creo que puede ser un problema de Hardware.

Amigo gu1llermo, he probado el circuito de la max con un pic 16f877, trabaja sin ningún problemas, no es problema de la max. Gracias por tu sugerencia.


El programa con el simulador va bien.

Amigo pocher, el programa funciona bien, lo sé porque lo utilizado en un pic16f877 (haciendo los cambios necesarios, obviamente)



Muchas gracias por sus respuestas.

Saludos cordiales.



Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: papinolmedo en 27 de Febrero de 2008, 20:02:02
Estimados:

El código que he insertado algunos post mas arriba detalla que utilizo el pic18f258, en realidad utilizo el pic18lf258, pero el grabador que utilizo (GTP USB Lite) lo reconoce como 18f258. Tal vez alguien haya trabajado con el pic18lf258 y pueda comentarme si ha tenido problemas con la recepción de datos seriales con él. Como ya dije, he probado el mismo código con dos pic18lf258 y en los dos ocurre lo mismo, esto me indica que el problema puede deberse más bien a errores de HW que de SW.

Por ahora voy a probar la recepción de datos seriales con un pic18f2580 y les cuento como me va.

Saludos cordiales.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: MGLSOFT en 27 de Febrero de 2008, 20:28:27
Hiciste lo que te sugeri en el foro CAN??
Ponerle la directiva ERRORS a la declaracion del port serial, no sea que desde la PC envies en realidad dos caracteres y no uno, y el segundo ande boyando...
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: quirogaareal en 27 de Febrero de 2008, 22:36:45
Hola :
Mira yo con otro amigo estamos trabajando en un conductimetro , y necesitabamos hacer un oscilador con pwm de ciclo fijo a 4 kHz (nosotros veniamos programando la linea 16f 876) pasamos del programa del 16f876 solo cambiando algunos fuses y el nombre a la linea 18f252, el oscilador no anduvo y despues leyendo el manual cs nos dimos cuenta de que una instruccion que habiamos usado para el 16f no era igual a la  que debiamos usar en la linea 18f , por ende la cambiamos y el oscilador anduvo, a que viene toda esta aburrida explicacion a que revises las instrucciones para ver si alguna no es compatible con la linea 18 ...quizas la sugerencia del amigo MGLSOFT te sea util ...solo es cuestion de probar . espero que esta sugerencia te ayude .


Saludos desde Cordoba

Pedro
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: papinolmedo en 27 de Febrero de 2008, 23:59:58
Estimados:

He solucionado el problema!!!. Típico error de capa 8!!!

El código que he posteado más arriba esta operativo y funciona a la perfección. Lo que pasa es que cuando uno duerme poco y trabaja mucho no puede ver con claridad los detalles importantes.

Les cuento cual era el error. El código posteado más arriba no era precisamente el que estaba utilizando en el pic, en el que de verdad ocupaba habían dos lineas extras, con las cuales utilizaba el puerto C, esta eran: #use fast_io(C) y set_tris_c(0x0f). Luego de aplicar la técnica RTFM, logre dar con la solución: "The SPEN (RCSTA register) and the TRISC<7> bits have to be set and the TRISC<6> bit must be cleared, in order to configure pins RC6/TX/CK and RC7/RX/DT as the Universal Synchronous Asynchronous Receiver Transmitter."

De este modo al cambiar a  set_tris_c(0b10000000) el pic recibía datos seriales y, tal como dijo el maestro RedPic, "el PIC y mi PC ahora hablan hasta por los codos"

Muchas gracias a todos quienes me dieron una mano con sus sugerencias.


Saludos cordiales.
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: quirogaareal en 28 de Febrero de 2008, 07:10:07
Hola:
Bueno papinolmedo me alegro que lo hayas solucionado ya es un dolor de cabeza menos en que pensar.

Saludos desde Cordoba

Pedro
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: pocher en 29 de Febrero de 2008, 14:21:40
Ah, tenías los dos pines como salida.

Si le quieres quitar el set_tris_c creo que funciona igual.

Un saludo
Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: papinolmedo en 29 de Febrero de 2008, 22:33:51
Ah, tenías los dos pines como salida.

Si le quieres quitar el set_tris_c creo que funciona igual.



Exactamente pocher, sin el set_tris_c funciona igual, pero lo inserté porque ocupo el puerto C para generar una salida. El código posteado es en realidad una parte del código total, lo hice solo como primera prueba para testear la comunicación serial. El programa a avanzando más, le he añadido más cosas como el uso de los timers.

Saludos cordiales.

Título: Re: RS232 - Comunicación serial (SOLUCIONADO) Arrrrr Fiiiinnnn! ;)
Publicado por: MGLSOFT en 01 de Marzo de 2008, 08:05:19
Tambien te va a funcionar quitando todos los #use_fast_io() y todos los set_tris_x().... :mrgreen: :mrgreen: