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

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

Desconectado juanes79

  • PIC10
  • *
  • Mensajes: 41
Re:Habilitar USART por software en PIC 12F675
« Respuesta #15 en: 15 de Septiembre de 2017, 13:07:57 »
correción: el PIC 12F675 no tiene PWM.

Desconectado KILLERJC

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

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1297
Re:Habilitar USART por software en PIC 12F675
« Respuesta #17 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.
« Última modificación: 15 de Septiembre de 2017, 14:35:36 por elreypic2 »

Desconectado juanes79

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

Desconectado KILLERJC

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

Desconectado juanes79

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

Desconectado KILLERJC

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

Desconectado alejo1996

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