Proyecto
Todavía no tengo mucha experiencia con la electrónica y la programación de microcontroladores. Recientemente (por accidente) compré un par de microcontroladores ATTiny13A, suponiendo que podría programarlos con el IDE de Arduino.
Debido a la poca memoria de estas cosas, decidí hacer un proyecto sencillo: una luz de lectura que se apaga automáticamente. Y decidí utilizar AVR Studio (6.0) en lugar del IDE de Arduino.
El circuito es bastante sencillo, creo. Dos botones para añadir media hora de luz, y otro para apagar las luces inmediatamente. Todo se alimenta de una varilla de pared USB, que suministra alrededor de 5V (5,2, he medido).
He simplificado el led. De hecho son 2 leds (al principio pensaba en 3) y las resistencias correspondientes, por lo que también he añadido la resistencia. También he omitido las conexiones al programador AVR, ya que no son relevantes para el circuito en sí.
simular este circuito - Esquema creado con CircuitLab
La luz funciona como se supone que debe hacerlo. Arde durante 3 segundos cuando la conecto. Puedo encenderla y apagarla. Y cuando la enciendo, arde durante una media hora antes de apagarse sola. Si sé de antemano que quiero tener más de media hora de luz, puedo pulsar el botón varias veces, para obtener N veces media hora.
Hasta aquí todo bien.
Problema: reinicios no deseados
Ahora el problema es que parece ser bastante sensible a los picos o caídas. Tengo una varilla de pared con dos conexiones. Cuando la luz nocturna está conectada en una de ellas, y yo conecto mi teléfono en la otra, la luz nocturna se reinicia, encendiéndose durante tres segundos y luego se apaga. Esto también ocurre la mayoría de las veces cuando desenchufo el teléfono. No importa si la luz estaba encendida o apagada cuando lo hago.
Así que mi pregunta principal es, ¿Cómo puedo solucionar estos reinicios? ? También estoy abierto a otros consejos.
Voy a pegar el programa aquí para que sirva de referencia también. Creo que no es relevante, pero intenté usar interrupciones y tener el controlador en modo de reposo la mayor parte del tiempo, así que lo publicaré de todos modos, por si contiene información vital.
/*
* NachtLampje.c
*
* Created: 22-10-2014 19:46:50
* Author: GolezTrol
*/
#define F_CPU 1200000UL // Sets up the default speed for delay.h
#include <avr/interrupt.h>
#include <avr/sleep.h>
#include <avr/wdt.h>
volatile int seconds = 3;
int secondsInc = 1800;
void setupLed() {
DDRB = 1<<DDB0;
}
void updateLed() {
// Blink for a moment when we're at 15 seconds, so user might prolong.
if (seconds > 0 && seconds != 15)
PORTB |= 1<<PB0;
else
PORTB &= ~(1<<PB0);
}
void setTimer(int state) {
if (state) {
WDTCR |= (1<<WDP2) | (1<<WDP1); // 1sec
WDTCR |= (1<<WDTIE); // Enable watchdog timer interrupts
}
else {
WDTCR &= ~(1<<WDTIE); // Disable watchdog timer interrupts
}
}
ISR(WDT_vect) {
// Timer interrupt
if (seconds == 0)
return;
if (--seconds == 0) {
setTimer(0);
}
updateLed();
}
ISR(PCINT0_vect){
// Button interrupt
// Button 1 = PB3 = Add half an hour of light.
if (~PINB & 0x08) {
seconds += secondsInc;
}
// Button 2 = PB 4 = Turn off the lights
if (~PINB & 0x10) {
seconds = 0;
}
// Enable timer, if necessary
setTimer(seconds > 0);
// Update the led.
updateLed();
}
int main(void) {
setupLed();
updateLed();
setTimer(seconds > 0);
GIMSK = 0b00100000; // turns on pin change interrupts
PCMSK = 0b00011000; // turn on interrupts on pins PB3 and PB4
sei(); // Enable global interrupts
// Use the Power Down sleep mode
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
for (;;) {
sleep_mode(); // go to sleep and wait for interrupt...
}
}
1 votos
atmel.com/images/
0 votos
No estoy seguro de que esté relacionado con el problema que reportas, pero en tu esquema falta una resistencia limitadora de corriente en la base del transistor en el pin 5 de la MCU. ¿Está ahí en el circuito y te lo perdiste al capturar el esquema?
6 votos
Observo la importante omisión de cualquier condensador de desacoplamiento en ese esquema. ¿Los has omitido a propósito, o realmente no tienes ninguno?
0 votos
Los LEDs también necesitan resistencias limitadoras de corriente. ¿Los LED están en serie o en paralelo?
0 votos
@Ricardo Gracias. Los dejé fuera en el esquema, pero están ahí. Los LEDs están en paralelo.
1 votos
@Majenko-notGoogle Muchas gracias. Yo no tengo de esos. He construido una placa-arduino que los tenía, pero creo que no entendí bien para qué servían, y no sabía que los necesitaba aquí también. Estoy leyendo el documento que enlazó Ignacio Vázquez-Abrams, y creo que ahora entiendo el propósito del condensador de desacoplamiento. Ahora sólo falta saber qué valor tiene que tener :)
0 votos
100nF directo en el pin Vcc, y 10µF en la entrada de la placa.
0 votos
Eso no va a servir necesariamente de mucho sin añadir también un diodo... 10uF podría hacer funcionar este circuito durante un instante, pero no si tiene que retroalimentar el cargador y por tanto el teléfono.
0 votos
¿Tienes acceso a un osciloscopio?
0 votos
@Majenko-notGoogle Gracias, lo probaré. Pero primero voy a leer Circuitos y cálculos de suavización de condensadores porque en este momento es un completo misterio para mí cómo determinaste esos valores. :)
0 votos
@GolezTrol Son sólo valores comunes de regla de tres que son lo suficientemente buenos para la mayoría de las situaciones. Hay ocasiones en las que se pueden utilizar valores más específicos (para circuitos analógicos) pero para el desacoplamiento básico de MCUs y circuitos digitales similares 100nF por Vcc y 10µF en la entrada de la placa está bien.
0 votos
@IgnacioVazquez-Abrams: ¿Acaso está aludiendo a "AVR042: Consideraciones sobre el diseño del hardware del AVR" ?