La scheda Arduino personalizzata emette un segnale acustico e il processo si blocca mentre sto caricando uno schizzo su di esso. Perché?


8

La cosa più strana sta succedendo a una scheda Arduino autonoma che ho progettato e costruito. La scheda (i cui schemi sono di seguito) ha le seguenti caratteristiche:

  1. Ha un ATmega328P con un regolatore di tensione a 5 V e circuiti usuali quando impostato come controller autonomo.
  2. Controlla un tabellone con diverse cifre a 7 display collegate attraverso i connettori sulla destra (da JP1 a JP12).
  3. Ha i pulsanti cursore decodificati usando una scala di tensione attraverso ANALOG_0 (A0).
  4. Ha un orologio in tempo reale per tenere il tempo quando è spento.
  5. Ha un modulo ricevitore RF.
  6. Ha un'intestazione UART (JP17), quindi posso programmare la scheda usando una porta seriale.
  7. Ha un altoparlante collegato al pin 3 digitale (D3).

Schemi del controller

Carico gli schizzi su di esso usando un adattatore da RS232 a TTL che ho anche creato (schemi anche sotto) e un cavo da seriale a USB. Durante la programmazione, la scheda si comporta in modo molto simile a una scheda Severino .

inserisci qui la descrizione dell'immagine

La cosa strana è che, quando carico uno schizzo, il processo viene messo in pausa nel mezzo e quindi l'altoparlante inizia a emettere continuamente segnali acustici. Si mette in pausa con i seguenti messaggi avrdude:

avrdude: Versione 5.11, compilata il 2 settembre 2011 alle 19:38:36 Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/ Copyright (c) 2007-2009 Joerg Wunsch

     System wide configuration file is "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf"

     Using Port                    : \\.\COM1
     Using Programmer              : arduino
     Overriding Baud Rate          : 115200

Quando premo reset sulla scheda, avrdude continua a inviare i suoi messaggi (come di seguito), il segnale acustico si interrompe, il caricamento continua e lo schizzo viene caricato correttamente sulla scheda.

avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
avrdude: Send: 0 [30]   [20] 
... messages and upload continue and completes successfully.

Non ho il resto dei messaggi a portata di mano qui, ma spero che tu abbia capito.

Quindi, le mie domande sono:

  1. Cosa sta mettendo in pausa il processo di caricamento?
  2. Perché il cicalino emette un segnale acustico quando il processo si interrompe?

1
Nelle preferenze dell'IDE, attiva il dettaglio per il caricamento. Questo registro dovrebbe fornire alcune informazioni o altri indizi.
mpflaga,

1
Domanda stupida: hai programmato ATmega328p con un bootloader?
Connor Wolf,

1
"Funziona perfettamente in UNO" -Queste sono informazioni utili. Quindi la tua scheda deve avere una presa. In tal caso, puoi determinare l'origine in modo più specifico con un rapido esperimento. Per ciascuno dei pin IO, piegare il pin verso l'esterno, in modo da non entrare in contatto. Galleggiante! Quando si inserisce l'IC nella presa. Alla fine, con tutti i pin fluttuanti, il circuito sarà fuori discussione. E poiché un punto tra il ritardo / segnale acustico dovrebbe arrestarsi. E riferire.
mpflaga,

1
@jfpoilpret se l'altoparlante è in realtà un cicalino (piezo), quindi non c'è induzione, quindi non è necessario alcun diodo. Dimentica il mio commento originale.
jfpoilpret,

1
Un mio amico che ha fatto molta elettronica in gioventù una volta mi ha detto: "se non funziona come ti aspetteresti, aggiungi un condensatore di disaccoppiamento". In molte occasioni, ho seguito questo consiglio con grande successo! Nel tuo schema, però, non mi è chiaro dove potresti aggiungere una capacità di disaccoppiamento. Hai provato in // con il cicalino? Puoi anche provare 2 (uno per freq basse, uno per freq alte): un elettrolitico almeno 1uF, un ceramico 100nF. Nel peggiore dei casi, non avrà alcun effetto :-)
jfpoilpret

Risposte:


3

Cosa sta mettendo in pausa il processo di caricamento?

Bene, dati tutti i commenti fatti sotto la tua domanda, questo è sicuramente difficile. Potresti provare ad aggiungere un condensatore di disaccoppiamento come suggerito da @jfpoilpret, anche se i tuoi schemi mi sembrano a posto ... (forse chiedigli una recensione su EE SE ).

Ti consiglio anche di copiare il avrdudecomando dall'output IDE di Arduino (lo troverai in alto) ed eseguirlo nella shell dei comandi con bitrate inferiore:

avrdude -v -v -v -v -C "C:\arduino-1.0.3\hardware/tools/avr/etc/avrdude.conf" -P COM1 -patmega328 -U… -B3 -b115200

più alto è il -Bvalore, più basso è il tuo bitrate. e -bal baudrate corretto per il tuo bootloader (sei sicuro che sia 115200? è più comune vedere 57600).

Hai anche impostato correttamente i fusibili? Potresti anche voler controllare i valori dei fusibili per vedere se gli orologi sono impostati correttamente:

avrdude -U lfuse:r:-:i -U hfuse:r:-:i -U efuse:r:-:i

che genererà i valori dei fusibili. Quindi per rendere leggibili i valori, inserire i valori nella parte inferiore del modulo sul sito della calcolatrice dei fusibili , dopo aver scelto l' Atmega328PMCU dall'elenco a discesa.

Ricontrolla che:

  • hai dimensioni sufficienti per il bootloader (di solito più lo dai, meglio è);
  • hai impostato correttamente la configurazione dei cristalli per il tuo progetto (che potrebbe non essere compatibile con le impostazioni Uno predefinite come configurate dall'IDE di Arduino), controllando se hai impostato correttamente il cristallo esterno a 16MHz ...

Perché il cicalino emette un segnale acustico quando il processo si interrompe?

È perché quando il processore non ha l'output impostato, i valori all'interno dei registri si trovano in uno stato indefinito e imprevedibile. Ciò significa che di solito mantiene l'ultimo valore che aveva prima di un reset, o cambia stato a causa di una stranezza elettrostatica, o sta dando qualche strano output PWM a causa dell'influenza di un orologio nelle vicinanze.

Quindi, in sostanza, sta succedendo qualcosa di sbagliato quando carichi il tuo codice e quella cosa sbagliata ha un effetto indiretto sull'audio. Non mi preoccuperei molto di quella roba, ma di più sulla causa della pausa.

Purtroppo, non ho una risposta diretta per te, ma nel migliore dei casi dovresti indagare di più. HTH


+1 Grazie per i suggerimenti! Molto utile. Li proverò tutti e riferirò tra un paio di giorni.
Ricardo

Volevo solo farti sapere che ho risolto il problema. Vedi la mia risposta a questa domanda. Grazie comunque!
Ricardo,

3

Alla fine ho scoperto che cosa stava causando il problema: il segnale di reset dal pin 4 (DTR - Data Terminal Ready) sul connettore DB9-Female stava raggiungendo i 10 V prima di passare a 0 V e stava innescando la programmazione ad alta tensione sull'ATmega. Di seguito è riportato un ambito che mostra la situazione:

Scope shot che mostra un picco di tensione a 10 V.

La traccia gialla è il DTRsegnale mentre la traccia verde è il RESETsegnale sull'ATmega.

Secondo la nota applicativa Atmel AVR042 di Atmel: AVR Hardware Design Considerations , si dovrebbe aggiungere un diodo ESD tra ATmega RESETe Vccimpedire al segnale di reset di attivare la modalità di programmazione ad alta tensione, in questo modo:

Collegamento a pin di RESET raccomandato per ATmegas

Dopo aver aggiunto un diodo di segnale così piccolo (1N4148) come raccomandato dalla nota dell'app, ho risolto il problema. Vedi sotto lo scatto dell'oscilloscopio effettuato dopo l'aggiunta del diodo.

Scope tiro dopo aver fissato la scheda

Ora il picco di 10 V è sparito.

È stato difficile !! Ma non avrei mai potuto trovare ciò che non andava senza la ricerca e gli strumenti giusti. Il denaro in un ambito è denaro ben speso !!


1
Ciò accade perché la linea di ripristino non ha il tipo di traduttore di livello applicato alla linea dati seriale. La maggior parte usa un traduttore di livello ic ed esegue il reset attraverso un canale di questo.
Chris Stratton,

@ Chris - Sì, ricordo che mi hai detto di usare il secondo convertitore MAX232 per risolvere il problema. Dò un'altra occhiata e vedrò se riesco a risolvere quel disegno. Grazie!!
Ricardo,

1

Non sono sicuro, ma il problema potrebbe anche essere correlato alla funzione di ripristino automatico della scheda del convertitore.

Ho copiato il design della scheda del convertitore da Arduino Severino e secondo il suo manuale , la comunicazione seriale deve essere impostata su 19.200 bps affinché la funzione di ripristino automatico funzioni.

Assicurarsi che la velocità della porta COM del computer sia impostata su 19200 bps, altrimenti il ​​ripristino automatico non funzionerà correttamente.

Bene, sto usando 115.200, quindi deve essere un problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.