Proyecto
Todavía no tengo mucha experiencia con la electrónica y la programación de microcontroladores. Recientemente (accidentalmente) compré un par de microcontroladores ATTiny13A, suponiendo que pudiera programarlos usando el IDE de Arduino.
Debido a la poca memoria de estas cosas, decidí hacer un proyecto simple: una luz de lectura que se apaga automáticamente. Y decidí usar AVR Studio (6.0) en lugar del IDE de Arduino.
El circuito es bastante simple, creo. Dos botones para añadir media hora de luz, y otro para apagar las luces inmediatamente. Todo está alimentado por una verruga de pared USB, que suministra alrededor de 5V (5.2, medí).
Simplifiqué el led. De hecho, hay 2 LED (planeé 3 al principio) y las resistencias apropiadas, por lo que también agregué la resistencia. También omití 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. Se quema durante 3 segundos cuando lo enchufo. Puedo encenderlo y apagarlo. Y cuando lo enciendo, se quema durante aproximadamente media hora antes de apagarse solo. Si sé de antemano que quiero tener más de media hora de luz, puedo pulsar varias veces el botón, para obtener N veces media hora.
Hasta ahora, todo bien.
Problema: reinicios no deseados
Ahora el problema es que parece ser bastante sensible a picos o caídas. Tengo una verruga en la pared con dos conexiones. Cuando la luz nocturna está enchufada en uno de ellos y enchufo mi teléfono en el otro, la luz nocturna se reinicia, se enciende durante tres segundos y luego se apaga. Esto también sucede la mayor parte del tiempo cuando desconecto el teléfono. No importa si la luz estaba encendida o apagada cuando lo hago.
Entonces, mi pregunta principal es, ¿ cómo resuelvo estos reinicios ? Estoy abierto a otros consejos también.
Pegaré el programa aquí como referencia también. Creo que no es relevante, pero traté de usar interrupciones y tener el controlador en modo de suspensión la mayor parte del tiempo, así que lo publicaré de todos modos, en caso de que contenga 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...
}
}
Lo más probable es que tenga una caída de voltaje al conectar o desconectar el teléfono. Siempre debe agregar algo de capacitancia entre VCC y GND para que el circuito sea menos propenso a las caídas de voltaje. Intente agregar dos capacitores en paralelo: 10uF (electrolítico) y 100nF (cerámica o lámina). ¡Cuidado con la polaridad del electrolítico! Si esto no ayuda, intente agregar más tapas en paralelo.
Y sí, el transistor debe tener al menos una resistencia base de 10 ohmios.
Editar: para los MCU de Atmel, los valores de condensador correctos se pueden encontrar en la hoja de datos o en los diseños de referencia.
Pero: quizás aún más importantes son los parásitos (ESR, resistencia en serie equivalente). Asegúrese de colocar una tapa de ESR inferior (cerámica) lo más cerca posible de los pines de suministro de la MCU. En general, cuanto mayor sea el límite, más ESR tendrá. 100nF es un valor que se usa comúnmente cerca de los pines de alimentación (nivel de chip), mientras que 10uF o 4,7uF se usan comúnmente para amortiguar partes completas del circuito (nivel de subcircuito).
Para su circuito, ciertamente es suficiente agregar dos 100nF en paralelo a los pines de alimentación.
Comenzaría con una tapa de cerámica de 100 nF lo más cerca posible de los pines Vcc y GND. Esta es una recomendación general para Atmel uC para lidiar con caídas y picos de voltaje más pequeños.
Como segundo paso, agregue ese electrolítico en algún lugar de la línea de suministro de energía (no tiene que estar muy cerca del chip). Puede comenzar con algo en el rango de 10-100uF y elegir uno apropiado para la calidad de su fuente de alimentación de verrugas de pared. Esto es puramente experimental.
En términos generales, cuanto mayor sea la tapa que agregue, más resistente será su circuito a las pérdidas de energía, pero más prolongado será el tiempo de apagado cuando desconecte el enchufe.
Consejo: 100uF, 47uF y límites similares se pueden eliminar de forma gratuita de las placas base de PC, televisores y otros dispositivos electrónicos de escritorio.
Lea sobre los circuitos POR (Power On Reset) para CPU basadas en Atmel, página 6
http://www.atmel.com/Images/Atmel-2521-AVR-Hardware-Design-Considerations_ApplicationNote_AVR042.pdf
Para proteger la línea RESET de más ruido, conecte un capacitor desde el pin RESET a tierra. Esto no es un requisito directo ya que el AVR tiene internamente un filtro de paso bajo para eliminar los picos y el ruido que podrían causar un reinicio. El uso de un condensador extra es una protección adicional. Sin embargo, dicho capacitor adicional no se puede usar cuando se usa DebugWIRE o PDI.
Ignacio Vázquez-Abrams
ricardo
Majenko
ricardo
GolezTrol
GolezTrol
Majenko
chris stratton
jake robinson
GolezTrol
Majenko
davidcary