Control con pic

Buenas.
En primer lugar he probado diferentes circuitos en proteus y en ninguno logro que encienda el led.
En segundo lugar quisiera saber qué me recomiendan para controlar una carga de 12v 1a (leds en serie) con un pic16f628a con una fuente de 12v. Creo que la mejor opción es un mosfet porque con los bjt tengo mucha caída de tensión Vce. Y si es posible algún diseño que me oriente...

Gracias
 

Adjuntos

  • Captura de pantalla (64).jpg
    Captura de pantalla (64).jpg
    118.2 KB · Visitas: 34
  • Captura de pantalla (65).jpg
    Captura de pantalla (65).jpg
    116.5 KB · Visitas: 25
???? de que hablas, si el BJT se satura, en colector practicamente hay masa....
Puede ser una falla de tu programa, publica el programa...
De cuanto es la R que va a la base? y la de base a masa?, como hiciste los calculos para las R????
Si la caida es grande, es porque el transistor no conduce a pleno en la base debe haber 0.7V y tu R de base debe estar calculada para que en los extremos soporte 5-0.7V=4.3 y la atraviese la corrriente de base que por el hfe sature el transistor.
En la práctica no necesitas la R de base a masa, te complica.....
 
Última edición:
Buenas gente! en primer lugar, en "mi opinion"personal y sin desvirtuar el topico, yo implementaria un simple mosfet y a la salida del micro un PWM de duty variable... Con eso no solo vas a alargar l vida util del led, si no que tambien veras que con un poco menos de corriente, ilumina igual que fuente directa al led por el efecto POV... Como el mosfet el control no es por corriente, es por tension, con un simple totem pole tenes practicamente todo cocinado... (un ejemplo sencillo)
totem_pole1.png

No olvides de colocar la resistencia limitadora de corriente
 
Eso no cambia el problema, si no enciende, vamos por parte no podemos poner el techo si ni siquiera estan los cimientos, primero que funcione la salida, puede que sea el programa, puede que la forma de conectarlo, hay que verificar eso, luego se ve el resto, las cosas deben hacerse ordenadamente
 
Última edición:
1.- Si armas y armas circuitos en Proteus y ninguno te funciona tienes que valorar también tu software, ademas estás compilando bien? la librerías y tu código de programa cual es?

2.- No estoy seguro de que es lo que tiene que hacer tu circuito, controlas los leds solo on-off pues usa un rele, si usas PWM yo usaria un TIP41C
 
Plugin ccs en mplab. El programa es:


#include <16F628A.h>

#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD

#use delay(clock=4000000)
#define led1 PIN_A1
#define led2 PIN_A2

void main()
{
while (1)
{
for (int i = 0;i < 3; i++ ){
output_bit(led1, TRUE);
output_bit(led2, TRUE);
delay_ms(1000);
output_bit(led1, FALSE);
output_bit(led2, FALSE)
delay_ms(700);
}
}
}
 
Plugin ccs en mplab. El programa es:


#include <16F628A.h>

#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES NOMCLR
#FUSES NOLVP
#FUSES NOCPD

#use delay(clock=4000000)
#define led1 PIN_A1
#define led2 PIN_A2

void main()
{
while (1)
{
for (int i = 0;i < 3; i++ ){
output_bit(led1, TRUE);
output_bit(led2, TRUE);
delay_ms(1000);
output_bit(led1, FALSE);
output_bit(led2, FALSE)
delay_ms(700);
}
}
}

Sin analizar tanto, para que pones un for, dentro de un while si no vas a usarlo?
Pon simplemente

PHP:
void main()
{
while (1)
 {
    output_high(led1);
    output_high(led2);
    delay_ms(1000); 
    output_low(led1);
    output_low(led2);
    delay_ms(700); 
}
}
 
Eso no cambia el problema, si no enciende, vamos por parte no podemos poner el techo si ni siquiera estan los cimientos, primero que funcione la salida, puede que sea el programa, puede que la forma de conectarlo, hay que verificar eso, luego se ve el resto, las cosas deben hacerse ordenadamente

:rolleyes:


al ejemplo anterior, yo le sumaria configurar puertos tambien y probar...

Código:
#include <16F628A.h>
#use delay(clock=4000000)

void main()
{set_tris_b(0x00);
  output_b(0x00);

while (1)
 {
    output_high(pin_b0);
    output_high(pin_b1);
    delay_ms(1000); 
    output_low(pin_b0);
    output_low(pin_b1);
    delay_ms(700); 
}
}

Coincido que quizas el problema este al compilar...
 
"int i" fuera del for?????? es extraño......
Al no publicar tu código completo es imposible ver los errores, no hay adivinos en el foro
 
Última edición:
Código:

Código:
#include <16F628A.h>

#FUSES HS
#use delay(crystal=20Mhz)
#FUSES NOWDT
#FUSES NOPUT
#FUSES NOPROTECT
#FUSES NOBROWNOUT
#FUSES MCLR
#FUSES NOLVP
#FUSES NOCPD
#define led1 PIN_A1 
#define led2 PIN_A2 

void main()
{
while (1)
 {
    int i;
    for ( i = 0;i < 3; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, TRUE);
        delay_ms(1000); 
         output_bit(led1, FALSE); 
        output_bit(led2, FALSE);
        delay_ms(700); 
    }
    
    
    for (i = 0;i < 7; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, TRUE); 
  delay_ms(300); 
  output_bit(led1, FALSE); 
  output_bit(led2, FALSE); 
  delay_ms(280); 
    }
 
    
    for (i = 0;i < 15; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, FALSE); 
  delay_ms(250); 
  output_bit(led1, FALSE); 
  output_bit(led2, TRUE); 
  delay_ms(250); 
    }
    
    
     for (i = 0;i < 15; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, FALSE); 
  delay_ms(100); 
  output_bit(led1, FALSE); 
  output_bit(led2, TRUE); 
  delay_ms(100); 
  output_bit(led1, FALSE); 
  output_bit(led2, FALSE); 
  delay_ms(75); 
    }
    
    
    for (i = 0;i < 15; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, FALSE); 
  delay_ms(120); 
  output_bit(led1, FALSE); 
  output_bit(led2, TRUE); 
  delay_ms(120); 
    }
    
    
    for ( i = 0;i < 20; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, TRUE); 
  delay_ms(100); 
  output_bit(led1, FALSE); 
  output_bit(led2, FALSE); 
  delay_ms(100); 
    }
    
    
    for ( i = 0;i < 26; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, TRUE); 
  delay_ms(25); 
  output_bit(led1, FALSE); 
  output_bit(led2, FALSE); 
  delay_ms(30); 
    }
    
    
    for ( i = 0;i < 4; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, FALSE); 
  delay_ms(800); 
  output_bit(led1, FALSE); 
  output_bit(led2, TRUE); 
  delay_ms(800); 
    }
    
    
    for ( i = 0;i < 30; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, TRUE); 
  delay_ms(100); 
  output_bit(led1, FALSE); 
  output_bit(led2, FALSE); 
  delay_ms(100); 
    }
    
    
    for ( i = 0;i < 4; i++ ){
        output_bit(led1, TRUE); 
        output_bit(led2, FALSE); 
  delay_ms(110); 
  output_bit(led1, FALSE); 
  output_bit(led2, TRUE); 
  delay_ms(100); 
    }
    
     }
}
 
Hola massi123, y digo yo, no te es mas comodo, una vez has declarado led1 y led2 con sus respectivos pines, Pin_A1 y Pin_A2, poner, por ejemplo: output_high(led1); para activarlo, en vez de output_bit(led1,true);?, ahorras escritura.

Por cierto, lo de la variable int i se soluciona poniendo una diferente en cada for, ejemplo int a, int b, int x.
 
Última edición:
Si, es otra posibilidad. Igual el pic lo grabe y colocandole leds de prueba funciona bien el programa. Pero lo que sigue sin funcionar es la simulacion en proteus
 
Con lo cual te puedes dar cuenta que Proteus o cualquier simulador no lo es todo, asi como a veces no funcionan en la práctica y en el simulador si, se da también la inversa y en el simulador no anda y en la práctica si.
 
Atrás
Arriba