Codigo:
#include <16f877.h>
#use delay(clock=4000000)
#use RS232(BAUD=9600, BITS=8, PARITY=N, XMIT=PIN_C6, RCV=PIN_C7)
#use fast_io(B)
//
// 9600 baudios, 8 bits de datos, sin paridad.
//
// ------------* *--------
// | |
// P RC6(TxD)|----------------->|(RxD)
// I | | PC
// C RC7(RxD)|<-----------------|(TxD)
// | |
// ------------* *--------
main()
{
set_tris_b(0);
while(1)
{
output_B(1);
delay_ms(65);
output_B(0);
delay_ms(65);
puts(" hola "); // El pic transmite al pc la cadena.
output_B(2);
delay_ms(65);
output_B(0);
delay_ms(65);
}
}
. Se ve que mi placa de pruebas, la picdem 2 plus, trabaja con un cable serie normal... seguiré haciendo pruebas, xq pa mi q antes con uno normal no iba... xo en fin, el caso es q este programita en concreto ya tira.
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>
main()
{
char c;
long int k;
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
set_pwm1_duty(0); // Frecuencia 0 de partida
while(1)
{
puts("Pulsa 1, 2 o 3 segun a la frecuencia que prefieras trabajar: ");
puts("1. f=500Hz (T=2ms=2000us)");
puts("2. f=2kHz (T=0.5ms=500us)");
puts("3. f=20kHz (T=50us)");
c = getc();
if (c=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 (c=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 (c=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 ");
}
else
{
puts("El numero seleccionado no es correcto");
}
puts("Ahora selecciona el duty de la misma manera: ");
puts("1. Duty=1.5ms");
puts("2. Duty=750us");
c = getc();
if (c=1)
{
set_pwm1_duty(94); // Duty=1,5ms
puts("Has seleccionado el duty de 1.5ms");
lcd_putc(" Duty = 1.5ms ");
}
if (c=2)
{
set_pwm1_duty(16); // Duty=750us
puts("Has seleccionado el duty de 750us");
lcd_putc(" Duty = 750us ");
}
}
}
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(" ");
}
}
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 frec[5];
long int k1,K2,PR2,CCPR1L;
main()
{
lcd_init();
lcd_gotoxy(1,1);
lcd_putc("F= Hz");
lcd_gotoxy(1,2);
lcd_putc("Duty= us");
PORTB=0b00000010; // B1 será el led q emplearemos para la modulación
setup_ccp1(CCP_PWM); // Configura CCP1 como PWM
puts("Ejercicio de PWM a distancia.");
set_pwm1_duty(0); // Frecuencia 0 de partida
while(1)
{
parte1:
puts("Elige la frecuencia que prefieras trabajar en Hz y pulsa INTRO: ");
gets(frec);
k1 = atoi32(frec); //Convierte los caracteres ascii recibidos a un numero entero.
printf("%Lu" " Hz", k1);
puts(" ");
PR2=(62500/k1)-1;
if ((PR2<0)|(PR2>255))
{
puts("Frecuencia indebida, seleccione de nuevo una frecuencia");
goto parte1;
}
if ((PR2>0)&(PR2<256))
{
setup_timer_2(T2_DIV_BY_16,PR2,1);
printf(" por tanto, PR2=" "%Lu", PR2);
puts(" ");
}
lcd_gotoxy(4,1);
printf(lcd_putc,"%Lu",k1);
parte2:
puts("Elige el duty en us y pulsa INTRO: ");
gets(frec);
k2 = atoi32(frec);
printf("%Lu" " us", k2); //Devolvemos el dato recibido por la USART, Por ejemplo.
puts(" ");
CCPR1L=k2/16;
if ((CCPR1L<0)|(CCPR1L>255))
{
puts("Duty incorrecto, repite el proceso");
goto parte2;
}
if ((CCPR1L>0)&(CCPR1L<256))
{
set_pwm1_duty(CCPR1L);
printf(" por tanto, CCPR1L=" "%Lu", CCPR1L);
puts(" ");
}
lcd_gotoxy(7,2);
printf(lcd_putc,"%Lu",k2);
puts("Muy bien, ahora comprueba el resultado en la placa.");
puts(" ");
}
}