TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Edwin_pe en 06 de Septiembre de 2011, 12:50:39
-
Hola a todos,
Hice un programita k envia 5 caracteres (contraseña) del pc al pic, este lo compara con otros caracteres.
* Si los caracteres tecleado son correctos prende led por 2seg si no son correctos apaga led por 2 seg.
* Mientras no se envia caracter el led esta oscilando cada 100ms.
Todo funciona bien pero cuando tecleo muy rapido el pic se loquea y ya no me hace caso, a k se debe eso.
Gracias y saludos.
Aqui posteo el codigo.
#include <16f876.h>
#fuses XT,NOWDT,NOPUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=pin_C6, rcv=pin_C7, bits=8, parity=N)
void main (void){
int i=0;
char Data[5];
SET_TRIS_A(0x00); // RA0 salida
output_low (pin_A5);
while(TRUE){
if(kbhit()){
Data=getc();
i++;
if(i==5){
i=0;
if(Data[0]=='E'&& Data[1]=='d' && Data[2]=='w'&& Data[3]=='i'&& Data[4]=='n'){ //aqui compara
puts("Recibido");
output_high(PIN_A5);
delay_ms(2000);
}
else{
puts("Error");
output_low(PIN_A5);
delay_ms(2000);
}
}
}
output_high (pin_A5);
delay_ms(100);
output_low (pin_A5);
delay_ms(100);
}
}
-
Yo te aconsejo utilizar mejor una interrupción para la recepción
Saludos.
-
Pregunta.... ¿No hay un error en la línea "Data=getc();", no debería ser "Data=getc();"?
-
O intenta subir los baud a 38400 o mas :mrgreen:
-
cierto AngelGris? ;-)
-
cierto AngelGris? ;-)
Gracias por la correción MLO__ en el apuro me comí los corchetes :oops:
-
Hola a todos,
Gracias por sus respuestas debo decir que copie mal mi programita en esta parte Data = getc() en el CCS estaba bien, zorry a todos .
Como les dije el programa funciona bien pero cuando uno ingresa rapido la contraseña el pic se loquea y no hace caso; pero repito si digito poco rapido funciona muy bien.
Que pasa cuando el pic esta en los retardos output_high (pin_A5); delay_ms(100); y ingresa un caracter ?...
Tambien lo hice con interrupiones para Rx pero no me salio se aceptan sugerencias ...
Sl2.
-
..........
Que pasa cuando el pic esta en los retardos output_high (pin_A5); delay_ms(100); y ingresa un caracter ?...
Tambien lo hice con interrupiones para Rx pero no me salio se aceptan sugerencias ...
Sl2.
No utilizo CCS y no conozco como se configura el RS232 con dicho compilador, solo puedo sugerirte de asegurarte que lo estés implementando por HardWare. Y luego sí utilizar la interrupción de dicho modulo. Tal vez esté pasando lo que indicas y justo esté ingresando un caracter mientras estás en el delay y entonces lo perderías pero no sé si sería suficiente como para loquear al pic.
-
Podés ver este hilo del maestro Redpic
http://www.todopic.com.ar/foros/index.php?topic=23222.0
Allí hay varios ejemplos que te van a ser de utilidad. :)
Saludos.
Jukinch
-
Hola.
Lo que sucede es que estas accediendo al byte que transmites cada cierto tiempo y por eso, si lo escribes muy rápido, no lo va a leer, porque puede darse el caso que cuando llegue el byte el programa este en la rutina de delay_ms(); o en otro lado.
Para evitar eso, es mejor usar interrupciones, es decir, que el PIC interrumpa lo que este haciendo en el programa principal para ir a leer el byte que llega por la USART.
Mira el link que te han puesto o busca en foro acerca de interrupciones, hay mucha info al respecto
Saludos
-
Hola amigo, el manejo de las interrupciones es bastante sencillo y más en CCS, revisa este ejemplo.
///////////////////////////////////////////////////////////////////////////////
#int_rda //Vector de interrupcion de la recepcion de datos
void interrupcion_rx() //por el usart
{
variable = getc(); //Se lee el dato recibido
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
#zero_ram //Borrado de la memoria ram
void main() //Rutina principal
{
enable_interrupts(global); //Habilitación de todas las interrupciones
enable_interrupts(int_rda); //Habilitación de todas las interrupciones
Saludos.
-
Hola a todos;
Aqui pongo el mismo programa hecho con int. Pero tengo un problema no ocurre la int lo simulo en proteus (uso el archivo xxx.cof) y veo que solo esta en los led (prende y apaga), no encuentro el problema ; espero sus comentarios muchas gracias.
#int_rda
char ch;
int Flag_int_Rx=0;
void serial_isr(){
ch=getchar();
Flag_int_Rx=1;
}
void main (){
int i=0;
char Data[5];
enable_interrupts(global);
enable_interrupts(int_rda);
SET_TRIS_A(0x00); // RA0 salida
output_low (pin_A5);
while(TRUE){
if(Flag_int_Rx==1){
flag_int_Rx=0;
Data[ i ]=ch;
i++;
if(i==5){
i=0;
if(Data[0]=='E'&& Data[1]=='d' && Data[2]=='w'&& Data[3]=='i'&& Data[4]=='n'){
puts("Recibido");
disable_interrupts(int_rda);
output_high(PIN_A5);
delay_ms(2000);
enable_interrupts(int_rda);
}
else{
puts("Error");
disable_interrupts(int_rda);
output_low(PIN_A5);
delay_ms(2000);
enable_interrupts(int_rda);
}
}
}
if(Flag_int_Rx==0){
output_high (pin_A5);
delay_ms(100);
output_low (pin_A5);
delay_ms(100);
}
}
}
-
Encontre la falla, ahora esta bien ...
char ch;
int Flag_int_Rx=0;
#int_rda
void serial_isr(){
ch=getchar();
Flag_int_Rx=1;
}
-
Para incrustar código en el foro podes usar:
[ code ] Tu código [ /code ]
Sin espacio entre corchetes ;-)
Saludos!