El proyecto ATTiny se reinicia cuando se conecta el teléfono

5

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, asumiendo que podría programarlos usando el IDE de Arduino.

Debido a la pequeña cantidad de memoria en 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 agregar media hora de luz y otro para apagar las luces inmediatamente. Todo funciona con una verruga de pared USB, que suministra alrededor de 5V (5.2, lo medí).

Simplifiqué el led. De hecho, hay 2 leds (planifiqué 3 al principio) y las resistencias apropiadas, que es también la razón por la que agregué la resistencia. También dejé de lado las conexiones con el programador AVR, ya que no son relevantes para el circuito en sí.

simular este circuito : esquema creado usando CircuitLab

La luz funciona como debe ser. Se enciende 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 presionar el botón varias veces, para obtener N veces media hora.

Hasta ahora todo bien.

Problema: reinicios no deseados

Ahora el problema es que parece ser bastante sensible a los picos o caídas. Tengo una verruga de pared con dos conexiones. Cuando la luz de la noche está enchufada en una de ellas, y conecto mi teléfono a la otra, la luz de la noche se reinicia, se quema 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 ? También estoy abierto a otros consejos.

También pegaré el programa aquí como referencia. Creo que no es relevante, pero intenté usar interrupciones y tener el controlador en modo de suspensión la mayor parte del tiempo, así que lo publicaré de todas formas, 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...
    }
}
    
pregunta GolezTrol

3 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 caídas de voltaje. Intente agregar dos condensadores en paralelo: 10uF (electrolítico) y 100nF (cerámica o lámina). ¡Cuidado con la polaridad del electrolítico! Si esto no funciona, intente agregar más mayúsculas en paralelo.

Y, sí, el transistor debería tener al menos una resistencia de base de 10 ohmios.

Editar: Para las MCU de Atmel, los valores correctos de los condensadores 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 más grande sea la tapa, más ESR tendrá. 100nF es un valor comúnmente usado cerca de los pines de suministro (nivel de chip), mientras que 10uF o 4.7uF se usa comúnmente para amortiguar partes de circuitos completos (nivel de subcircuito).

Para su circuito, ciertamente es suficiente agregar dos 100nF en paralelo a las clavijas de alimentación.

    
respondido por el Simon
2

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 alimentación (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 el límite que agregue, más resistente será su circuito a las pérdidas de energía, pero más largo será el tiempo de apagado cuando retire el enchufe.

Sugerencia: 100uF, 47uF y tapas similares se pueden eliminar de forma gratuita desde las placas principales de PC, televisores y otros dispositivos electrónicos de escritorio.

    
respondido por el emes
0

Lea los circuitos de POR (reinicio de encendido) para las CPU basadas en Atmel, página 6

enlace

  

Para proteger la línea RESET del ruido adicional, conecte un condensador desde el pin RESET a tierra. Esto es   no se requiere directamente ya que el AVR tiene un filtro de paso bajo para eliminar los picos y el ruido que   podría causar reinicio. El uso de un condensador adicional es una protección adicional. Sin embargo, tal condensador extra   no se puede utilizar cuando se utiliza DebugWIRE o PDI.

    
respondido por el Clown Man

Lea otras preguntas en las etiquetas