PIC18F25K22 Usart1 Y Usart2

Hola , estoy haciendo el PFC y estoy utilizando un micro con dos EUSART , concretamente el PIC18F25K22 , el compilador que uso es CCS, he conseguido transmitir y recibir mediante interrupción en ambas EUSART por separado , pero cuando lo intento hacer con la directivas #use rs232 en el mismo programa la EUSART2 me envía caracteres extraños y la EUSART1 ninguno. Envío “ + “ y me tendría que responder “ OK “ , pero me responde :


Según el data sheet ( pag 27-45 y pag 357 ) los registros de control del oscilador son :
OSCON OSCON 2 y OSCTUNE

Yo los he configurado así :
IDLEN IRCF OSTS HFIOFS SCS
OSCON --> 0 1 0 1 1 0 0 0
PLLRDY SOSCRUN --- MFIOSEL SOSCG PRISD MFIGFS LFIOFS
OSCON2 --> 0 0 0 0 0 1 0 0
INTSRC PLLEN
OSCTUNE --> 0 0 0 0 0 0 0 0

Intuyo que debe tener que ver con la velocidad del oscilador , pero no lo sé . No sé qué hago mal . Algo hay que se me escapa .
Muchas gracias de antemano por la ayuda .


Este es el código:

Código:
#include <18F25K22.h>
#FUSES XT,NOWDT
#use delay(clock=40000)
#use rs232(baud=9600, xmit=pin_b6, rcv=pin_b7, bits=8, parity=N,stream=USART2,ERRORS)
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7, bits=8, parity=N,stream=USART1,ERRORS)
#use standard_io(c)

char ch,B,C;
  
  #BYTE TRISB= 0x0F93
  #BYTE ANSELB= 0x0F39

        #bit TRISB7 = 0x0F93.7
        #bit TRISB6 = 0x0F93.6
  
        #bit ANSELB7 = 0x0F39.7
        #bit ANSELB6 = 0x0F39.6
        
  #BYTE OSCON =  0x0FD3
  #BYTE OSCON2 = 0x0FD2
  #BYTE OSCTUNE = 0x0F9B

#int_rda2
void serial_isr() 
{  
    ch=getchar();
    
    if( ch == '+')
    B=ch;
 }
void main()
{
   enable_interrupts(global);
   enable_interrupts(int_rda2);
       
//   Configuro el Puerto como digital ya que viene de fábrica como analógico 

    ANSELB7 = 0;
    ANSELB6 = 0;
    
    TRISB7 =1;          //  RB7 (RX)  como entrada
    TRISB6= 0;        //  RB6  ( TX )  como salida

//  El pic viene configurado por defecto con un reloj interno de 1 Mhz 

//  Configuro el oscilador 

    OSCON =  0b01011000;    
    OSCON2 = 0b00000100;
    OSCTUNE= 0b00000000;
    
while(1)  
{
    if( B == '+')
    {
   printf( USART2,"\ OK  \r");
   
   B=0;
    }
    }
}
 
Última edición por un moderador:
Hola , estoy haciendo el PFC y estoy utilizando un micro con dos EUSART , concretamente el PIC18F25K22 , el compilador que uso es CCS, he conseguido transmitir y recibir mediante interrupción en ambas EUSART por separado , pero cuando lo intento hacer con la directivas #use rs232 en el mismo programa la EUSART2 me envía caracteres extraños y la EUSART1 ninguno. Envío “ + “ y me tendría que responder “ OK “ , pero me responde :

Intuyo que debe tener que ver con la velocidad del oscilador , pero no lo sé . No sé qué hago mal . Algo hay que se me escapa .
Si es importante la velocidad del oscilador, sin embargo al compilar tu código, me aparece un error.
Error 96: Baudrate out of range (try 10000)
Para eliminar ese error aumente el oscilador a 20MHz (Crystal) y el baudrate a 19200bps.
Pero aún así, con ese cambio tu programa no funcionaría.

Adjunto un ejemplo usando los dos módulos EUSART para que mires la configuración a usar.

Suerte.
 

Adjuntos

  • 18F25K22 EUSART.rar
    28.7 KB · Visitas: 22
  • EUSART1_Test.jpg
    EUSART1_Test.jpg
    325.7 KB · Visitas: 21
  • EUSART2_Test.jpg
    EUSART2_Test.jpg
    318.9 KB · Visitas: 22
Hola, muchas gracias por responder. Funciona de maravilla, no disponía de un cristal de 20 Mhz y lo he probado con uno de 4 Mhz y funciona. Me he enredado con la interrupción y era mas sencillo que todo eso y además debería haber prestado mas atención con la función fprint que es la que me permite dirigir el flujo de datos. Pero lo que necesito es por ejemplo recibir un dato por la USART1 y transmitirlo por la USART2 y viceversa, algo que no debería tener mayor complicación, pero no lo consigo . También he probado con PROTON y con C18 . No sé si es que el compilador no lo permite o es algo del micro .He cambiado en el programa en la función fprint USART1 por USART2 y viceversa . Esto es lo que me sale en el hyperterminal :

USART1 USART2
Envío : skgv recibo : {kww
Recibo : {kww Envío : skgv



Quiero hacer también un aporte al foro ya que ha sido él el que me ha enseñado muchas cosas y el que me ha permitido conseguir llegar hasta aquí. Son pruebas que he ido haciendo, pruebas sencillas que me han permitido llegar a otras mas complejas. Mi grado de conocimiento no es que sea mucho pero ya que lo he ido adquiriendo aquí es justo que lo vuelva a depositar aquí. Es un alivio poder solucionar los problemas cuando te quedas atascado y parece que no lo vas a conseguir. Gracias a la gente que pone sus progresos y permíte hacer progresar a los demás .

PD

cuál es la mejor forma de subir el archivo? ocupa 74 Mb y está en .rar
 
Última edición:
Hola, muchas gracias por responder. Funciona de maravilla, no disponía de un cristal de 20 Mhz y lo he probado con uno de 4 Mhz y funciona. Me he enredado con la interrupción y era mas sencillo que todo eso y además debería haber prestado mas atención con la función fprint que es la que me permite dirigir el flujo de datos. Pero lo que necesito es por ejemplo recibir un dato por la USART1 y transmitirlo por la USART2 y viceversa, algo que no debería tener mayor complicación, pero no lo consigo . También he probado con PROTON y con C18 . No sé si es que el compilador no lo permite o es algo del micro .He cambiado en el programa en la función fprint USART1 por USART2 y viceversa.
Pues básicamente eso es lo que se tiene que hacer, desafortunadamente no dispongo de ese PIC.
Así que no puedo realizar una prueba físicamente y ver los resultados realmente.
Prueba ahora este nuevo programa que está configurado para trabajar con el oscilador interno a 8MHz.
También adjunto la interfaz con la que realice las pruebas, ya que necesitas crear dos instancias.
Una instancia la configuras para trabajar con el puerto COM3 y la otra por el puerto COM5.
Ya nos contarás si funciona.
Quiero hacer también un aporte al foro ya que ha sido él el que me ha enseñado muchas cosas y el que me ha permitido conseguir llegar hasta aquí. Son pruebas que he ido haciendo, pruebas sencillas que me han permitido llegar a otras mas complejas. Mi grado de conocimiento no es que sea mucho pero ya que lo he ido adquiriendo aquí es justo que lo vuelva a depositar aquí. Es un alivio poder solucionar los problemas cuando te quedas atascado y parece que no lo vas a conseguir. Gracias a la gente que pone sus progresos y permíte hacer progresar a los demás.
(y)

cuál es la mejor forma de subir el archivo? ocupa 74 Mb y está en .rar
Necesitas buscar un alojamiento seguro y que no requiera registro preferentemente.
Existen varias paginas que ofrecen ese servicio de forma gratuita.
Si fuese un archivo en formato PDF, el Foro solo admite 5MB, y archivos comprimidos de 2MB.
Así que dividir en partes 74MB serían 37 archivos de 2MB.
Lo mejor es que alojes tu archivo como te mencione y coloques el link de descarga.

Saludos.
 

Adjuntos

  • 18F25K22 EUSART II.rar
    497 KB · Visitas: 26
Última edición:
Una vez mas muchas gracias, y una vez mas funciona de maravilla. Lo he probado con el Pic y con un cristal a 20 Mhz y funciona muy bien.
He seguido haciendo pruebas puesto que lo que quiero es recibir una trama por una EUSART2 ( por ejemplo ) y enviarla después por EUSART1 y viceversa, pero sin éxito. La trama sería : “ A,21/3/2012,21:30,19.2,45,1200,B “ . Es decir , fecha, hora,temperatura,humedad y CO2 .
He probado con un simple “HOLA”, intento recibirlo y enviarlo después, pero sólo soy capaz de enviar “HO” .
He intentado con fgets, pero no lo tengo muy claro, además, tengo que enviar también un retorno de carro y el carácter NULL.

No sé lo que pasa, es como si el buffer de recepción se sobrecargara ( o no le diera tiempo a vaciarse ) y no aceptara más de dos caracteres.

Saludos

PD
La dirección donde voy a colgar los archivos es :

https://www.forosdeelectronica.com/showthread.php?p=788370#post788370
 

Adjuntos

  • PRUEBAS.rar
    260.5 KB · Visitas: 5
Hola, después de muchas pruebas y ver que ninguna me salía me puse a redactar el PFC. Pero ayer parece ser que me vino la luz, harto ya de redactar ( ya llevo 200 páginas ) me puse con esto otra vez . En un principio parece que voy bien. Las pruebas que he colgado son muy básicas pero parece que la comunicación va por buen camino, ahora falta hacerlas en la realidad, añadir más código, que las placas funciones, ... muchas cosas.. pero de momento me sirve .

He optado por prescindir de las dos EUART por hardware pues parece que las dos no coexisten bien cuando se trata de amigarse la una con la otra, por separado, es decir, cada una por su parte parecen ir bien, pero cuando tienen que compartir.......

Así que he combinado la EUART por hard con la UART por soft y parece que estas sí que se entienden. Como el PIC2 solo hace de transmisor receptor no preciso interrrupción, ya que el código no es muy grande, solo se encarga casi que de redireccionar el flujo. Pero si se requiere de interrupción porque el programa tiene que estar haciéndo otras cosas entonces se puede utilizar la interrupción de RB0. Encontré un programa que encuanto lo encuentre lo pruebo y lo subo.

Le tenía un poco de miedo a la Uart por soft, leí cosas y parecía ser mas complicado, sé que no es lo mas adecuado, que para velocidades mas altas no es conveniente, pero con una velocidad de 9600 que no tenga que configurar nada del módem me sobra.

Muchas gracias por tu ayuda. Cuando uno está en tinieblas es un gran alivio que venga alguien que conoce mas y te eche una mano...

PD

Cuando pueda seguiré subiendo programillas.Aunque sean básicos.
 

Adjuntos

  • P.rar
    507.2 KB · Visitas: 8
Atrás
Arriba