uint32_t time_soft;
/*
Funcion para configurar
el UART por Soft
@softbaud = Velocidad deseada de baudios
*/
void SetSoftUART(uint32_t softbaud){
time_soft =(uint32_t)(soft_uart_Tick/softbaud);
soft_pin_init_tx;
soft_pin_init_rx;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);
soft_pin_init_rx_state &=~0x18;
if(!soft_uart_invert)
soft_pin_init_rx_state |= (0<<3)+(1<<4);
else
soft_pin_init_rx_state |= (1<<3)+(0<<4);
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);
}
/*
Funcion para poner un caracter
*/
void soft_putc_uart(uint8_t d){
uint8_t i_;
if(!soft_uart_invert)
soft_pin_tx_low;
else
soft_pin_tx_high;
delay_us(time_soft);
for(i_=0;i_<8;i_++){
if(d&0x01){
if(!soft_uart_invert)
soft_pin_tx_high;
else
soft_pin_tx_low;
}else{
if(!soft_uart_invert)
soft_pin_tx_low;
else
soft_pin_tx_high;
}
d>>=1;
delay_us(time_soft);
}
if(!soft_uart_invert)
soft_pin_tx_high;
else
soft_pin_tx_low;
delay_us(time_soft);
}
/////////////////////////////////////////
//Funcion para recibir un caracter
/////////////////////////////////////////
uint8_t soft_getc_uart(void){
uint8_t da_=0,i_;
if(!soft_uart_invert)
while(soft_pin_state_rx);
else
while(!soft_pin_state_rx);
delay_us(time_soft);
delay_us(time_soft/2);
for(i_=0;i_<8;i_++){
if(soft_pin_state_rx){
if(!soft_uart_invert)
da_ |= (1<<i_);
else
da_ &=~ (1<<i_);
}
delay_us(time_soft-i_);
}
if(!soft_uart_invert){
if(soft_pin_state_rx){
delay_us(time_soft/2);
return da_;
}else{
delay_us(time_soft/2);
return 0;
}
}else{
if(!soft_pin_state_rx){
delay_us(time_soft/2);
return da_;
}else{
delay_us(time_soft/2);
return 0;
}
}
}
///////////////////////////////////////
//Funcion para recibir una cadena de caracteres
//Ojo se debe de terminar con '\r'
///////////////////////////////////////
void soft_read_string(char *ptrr){
do{
(*ptrr)=soft_getc_uart();
}while((*ptrr++)!='\r');
}
/*
Funcion para escribir una cadena de caracteres
de la memoria rom
*/
void soft_write_string_rom(const char *ptr2){
do{
soft_putc_uart(*ptr2);
}while((*ptr2++)!='\r');
}
/*
Funcion para escribir una cadena de caracteres
de la memoria ram
*/
void soft_write_string_ram(char *ptr3){
do{
soft_putc_uart(*ptr3);
}while((*ptr3++)!='\r');
}
#define soft_uart_Tick 500000
#define soft_uart_invert 0
#define soft_pin_tx_low LPC_GPIO1->DATA &=~(1<<9)
#define soft_pin_tx_high LPC_GPIO1->DATA |=(1<<9)
#define soft_pin_state_rx (LPC_GPIO1->DATA & (1<<8))
#define soft_pin_init_tx LPC_GPIO1->DIR |= (1<<9)
#define soft_pin_init_rx LPC_GPIO1->DIR &= ~(1<<8)
#define soft_pin_init_rx_state LPC_IOCON->PIO1_8
void SetSoftUART(uint32_t softbaud);
void soft_putc_uart(uint8_t d);
uint8_t soft_getc_uart(void);
void soft_read_string(char *ptrr);
void soft_write_string_rom(const char *ptr2);
void soft_write_string_ram(char *ptr3);
sdcc -mpic14 -p12f675 --use-non-free main.cBuenas noches amigos del foro. Necesito habilitar el módulo USART en el microcontrolador PIC 12F675. Estoy utilizando el programa MPLABX con el compilar XC8. Necesito recibir y transmitir datos con este microcontrolador en lenguaje C.
Muchas gracias por su ayuda.
Buenas noches amigos del foro. Necesito habilitar el módulo USART en el microcontrolador PIC 12F675. Estoy utilizando el programa MPLABX con el compilar XC8. Necesito recibir y transmitir datos con este microcontrolador en lenguaje C.
Muchas gracias por su ayuda.
Hola amigos. Les cuento que ya habilite el módulo USART virtual en el PIC 12F675. Les comparto el código:Código: [Seleccionar]
#USE rs232(baud=9600,xmit=PIN_A4,stream=PIC,parity=N,rcv=PIN_A5,bits=8)
Esta línea de arriba es para habilitar la transmisión y recepción de datos en el pin _A4 como trasmisor y en el PIN_A5 como receptor. De esta forma estos dos pines como USART virtual, porque el PIC 12F675 no tiene módulo USART físico. Se pueden habilitar otros pines.
Les consulto si es posible realizar interrupción de un USART virtual en este PIC. Si tiene algún ejemplo mucho mejor.
Saludes.
Hola amigos. Les consulto como puedo realizar un dimerizado (variación de la intensidad de un diodo led RGB) a través del timer 0 ó 1 del microcontrolador PIC 12F675.
Saludos.
Necesito ejemplos....
Hola,
te comparto un codigo para implementarlo solo debes de cambiar algunas cosas, tales como el pines que queires usar como TX y RX, y lo mas importante la funcion del delay, para que te de los tiempos correcto.
Archivo.cCódigo: [Seleccionar]
uint32_t time_soft;
/*
Funcion para configurar
el UART por Soft
@softbaud = Velocidad deseada de baudios
*/
void SetSoftUART(uint32_t softbaud){
time_soft =(uint32_t)(soft_uart_Tick/softbaud);
soft_pin_init_tx;
soft_pin_init_rx;
LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);
soft_pin_init_rx_state &=~0x18;
if(!soft_uart_invert)
soft_pin_init_rx_state |= (0<<3)+(1<<4);
else
soft_pin_init_rx_state |= (1<<3)+(0<<4);
LPC_SYSCON->SYSAHBCLKCTRL &= ~(1<<16);
}
/*
Funcion para poner un caracter
*/
void soft_putc_uart(uint8_t d){
uint8_t i_;
if(!soft_uart_invert)
soft_pin_tx_low;
else
soft_pin_tx_high;
delay_us(time_soft);
for(i_=0;i_<8;i_++){
if(d&0x01){
if(!soft_uart_invert)
soft_pin_tx_high;
else
soft_pin_tx_low;
}else{
if(!soft_uart_invert)
soft_pin_tx_low;
else
soft_pin_tx_high;
}
d>>=1;
delay_us(time_soft);
}
if(!soft_uart_invert)
soft_pin_tx_high;
else
soft_pin_tx_low;
delay_us(time_soft);
}
/////////////////////////////////////////
//Funcion para recibir un caracter
/////////////////////////////////////////
uint8_t soft_getc_uart(void){
uint8_t da_=0,i_;
if(!soft_uart_invert)
while(soft_pin_state_rx);
else
while(!soft_pin_state_rx);
delay_us(time_soft);
delay_us(time_soft/2);
for(i_=0;i_<8;i_++){
if(soft_pin_state_rx){
if(!soft_uart_invert)
da_ |= (1<<i_);
else
da_ &=~ (1<<i_);
}
delay_us(time_soft-i_);
}
if(!soft_uart_invert){
if(soft_pin_state_rx){
delay_us(time_soft/2);
return da_;
}else{
delay_us(time_soft/2);
return 0;
}
}else{
if(!soft_pin_state_rx){
delay_us(time_soft/2);
return da_;
}else{
delay_us(time_soft/2);
return 0;
}
}
}
///////////////////////////////////////
//Funcion para recibir una cadena de caracteres
//Ojo se debe de terminar con '\r'
///////////////////////////////////////
void soft_read_string(char *ptrr){
do{
(*ptrr)=soft_getc_uart();
}while((*ptrr++)!='\r');
}
/*
Funcion para escribir una cadena de caracteres
de la memoria rom
*/
void soft_write_string_rom(const char *ptr2){
do{
soft_putc_uart(*ptr2);
}while((*ptr2++)!='\r');
}
/*
Funcion para escribir una cadena de caracteres
de la memoria ram
*/
void soft_write_string_ram(char *ptr3){
do{
soft_putc_uart(*ptr3);
}while((*ptr3++)!='\r');
}
Archivo.hCódigo: [Seleccionar]#define soft_uart_Tick 500000
#define soft_uart_invert 0
#define soft_pin_tx_low LPC_GPIO1->DATA &=~(1<<9)
#define soft_pin_tx_high LPC_GPIO1->DATA |=(1<<9)
#define soft_pin_state_rx (LPC_GPIO1->DATA & (1<<8))
#define soft_pin_init_tx LPC_GPIO1->DIR |= (1<<9)
#define soft_pin_init_rx LPC_GPIO1->DIR &= ~(1<<8)
#define soft_pin_init_rx_state LPC_IOCON->PIO1_8
void SetSoftUART(uint32_t softbaud);
void soft_putc_uart(uint8_t d);
uint8_t soft_getc_uart(void);
void soft_read_string(char *ptrr);
void soft_write_string_rom(const char *ptr2);
void soft_write_string_ram(char *ptr3);
Saludos!