우리는 많은 제품에서 ATmega48 / 88 / 168 / 328 마이크로 컨트롤러를 수년 동안 성공적으로 사용해 왔습니다. 우리는 이제 A 및 PA 변형을 새로운 PB 변형으로 전환하는 것을 고려했습니다 (새 제품에는 추가 핀, 타이머 및 UART가 필요하기 때문에 저렴 해졌고 기존 변형이 중단 된 것처럼 보이기 때문에). ATmega328PB를 사용하여 ATmega328A를 교체했습니다. 정전 후에 매우 빈번하게 연결되는 것 같습니다 . 이전 버전에서는 이러한 문제가 발생하지 않았습니다.
당사 제품의 사용 사례에서 정기적 인 정전이 일반적입니다. 우리는 (같은 스위칭 전원 공급 장치 사용 이 하나를 5V로 설정)하고, ATMEGA의 VCC에 220μF 범위에서 커패시터를 가지고, 임무하지 않은 내부 상태를 저장하는 데 몇 분 정도의 범위에서 전원 중단을 위해 살아 SRAM을 유지 중요하지만 다시 시작할 때 즉시 사용할 수 있으므로 사용자 환경이 크게 향상됩니다 (이러한 상태는 EEPROM을 부적합하게 만들 정도로 자주 변경됩니다). 이것은 항상 효과가 있었다.
그러나 새로운 ATmega328PB를 사용하면 전원 중단 후 칩이 MCUSR에서 리셋 조건을 찾지 않고 리셋되며 클럭이 사라지는 것처럼 보입니다.
- 브라운 아웃 감지기는 퓨즈마다 설정됩니다. 우리는 가능한 모든 보드 레벨을 시도했지만 버그는 그들 모두에서 발생합니다.
- 외부 20MHz를 사용하며 퓨즈 당 올바르게 설정되어 있습니다.
- 우리는 3 개의 서로 다른 칩을 시험해 보았으므로 단일 납땜이나 다른 하드웨어 고장이 아닙니다.
버그가 발생한 후 클럭은 종종 2.5 배 더 느린 속도로 설정되어 mcu가 8MHz 내부 오실레이터에 의해 클럭킹되고 있음을 나타냅니다. 그러나 때로는 둔화가 약 6 배입니다. 이것은 소프트웨어에서 퓨즈를 설정할 수 없으며 클럭 분배기가 클럭을 2.5 또는 6으로 나눌 수 없기 때문에 클럭 분배기를 변경하는 소프트웨어 버그가 될 수 없음을 의미합니다.
그래서 첫 번째 용의자는 새로운 Clock Failure Detection 퓨즈입니다. 그러나 켜져 있거나 꺼져 있더라도 동작은 동일하게 유지됩니다.
소프트웨어 특성을 배제하기 위해 타이머 테스트에서 100Hz로 출력을 토글하는 것 외에 다른 테스트 프로그램을 처음부터 작성했습니다. 매번 재시작 한 후 재설정 조건이 활성화 된 MCU를 MCUSR에서 읽습니다. 나머지 하드웨어도 제거되었으며 mcu와 레귤레이터 만 있습니다 (및 직렬 저항이있는 표시기 LED).
결과
대략 2/3의 시간, 흥미로운 것은 없습니다. 전원 중단 후 mcu는 작업을 다시 시작하며 브라운 아웃 재설정 및 전원 켜기 재설정 표시등이 모두 켜집니다.
(이미지에서 빨간색은 토글 된 핀이고 파란색은 VCC입니다.이 이미지에서 2.7V 브론 출력이 명확하게 보입니다. 다른 브라운 아웃 설정과 동일한 테스트를 수행하면 결과가 정확히 동일합니다. 그래서 나는 그 사진을 생략합니다)
전원이 다시 때 대략 시간의 1/3, 상기 버그가 발생하고, 아무도 브라운 - 아웃 리셋 리셋 지표 전원에의는 점등되지 않습니다! 마치 MCU가 이상한 시계로 똑딱 거리는 것처럼 출력이 다릅니다. 혼란 스럽지는 않지만 같은 빈도로 계속 똑딱 거리고 있습니다.
흥미롭게도,이 상황에서 브라운 아웃 감지기는 완전히 작동하지 않는 것 같습니다. 다음 번 정전이 발생한 후 (정확한 클럭이 때때로 복원되는 경우도 있음), 브라운 이후에도 출력이 계속 잘 돌아가는 것을 알 수 있기 때문입니다. 아웃 레벨이 통과되었습니다. 이러한 상황에서 시계는 때때로 빨라지고 다른 경우에는 느려집니다.
이 테스트 중에 시작 지연에 16K CK / 14CK + 4.1ms를 사용했지만 65ms 지연은 문제를 피하지 못합니다.
다음은 VCC가 2ms 미만의 5V에서 안정적인 상태에 도달 한 것을 분명히 볼 수있는 확대 그림입니다.
위 그림에서 mcu가 올바르게 시작되었습니다.
흥미롭게도 전원이 공급되지 않으면 공급 전압이 더 빨리 5V까지 안정적으로 유지됩니다 (mcu의 많은 부분이 켜지지 않아 시동 중에 전류를 덜 소비 함)
아래는 실패한 시작의 이미지입니다.
전원 전압이 안정화 된 후 소프트웨어가 달리 필요한 10.5ms 대신 85ms 이상 후에 소프트웨어가 실행되기 시작합니다. 시동 지연의 퓨즈는 여전히 동일합니다 (16K CK / 14CK + 4.1ms).
흥미로운 점은 전원이 꺼진 후 VCC가 1.1 ~ 1.2V로 안정화된다는 점입니다 (구형 ATmega328A 변형은 약 0.6-0.7V로 떨어짐). 몇 분 동안 유지합니다. 30 분 이상 기다릴 경우 mcu는 항상 올바르게 시작됩니다! 따라서 문제는 1.1 볼트가 주변에 있다는 것입니다. 데이터 시트에 따르면 전원 켜기 재설정에 충분하지 않을 수도 있습니다. 그러나 브라운 아웃 재설정에 충분해야합니다!
이러한 상황을 제외하고 브라운 아웃 감지기는 정상적으로 작동합니다. 첫 번째 이미지에서 볼 수 있습니다 (보드 레벨에 도달하면 출력 신호가 중지되고 MCU의 일부가 종료됨에 따라 전압 강하가 느려집니다). VCC를 보드 레벨보다 약간 아래로 낮추고 다시 다시 올렸을 때 테스트를 수행했으며, 브라운관 리셋 표시등 만 켜진 상태에서 mcu가 항상 이러한 조건에서 올바르게 다시 시작되었습니다.
내가 명백한 것을 놓쳤습니까, 아니면 ATmega328PB의 브라운 아웃 검출기에 심각한 버그가 있습니까?
편집하다:
흥미롭게도, 위의 문제는 레귤레이터 전에 전원을 차단할 때만 발생합니다. 레귤레이터 다음에 중단하거나 실험실 전원 공급 장치를 사용하면 문제가 발생하지 않습니다. 상승 전압의 모양이 문제를 일으킨 것처럼. 그러나 마지막 이미지에서 볼 수 있듯이 전압 상승은 매우 좋으며 빠르게 안정화됩니다.
편집 2
나는 20 MHz 대신 16 MHz로 시도했지만 정확히 같은 문제가 발생합니다.