Pues yo creo que si me va a servir, lo que sucede es que desde visual estoy sacando por el puerto serial un caracter ascii, mismo que será recibido por el pic, lo que no sabía era como manipular ese dato, ya que lo necesito para colocarlo como valor en el duty del pwm. Espero me entiendas. De antemano gracias.
El codigo que estoy utilizando para el pic es este:
Codigo:
#include <16f874A.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
char value;
char string;
int duty;
while (TRUE)
{
value = getc();
if (value=="j")
{
output_high(PIN_B7);
setup_ccp1(CCP_PWM); //se habilita el pwm
setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia
string=getc();
duty=(string-48);
set_pwm1_duty(duty); //se establece como variable el ancho de pulso
}
}
}
Revisamelo porfa y si ves algo mal pues echame la mano, te lo agradecería bastante.
Hola
Pues en si, esa parte del envío de la "j" lo hago como caracter y ese si se me respeta, yo desde visual mando la "j" para iniciar la comunicación y hasta ahí vamos bien. Mi problema comienza al tratar de cambiar el valor que le llega al pic, siendo este valor el que se utilizará en la variable duty del pwm. Ya hice lo que me dijiste pero como que no pasa nada. El problema está en esta parte del código
Codigo:
string=getc();
duty=(string-48);
set_pwm1_duty(duty); //se establece como variable el ancho de pulso
Es mas, yo solo quiero obtener un valor entero entre 0 y 255
Hola
Pues hice lo que me dijeron y pues no manda nada a la salida del pwm, en otras palabras el led que coloqué ahí pues no enciende. Espero haber hecho lo que me dijiste pocher este es el codigo:
Codigo:
#include <16f874A.h>
#include <stdlib.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
char value;
char string;
int duty;
setup_ccp1(CCP_PWM); //se habilita el pwm
setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia
while (TRUE)
{
while(!kbhit()); //Espera la recepcion de un caracter
value=getc();
if (value=="j")
{
output_high(PIN_B7);
while(!kbhit());
string=getc();
duty=atoi(string); //Usa la función ATOI para pasarlo a entero
set_pwm1_duty(duty); //El caracter ascii recibido pasado a entero establecido como ciclo de trabajo
}
}
}
Tal vez mi error lo tengo en el mismo visual donde mando la "j" para iniciar la comunicación pero no espero datos de regreso, sino que al mismo tiempo envio el dato que será asignado a la variable duty. Para esto tomo el valor numérico de un control de perilla y lo mando por el puerto serie pero como ascii. Tal vez ahí esté el problema. Espero me corrijan mis errores por favor.
Pues no se que pasó pero chequen lo que hice en mi código:
Codigo:
#include <16f874A.h>
#include <stdlib.h>
#fuses HS, NOPROTECT, NOWDT, NOPUT, NOBROWNOUT, NOLVP, NOCPD, WRT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
main()
{
char value;
int duty;
setup_ccp1(CCP_PWM); //se habilita el pwm
setup_timer_2(T2_DIV_BY_1, 255,1); //se establece el valor de la frecuencia
while (TRUE)
{
while(!kbhit()); //Espera la recepcion de un caracter
value=getc();
if (value=="j")
{
output_high(PIN_B7);
while(!kbhit());
duty=getc();
//duty=atoi(string); //Usa la función ATOI para pasarlo a entero
set_pwm1_duty(duty); //El caracter ascii recibido pasado a entero
}
}
}
Al quitar la parte de la transformación del atoi y pasar directamente lo recibido a la variable duty, ya pude variar la intensidad del led. Si alguien me puede explicar que esta sucediendo pues lo agradecería mucho.
Pues en ralidad es sencillo ... (en asm)
Como sabes los caracteres ascii de los numeros (0 al 9 ) estan codificados en binario ....mmmmm de una foma muy facil paraconbertir a numero
para convertir un caracter ascii a numeor solo limino los 3 bit mas significativos .... esto lo puedes hacer con una operacion AND con los bits menos sinificativos,.....
que enredo...
mejo deja lo escribo
Codigo:
b="1" ;
a=b"00001111"
b =a and b
y listo lla tienes el numero del codigo ascii
el codigo de aribita no esta ni en c ni en asm solo es para ilustrar eh!!
en asm quedaria como sigue
Codigo:
movlw b"00001111"
andwf ascii,f ;ascii es el dato que queires convertir
saludillos
see you later .... may be je je