AVR deprogrammazione stessa


8

Qualcun altro ha avuto casi in cui un AVR ha smesso di funzionare misteriosamente dopo diversi mesi, ma riprogrammarlo lo avrebbe riportato?

Sto gestendo un sacco di atmega328 nella rete di sensori wireless. Ora ho avuto 3 volte (in circa un anno) quando uno di loro ha appena smesso di funzionare. Brucerò nuovamente il programma e ricomincerà a funzionare. Non è sempre la stessa unità, quindi non sembra un chip difettoso.

Sembra che sarebbe una cosa piuttosto disastrosa che impedirebbe alle persone di utilizzare gli AVR, quindi è ovviamente qualcosa delle mie circostanze particolari. Mi stavo solo chiedendo se qualcun altro si è imbattuto in esso e potrebbe avere alcuni suggerimenti.

Sto esaurendo le batterie a 3,3 V, quindi la tensione si abbassa troppo per funzionare una volta ogni due mesi e devo sostituire i ricaricabili. I moduli utilizzano la modalità di sospensione e il timer del watchdog per dormire per 60 secondi, prendere una lettura, trasmetterla di nuovo alla stazione base e poi dormire di nuovo. I moduli sono compatibili con Arduino, quindi non ho lanciato il bit "Non farmi ri-masterizzare questo".


Dove sei in grado di identificare il problema? Stiamo riscontrando problemi simili con una configurazione simile. Hai mai letto la memoria flash "corrotta" e confrontata con i contenuti HEX originali?
Rev1.0

Risposte:


6

Stai usando BOD? Occasionalmente possono succedere cose brutte se un chip si consuma.


3
Per chiarire, edebill dovrebbe usare BOD.
Kevin Vermeer,

Non usando il CdA. Dovrò vedere come aggiungerlo. Quindi, lo scenario qui sarebbe che il chip inizia a fluttuare mentre la tensione diventa troppo bassa e corrompe accidentalmente il proprio flash?
edebill,

@edebill - Sui PIC, ho visto che succede molto nella produzione quando non sono impostate le soglie BORV.
J. Polfer,

Cos'è BOD? Brown Out Detection?
Peter Mortensen,

2
Sì, è il rilevamento brown-out.
Leon Heller,

6

Probabilmente il Brown-Out-Detection è il modo giusto di fare, ma ...

Ho avuto un solo problema software che ha causato sintomi molto simili, anche se molto più rapidamente. Credo che un cattivo C ++ (compilazione?) Abbia portato alla corruzione dello stack e la funzione sia tornata al di fuori del programma reale, eseguendo istruzioni casuali. Non sono sicuro di cosa sia successo dopo, ma l'unico modo per risolverlo è stato di ripristinare il programma (apparentemente alcune di quelle istruzioni casuali includevano la scrittura nella memoria del programma).

Il bug era solo un distruttore chiamato al momento sbagliato. Rendere la variabile globale (quindi non è mai stata distrutta) ha risolto il problema. Il problema era facilmente riproducibile (il trigger ha richiesto circa un minuto) e con una potenza molto costante. La configurazione particolare era Arduino + WaveShield che utilizzava la libreria WaveHC, ma penso che ciò possa accadere a chiunque usi C ++.

Se preferisci linguaggi di basso livello, ho fatto accidentalmente la stessa cosa durante il montaggio, ma miracolosamente questo non ha mai causato altro che sporadici problemi di temporizzazione: la maggior parte delle istruzioni sono lunghe 2 byte, ma alcune sono più lunghe, e ho calcolato stupidamente la distanza del salto e ho saltato nel mezzo di un'istruzione di 4 byte. È stato riallineato abbastanza rapidamente, ma non è difficile immaginare qualcosa di simile su un percorso di codice usato raramente che causa follia.


Questo potrebbe accadere anche con processori che mappano parte della memoria flash nello spazio di memoria principale. So che almeno i dsPIC e i PIC24 lo fanno. Se avessi un puntatore corrotto e le giuste circostanze, potresti sovrascrivere flash.
Thomas O

3

Ho anche visto condensatori di disaccoppiamento Vcc insufficienti / mal posizionati / mancanti che causano effetti simili. Hai il disaccoppiamento locale il più vicino possibile all'IC? (Si preferisce il tipo di ceramica 100nF - 1uF)


2

Un altro fattore che può causare la perdita della memoria dei dispositivi sono le scariche elettrostatiche (ESD).

Posizionare alcuni varistori su tutti i connettori di rivestimento esterni soggetti a esposizione può alleviare questo problema. L'ho visto prima in alcuni prodotti commerciali basati su microcontrollori PIC Microchip, quindi non è inaudito.

Esistono alcuni varistori utili che fungono anche da condensatori di filtro (nell'ordine di 10-150 pF). Dai un'occhiata a http://www.tdk.co.jp/tefe02/e9c11_avr.pdf

Sono piccoli, economici e proteggeranno il tuo dispositivo. Posizionarli il più vicino possibile ai connettori portando segnali esterni sulla scheda e instradare immediatamente tutte le tracce dai pin del connettore.


I varistori non sono per la protezione ESD (sono per la protezione di picchi che durano da 10 a 100 di millisecondi); i diodi interni del dispositivo sono in genere sufficienti, ma quando non lo è, l'aggiunta di alcuni diodi polarizzati al contrario su entrambe le rotaie (Vdd e GND) di solito funziona, fare attenzione però perché questo aggiunge capacità all'IO e può influire su roba ad alta velocità .
Thomas O,

1
Thomas dà un'occhiata al set di dati TDK, questi dispositivi sono specificamente progettati per le contromisure ESD e hanno dimostrato di funzionare nella produzione di dispositivi di comunicazione elettronica. Testiamo i nostri dispositivi internamente con ESD fino a 8 kV e questi dispositivi proteggono altri componenti.
smashtastic

Hai ragione sulla capacità aggiuntiva, e questo deve essere considerato.
smashtastic
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.