Hola de nuevo.
Se ha producido un error. No he podido enviar al foro el fichero adjunto con el programa. Intento copiarlo en el cuerpo de este mensaje. Espero que se entienda.
Saludos.
#include "16F877.h"
#use delay (clock=3500000)
#use fast_io(C)
#fusesRC,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT
#bit RA0 = 0x05.0
main()
{
long int duty; // Definimos dos variables
int periodo;
periodo=86; // La frecuencia deben ser 10kHz.
duty=175; // A esto, le corresponde un periodo de 100us.
// Cargaremos 86 ya que:T = (PR2+1).4.(1/3"5MHz).1
// Definimos el valor del ciclo de trabajo.
// Consideando inicialmente un periodo de 100us, el
// duty deberian ser 50us para mantener la relacion
// pedida.
// 0"5us=(CCPRxL:CCPxCON<5:4>)*Tosc*Prescaler
// Fijando en CCPxCON<5:4> el valor 00 (CCP_PWM)
// resulta un valor en CCPRxL = 175.
setup_timer_2(T2_DIV_BY_1,periodo,1); // Configuramos timer2
setup_ccp1(CCP_PWM); // Configuramos CCP para modo PWM
set_pwm1_duty(duty); // Definimos el duty de la señal PWM
//como el valor de la variable duty
set_tris_c(0b11111011); // Configuramos PORTC
while (TRUE) /* Bucle continuo de ejecuccion */
{
while (RA0); // Espera a que se pulse la tecla
delay_ms(20); // Espera para evitar rebotes
do
{
if(periodo<255) // Comprobamos que el periodo no tiene ya su
// valor maximo
{
periodo=periodo+5; // Incrementamos "periodo" en 5
//unidades. (Podriamos incrementarlo en n)
// Se demuestra que un incremento en 5
//unidades en periodo supone un
// incremento en 10 unidades en duty
// para mantener la relacion.
duty=duty+10; // Redefinimos el duty
setup_timer_2(T2_DIV_BY_1,periodo,1); //Reconfiguramos el
// timer2
set_pwm1_duty(duty); // Reconfiguramos el duty del PWM
delay_ms(50); // Esperamos 50 ms antes de incrementar
}
while (!RA0);
while (RA0); // Espera otra pulsación de la tecla
delay_ms(20); // Esperamos para evitar rebotes
do
{
if(periodo>0) // Comprobamos que el periodo no
// tiene su valor mínimo
{
periodo=periodo-5; // Decrementamos el periodo
duty=duty-10; // Redefinimos el duty
setup_timer_2(T2_DIV_BY_1,periodo,1);
// Reconfiguramos el timer2
set_pwm1_duty(duty); // Reconfiguramos el duty
// del PWM
delay_ms(50); // Esperamos 50 ms antes de
// incrementar
}
}
while (!RA0);
} /* Fin bucle infinuto */
} /* Fin de main */