Autor Tema: Problemas con USART en C18 con 18F4550  (Leído 6588 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Problemas con USART en C18 con 18F4550
« en: 01 de Mayo de 2011, 15:23:47 »
Hola a todos, estoy tratando de hacer funcionar la USART en el 18f4550 y hasta ahora no he podido obtener los resultados deseados. He leído el datasheet, pero me quedan algunas dudas.

La idea del código es sacar un simple "hola" por por un programa de tipo hyperterminal, pero solo obtengo caracteres raros del tipo "àààààà" en pantalla.

Alguien sabe como configurar y para que sirven los bits SENDB BRGH TRMT CREN  ? la verdad es que no me queda muy claro en el datasheet.

A continuación dejo el código.  Si necesitan alguna aclaración, por  favor me lo dicen.

Muchas gracias a todos!

Saludos!


Código: [Seleccionar]
/*Includes*/

#include "p18F4550.h"
#include "delays.h"
#include "stdlib.h"
#include "usart.h"


#pragma config FOSC = XTPLL_XT,FCMEN = OFF,IESO = OFF,PLLDIV = 1, CPUDIV = OSC1_PLL2
#pragma config PWRT = ON,BOR = OFF,BORV = 0
#pragma config WDT = OFF,WDTPS = 32768
#pragma config MCLRE = ON,LPT1OSC = OFF,PBADEN = OFF,CCP2MX = OFF
#pragma config STVREN = OFF,LVP = OFF,XINST = OFF,DEBUG = OFF
#pragma config CP0 = OFF,CP1 = OFF,CP2 = OFF
#pragma config CPB = OFF,CPD = OFF
#pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF
#pragma config WRTB = OFF,WRTC = OFF,WRTD = OFF
#pragma config EBTR0 = OFF,EBTR1 = OFF,EBTR2 = OFF
#pragma config EBTRB = OFF



//----------------------------/*****Programa principal******/-------------------------//


void main (void)

{

ADCON0 = 0X00;         //ADC desactivado
ADCON1=0x0F;        // Todos entradas/salidas digitales - equivalente en binario ADCON1= 0b00001111
CMCON = 0X07;    //Comparadores desactivados


TRISC=0b01100000;      //RC 6 y 7 =1 como indica el datasheet para la USART   
LATC=0b00000000;       //todas las salidas abajo

ADCON0 = 0X00;          //ADC desactivado
ADCON1=0x0F;       // Todos entradas/salidas digitales - equivalente en binario ADCON1= 0b00001111
CMCON = 0X07;           //Comparadores desactivados


//-----------------------------------------------------Configuración USART--------------------------------------------------------------//

TXSTA=0b00100010;     
RCSTA=0B10010000;
BAUDCONbits.TXCKP=0;
BAUDCONbits.BRG16=0;
BAUDCONbits.WUE=0;
BAUDCONbits.ABDEN=0;

SPBRG=311; //Baud Rate=9600    // Baud Rate = FOSC/[16 (n + 1)]


while(1)

{
putrsUSART("hola");
Delay10KTCYx(100);


 
}   

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
No contesto mensajes privados, las consultas en el foro

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Re: Problemas con USART en C18 con 18F4550
« Respuesta #2 en: 01 de Mayo de 2011, 17:21:54 »
Gracias Suky por responder tan pronto.

Te cuento que he intentado trabajar con las librerías como las presentas en tu tutorial, el cual es libro de "Cabecera" para mí, sin embargo no he logrado comunicarme. Voy a seguir intentándolo ( esto comenzando a dudar del hard)

¿Es fundamental usar algún tipo de interrupción para lo que deseo hacer?

Saludos!

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re: Problemas con USART en C18 con 18F4550
« Respuesta #3 en: 01 de Mayo de 2011, 19:08:52 »
Hola Pacman, que dejo un ejemplo que funciona correctamente para que puedas estudiarlo y ver donde fallas.
Código: CSS
  1. /**************************************************************************************/
  2. /* ** Prueba de comunicacion del modulo USART con Interrupcion de Alta Prioridad
  3. /* ** Encendemos 2 leds conectados al PORTB bits <0:1>
  4. /* ** LED ROJO ----> RB0
  5. /* ** LED AZUL ----> RB1
  6. /* ** Letra R ----> Led Rojo
  7. /* ** Letra A ----> Led Azul
  8.  
  9. /* ** Autor: Miquel Servera
  10. /* ** Fecha: 25-Abril-2011
  11. /* ** Modelo de Micro: PIC18F4550
  12.  
  13. /*************************************************************************************/
  14.  
  15. /* ** Archivo con definicion de registros y bits del microcontrolador elegido ** */
  16.  
  17. #include <p18f4550.h>
  18.  
  19. /* ** Include para el USART ** */
  20.  
  21. #include <usart.h>
  22.  
  23. /* ** Configuracion de los Fuses del microcontrolador ** */
  24.  
  25. #pragma config FOSC = XT_XT,FCMEN = OFF,IESO = OFF,CPUDIV = OSC1_PLL2
  26. #pragma config PWRT = ON,BOR = OFF,BORV =0,WDT = OFF
  27. #pragma config WDTPS = 32768,CCP2MX = OFF,PBADEN = OFF,LPT1OSC = OFF
  28. #pragma config MCLRE = OFF,STVREN = OFF,LVP = OFF,ICPRT = OFF
  29. #pragma config XINST = OFF,DEBUG = OFF,CP0 = OFF,CP1 = OFF
  30. #pragma config CP2 = OFF,CP3 = OFF,CPB = OFF,CPD = OFF
  31. #pragma config WRT0 = OFF,WRT1 = OFF,WRT2 = OFF,WRT3 = OFF
  32. #pragma config WRTC = OFF,WRTB = OFF,WRTD = OFF,EBTR0 = OFF
  33. #pragma config EBTR1 = OFF,EBTR2 = OFF,EBTR3 = OFF,EBTRB = OFF
  34.  
  35. /* ** Declaracion de Funciones a utilizar ** */
  36.  
  37. void ISRRecepcion(void);
  38.  
  39. /* ** Variables de uso general ** */
  40.  
  41. volatile char Dato,kbhit;
  42.  
  43. /* ** Seccion de codigo a partir de la direccion 0x0008 ** */
  44.  
  45. #pragma code interrupcion = 0x0008
  46. void VectorInterrupcion(void)
  47. {
  48.         _asm goto ISRRecepcion _endasm
  49. }
  50. #pragma code    // Cerramos seccion.-
  51.  
  52. /* ** Rutina de Interrupcion ** */
  53.  
  54. #pragma interrupt ISRRecepcion
  55. void ISRRecepcion(void)
  56. {
  57.         if(PIR1bits.RCIF==1)
  58.         {
  59.                 Dato=getcUSART();       // Leemos dato recibido.-
  60.                 kbhit=1;                        // Indicamos que se ha recibido un dato.-
  61.                 PIR1bits.RCIF=0;        // Borramos flag.-
  62.         }
  63. }
  64.  
  65. /* ** Funcion MAIN ** */
  66.  
  67. void main(void)
  68. {
  69.         TRISB=0x00;
  70.         LATB=0x00;
  71.         OpenUSART( USART_TX_INT_OFF &
  72.                            USART_RX_INT_ON &
  73.                            USART_ASYNCH_MODE &
  74.                            USART_EIGHT_BIT &
  75.                            USART_CONT_RX &
  76.                            USART_BRGH_HIGH,12);         // 19.200 baudios.-
  77.         kbhit=0;
  78.         RCONbits.IPEN=0;        // Desabilitamos Prioridades.-
  79.         INTCONbits.PEIE=1;      // Habilitamos Interrupcion de perifericos.-
  80.         INTCONbits.GIE=1;       // Habilitamos Interrupcion Global.-
  81.  
  82.         putrsUSART("Prueba de Comunicacion USART \r");
  83.         putrsUSART("Seleccione una opcion del Menu \r");
  84.         putrsUSART("\r");
  85.         putrsUSART("R: Led ROJO \r");
  86.         putrsUSART("A: Led AZUL \r");
  87.         putrsUSART("\r");
  88.        
  89.         while(1)
  90.         {
  91.                 while(kbhit==0){};              // Esperamos a recibir dato.-
  92.                 kbhit=0;
  93.                
  94.                 switch(Dato)
  95.                 {
  96.                         case 0x52:                      // Letra R.-
  97.                         LATB=0b00000001;
  98.                         putrsUSART("Led ROJO ON \r");
  99.                         break;
  100.  
  101.                         case 0x41:                      // Letra A.-
  102.                         LATB=0b00000010;
  103.                         putrsUSART("Led ROJO OFF \r");
  104.                         putrsUSART("Led AZUL ON \r");
  105.                         break;
  106.                 }
  107.         }
  108. }
Saludos

Miquel_S
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Problemas con USART en C18 con 18F4550
« Respuesta #4 en: 01 de Mayo de 2011, 19:12:45 »
Igual hay un problema a simple vista en tu código, colocas el bit BRG16 a 0, (8-bits) pero colocas 311 en SPBRG. Revisa ese calculo, seguro es el problema de todo.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado Pacman

  • PIC10
  • *
  • Mensajes: 6
Re: Problemas con USART en C18 con 18F4550
« Respuesta #5 en: 02 de Mayo de 2011, 23:32:30 »
Gracias por los comentarios, en cuanto tenga 2 min para hacer algunas pruebas les cuento los resultados.

Desconectado 1989raymundo

  • PIC10
  • *
  • Mensajes: 1
Re: Problemas con USART en C18 con 18F4550
« Respuesta #6 en: 14 de Agosto de 2011, 15:18:25 »
Gracias por los comentarios, en cuanto tenga 2 min para hacer algunas pruebas les cuento los resultados.
oye amigo ya se como resolver tu problema, no te sale un hola porq el problema lo tienes en el SPBRG, ya que para una velocidad de 9600 Bd, requieres un SPBRG=12, ya que la operacion es la siguiente (FREQ/64)/baud)-1), espero que te ayude bye

Desconectado gabyua

  • PIC10
  • *
  • Mensajes: 3
Problemas con USART en C18 con 18F4550
« Respuesta #7 en: 27 de Enero de 2016, 20:38:19 »
hola, estoy teniendo problemas de envío de datos en protocolo rs232 desde el pic 18f4550, estoy usando el oscilador interno y RTOS ya que después le pienso implementar varias tareas más.
Al montar en la protoboard y comenzar el envío de datos, mi aplicacion en C# no recibe los datos correctamente.
Estoy leyendo el datasheet al mismo tiempo que busco respuestas en este foro, si alguien tiene la cabeza menos enredada y conoce qué estoy haciendo mal, avíseme :shock:. Mi código lleva lo siguiente,

Código: [Seleccionar]
#include <18F4550.h>
#device adc=10
#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES PLL5                     //Divide By 5(20MHz oscillator input)
#FUSES CPUDIV1                  //No System Clock Postscaler
#FUSES NOUSBDIV                 //USB clock source comes from primary oscillator
#FUSES INTRC_IO                 //Internal RC Osc, no CLKOUT
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOVREGEN                 //USB voltage regulator disabled
#FUSES NOLPT1OSC                //Timer1 configured for higher power operation
#FUSES NOSTVREN                 //Stack full/underflow will not cause reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOIESO                  // No se necesita conmutar entre el oscilador externo y el interno
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(internal=4M)
#use rtos(timer=0,minor_cycle=1ms)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PORT1)

#task(rate=500ms,max=1ms)
void puerto_serie( );

void puerto_serie(){
 
   //VARIABLE RS232
   char  dato_rx;
   
    if(input(pin_b3)==1){
    dato_rx='g';
    putc(dato_rx);
    delay_ms(1000);}
   
   
}

void main(){
   setup_adc_ports(AN0_TO_AN3);
   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);

   rtos_run( );
}


Si la app de c# Visual Basic detecta una "g" se imprime en un textbox, pero en la vida real empieza a imprimir pura basura  :oops:
Gracias!
« Última modificación: 27 de Enero de 2016, 20:42:08 por gabyua »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problemas con USART en C18 con 18F4550
« Respuesta #8 en: 27 de Enero de 2016, 21:06:13 »
Deberías abrir un post nuevo. Este post es viejísimo.
De todos modos, no has probado con un programa terminal a ver si recives bien la 'g'? quizá sea problema del manejo del puerto serie en el C#. Si no recives las g en el terminal, deberías chequear con el oscilloscopio que esté saliendo datos por el pin Tx del uC.

Saludos
-
Leonardo Garberoglio

Desconectado gabyua

  • PIC10
  • *
  • Mensajes: 3
Re:Problemas con USART en C18 con 18F4550
« Respuesta #9 en: 27 de Enero de 2016, 21:18:01 »
Deberías abrir un post nuevo. Este post es viejísimo.
De todos modos, no has probado con un programa terminal a ver si recives bien la 'g'? quizá sea problema del manejo del puerto serie en el C#. Si no recives las g en el terminal, deberías chequear con el oscilloscopio que esté saliendo datos por el pin Tx del uC.

Saludos

Hola, lo he intentado por el terminal de Proteus y si me envía el caracter g, en c# lo recibo del puerto serial como
Código: [Seleccionar]
private void Recepcion(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            Recibidos += serialPort1.ReadExisting();
            }
y cada vez que se actualiza el evento del serial port, me escribe lo que se supone le llega del pic con
Código: [Seleccionar]
txtbVisualizar.Text += Recibidos;
pero solo escribe DEVICE FOUND!, y nunca encuentra la g :/ Ambos programas tienen las mismas configuraciones del puerto serial.

Saludos y gracias!
P.D. cabe mencionar que con el pic 16f887 si funciona la comunicación en la vida real, así que creo que el problema está en la config del 18f
« Última modificación: 27 de Enero de 2016, 23:52:19 por gabyua »

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Problemas con USART en C18 con 18F4550
« Respuesta #10 en: 28 de Enero de 2016, 07:22:56 »
Insisto en que debes probar con un programa terminal con el circuito real (no con la simulacion de proteus). El manejo del puerto serie tiene algún que otro secretito. Estas usando delegados para actualizar tu text box?

saludos
-
Leonardo Garberoglio

Desconectado gabyua

  • PIC10
  • *
  • Mensajes: 3
Re:Problemas con USART en C18 con 18F4550
« Respuesta #11 en: 29 de Enero de 2016, 00:25:22 »
elgarbe al final supe que era, mi windows actualizó el driver de mi FTDI232 y yo ni en cuenta :5] , probé todo en otra compu y sirvió muy bien.
¿Quién lo iba a pensar? :-)

Gracias!