Desprogramação do AVR


8

Alguém já teve casos em que um AVR parou de funcionar misteriosamente depois de vários meses, mas a reprogramação o traria de volta?

Estou executando um monte de atmega328 na rede de sensores sem fio. Eu já tive três vezes (em cerca de um ano) quando um deles parou de funcionar. Vou re-gravar o programa nele e ele começará a funcionar novamente. Nem sempre é a mesma unidade, por isso não parece ser um chip com defeito.

Parece que seria uma coisa bastante desastrosa que impediria as pessoas de usar AVRs, por isso é obviamente algo sobre minhas circunstâncias particulares. Eu só estava me perguntando se alguém já se deparou com isso e pode ter algumas dicas.

Como as baterias estão funcionando a 3,3V, a tensão cai muito baixo para funcionar uma vez a cada dois meses e preciso substituir as baterias recarregáveis. Os módulos usam o modo de suspensão e o timer do watchdog para dormir por 60 segundos, fazer uma leitura, enviá-lo por rádio de volta à estação base e depois dormir novamente. Os módulos são compatíveis com o arduino, então eu não virei o bit "não me deixe re-queimar isso".


Onde você é capaz de identificar o problema? Estamos enfrentando problemas semelhantes com uma configuração semelhante. Você já leu a memória flash "corrompida" e a comparou com o conteúdo HEX original?
Rev1.0

Respostas:


6

Você está usando BOD? Ocasionalmente, coisas desagradáveis ​​podem acontecer se um chip escurecer.


3
Para esclarecer, o edebill deve estar usando o BOD.
Kevin Vermeer

Não está usando o BoD. Vou ter que ver sobre como adicioná-lo. Então o cenário aqui seria que o chip começa a se agitar à medida que a tensão fica muito baixa e acidentalmente corrompe seu próprio flash?
edebill

@edebill - Nos PICs, vi que isso acontece muito na produção quando os limites de BORV não são definidos.
J. Polfer

O que é BOD? Detecção Brown Out?
Peter Mortensen

2
Sim, é detecção de queda de energia.
Leon Heller

6

Provavelmente o Brown-Out-Detection é o caminho certo, mas ...

Eu tinha um problema apenas de software que causava sintomas muito semelhantes, embora muito mais rapidamente. Acredito que algum C ++ ruim (compilação?) Resultou em corrupção da pilha e a função retornou fora do programa real, executando instruções aleatórias. Não sei ao certo o que aconteceu a seguir, mas a única maneira de corrigi-lo era reativar o programa (aparentemente algumas dessas instruções aleatórias incluíam a gravação na memória do programa).

O bug era apenas um destruidor sendo chamado na hora errada. Tornar a variável global (para que nunca fosse destruída) resolveu o problema. O problema era facilmente reproduzível (demorava cerca de um minuto para disparar) e com energia muito estável. A configuração específica foi o Arduino + WaveShield usando a biblioteca WaveHC, mas acho que isso pode acontecer com qualquer pessoa que use C ++.

Se você preferir linguagens de baixo nível, acidentalmente fiz a mesma coisa na montagem, mas milagrosamente isso nunca causou nada além de problemas de tempo esporádicos: a maioria das instruções tem 2 bytes de comprimento, mas algumas são maiores, e eu calculei a distância do salto e pulei no meio de uma instrução de 4 bytes. Ele foi realinhado rapidamente, mas não é difícil imaginar algo assim em um caminho de código raramente usado, causando insanidade.


Isso também pode acontecer com processadores que mapeiam parte da memória flash no espaço de memória principal. Eu sei que pelo menos os dsPIC e PIC24 fazem isso. Se você tivesse um ponteiro corrompido e as circunstâncias corretas, poderia substituir o flash.
Thomas O

3

Também vi capacitores de desacoplamento Vcc insuficientes / mal posicionados / ausentes causar efeitos semelhantes. Você tem desacoplamento local o mais próximo possível do IC? (100nF - 1uF é o tipo cerâmico)


2

Outro fator que pode causar perda de memória dos dispositivos são as descargas eletroestáticas (ESD).

A colocação de alguns varistores em todos os conectores externos que estão sujeitos à exposição pode aliviar esse problema. Eu já vi isso em alguns produtos comerciais baseados em microcontroladores Microchip PIC, por isso não é inédito.

Existem alguns varistores úteis que também funcionam como capacitores de filtro (da ordem de 10-150 pF). Verifique estes http://www.tdk.co.jp/tefe02/e9c11_avr.pdf

Eles são pequenos, baratos e protegerão seu dispositivo. Coloque-os o mais próximo possível dos conectores que trazem sinais externos para a placa e direcione todos os traços imediatamente para longe dos pinos do conector.


Os varistores não são para proteção contra ESD (eles são para proteção de sobretensões com duração de 10 a 100 segundos de milissegundos); os diodos internos do dispositivo geralmente são suficientes, mas, quando não é, adicionar alguns diodos com polaridade inversa ao trilho (Vdd e GND) geralmente funciona; tenha cuidado, pois isso aumenta a capacitância do IO e pode afetar coisas de alta velocidade .
Thomas O

1
Thomas dá uma olhada no TDK datahseet, esses dispositivos são projetados especificamente para medidas de ESD e comprovadamente funcionam na produção de dispositivos de comunicação eletrônica. Testamos nossos dispositivos internamente com ESD de até 8 kV e esses dispositivos protegem outros componentes.
Smashtastic 16/10/10

Você está correto sobre a capacitância adicional e isso precisa ser considerado.
Smashtastic 16/10/10
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.