Autor Tema: Habilitar USART por software en PIC 12F675  (Leído 5237 veces)

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

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Habilitar USART por software en PIC 12F675
« 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Habilitar USART por software en PIC 12F675
« Respuesta #1 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Habilitar USART por software en PIC 12F675
« Respuesta #2 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.

Desconectado george.manson.69

  • PIC10
  • *
  • Mensajes: 33
    • Microcontroladores en General
Re:Habilitar USART por software en PIC 12F675
« Respuesta #3 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!

Desconectado tsk

  • PIC18
  • ****
  • Mensajes: 255
Re:Habilitar USART por software en PIC 12F675
« Respuesta #4 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. }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Habilitar USART por software en PIC 12F675
« Respuesta #5 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.

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #6 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Habilitar USART por software en PIC 12F675
« Respuesta #7 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.

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #8 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Habilitar USART por software en PIC 12F675
« Respuesta #9 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.

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #10 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.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Habilitar USART por software en PIC 12F675
« Respuesta #11 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.

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #12 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.

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Habilitar USART por software en PIC 12F675
« Respuesta #13 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.

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #14 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.

« Última modificación: 15 de Septiembre de 2017, 13:09:18 por juanes79 »


 

anything