TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: juanes79 en 08 de Septiembre de 2017, 00:50:44

Título: Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 08 de Septiembre de 2017, 00:50:44
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.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 08 de Septiembre de 2017, 09:41:36
Primero que nada, deerias leer el datasheet del micro, ahi te explica como funciona el modulo.

El datasheet tambien te da un paso a paso de como hacer para configurar el modulo de la UART para recibir y para transmitir. Para ser un poco mas especifico, te dice que activar en caso de que lo necesites.

Tambien tenes creo que 2 registros que son los que tenes que poner los bits como corresponden, deberias leer que hace cada bit y entender porque estas activandolos.

Cualquier duda que poseas sobre esto podes preguntarla que te vamos a responder.
Una cosa mas, no se si queres recibir por interrupcion o dentro del main.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: elreypic2 en 08 de Septiembre de 2017, 10:37:31
Que tal juanes79,

El PIC12F675 no contiene módulo USART o UART. Tienes que buscar la forma de hacerlo emulado por software.

Elreypic.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: george.manson.69 en 08 de Septiembre de 2017, 11:44:27
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.c

Có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.h

Có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!
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: tsk en 08 de Septiembre de 2017, 12:38:07
Este es un ejemplo que hice hace ya bastante tiempo con SDCC y el 12F675, lo acabo de modificar para que compile con la última versión, pero no tengo con que probar que funcione, debería funcionar porque en su tiempo funcionó, pero no estoy seguro

Para compilar este ejemplo
Código: [Seleccionar]
sdcc -mpic14 -p12f675 --use-non-free main.c
Código: C
  1. #include <pic14regs.h>
  2.  
  3. typedef unsigned int word;
  4. word __at 0x2007 CONFIG = _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _BODEN_OFF & _CP_OFF & _CPD_OFF;
  5.  
  6. unsigned char Count,Temp,SerBuf;
  7.  
  8. #define Tx 1
  9. #define Rx 2
  10.  
  11. void baud(unsigned char baudrate)
  12. {
  13. __asm
  14. baud:
  15.         movlw D'16'
  16.         movwf _Count
  17. baud1:
  18.         decfsz _Count,F
  19.         goto baud1
  20.  
  21. half_baud:
  22.         movlw D'16'
  23.         movwf _Count
  24. hbaud1:
  25.         decfsz _Count,F
  26.         goto hbaud1
  27.  
  28. __endasm;
  29.  
  30. }
  31.  
  32. void recv_suart()
  33. {
  34. __asm
  35. inch_n:
  36.         btfsc GPIO,Rx
  37.         goto inch_n
  38.         movlw 8
  39.         movwf _Temp
  40.         clrf _SerBuf
  41.         call half_baud
  42.         ;btfsc GPIO,Rx
  43.         ;goto inch_n
  44. inch_n1:
  45.         call baud
  46.         bcf STATUS,0
  47.         rrf _SerBuf,F
  48.         btfsc GPIO,Rx
  49.         bsf _SerBuf,7
  50.         decfsz _Temp,F
  51.         goto inch_n1
  52.         call baud
  53. __endasm;
  54. }
  55.  
  56. void send_suart()
  57. {
  58. __asm
  59. outch_n:
  60.         ;movwf _SerBuf
  61.         movlw 8
  62.         movwf _Temp
  63.         bcf GPIO,Tx
  64.         call baud
  65. outch_n1:
  66.         rrf _SerBuf,F
  67.         btfss STATUS,0
  68.         bcf GPIO,Tx
  69.         btfsc STATUS,0
  70.         bsf GPIO,Tx
  71.         call baud
  72.         decfsz _Temp,F
  73.         goto outch_n1
  74.  
  75.         rrf _SerBuf,F
  76.         bsf GPIO,Tx
  77.         call baud
  78.         call baud
  79. __endasm;
  80.  
  81. }
  82. void on_adc() {
  83. __asm
  84.         movlw 0x01
  85.         movwf ADCON0
  86. __endasm;
  87. }
  88.  
  89. void off_adc() {
  90. __asm
  91.         clrf ADCON0
  92. __endasm;
  93. }
  94.  
  95. void read_adc() {
  96. __asm
  97.         bsf ADCON0,1
  98. waitfc:
  99.         btfsc ADCON0,1
  100.         goto waitfc
  101. __endasm;
  102. }
  103. void initPIC()
  104. {
  105. /*Poner a Ceros el Puerto*/
  106. __asm
  107.         BANKSEL GPIO
  108.         movlw 0x02
  109.         movwf GPIO
  110.         movlw 0x07
  111.         movwf CMCON
  112.         BANKSEL ANSEL
  113.         movlw 0x11
  114.         movwf ANSEL
  115.         movlw 0x0d
  116.         movwf TRISIO
  117.         BANKSEL GPIO
  118. __endasm;
  119. }
  120.  
  121. /*Rutina de Retardo*/
  122. void delay(int ret) {
  123.         int r;
  124.         for(r=0;r<=ret;r++) { }
  125. }
  126.  
  127. void main() {
  128.         initPIC();
  129.         SerBuf=0x70;
  130.         send_suart();
  131.         SerBuf=0x69;
  132.         send_suart();
  133.         SerBuf=0x63;
  134.         send_suart();
  135.         SerBuf=0x31;
  136.         send_suart();
  137.         SerBuf=0x32;
  138.         send_suart();
  139.         SerBuf=0x66;
  140.         send_suart();
  141.         SerBuf=0x36;
  142.         send_suart();
  143.         SerBuf=0x37;
  144.         send_suart();
  145.         SerBuf=0x35;
  146.         send_suart();
  147.         SerBuf=0x0D;
  148.         send_suart();
  149.         recv_suart();
  150.         send_suart();
  151.         while(1){
  152.                 on_adc();
  153.                 read_adc();
  154.                 off_adc();
  155.                 SerBuf=ADRESH;
  156.                 send_suart();
  157.                 GP5=1;
  158.                 delay(20000000);
  159.                 GP5=0;
  160.                 delay(20000000);
  161.         }
  162. }
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 08 de Septiembre de 2017, 14:03:15
Creo que el no trata de genera una UART por software.

Sino que le den el software, para configurar y que envie/reciba utilizando el modulo UART del PIC.

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.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 08 de Septiembre de 2017, 16:03:27
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.

Buenas tardes. Muchas gracias por su ayuda. El PIC 12F675 no tiene modulo USART, por lo tanto debo configurarlo por software.

Saludes.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 08 de Septiembre de 2017, 17:33:07
Nunca me fije que no poseia modulo por hardware. Entonces los codigos que te pasaron y seguro hay mas dando vueltas por internet te pueden ayudar.

PD: Cambiaria de micro si es posible por alguno que tenga mas prestaciones.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 11 de Septiembre de 2017, 08:16:06
Buenos días. Lo que requiero hacer es habilitar el USART en el PIC 12F675 por software en el programa MPLAB. Les consulto si el MPLAB tiene alguna librería para habilitar el USART por software. si tienen algún ejemplo mucho mejor.

Saludos.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: elreypic2 en 11 de Septiembre de 2017, 19:34:55
juanes79,

Nuestro amigo "george.manson.69" justamente te respondió esa pregunta. Ha colocado los drivers para que puedas implementar un USART por software en C y MPLAB.

elreypic.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 14 de Septiembre de 2017, 00:27:06
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.

Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: elreypic2 en 14 de Septiembre de 2017, 00:47:42
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.

Que tal juanes79,

Me alegra que encontraras la solución, pero eso no es para el compilador XC8, eso es para CCS. Y originalmente pedías en XC8 por eso comente que la solución te la habia compartido george.manson.

Saludos,

elreypic.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 14 de Septiembre de 2017, 17:50:55
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.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: elreypic2 en 14 de Septiembre de 2017, 18:26:34
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.

En este link se responde a tu pregunta:

http://www.todopic.com.ar/foros/index.php?topic=45328.msg377472#msg377472

Saludos,

elreypic.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 15 de Septiembre de 2017, 13:06:35
Gracias a todos por sus oportunas respuestas. El PIC 12F675 no tiene modulo PWM, razón por la cual debo buscar otra alternativa como timer 0 ó 1 para realizar el dimerizado de un led RGB, es decir variar la intensidad de luz de mas a menos y luego de menos a mas. Les consulto si conocen de algún ejemplo con este PIC12F675 ó como puedo realizar dicho programa.

Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 15 de Septiembre de 2017, 13:07:57
correción: el PIC 12F675 no tiene PWM.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 15 de Septiembre de 2017, 14:03:28
Busca "PWM Software" y seguramente vas a tener un codigo de como implementarlo en Software.

Pero como te dije antes, si requeris de tantas cosas que ese micro no posee, es mejor directamente buscar un micro que tenga mejores prestaciones.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: elreypic2 en 15 de Septiembre de 2017, 14:23:49
Tambien puedes visitar el subforo de DMX512, ahi encontrarás bastante información al respecto y muchos ejemplos que los foreros han realizado.
O puedes ver este enlace, que hace exactamente lo que necesitas con un microcontrolador PIC12F629:
http://www.enide.net/webcms/index.php?page=power-pic-rgb

elreypic.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 18 de Septiembre de 2017, 08:22:25
Les consulto si tienen algún ejemplo, donde se explique como realizar un dimerizado con el PIC 12F675 en PIC C, utilizando el timer 0 ó 1.

Saludos.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 18 de Septiembre de 2017, 13:26:08
Simple, pensa que es un PWM y como realizarlo. Es como una onda cuadrada en el que varia el pulso que esta en alto.

La frecuencia es constante.
Si quisiera un PWM con 100 pasos y una frecuencia de 100Hz por ejemplo. necesitaria: Tpwm = 1 / 100Hz = 10ms , y necesito 100 pasos, por lo cual necesito 10ms/100 = una interrupcion cada 100us.

En la interrupcion voy a tener una variable que cuente ( Va a ir de 0 a 100 ). y un if comparandolo con el duty que yo seleccione, en este caso es simple por que el 0 al 100 del contador, responden a lo mismo que 0% al 100% del duty.

Puede haber errores en el codigo, pero es algo asi:

Código: C
  1. uint8_t contador = 100;
  2.  
  3. void funcionDeInterrupcionTMRx(void)
  4. {
  5.       if(contador == 0 )
  6.       {
  7.           // Se completo todos los pasos en esa frecuencia? Apago todo
  8.           contador = 100;
  9.           salida = 0;
  10.       }
  11.  
  12.       if(PWM1 >= contador )
  13.       {
  14.          //Activo la salida cuando se necesite
  15.          salida = 1;
  16.       }
  17.  
  18.       contador--;
  19. }

Tambien se puede hacer de otras formas, con contador que sea ascendente en ves de descendente, etc.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: juanes79 en 20 de Septiembre de 2017, 00:21:55
Muchas gracias por sus valiosos aportes. Les cuento que me vi obligado a cambiar el microcontrolador 12F675, por el micro 16F883, el cual es mucho mas completo porque posee mas salidas y PWM. Les consulto si conocen de algún programa realizado en este microcontrolador que me permita realizar un dimerizado de un led RGB, es decir variar la intensidad de brillo en en varias salidas utilizadas en el microcontrolador.

Necesito ejemplos....

Saludes.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: KILLERJC en 20 de Septiembre de 2017, 09:37:45
Citar
Necesito ejemplos....

El PIC16F883 es de la familia del PIC1F887. Y tiene dos PWM independiente si no mal recuerdo. Si queres realizar tres para un RGB, lo vas a tener que realizar con el codigo que pase, y modificandolo para que funcione con los 3 colores.

Es decir haciendo un PWM por software, darte el "ejemplo" es darte el codio realizado, y la idea es que aprendas como es que funciona. Sabiendo como funciona, podras modificar el codigo para lo que quieras.
Título: Re:Habilitar USART por software en PIC 12F675
Publicado por: alejo1996 en 04 de Septiembre de 2018, 23:51:33
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.c

Có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.h

Có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!

Hola esto es exactamente lo que estaba buscando pero me quedaron un par de dudas, en que parte definís los pines que van a ser tx y rx y por otra parte el baudrate lo tengo que pasar como argumento cuando llamo al SetSoftUART o lo tengo que poner en algun otro lado?