구형 8비트 MCU 가스누설 경보기를 새 MCU로 재설계하며 배운 것
구형 8비트 MCU 기반 다회로 가스누설 경보기(가스감지기 수신부)를 새 MCU로 재설계하며 포팅 대신 재작성을 택한 이유, 4-20mA 센서 경계 구간 판정, 저전압 정지 설계, 그리고 실기판에서 만난 펌웨어 함정을 체크리스트로 정리했습니다.
건물 안 여러 지점의 가스 누설을 한 곳에서 감시하는 다회로 가스누설 경보기는 오래 쓰이는 제품입니다. 그만큼 오래된 MCU 위에서 돌아가는 경우가 많습니다. 센스키랩은 최근 RAM 128바이트짜리 구형 8비트 MCU 기반 경보기를 최신 세대 8비트 MCU로 하드웨어 재설계 및 펌웨어 개발을 고객사 의뢰로 마쳤습니다.
비교 항목 | PIC16Fxx (기존) | PIC16F18xxx (변경) |
제조사 | Microchip | Microchip |
MCU 아키텍처 | 8비트 Mid-Range PIC | 8비트 Enhanced Mid-Range PIC |
최초 등장 시기 | 2002년 | 2021년경 |
프로그램 메모리 | 2K × 14비트 (약 3.5KB) | 14KB |
SRAM | 128 bytes | 1,024 bytes |
ADC | 8비트 | 10비트 |
2002년 세대의 PIC16Fxx를 2020년대에 등장한 PIC16F18xxx로 교체하면서 SRAM은 8배, ADC 분해능은 8비트에서 10비트로 향상되었습니다. 그러나 MCU 교체의 핵심은 단순한 성능 개선이 아니라, 기존 펌웨어의 타이밍 처리와 경보 로직, 아날로그 신호 판정 및 전원 이상 대응을 새 하드웨어 환경에 맞게 재검증하는 것이었습니다.
이 글에서는 결과물 소개보다 재설계 과정에서 내린 판단과 실기판에서 만난 함정을 정리합니다. 단종이나 공급 문제로 기존 제품의 MCU를 바꿔야 하는 분들께 참고가 되길 바랍니다.
개발 사항
시스템 구성
이 경보기는 세 종류의 보드로 이루어집니다.
AC 전원 → 트랜스 → 메인유닛 → 알람유닛 #1~#9 → 센서유닛- 메인유닛: 전원·배터리 충전, 배터리 격리시험, 부저, 전압 표시, 알람유닛 상태 수신
- 알람유닛: 센서 4~20mA 입력, 농도 표시, 경보 출력·차단 릴레이, 교정 메뉴
- 센서유닛: 4~20mA 출력 아날로그 센서 (MCU 없음)
정전 시에는 12V Ni-Cd 배터리로 동작하고, 알람유닛은 최대 9대까지 메인유닛 하나에 물립니다.
![[시스템 구성도: 개념도(AI 생성)]](https://image.inblog.dev?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fattachment%253Abd1523be-8e0b-4ef1-b211-b12f3dc1823c%253Aimage.png%253FspaceId%253D89917f5a-4e07-4d31-9f02-aa72f79c2cdc%3Ftable%3Dblock%26id%3D4098d3a9-c00a-803a-b017-d071b8c435b0%26cache%3Dv2&w=828&q=85)
포팅하지 않고 다시 쓴 이유
처음 검토한 것은 기존 펌웨어를 새 MCU로 옮기는 포팅이었습니다. 하지만 두 펌웨어를 나란히 놓고 보니 공유할 수 있는 레이어가 거의 없었습니다.
- 표시부: 시프트 레지스터 비트뱅잉 → 포트 직결
- ADC: 8비트 전원 기준 → 10비트 ADC + 내부 기준전압(FVR)
- RAM 128B 제약 때문에 들어간 비트시프트 필터 같은 "꼼수"
더 큰 문제는 따로 있었습니다. 포팅을 하면 "이 상수가 왜 이 값인가"가 주석에 없는 자리마다 이전 개발자의 암묵적 가정이 그대로 따라옵니다. 그래서 펌웨어는 새로 쓰고, 기존 펌웨어는 항목별로 전수 대조해 교훈만 옮기는 방식을 택했습니다. 대조 결과는 별도 문서로 남겨 "이미 반영 / 조치 / 해당 없음"으로 모든 항목을 종결했습니다.
설계에서 신경 쓴 두 가지
1. 4~20mA 경계 구간을 어떻게 볼 것인가
4~20mA 센서 입력에서 정상 범위 밖의 값은 모두 "고장"으로 처리하기 쉽습니다. 하지만 구간마다 의미가 다릅니다.
- 20.5mA 초과: 고장이 아니라 측정 범위 초과입니다. 오히려 가스 농도가 매우 높은 상황일 수 있습니다. 고장으로 처리하면 경보와 차단 접점이 풀리는, 가장 피해야 할 동작이 됩니다. 그래서 "Ovr"로 표시하고 경보와 차단 상태를 그대로 유지하다가, 20.0mA 이하로 돌아오면 해제합니다.
- 약 2~3.5mA: 센서가 열화되어 출력이 영점 아래로 내려간 상태일 수 있습니다. 그대로 두면 농도가 0으로 표시되고 정상 LED가 켜져, "센서는 죽었는데 화면은 정상"이 됩니다. 가스검지기에서 가장 위험한 고장 양상이라 이 구간은 "Lo"로 따로 표시합니다.
- 2mA 미만: 센서 고장으로 판정합니다.
여기서 함정이 하나 더 있었습니다. 전원을 켜면 센서 출력은 0mA에서 올라오거나, 센서에 따라 20mA 위에서 내려오기도 합니다. 어느 쪽이든 안정되기 전에 경계 구간을 지나가므로, 워밍업 중의 값으로 판정을 확정하면, 히스테리시스 폭 사이에 끼인 개체는 "Lo"에서 영영 빠져나오지 못합니다. 실제로 시험 개체 중 1대에서 이 증상이 나왔고, 워밍업이 끝나는 시점에 판정 상태를 초기화해서 해결했습니다. 임계값을 넓히는 건 답이 아니었습니다. 진짜 열화를 놓치게 되기 때문입니다.
2. 저전압에서는 "버티기"보다 "정의된 상태로 내려가기"
정전이 길어지면 배터리 전압이 계속 떨어집니다. MCU 동작 하한 근처에서는 부분 리셋, 릴레이 들썩임(오경보나 경보 누락), EEPROM 손상이 생길 수 있습니다. 그래서 일정 전압 아래로 일정 시간 내려가면 경보 출력을 끄고 스스로 정지하도록 했습니다.
복귀 전압은 정지 전압보다 크게 높게 잡았습니다. 부하가 빠지면 Ni-Cd 배터리 전압이 무부하로 반등하기 때문에, 히스테리시스가 좁으면 정지와 재기동을 반복하며 발진합니다.
시험 중에는 이런 일도 있었습니다. 낮은 전압에서 리셋이 반복됐는데, 원인은 브라운아웃 리셋이 아니라 펌웨어가 거들고 있었던 것이었습니다. 재기동하면 자가진단이 제일 먼저 모든 세그먼트를 켜서 최대 부하를 걸고, 그 순간 다시 브라운아웃이 납니다. 기동 직후 전압을 먼저 재고, 낮으면 자가진단을 건너뛰도록 바꿔서 해결했습니다. 브라운아웃 리셋 자체는 끄지 않았습니다. 끄면 동작 하한 아래에서도 MCU가 돌면서 교정값이 깨질 수 있습니다.
실기판에서 만난 함정들
코드 리뷰로는 보이지 않고 실기판에서만 드러난 것들입니다. 비슷한 작업을 하실 때 체크리스트로 쓰셔도 좋습니다.
- 정수 나눗셈 버림이 두 번 겹친다: 환산에서 한 번, 표시에서 한 번 버리면서 표시값이 한 자리씩 낮게 나왔습니다. 전부 반올림으로 바꿨습니다.
- 임계값을 깔끔한 숫자로 두면 안 되는 자리: 3.8mA 복귀 임계가 ADC 양자화 때문에 도달할 수 없는 값이었습니다. 임계값은 ADC 카운트로 환산해서 검증해야 합니다.
- ANSELx는 리셋 직후 아날로그 입력: 구형 PIC에서 넘어올 때 가장 흔히 놓치는 부분입니다. 액티브 LOW 입력에서 이걸 지우지 않으면 전원을 넣자마자 오경보가 납니다.
- 포트 초기화가 ADC 필터 커패시터를 방전시킨다: 초기화 코드에서 ADC 핀을 잠깐 출력으로 만들면 분압단 커패시터가 방전되고, 재충전되는 동안 읽은 첫 값이 실제의 3분의 1 수준으로 나옵니다. 핀에 커패시터가 달려 있다면 종류와 관계없이 같은 문제가 생깁니다.
- EEPROM 쓰기가 "조용히" 실패한다: 주소 공간 선택 비트가 틀리면 에러 없이 쓰기가 무시됩니다. 쓰기 후 되읽기 검증이 없었다면 저장됐다고 믿고 넘어갔을 것입니다. 또 헤더나 디바이스 정의 파일은 레지스터 이름의 근거일 뿐, 비트 폭이나 주소 공간 같은 동작의 근거는 아니었습니다. 이런 것은 짧은 프로브 코드로 실기판에서 확인하는 게 가장 빨랐습니다.
- 경보 장치에 "친절한" 소리는 독이다: 버튼이 눌렸다는 걸 알리려고 넣은 짧은 확인음이, 경보가 없을 때도 부저를 울렸습니다. 이 제품에서 부저는 안전 신호입니다. 경보가 아닌 소리를 내면 신호가 오염되므로 확인음을 없애고 피드백은 LED가 맡도록 했습니다.
돌아보면 공통된 교훈이 하나 있습니다. 정적 분석이 "코드는 정상"이라고 두 번 말하면, 세 번째 가설을 세우는 대신 계측을 넣어야 한다는 것입니다. 펌웨어가 읽는 값을 표시부에 그대로 띄우는 진단 빌드를 만들자, 며칠 걸릴 수 있던 문제가 한 번의 측정으로 풀렸습니다.
검증 결과
- 메인유닛·알람유닛 전 기능 단계별 실기판 검증 완료
- 최대 부하 조건 통합시험 통과: AC 전원과 배터리를 연결하고 알람유닛 4대가 동시에 경보를 내는 상태에서 부저 정지, 배터리 격리시험 모두 정상. 시험 중 MCU 리셋이나 경보 래치 해제 없음
- 메모리 여유: 메인유닛 플래시 약 47%, 알람유닛 플래시 약 80% (컴파일러 최적화 없이)
마무리
MCU 교체는 핀 맞추고 레지스터 이름만 바꾸면 될 것 같지만, 실제로는 이전 설계가 숨겨 둔 가정을 다시 드러내는 작업에 가깝습니다. 특히 가스경보기처럼 안전과 직결된 제품은 "정상 동작"보다 경계 상황에서 어떻게 실패하느냐가 더 중요합니다.
센스키랩은 가스센서 회로 설계부터 펌웨어, 실기판 검증까지 직접 수행합니다. 단종된 MCU 대체, 기존 가스경보기 재설계, 4~20mA 센서 인터페이스 개발이 필요하시면 편하게 문의해 주세요.
가스경보기 재설계나 펌웨어 개발이 필요하신가요? 지금 문의하기