Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

10/10/2016 #1


Problemas con la lectura continua del RS232
Buenas tardes a todos!

antes que todo:

compilador: CCS C Compiler
Micro : 16f777
modulo bluetooth: HC-05

Lo que actualmente hago con el modulo bluetooth HC-05 es enviar un dato del tipo caracter "constantemente" (mediante una app que hice para enviar cada 5ms un caracter \'W\' mientras pulse un boton ). La app esta funcionando bien, probe con el arduino UNO y el modulo HC-05 y efectivamente le llega el valor continuamente \'W\'.

el valor \'W\' se envia mientras tenga 1 boton pulsado en la APP. Por eso realice una programacion en el microcontrolador que se encierre en un ciclo mientras le este llegando el caracter \'W\' por el puerto serie. PERO!! cuando llega al ciclo, nunca mas vuelve a salir de este. y haciendo pruebas, encontre que se queda en el comando GETCH. debido a que borre este y termina el ciclo FOR explicado a continuacion:

AQUI EL PROGRAMA:
/////////////////////////////////////////////////////////////////////////////////////

#include <16F777.h>
#device ADC=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT
#FUSES NOMCLR
#FUSES HS

#use delay(crystal=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_D0,rcv=PIN_D1,bi ts=8,stream=PORT1)

char recepcion,prueba;
int16 cont;

void main() {

setup_timer_2(T2_DIV_BY_4,249,1); //500 us overflow, 500 us interrupt

//////////////////////////////////////////// configuracion de los ccp para otro asunto ///////////////////
setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

set_pwm1_duty((int16)0);
// set_pwm1_duty((int16)997);
// set_pwm2_duty((int16)997);
/////////////////////////////////////////CONFIGURACION DE LOS PUERTOS /////////////


set_tris_d(0b01000000);
set_tris_c(0x00);

output_c(0x00);
output_d(0x00);
///////////// LUZ PILOTO //////////////////////
output_high(pin_d4);
delay_ms(500);
output_low(pin_d4);
delay_ms(300);
output_high(pin_d4);
///////////////////////////////////
while(TRUE){

recepcion=getch(); // leo rs232

if( recepcion == 'W') // si es W, entro.
{

output_high(pin_d5); // prendo un led.

for(cont=1;cont<50;cont++){ // entro a este ciclo por 50 veces
recepcion=getch(); // leo nuevamente el rs232 **

if(recepcion=='W'){ // SI ES W entonces el ciclo FOR se reinicia
cont=1;
recepcion=' '; // Borro el contenido de la variable recepcion **
}

delay_ms(50); // para qe no termine tan rapido el ciclo FOR
}
output_low(pin_d5); // apago led
recepcion=' ';
}

}

}


hice muuuuchas pruebas de funcionamiento de la programacion, llege a la conclusion de que el problema esta con el segundo GETCH(). ¿acaso no puedo usar 2 veces el comando ? aiuudaaa

MUUUUUUUUCHAS GRACIAS !!!!!!!!!!!!!!!! ...
10/10/2016 #2


misterio resuelto, faltaba dormir un poco jaja.

el problema es que el comando getch espera siempre un valor de vuelta. por lo tanto el programa se estaba quedando ahi.

LA SOLUCION:

if(kbhit(PORT1)== TRUE){ // comando pregunta si hay valor en el stream (port1, se debe especificar en la configuracion del RS232.
recepcion=getch(); // ya que la respuesta fue positiva, capto el valor de getch
}

espero a alguien le sea de ayuda !




#include <16F777.h>
#device ADC=16

#FUSES NOWDT //No Watch Dog Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOPROTECT
#FUSES NOMCLR
#FUSES HS

#use delay(crystal=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_D0,rcv=PIN_D1,bi ts=8,stream=PORT1)

char recepcion,prueba;
int16 cont;

void main() {

set_pwm1_duty((int16)0);
// set_pwm1_duty((int16)997);
// set_pwm2_duty((int16)997);

setup_timer_2(T2_DIV_BY_4,249,1); //500 us overflow, 500 us interrupt

setup_ccp1(CCP_PWM);
setup_ccp2(CCP_PWM);

set_tris_d(0b01000000);
set_tris_c(0x00);

output_c(0x00);
output_d(0x00);

output_high(pin_d4);
delay_ms(500);
output_low(pin_d4);
delay_ms(300);
output_high(pin_d4);

while(TRUE){

recepcion=getch();


if( recepcion == 'W')
{

output_high(pin_d5);

for(cont=1;cont<500;cont++){

if(kbhit(PORT1)== TRUE){
recepcion=getch();
}
if(recepcion=='W'){
cont=1;
}

delay_ms(1);
}
output_low(pin_d5);
}

}


}
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.