Eu nunca lidei com peças com defeito devido ao digikey, mas três novos Atmel ATmega164A que recebi exibiram um comportamento extremamente estranho.
Eu o reduzi a algo relacionado ao relógio, e o sinal do relógio resultante do oscilador interno supostamente "calibrado de fábrica" tremia entre 650-700 kHz em vez do sólido 1 MHz que deveria ser. Consegui escrever no byte de calibração para chegar perto de 1 MHz (ainda com alguma instabilidade) e a maioria das coisas funciona, mas os UARTs simplesmente não se comportam corretamente, eles parecem emitir um fluxo contínuo de pulsos curtos, não importa o que você pede para eles fazerem.
Eu lidei com a versão de baixo consumo de energia deste microcontrolador antes (164P) com zero problemas e decidi deixá-lo no lugar e verificar a saída do relógio, e é um sólido de 1 MHz sem tremulação. Estou me inclinando para a conclusão de que esses chips 164A estão com defeito, mas haveria outros testes que eu pudesse tentar confirmar?
Edit: Apenas pensei em descrever o processo pelo qual estou medindo o relógio. Ativei o bit de fusível da saída do relógio e medi o pino apropriado com um analisador lógico de amostragem a uma taxa muito alta. Eu tenho um programa que escreve no registro de calibração OSCCAL
e fui capaz de tentar e errar até 1 MHz.
Edit # 2: Após uma investigação mais aprofundada, parece que o microcontrolador começa a funcionar após um determinado tamanho de programalimite. Um projeto básico com um único arquivo de origem piscando em um LED parece estar bem, mas compilar e vincular qualquer um dos meus outros arquivos (por exemplo, biblioteca UART ou qualquer outra coisa) sem sequer fazer uma chamada de função para esses métodos faz com que o microcontrolador se comporte o comportamento descrito acima. As conexões de energia estão bem e a dissociação adequada foi exercida. Não tenho tempo para depurar isso ainda mais, por isso continuamos com a versão de baixa potência. Não sei ao certo onde exatamente o problema poderia ser 1) 164A e 164P não são compatíveis com o código 2) O procedimento de programação é diferente para essas duas unidades do uC 3) As unidades estão com defeito. Estou confiante no design de nossa placa e descartaria problemas de energia. Infelizmente, não consigo escolher a resposta correta, então deixarei a pergunta como está - talvez eu Voltarei ao problema novamente no futuro. Obrigado a todos que forneceram comentários ou respostas perspicazes, eles podem ser úteis para outras pessoas com problemas de UC fora da caixa.
Respostas:
É raro ter esse tipo de falha. Você pode esperar ver um pouco mais de ruído em um alfinete ou deixá-lo completamente inoperante. Mas tê-lo "um pouco de trabalho, mas não de uma maneira útil" é raro. Eu suspeitaria que há problemas de design que estão causando os problemas e tem algo a ver com a diferença entre o 164A e o 164P. Como o jitter é alto, eu consideraria coisas relacionadas à energia. Todos os pinos power / gnd estão conectados? Os pinos de E / S são acionados ou puxados para cima ou para baixo? Etc.
Mas ainda resta a possibilidade de as peças estarem ruins. É raro, mas não inédito. A única maneira real de saber é obter mais peças de um fornecedor diferente e experimentá-las. Se eles funcionarem, você precisará investigar mais e ver se os matou no manuseio / solda ou se eles realmente vieram do Digikey ruins.
fonte
Certa vez, tive um problema muito semelhante com as peças de microchip da linha de base. Estávamos estragando a programação do ICSP e estávamos encontrando uma maneira de apagar o ajuste do oscilador, causando erros graves na precisão do relógio interno. Verifique se o equipamento de programação e / ou ferramentas de programação estão sendo conectados corretamente e estão sendo usados corretamente.
Não há uma maneira fácil de verificar a precisão do oscilador sem programar as peças; portanto, basta escrever um programa trivial de alternância de portas (que não faz nada além de mexer em uma linha de E / S) e pedir a alguém que programe o peças, de preferência com diferentes hardwares de programação. Depois de verificar a manobra, você pode atualizar novamente com seu próprio código e verificar se o problema persiste.
fonte