El proyecto ATTiny se reinicia al conectar el teléfono

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í.

esquemático

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...
    }
}
No estoy seguro de si está relacionado con el problema que está informando, pero a su esquema le falta una resistencia limitadora de corriente en la base del transistor en el pin 5 de la MCU. ¿Está allí en el circuito y se lo perdió cuando capturó el esquema?
Noto la omisión significativa de cualquier condensador de desacoplamiento en ese esquema. ¿Los dejaste a propósito, o en realidad no tienes ninguno?
Los LED también necesitan resistencias limitadoras de corriente. ¿Los LED están en serie o en paralelo?
@Ricardo Gracias. Los dejé fuera en el esquema, pero están ahí. Los LED están en paralelo.
@ Majenko-notGoogle Muchas gracias. esos no los tengo Construí una placa de prueba-arduino que los tenía, pero supongo que no entendí completamente para qué servían, y no sabía que los necesitaba aquí también. Estoy leyendo el documento al que se vinculó Ignacio Vázquez-Abrams, y creo que ahora entiendo el propósito del condensador de desacoplamiento. Ahora solo para averiguar qué valor debe tener. :)
100nF directo en el pin Vcc y 10µF en la entrada de la placa.
Eso no necesariamente hará mucho bien sin agregar también un diodo ... 10uF podría ejecutar este circuito por un instante, pero no si tiene que retroalimentar el cargador y, por lo tanto, el teléfono.
¿Tiene acceso a un osciloscopio?
@ Majenko-notGoogle Gracias, lo intentaré. Pero primero leeré Circuitos y cálculos de suavizado de condensadores , porque en este momento es un completo misterio para mí cómo determinaste esos valores. :)
@GolezTrol Son solo valores de regla general comunes que son lo suficientemente buenos para la mayoría de las situaciones. Hay momentos en los que es posible que desee utilizar valores más específicos (para circuitos analógicos), pero para el desacoplamiento básico de MCU y circuitos digitales similares, 100 nF por Vcc y 10 µF en la entrada de la placa está bien.
@IgnacioVazquez-Abrams: ¿Quizás se está refiriendo a "AVR042: Consideraciones de diseño de hardware AVR" ?

Respuestas (3)

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.

Gracias por tu respuesta. Es apreciado. Su consejo es lo que entendí de los comentarios también. ¿Puede decirme cómo puedo encontrar los valores adecuados para esos condensadores? Prueba y error parece no ser una buena manera de conseguirlos. Además, ¿elegir el valor incorrecto puede dañar mi circuito de alguna manera?

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.