#include <16f84A.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1, FORCE_SW) //manejo del RS232
char string[30];
char pass[8]="entrar";
void main(void){
SET_TRIS_A(0b00010);
while(1){
printf("\n\rPassword: "); // el password es: entrar
gets(string);
if(!strcmp(string, pass)) // cuando la comparación NO es igual, retorna 1
printf("\n\rPassword correcto");
else
printf("\n\rError, intente de nuevo");
}
}
pero si el 16f84a no tiene implementado por hardware el puerto usart por lo tanto no puede generar interrupcion #rda, sera por eso?
Probando el codigo de la interrupción, por mas que le he dado vuelta, el CCS siempre dice:(http://img254.imageshack.us/img254/7936/auch.gif) (http://img254.imageshack.us/img254/7936/auch.gif) Nunca me fije que micro estabas usando! Claro, el PIC16F84 no tiene módulo USART.
"Invalid Pre-Processor directive", es decir, error con la #int_rda, sera por el 16f84a?, ya he visto varios ejemplos en el foro con la int_rda y pues he escrito el codigo bien, tambien según lo que me han dicho ustedes.
#include <16f84A.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_B0, FORCE_SW) //manejo del RS232
char string[30];
char pass[8]="entrar";
#int_EXT
void EXT_isr(void)
{
gets(string);
}
void main(void)
{
SET_TRIS_B(0b00000001);
SET_TRIS_A(0b00000);
ext_int_edge(H_TO_L);
enable_interrupts(global);
enable_interrupts(INT_EXT);
pedir: printf("\n\rPassword: ");
delay_ms(5000); //Espera 5 segundos por el password
if(!strcmp(string, pass)) //cuando la comparación NO es igual, retorna 1
{
printf("\n\rPassword correcto");
disable_interrupts(global); // apagado del programa
disable_interrupts(INT_EXT);
// goto pedir; //Para que vuelva a pedir el password
}
else
{
printf("\n\rError, intente de nuevo");
goto pedir; //Para que vuelva a pedir el password
}
}
Yo lo haría de la siguiente manera:
Hola!
Fijate si conseguis el 16f628 o el 16f873. Son muy comunes y tienen modulo UART. De ese modo podes implementar un puerto serie por hardware y otro por software.
Suerte!!
#include <16f876.h>
#include <string.h>
#use delay(clock=4M)
#fuses NOWDT,NOPUT,NOPROTECT
#use rs232(STREAM=ALARMA, baud=9600, xmit=PIN_C6, rcv=PIN_C7, parity=N, bits=8)
#use rs232(STREAM=MODEM, baud=9600, xmit=PIN_B2, rcv=PIN_B0, parity=N, bits=8)
char string_alarma[16];
char string_modem[16];
int1 kbhit_alarma=0; // Para saber si llego dato desde la alarma.
int1 kbhit_modem=0; // Para saber si llego dato desde el modem.
#int_RDA
void rda_isr()
{
gets(string_alarma);
kbhit_alarma=1;
}
#int_EXT
void ext_isr()
{
gets(string_modem);
kbhit_modem=1;
}
void main(void)
{
SET_TRIS_B(0b00000001);
SET_TRIS_C(0b10000000);
ext_int_edge(H_TO_L);
enable_interrupts(int_RDA);
enable_interrupts(int_EXT);
enable_interrupts(GLOBAL);
while(1)
{
while(kbhit_alarma==0&&kbhit_modem==0){} //Espero a que llegue dato desde algun dispositivo.
if(kbhit_alarma)
fprintf(MODEM,"\n\rEl dato de la alarma fue: %s",string_alarma);
if(kbhit_modem)
fprintf(ALARMA,"\n\rEl dato del modem fue: %s",string_modem);
kbhit_alarma=0;
kbhit_modem=0; // Reinicio bandera para proxima espera.
}
}
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?Exactamente!
Faltaba colocar con que puerto recibir los datos:
El stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?Exactamente!
De nada! :D :DEl stream seria como un descriptor para saber por donde se tienen q recibir o enviar los datos?Exactamente!
Muchas gracias por aclararme la duda Suky!! :D
if(kbhit())
{
c = getc();
}
En el PIC de recepcion, usa la funcion kbhit(); antes de obtener el dato:Código: [Seleccionar]if(kbhit())
{
c = getc();
}
while(!FlagDatoOk);while(true)
{
printf(lcd_putc,"\f%u",c);//Imprimo el dato en la LCD
while(!FlagDataOk);//Espero al cambio en la interrupcion
FlagDataOk=0;//Clareo el flag
}#int_RDA
void RDA_isr(void)
{
if(kbhit())
{
c=getc();
FlagDatoOk=1;
}
}