Holas de nuevo!! Sigo completando (y complicando) el programita con el que empecé... Os dejo luego lo que llevo hecho hasta ahora.
Ahora me gustaria que el programa cambiase bastante. En vez de dar opciones, me gustaria meter directamente una frecuencia y un duty cualquiera. El problema me viene a la hora de operar... Un ejemplo: Si yo meto frecuencia 500 Hz, tengo q operar para calcular PR2. Algo así
puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: ");
gets(frec);
k = atoi32(frec); //Convierte los caracteres ascii recibidos a un numero entero.
PR2=((1/frec)*1000000/16)-1;
setup_timer_2(T2_DIV_BY_16,PR2,1);
Pero esto así no funciona, alguien me puede decir como hacerlo?
Aqui va el programa q he hecho de momento:
Codigo:
#include <16f877.h>
#fuses HS,NOPROTECT,NOPUT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7, RESTART_WDT)
#use fast_io(B)
#byte PORTB=6
#include <lcd-picdem.c>
#include <stdlib.h>
char c[1];
long int k1,k2;
main()
{
lcd_init();
lcd_gotoxy(1,1);
PORTB=0b00000010; // B1 será el led q emplearemos para la modulación
setup_ccp1(CCP_PWM); // Configura CCP1 como PWM
// Esta parte hasta el bucle infinito comprueba la eeprom para saber con que valores se trabajó anteriormente
puts("La ultima vez se trabajo con:");
k1=read_eeprom(0); // Lee el valor de la última frecuencia seleccionada
if (k1==1)
{
setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms)
puts("Una frecuencia de 500 Hz");
}
if (k1==2)
{
setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms)
puts("Una frecuencia de 2 KHz");
}
if (k1==3)
{
setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us)
puts("Una frecuencia de 20 KHz");
}
k2=read_eeprom(1); // Lee el valor del último duty seleccionado
if (k2==1)
{
set_pwm1_duty(94); // Duty=1,5ms
puts("Y un duty de 1,5ms");
}
if (k2==2)
{
set_pwm1_duty(16); // Duty=750us
puts("Y un duty de 750us");
}
while(1)
{
parte1:
puts("Pulsa 1, 2 o 3 segun a la frecuencia que ahora prefieras trabajar: ");
puts("1. f=500Hz (T=2ms=2000us)");
puts("2. f=2kHz (T=0.5ms=500us)");
puts("3. f=20kHz (T=50us)");
gets(c);
k1 = atoi32(c); //Convierte los caracteres ascii recibidos a un numero entero.
write_eeprom(0,k1); // Escribe k1 en la direccion 0 de la eeprom
lcd_gotoxy(1,1);
if (k1==1)
{
setup_timer_2(T2_DIV_BY_16,124,1); // f=500Hz (T=2ms)
puts("Has seleccionado la frecuencia de 500 Hz");
lcd_putc(" f=500Hz->T=2ms ");
}
if (k1==2)
{
setup_timer_2(T2_DIV_BY_16,30,1); // f=2KHz (T=0,5ms)
puts("Has seleccionado la frecuencia de 2 KHz");
lcd_putc("f=2kHz->T=0.5ms ");
}
if (k1==3)
{
setup_timer_2(T2_DIV_BY_16,2,1); // f=20KHz (T=50us)
puts("Has seleccionado la frecuencia de 20 KHz");
lcd_putc("f=20KHz->T=50us ");
}
if ((k1!=1)&(k1!=2)&(k1!=3))
{
puts("Error: Frecuencia indebida, selecciona de nuevo");
goto parte1;
}
parte2:
puts("Selecciona el duty pulsando 1 o 2: ");
puts("1. Duty=1.5ms");
puts("2. Duty=750us");
gets(c);
k2 = atoi32(c); //Convierte los caracteres ascii recibidos a un numero entero.
write_eeprom(1,k2); // Escribe k2 en la direccion 1 de la eeprom
lcd_gotoxy(1,2);
if (k2==1)
{
set_pwm1_duty(94); // Duty=1,5ms
puts("Has seleccionado el duty de 1.5ms");
lcd_putc(" Duty = 1.5ms ");
}
if (k2==2)
{
set_pwm1_duty(16); // Duty=750us
puts("Has seleccionado el duty de 750us");
lcd_putc(" Duty = 750us ");
}
if ((k2!=1)&(k2!=2))
{
puts("Duty incorrecto, selecciona de nuevo");
goto parte2;
}
puts(" ");
}
}