Arduino reiniciando mientras se vuelve a conectar el terminal serial

1

Escribí este código para el Arduino Uno. Contará una variable cada segundo y enviará ese recuento al terminal serial. El problema es que cuando cierro el terminal y lo vuelvo a abrir, la cuenta comenzará nuevamente desde 0. Estoy confundido con este comportamiento. Por favor, dime por qué esto está sucediendo.

Aquí está el código:

#include "Arduino.h"

#include <avr/io.h>
#include <avr/interrupt.h>

#define setbit(x,y) x |= 1<<y

unsigned long newmillis(void);
void newdelay(int x);
void toggle_led(void);

unsigned long volatile _count = 0;
volatile char state = 1;
int count = 0;

ISR(TIMER0_COMPA_vect) {

    _count++;

}

unsigned long newmillis(void) {
    //toggle_led();
    return _count;

}

void newdelay(int x) {
    unsigned volatile long y = (unsigned long)x + newmillis() - 1;
    while (y>newmillis());
}


int main(void) {

    init();
    TCCR0B = 0b11;
    OCR0A = 249;
    TIMSK0 |= 0b10;
    sei();

    Serial.begin(9600);
    DDRB |= 1<<5;

    //int count = 0;

    for (;;) {

        Serial.println(count++);
        newdelay(1000);
        toggle_led();

    }
}

void toggle_led(void) {

    if (state==0) {
        state = 1;
        PORTB |= 1<<5;
    }
    else {
        state = 0;
        PORTB &= ~(1<<5);
    }
}
    
pregunta 0xakhil

4 respuestas

4

Cuando programa el Arduino, el microcontrolador de la placa debe reiniciarse para ingresar al cargador de arranque para que pueda cargar el nuevo software. Arduino, en su infinita sabiduría, decidió que esto debería hacerse automáticamente cada vez que se conecte al puerto serie. Hay formas mucho mejores de hacerlo, pero supongo que decidieron hacerlo con la primera placa Arduino antes de que realmente supieran lo que estaban haciendo (¿incluso ahora?) Y ahora están atrapados en eso. Personalmente, habría usado un chip USB > RS232 diferente desde el principio, uno que puede hacer más que solo comunicaciones en serie, como el MCP2200 que le brinda un CDC y un dispositivo HID en una, y 8 líneas GPIO que podría usar para desencadenar eventos en el tablero, como restablecer, programáticamente.

Sin embargo, estoy divagando. Soy consciente de que hay dos formas de solucionar el problema: una que daña la placa permanentemente y otra que es mucho más simple y agradable.

  • La forma oficial es un mod permanente al tablero. No lo recomendaría de esta manera, hay una forma mucho más agradable (vea a continuación). Busque un pequeño enlace en el frente llamado RESET-EN y córtelo con un cuchillo muy afilado. Esto desconectará el chip serie del pin de reinicio y la placa nunca se reiniciará de nuevo. Sin embargo, esto romperá la capacidad de programar el tablero fácilmente. De ahora en adelante, deberá reiniciar manualmente la placa presionando el botón de reinicio en el momento adecuado para programarlo.

  • Elmétodoqueusoesmuchomássimpleymenosdestructivo.Conecteuncondensadorde22uFentreRESETyGND(enelencabezadoPOWER).Deberádesconectarloparaprogramarlaplaca,peronoimplicaromperlaplacaenabsoluto.Simplementeenchúfeloentreesasdosconexionesenelcabezal,asegurándosedequeellado-delcondensadorsepongaatierra.Estofuncionaalmantenerlalíneadereiniciolosuficientementealtacomoparaevitarqueelchipsereinicie,inclusocuandoelchipUSBestábajo.Elinterruptordereiniciodeberíaseguirfuncionando,peroesposiblequedebamantenerlounpocomásdelonormal.

En una nota al margen, el ChipKIT ™ UNO32 ™ tiene el mismo problema: tenían que mantener esa funcionalidad para mantener la compatibilidad con otros productos y metodologías de Arduino. Sin embargo, han sido mucho más sensibles al respecto. Todavía tienen el pequeño enlace para cortar, pero en lugar de estar entre las almohadillas de una huella 0805, están entre los agujeros pasantes de un cabezal de 0.1 "de 2 pines. De esta manera, puede cortar el enlace e instalar un encabezado de puente normal. A partir de ese momento, puede habilitar y deshabilitar la función de restablecimiento simplemente instalando o quitando un puente.

    
respondido por el Majenko
2

Es normal, es como funciona el Arduino. Cuando se conecte al puerto serie a través del chip FTDI (o los nuevos dispositivos serie Atmega), se reiniciará su dispositivo.

Por lo tanto, no está en su software, solo en el hardware. Me ha molestado antes, .. al igual que un escudo xbee restablece el chip atmega cuando sus buffers están llenos (aargh).

    
respondido por el Hans
0

En realidad, el restablecimiento no se debe al acto de conexión en sí, sino al comportamiento predeterminado de la mayoría de los sistemas operativos de las computadoras host para ordenar la activación de la señal DTR en la conexión del dispositivo en serie y la desactivación en el cierre del dispositivo.

Ese es el comportamiento que se puede configurar en la API serie del software del host y, por lo tanto, se evita.

    
respondido por el Chris Stratton
0

Otra opción que no requiere modificación de hardware (que @Chris_Stratton tocó) es conectarse al Arduino con DTR desactivado. Su host que envía una señal DTR es lo que hace que Arduino se reinicie, lo que se hace por diseño para volver a cargar su boceto si la conexión en serie se estaba utilizando para la programación.

No menciona qué software está utilizando para conectarse, pero aquí está un ejemplo de cómo deshabilitar DTR en Python.

    
respondido por el Cerin

Lea otras preguntas en las etiquetas