hola bueno e probado lo que me sugieren pero en efecto era el transistor por que ahora no se pega, pero el punto que me e dado cuenta que tengo algo mal en el código y no se que es, bueno les comento que ahora lo que pasa es que me da la impresión que se satura la comunicación o algo raro por que dejo por unos 10 min +/- el puerto encendido y de nuevo queda pegado todo.
en general lo que estoy asiendo es una alarma para mi casa debido que mi madre me pidió esto, por el motivo que nos entraron a robar a la casa hace algunas semanas atrás, bueno en el foro avía preguntado algo del pin B5 antes y todo esto, pero quería tener la alarma lista para hacer una publicación como proyecto listo, pero párese que no va a poder ser así, es por esto que les pido ayuda para poder ver que esta mal de mi código ya que según yo esta bien todo, y lo raro que en proteus me funciona de lo mas bien, bueno ahora le explico un poco de que se trata esta alarma:
esta alarma cuenta de 2 pic uno como esclavo y el otro como master, en el cual el esclavo se encarga del aspecto visual de la alarma, donde en este se ve que sensor esta activado o no, además de visualizar que la alarma esta activada o no. todo esto mediante unos led.
el master por otro lado es el encargado de ver que sensor tiene activado, y le manda al esclavo la señal del sensor activado para poder visualizar, esta pequeña rutina es la siguiente (solo el aspecto visual (comunicación master/esclavo))
master
int16 x;
x=input_b();
putc(0x00 + x);//envio dato al esclavo
esclavo
int16 lectura;
if(kbhit()){
lectura=getc;
}
output_b(lectura)
además de ver que sensor tiene activado, el master revisa si tiene la alarma activada o no, esto lo hace por que el esclavo le envía un 1 o 0, indicando el 1 que alarma activada y el 0 alarma desactivada. por otra parte cuando la alarma esta activada el master revisa todo el puerto B del pic revisando que sensor se encuentra activado, pero si el sensor activado proviene de B0, la alarma tomara un retardo de 30seg para que suene la sirena (este sensor es de puerta principal), pero si el sensor es cualquier otro distinto de B0, la alarma suena de forma inmediata el cual activa un par de relé de forma secuencial, dejando solo uno fijo todo el tiempo y es el que va a la sirena en cuanto a los otros 3 se activan de forma secuencial para hacer un llamado mediante un teléfono móvil, mediante discado rápido. además cuenta con un sistema que ve si la alarma se encuentra con la electricidad de la casa desactivada, dejando que la batería empiece a funcionar, pero en este punto, el pic revisa en que estado esta la batería y llama por teléfono cuando la batería esta bajo los 10.5 V aprox. (esto es para que la batería no sufra daño alguno).
bueno en resumen es eso lo que hace mi alarmita, pero como digo ahora tengo problema, en general no se si será ahora B5 pero como digo, yo e dejado esto funcionando por varios días sin activar B5 y todo marcha bien, pero activo B5 y ahora por mas tiempo que antes si, y el esclavo se queda pegado, ósea se pierde la comunicación entre ambos pic. bueno dejo el código para que lo discutamos....... bufff bueno espero que me ayuden a encontrar el problema ya que yo de verdad no lo e encontrado...... a y para que entiendan mejor dejo la simulación y los punto HEX.
codigo MASTER:
#include <16F873a.h>
#device adc=10
#FUSES NOWDT, XT, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=4000000) //Fosc=4Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#include <stdlib.h>
#use standard_io(C)
int16 x;
char activado;
int a,z,u;
char i=0,j=0,k=0,m=0,n=0,p=0;//variables de reloj
char flag=0,var=20; //variables globales
int16 Valor; // para 10 bits
float const resolucion= 5.0/1024.0; // Conversión con 10 bits
float voltios;
///LLAMADA FUNCION INTERRUPCION A RELOJ
#INT_TIMER0
void interrupcion()
{
if(flag>var){ //¿ya es 1 segundo?
var--; //SI -> decremento var...
if(var<18)
var=20; //...ajuste fino de 1s
flag=0; //reset flag para contar 1s
if(i>8){//define segundos
i=0; //SI -> restaura valor indice(para mostrar digito 0)
j++;
a++;//variable de activacion de zona1 a los 30 seg si es que la zona es 1
if(j>5){
J=0;
k++;
if(k>8){// define minutos
k=0;
m++;}
if(m>5){
m=0;
n++;}
if(n>8 || (p==2 && n>2)){//define horas
n=0;
p++;}
if(p>1){
P=0;}
}}
else{ // NO -> incrementa i
i++;
u++;}
}
set_timer0(61); //reset TMR0
flag++; //incremento variable flag
}
void main(void)
{
SET_TRIS_B( 0xFF );
enable_interrupts(INT_TIMER0); //interrupcion TIMER0 activada
setup_counters(RTCC_INTERNAL,RTCC_DIV_256);//configuracion interrupcion TMR0
set_timer0(61); //carga TMR0
enable_interrupts(GLOBAL); //todas las interrupciones activadas
// Configuramos entradas analogicas, para medición de la bateria
setup_adc_ports(AN0);
setup_adc(ADC_CLOCK_INTERNAL);
// Tomamos las medidas
set_adc_channel(0);
// termino de configurar entrada analoga
while(true){
x=input_B(); //visualisa todo el puerto B y lo guarda en x
if(!x){
putc(0x00);
}else{
putc(0x00 + x);}
activado=GETC(); //guarda el valor enviado por el RS-232
Valor=read_adc();//almacena el valor de medicion de la bateria
voltios= valor * resolucion; //convierte de resolucion de 10bit a numeros
if(activado==1){ //resivimos por RS232 un 1 para activar la alarma
output_high(PIN_A2);//encendemos led. que la alarma esta activada
}else{ //resivimos por RS232 un 0 que indica alarma desactivada
z=0;
output_low(PIN_A2);//desactivamos led que indica el estado de la alarma
output_low(PIN_A1);//ponemos en cero la alarma sonora
output_low(PIN_C5);//desactiva beep de llamada
}
if(((p==1 && n==2) || (p==2 && n==3)) && !input(PIN_C1)){ //activa relé por 1 hr si y solo si esta la electricidad dada
output_high(PIN_C0);//activamos relé
}//paso a bateria
else{output_low(PIN_C0);}//regresamos a corriente electrica
if(x==0x01 && activado==1){//retardo de activacion de alarma solo en la zona 1 por 30seg
if(a>2){//a> a 29 seg ??? si
z=1;
output_high(PIN_A1);
output_high(PIN_C5);//activa beep de llamada
}//activamos alarma sonora si a pasado 30 seg
}else{//si la alarma esta activada, y se activa cualquier zona menos la 1 se ensiende la sirena
a=0;//ponemos contador de retardo de zona 1 en 0
if(x!=0x00 && activado==1){
z=1;
output_high(PIN_A1);//activamos alarma sonora
output_high(PIN_C5);}//activa beep de llamada
}
if(voltios<=3.10 && voltios>=3.00){//comparamos el voltaje de la bateria paraque sea <= a 11v y llamar +activar alarma.
output_high(PIN_A3);
}
else{
output_low(PIN_A3);
}
if(z==1){
if(((u<=2 && u>0) || (u>37 && u<=39)) || (u>70 && u<=72)){
output_high(PIN_C2);
}else{
output_low(PIN_C2);
}
if(u>3 && u<=6){
output_high(PIN_C3);
}else{
output_low(PIN_C3);
}
if(u>40 && u<=43){
output_high(PIN_C4);
}else{
output_low(PIN_C4);
}
if(u==73){
u=73;}
}else{
u=0;
output_low(PIN_C2);
output_low(PIN_C3);
output_low(PIN_C4);}
}
}
codigo ESCLAVO:
#include <16F873a.h>
#device adc=10
#FUSES NOWDT, HS, NOPUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT
#use delay (clock=20000000) //Fosc=20Mhz
#use rs232(baud=9600, xmit=pin_c6, rcv=pin_c7)
#use standard_io(C)
#use standard_io(A)
int16 lectura;
int a;
#int_RDA //interrupcion para la resepcion del master
void RDA_isr()
{
if(kbhit()) { //Esto es para que no se te cuelgue el pic
lectura=GETC(); //guarda el valor enviado por el RS-232
}
}
void main(void)
{
SET_TRIS_B( 0x00 );
enable_interrupts(GLOBAL); //todas las interrupciones activadas
enable_interrupts(INT_RDA); //interrupcion INT_RDA activada. comunicacion RS-232
while(TRUE){
if(input(PIN_C0)){//mando senal al master que esta activada la alarma
putc(a=1);
output_high(PIN_C1);
output_low(PIN_C2);}
else{ // esta desactivada la alarma y se lo comunico al master
putc(a=0);
output_low(PIN_C1);
output_high(PIN_C2);}
output_b(lectura); //avilito puerto D como resepcion de comunicacion con master
}
}