Autor Tema: Aclaración al interpretar la libreria USART.h en C18  (Leído 2891 veces)

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

Desconectado jorgejg

  • PIC12
  • **
  • Mensajes: 96
Aclaración al interpretar la libreria USART.h en C18
« en: 16 de Septiembre de 2011, 15:03:08 »
Recien me inicio en C18 y no podia levantar el USART del PIC18F, era porque estaba interpretando mal la libreria, lo comento porque quizás alguien tambien tenga el mismo problema o haya pasado o este pasando algo similar.

Uso el include:
#include <usart.h>

Como uso el USB con CPUDIV=OSC1_PLL2 entonces el FOSC=48Mhz. La función "OpenUSART()" usa por defecto "BRG16=0" y al usar "USART_BRGH_HIGH" (BRGH=1) la formula para calcular el baudrate será (ver pag. 239 del datasheet del PIC18F4550):

baudrate=FOSC/[16*(spbrg+1)]

Entonces, si quisiera obtener baudrate=9600bps, en la formula spbrg=311, pero como por defecto el OpenUSART trabaja con "BRG16=0" significa que si escribimos 311 en la función el PIC solo trabajará con los primeros 8 bits de 311 que es: "311-256=55" por tanto el baurate real será:

baudrate=48Mhz/[16*(55+1)]=53.57Kbps

Aquí radicaba mi error, yo pensaba que podia escribir 311 y ser aceptado como tal, en realidad sucede algo curioso porque en la definición de la función el valor que uno puede escribir como spbrg es de tipo unsigned int lo cual significa que puede aceptar un valor de hasta 65535 pero el PIC no lo acepta porque la función usa el "BRG16=0" (creo que por defecto este valor viene a 0) es decir se trabaja a 8bits en el valor de "spbrg" por eso no usa el 311 sino el valor de 55.

Habiendo entendido esto ya es facil configurar el USART, por ejemplo para obtener un baudrate de 9600bps con BRG16=0 (8bits de spbrg) y BRGH=0 la formula a usar es (ver datasheet):

baudrate=FOSC/[64*(spbrg+1)]:

de aqui obtenemos spbrg=77 con lo cual la función para configurar el USART se declara asi:

OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_LOW, 77);

Otra forma de configurar a 9600bps es con BRG16=1 (16bits de spbrg) y BRGH=0, con lo cual la formula a usar es:

baudrate=FOSC/[16*(spbrg+1)]

de donde obtenemos spbrg=311 por tanto configuramos el USART de la siguiente forma:

OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_LOW, 311);
BAUDCONbits.BRG16=1;

Espero le sirva a alguien, es una pequeña contribución dentro de lo muy poco que entiendo de c18.
« Última modificación: 16 de Septiembre de 2011, 15:07:03 por jorgejg »

Desconectado jeremylf

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1341
Re: Aclaración al interpretar la libreria USART.h en C18
« Respuesta #1 en: 02 de Noviembre de 2011, 14:46:15 »
Me sirvió mucho tu aporte, gracias.