Soy completamente nuevo en el mundo de los microcontroladores PIC y la ingeniería eléctrica, así que ve con calma :)
De todos modos, logré programar mi PIC 16f627 para encender tres LED cuando se presiona el botón (disparador) y comenzar una secuencia de apagado (básicamente cada LED se apaga uno tras otro con un retraso de 5 segundos en el medio) cuando se presiona otro botón presionado (botón de reinicio). He estado probando esto en una placa de experimentación / programador K8048 PIC de Velleman. Los PIN RA0 y RA2 son las entradas para los botones de activación y reinicio respectivamente, mientras que los pines RB0, RB1 y RB2 son los pines de salida para los LED.
Trabajar con la placa de experimentación es genial, pero quiero mover esto a un circuito real. El problema es que no tengo idea por dónde empezar. Compré 3 LED (3,3 voltios cada uno), algunos botones y cable y construí el siguiente circuito:
(Perdón por el horrendo esquema)
En el circuito que construí, probé por primera vez para ver si los LED funcionarían con 3 baterías AA de 1.5 voltios y funcionaron bien, así que pensé que los resistencias no serían necesarios.
Sin embargo, esto no funciona y estoy totalmente perdido. Como referencia, aquí está mi código para el PIC. Está escrito en C usando MikroC. Funciona en el tablero de experimentación, así que no creo que sea un problema.
void main() {
TRISB.RB0 = 0;
TRISB.RB1 = 0;
TRISB.RB2 = 0;
PORTB.RB0 = 0;
PORTB.RB1 = 0;
PORTB.RB2 = 0;
CMCON = 0x07;
TRISA = 255;
for(;;){
if(PORTA.RA0 == 1 && PORTB.RB0 == 1 && PORTB.RB1 == 1 && PORTB.RB2 == 1){
delay_ms(5000);
PORTB.RB0 = 0;
delay_ms(5000);
PORTB.RB1 = 0;
delay_ms(5000);
PORTB.RB2 = 0;
}
if(PORTA.RA2 == 1){
PORTB.RB0 = 1;
PORTB.RB1 = 1;
PORTB.RB2 = 1;
}
}
}
Cualquier ayuda sería muy apreciada. ¡Gracias!
fuente
Respuestas:
En primer lugar, siempre necesita resistencias en serie con los LED cuando se acciona desde una fuente de voltaje (por ejemplo, batería, suministro de CC, etc.)
Esto se debe a que los LED tienen una curva IV no lineal, que parece una alta impedancia hasta el voltaje umbral del Luego, el LED se eleva muy bruscamente, lo que significa que con un ligero cambio de voltaje la corriente cambia mucho, por lo que es casi imposible establecer la corriente a un valor estable de esta manera.
Al usar las resistencias en serie de valor correcto, se asegura de que la corriente no pueda aumentar lo suficiente como para dañar el LED.
Para calcular el valor de la resistencia, necesita conocer el voltaje directo del LED (Vf), luego restar Vf del voltaje de alimentación y dividirlo por la corriente deseada, por ejemplo, para un suministro de 5V, un Vf de 2V y 15mA:
(5V - 2V) / 0.020A = 200Ω (El valor estándar de 220Ω servirá; si no tiene esto, apunte a cualquier cosa entre 150Ω y 600Ω para un rango de 20mA a 5mA)
Esto supone un LED típico de 5 mm o 3 mm de corriente de funcionamiento máxima de 20 mA.
Aunque dice "3 x 1.5V Battery in Series" en su esquema, las baterías parecen estar realmente conectadas en paralelo. T confirme, las baterías deben conectarse de extremo a extremo como en el diagrama inferior de esta imagen:
Necesita condensadores de desacoplamiento presentes entre el microcontrolador Vdd y tierra. No entraré en detalles (busque aquí, hay muchas buenas respuestas sobre este tema) pero básicamente son para proporcionar al microcontrolador una reserva de energía local de baja impedancia para la demanda de corriente de alta frecuencia, a la que la fuente de alimentación no puede responder rápidamente suficiente.
Idealmente, debe colocar uno (100nF o 1uF de cerámica es bastante estándar) a través de los pines de alimentación y tierra, lo más cerca posible de los pines.
Asegúrese de estar usando el oscilador interno si no tiene cristal presente. Su código no muestra la configuración de los bits de configuración, si los ha omitido, debe agregarlos para asegurarse de que el microcontrolador esté configurado correctamente. El manual de CCS debería decirle cómo hacer esto. También en los bits de configuración, asegúrese de que el temporizador Watchdog esté apagado, de lo contrario su micro se reiniciará continuamente (a menos que llame al comando WDT clear regularmente)
Asegúrese de tener los LED en la dirección correcta.
Asegúrese de que tiene el pin MCLR atado alto, de lo contrario su PIC se mantendrá en el reinicio (a menos que apague MCLR en los bits de configuración) Esto generalmente se hace con una resistencia a Vdd, valor alrededor de 10kΩ. La hoja de datos tendrá un ejemplo de esto en la sección de reinicio. (gracias a ajs410 por mencionar esto)
fuente
Recomiendo encarecidamente el libro de la serie O'Reilly "Diseño de sistemas integrados" de John Catsoulis para alguien en su posición. Hay un capítulo sobre "Electrónica 101" que lo llevará a la velocidad funcional con bastante rapidez, y otro sobre construcción práctica.
fuente
No exceda los 5 V, su PIC podría quemarse por encima del nivel de voltaje de 5 V. Puede usar baterías de 9 V o un adaptador de CA / CC con un regulador de voltaje lineal como LM7805 para producir 5 V para su circuito. Cómo cablear:
http://stuff.nekhbet.ro/2006/06/18/how-to-build-a-5v-regulator-using-78l05-7805.html
Como dijo la mayoría: no se olvide de suministrar un pin MCLR con una resistencia en serie. Puede usar la configuración pull-up para restablecer su PIC. Aquí está el enlace para el esquema: http://www.mcuexamples.com/push-buttons-and-switch-debouncing-with-PIC.php
Utilice siempre una resistencia en serie antes de un led. Ahorrará que el led se queme y disminuirá el consumo de energía. Para leds de 3.3V 220 o 330 ohmios estaría bien.
fuente
La función del botón es simple. Cuando presionamos un botón, dos contactos se unen y se establece la conexión. Aún así, no es tan simple. El problema radica en la naturaleza del voltaje como dimensión eléctrica y en la imperfección de los contactos mecánicos. Es decir, antes de que el contacto se haga o se corte, hay un corto período de tiempo en el que puede producirse vibración (oscilación) como resultado de la irregularidad de los contactos mecánicos, o como resultado de la diferente velocidad al presionar un botón (esto depende en persona que presiona el botón). El término dado a este fenómeno se llama SWITCH (CONTACT) DEBOUNCE. Si esto se pasa por alto cuando se escribe el programa, puede ocurrir un error, o el programa puede producir más de un pulso de salida con solo presionar un botón. Para evitar esto, podemos introducir un pequeño retraso cuando detectamos el cierre de un contacto. Esto asegurará que presionar un botón se interprete como un solo pulso. El retraso de rebote se produce en el software y la duración del retraso depende del botón y el propósito del botón. El problema puede resolverse parcialmente agregando un condensador a través del botón, pero un programa bien diseñado es una respuesta mucho mejor. El programa se puede ajustar hasta que se elimine por completo la detección falsa. La imagen a continuación muestra lo que sucede realmente cuando se presiona el botón. El programa se puede ajustar hasta que se elimine por completo la detección falsa. La imagen a continuación muestra lo que sucede realmente cuando se presiona el botón. El programa se puede ajustar hasta que se elimine por completo la detección falsa. La imagen a continuación muestra lo que sucede realmente cuando se presiona el botón.
Leer más: http://romux.com/tutorials/pic-tutorial/push-buttons#ixzz43cAbVcWR
fuente
Además de lo que han escrito los demás: no asigne pines de salida PIC individuales, como por ejemplo "PORTB.RB0 = 1;". En su lugar, haga que el bit cambie en una variable de tamaño de byte y luego escriba esa variable en el puerto.
Tu también puedes
fuente