Autor Tema: Conflicto con TIMER1 y PWM con PIC18F452.  (Leído 2416 veces)

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

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Conflicto con TIMER1 y PWM con PIC18F452.
« en: 11 de Mayo de 2011, 13:37:30 »
Estoy usando el TIMER1 del PIC18F452 con esta configuración:

Código: [Seleccionar]
//Configuración TIMER1.

//RD16 = 1;//Enables register Read/Write of Timer1 in one 16-bit operation
  RD16 = 0;//Enables register Read/Write of Timer1 in two 8-bit operations

  T1CKPS0 = 1;//Rango division timer1 = 8;
  T1CKPS1 = 1;

  T1OSCEN = 0;//Deshabilita el oscilador externo del timer1.

  TMR1CS = 0;//Habilita reloj interno del timer1.

  TMR1ON = 1;//Enable del timer1.

  TMR1IP = 0;

  TMR1L = PERIODO_REFRESCO_L;
  TMR1H = PERIODO_REFRESCO_H;

  TMR1IF = 0;//Borro flag interrupcion timer1.
  TMR1IE = 1;//Habilito interrupcion timer1.
  PEIE = 1;//Habilito interrupcion perifericos.

Con eso consigo hacer temporizaciones correctas por interrupción. Pero, al usar el PWM, con la siguiente configuración, las temporizaciones del TIMER1 van 4 veces más rápidas. Leyendo el dataseet del PIC18F452, pone que el TIMER1 se puede resetear con un reset interno provocado por el CCP "RESET from CCP module special event trigger", pero no veo forma de desactivarlo con algún registro.

Código: [Seleccionar]
//Configuracion y uso del PWM.
void ActualizarPWM_1(unsigned short duty){
CCPR1L = duty>>2;
    DC1B0 = duty & 0b00000001;
DC1B1 = (duty>>1) & 0b00000001;
}
//------------------------------------------------------
void IniciarPWM_1(void){
PR2 = 255;//PWM period = [(PR2) + 1] • 4 • TOSC • (TMR2 prescale value)
 //PWM de 10KHz.

TRISC2 = 0;//CCP1 pin an output

T1CKPS0 = 1; //Timer2 Clock Prescale Select bits = 4
T1CKPS1 = 0;

TOUTPS0 = 0;//Post escala
TOUTPS1 = 0;
TOUTPS2 = 0;
TOUTPS3 = 0;

TMR2ON = 1;//Timer2 is on

TMR2 = 0x00;

CCP1M0 = 0;//PWM mode
CCP1M1 = 0;
CCP1M2 = 1;
CCP1M3 = 1;
}
//------------------------------------------------------
//------------------------------------------------------
void ActualizarPWM_2(unsigned short duty){
DC2B0 = duty & 0b00000001;
DC2B1 = (duty>>1) & 0b00000001;
CCPR2L = duty>>2;
}
//------------------------------------------------------
void IniciarPWM_2(void){
PR2 = 255;//PWM period = [(PR2) + 1] • 4 • TOSC • (TMR2 prescale value)
 //PWM de 10KHz.

TRISC1 = 0;//CCP2 pin an output

T2CKPS0 = 1; //Timer2 Clock Prescale Select bits = 4
T2CKPS1 = 0;

TOUTPS0 = 0;//Post escala
TOUTPS1 = 0;
TOUTPS2 = 0;
TOUTPS3 = 0;

TMR2ON = 1;//Timer2 is on

TMR2 = 0x00;

CCP2M0 = 0;//PWM mode
CCP2M1 = 0;
CCP2M2 = 1;
CCP2M3 = 1;
}
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Conflicto con TIMER1 y PWM con PIC18F452.
« Respuesta #1 en: 11 de Mayo de 2011, 16:11:08 »
Que torpe  :oops: estoy definiendo los registros T1CKPS0 y T1CKPS1 dos veces. Utilicé el buscador del mplab, pero resulta que uno de esos registros está en otro archivo y no lo encontraba. Yo decia, si solo lo defino una vez, tiene que haber un conflicto...  :D

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡


 

anything