desktop

Voltaje de salida de un PIC es muy bajo

Saludos amigos, espero que me puedan ayudar en el siguiente problema: Estoy trabajando con un PIC 18F4550, programo 4 pines del Puerto B como salida y 4 como entrada, de tal manera que al presionar ,por ejemplo SI B0==0, por B1 y B2 estén en high, lo mismo para SI B3==0 entonces B4 y B5 estén en high. Todo funciona bien. El problema es que me he dado cuenta de que cuando se ejecuta, los HIGH de B1 y B2 y B4 y B5 SOLO muestran valores entre 1.5 y 1.8 voltios. Cuando ANULO el segundo IF (para B3==0), los voltajes de las salidas SUBEN hasta 4.5 voltios. O sea, que cuando se estan ejecutando VARIOS IF los valores de voltaje de salida son menos de 2 voltios. Por favor, cómo podría solucionar esto? De tal manera que siempre tenga unas salida de 4.5 voltios o más. Muchas gracias.
 
El problema es que me he dado cuenta de que cuando se ejecuta, los HIGH de B1 y B2 y B4 y B5 SOLO muestran valores entre 1.5 y 1.8 voltios. Cuando ANULO el segundo IF (para B3==0), los voltajes de las salidas SUBEN hasta 4.5 voltios. O sea, que cuando se están ejecutando VARIOS IF los valores de voltaje de salida son menos de 2 voltios.
Si estás midiendo cambios de estado a velocidades altas usando un multímetro, es normal que obtengas lecturas incorrectas.
Es como tratar de medir el voltaje de una señal de onda cuadrada con el voltímetro en CD.
Como no mencionas que estás usando un osciloscopio, es lo que me imagino, y si lo estás usando, entonces podría ser que no estés configurando los puertos como digitales, ver registro ADCON1, bits PCFG<3:0>
 
Si los estados son fijos, está mal, y está mal tambien que sea 4.5V y no 5V, pero si los estados de las salidas son señales de pulsos, vas a medir el valor medio de la señal cuadrada, tenes que aclarar eso.
 
Saludos amigos, espero que me puedan ayudar en el siguiente problema: Estoy trabajando con un PIC 18F4550, programo 4 pines del Puerto B como salida y 4 como entrada, de tal manera que al presionar ,por ejemplo SI B0==0, por B1 y B2 estén en high, lo mismo para SI B3==0 entonces B4 y B5 estén en high. Todo funciona bien. El problema es que me he dado cuenta de que cuando se ejecuta, los HIGH de B1 y B2 y B4 y B5 SOLO muestran valores entre 1.5 y 1.8 voltios. Cuando ANULO el segundo IF (para B3==0), los voltajes de las salidas SUBEN hasta 4.5 voltios. O sea, que cuando se estan ejecutando VARIOS IF los valores de voltaje de salida son menos de 2 voltios. Por favor, cómo podría solucionar esto? De tal manera que siempre tenga unas salida de 4.5 voltios o más. Muchas gracias.
Esquema de conexionado, código y archivos (si es necesario esto último)
Mira aquí:
El ABC de lo que hay y no hacer antes de postear
 
Si estás midiendo cambios de estado a velocidades altas usando un multímetro, es normal que obtengas lecturas incorrectas.
Es como tratar de medir el voltaje de una señal de onda cuadrada con el voltímetro en CD.
Como no mencionas que estás usando un osciloscopio, es lo que me imagino, y si lo estás usando, entonces podría ser que no estés configurando los puertos como digitales, ver registro ADCON1, bits PCFG<3:0>
Hola, amigo D@rkbytes, te comento lo siguiente:
1) Este programa NO funciona como debe ser, los motores tanto en un sentido como en otro, giran muy lento, de tal manera que aun con la mano lo puedo detener:
C:
#include <16F628a.h>
#fuses xt, nowdt, put, noprotect
#use delay (clock=4M)
#use standard_io(b)
#use standard_io(a)
//#define led1 pin_b0


void main()
{
set_tris_b(0b00110011);
set_tris_a(0b00000000);
output_b(0b00000000);
output_a(0b00000000);

while (true)
   {
    output_high(PIN_A0);
    //ARRIBA
   if (input (PIN_B0)==0)
      {
         output_high(PIN_B2);
         output_low(PIN_B3);
      }
      else
      {
        output_low(PIN_B2);
        output_low(PIN_B3);
      }
      //ABAJO
      if (input (PIN_B1)==0)
      {
         output_low(PIN_B2);
         output_high(PIN_B3);
      }
      else
      {
        output_low(PIN_B2);
        output_low(PIN_B3);
      }
       //IZQUIERDA
      if (input (PIN_B4)==0)
      {
         output_high(PIN_B6);
         output_low(PIN_B7);
      }
      else
      {
        output_low(PIN_B6);
        output_low(PIN_B7);
      }
      //DERECHA
      if (input (PIN_B5)==0)
      {
         output_low(PIN_B6);
         output_high(PIN_B7);
      }
      else
      {
        output_low(PIN_B6);
        output_low(PIN_B7);
      }
  }
}
2) Este MISMO programa, con una simple modificación, funciona perfectamente (la modificaciónm es adicionarles un retarde de 20 ms después de cada IF.
C:
#include <16F628a.h>
#fuses xt, nowdt, put, noprotect
#use delay (clock=4M)
#use standard_io(b)
#use standard_io(a)
//#define led1 pin_b0


void main()
{
set_tris_b(0b00110011);
set_tris_a(0b00000000);
output_b(0b00000000);
output_a(0b00000000);


while (true)
   {
    output_high(PIN_A0);
    //ARRIBA
   if (input (PIN_B0)==0)
      {
         output_high(PIN_B2);
         output_low(PIN_B3);
         delay_ms(20);
      }
      else
      {
        output_low(PIN_B2);
        output_low(PIN_B3);
      }
      //ABAJO
      if (input (PIN_B1)==0)
      {
         output_low(PIN_B2);
         output_high(PIN_B3);
         delay_ms(20);
      }
      else
      {
        output_low(PIN_B2);
        output_low(PIN_B3);
      }
       //IZQUIERDA
      if (input (PIN_B4)==0)
      {
         output_high(PIN_B6);
         output_low(PIN_B7);
         delay_ms(20);
      }
      else
      {
        output_low(PIN_B6);
        output_low(PIN_B7);
      }
      //DERECHA
      if (input (PIN_B5)==0)
      {
         output_low(PIN_B6);
         output_high(PIN_B7);
         delay_ms(20);
      }
      else
      {
        output_low(PIN_B6);
        output_low(PIN_B7);
      }
  }
}
Por qué UNO funciona y el OTRO no, sinceramente no lo sé. Lo dejo a los expertos.
NOTA: Las salidas B2, B3, B6 y B7 se conectan a las entradas de un L298N para controlar motores.

De todas maneras, muchísimas gracias por sus comentarios a todos ustedes.
 
Este programa NO funciona como debe ser, los motores tanto en un sentido como en otro, giran muy lento, de tal manera que aun con la mano lo puedo detener
¿Qué motores?
¿El esquema?
¿Qué cosa quieres hacer?
Por qué UNO funciona y el OTRO no, sinceramente no lo sé.
Si se supone que tú escribiste los programas, deberías saberlo.
Solo veo que un programa tiene retardos y el otro no.
Sin saber lo que pregunté anteriormente, es para consultarlo a la bola de cristal.
Estoy trabajando con un PIC18F4550
Aquí mencionas que estás usando un PIC18F4550, pero los programas que publicas son para un PIC16F628A. :unsure:
 
Camarada tu problema es de lógica, estás programando lo siguiente:

C:
//ARRIBA

if (input (PIN_B0)==0)

      {

         output_high(PIN_B2);

         output_low(PIN_B3);

      }

      else    //<- aquí deshaces lo que hace el if siguiente

      {

        output_low(PIN_B2);

        output_low(PIN_B3);

      }

Y enseguida:

C:
      //ABAJO

      if (input (PIN_B1)==0)

      {

         output_low(PIN_B2);

         output_high(PIN_B3);

      }

      else   //<-- aquí deshaces lo que hizo el if anterior

      {

        output_low(PIN_B2);

        output_low(PIN_B3);

      }

Ves el problema? Con un if deshaces lo que hizo el anterior y tú motor queda encendido nada más por microsegundos, excepto cuando le agregas los retardos.
 
Atrás
Arriba