Autor Tema: duda con puerto B y 8 LED en él  (Leído 2221 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
duda con puerto B y 8 LED en él
« en: 08 de Noviembre de 2009, 11:37:25 »
hola a todos, se que lo que estoy preguntando es algo básico, pero como estoy teniendo problema con el puerto B del pic, quiero asesorarme mejor, y es por ello que mi duda es la siguiente:
tengo conectado en el puerto B de un PIC 16f873a 1 LED en cada pin del puerto, pero esto lo ago mediante una etapa de potencia básica que es un transistor, por que el puerto en algunos momentos tiene que encender todo los led y a este no le alcanza la corriente (?¿?¿?¿¿), pero el punto es que B5 del puerto lo enciendo y se vuelve loco el pic y esto es solo con este pins. en cuestión la pregunta es, que si es necesario ponerle este transistor a la salida del pic para encender los led ???, y para asegurarme que valores de resistencia tiene que tener este transistor tanto en la base como en el colector ??, por que yo en la base le e puesto una R de 10K y en el colector una de 330 ohm, estará bien esto ? o no ??.
bueno ustedes podrán decir que esta mala la programación, pero según yo no, por que en proteus me funciona bien, y según algunos miembro de este foro igual, pero como digo solo me da problema el B5 del pic el cual afecta a todo el pic dejándolo sin hacer nada, bueno para describirle mas de lo que se trata el código se los comento un poco:
estoy haciendo una comunicación entre dos pic mediante RS-232, esto me funciona bien, y como digo solo me da problema en la comunicación el B5 del esclavo y no del master, en donde el master chequea su puerto B y revisa como esta su puerto (este puerto esta todo como entrada) mediante la línea int16 x;  x=input_b(); y envía la variable x hacia el esclavo, el esclavo recibe este y lo refleja en el puerto B del mismo, la recepción queda guardada en la variable lectura y sacamos lo que viene del master de la forma output_b(lectura);, pero como digo puedo hacer en el master la combinación que quiera de 1 o  0 lógico en el puerto B pero sin incluir el B5 por que pongo en alto este y se pierde la comunicación y el esclavo se queda pegado, bueno espero que me puedan ayudar, y de antemano gracias.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: duda con puerto B y 8 LED en él
« Respuesta #1 en: 08 de Noviembre de 2009, 11:50:55 »
Parece que el transistor que pones en B5 tiene problemas (quemado o cortocircuitado talvez).

Sube por favor el diagrama de los transistores, leds y resistencias para que lo podamos ver.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: duda con puerto B y 8 LED en él
« Respuesta #2 en: 08 de Noviembre de 2009, 12:33:03 »
hola OK suvo altiro la fotito..... mmmmmpero ahora tego una duda es nesesario conectar este transistor en la salida ??? se podra conectar el led directo a la salida ?????????????? son led de 3mm ???

http://www.subirimagenes.com/otros-esquemaesclavo-3526825.html

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4583
Re: duda con puerto B y 8 LED en él
« Respuesta #3 en: 08 de Noviembre de 2009, 12:34:11 »
Has probado con otro micro?

Si van a estar todos prendidos, es mejor que uses transistores. Revisa en la hoja tecnica cuanto es el maximo de corriente por pin.
El papel lo aguanta todo

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: duda con puerto B y 8 LED en él
« Respuesta #4 en: 08 de Noviembre de 2009, 12:50:17 »
El PIC tiene una corriente límite por pin y por puerto. Al usar leds al mismo tiempo en el puerto b sí es recomendable usar los transistores.

Intenta poner el transistor de B5 en otro pin para descartar que sea falla del mismo.

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: duda con puerto B y 8 LED en él
« Respuesta #5 en: 08 de Noviembre de 2009, 13:07:25 »
hola bueno si como dices para descartar lo voy a cambiar....... y bueno veremos que pasa  :mrgreen:

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: duda con puerto B y 8 LED en él
« Respuesta #6 en: 08 de Noviembre de 2009, 15:48:44 »
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
Código: [Seleccionar]
int16 x;
x=input_b();
putc(0x00 + x);//envio dato al esclavo

esclavo
Código: [Seleccionar]
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:

Código: [Seleccionar]
#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:
Código: [Seleccionar]
#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  
}  
}

« Última modificación: 08 de Noviembre de 2009, 16:17:09 por japifer_22 »

Desconectado japifer_22

  • PIC18
  • ****
  • Mensajes: 405
Re: duda con puerto B y 8 LED en él
« Respuesta #7 en: 09 de Noviembre de 2009, 11:34:44 »
hi alguna sujerencia al respecto ????  :mrgreen: