PIC16F84를 사용한 24시간 시계입니다.
2 채널의 AC스윗치를 타이머 제어할 수 있습니다.
고정밀도 수정 발진 유니트를 사용해 고정밀도입니다.
PIC16F84만으로 할 수 있던 24시간 시계입니다. 발진 소자에, 고정밀도 수정
발진 유니트를 사용하고 있기 (위해)때문에, 고정밀도의 시계로,오차 하루 1초 이하
의 정밀도에 할 수 있습니다.
표시는 16 문자 2행의 액정 표시기로 백 라이트 첨부를 사용해, 한밤중
그렇지만 표시가 보이도록(듯이) 했습니다.
또 타이머 프로그램 기능이 붙어 있어 2 계통의 외부 제어가 가능
입니다. 이번은 이것에 AC솔리드 릴레이를 추가해, AC전원 스윗치의
기능을 부가하고 있습니다.
이 타이머 프로그램은 하루 9개까지 자유롭게 설정할 수가 있습니다.
【시계 유니트의 사양】
이번 제작한 시계 유니트의 기능 사양은 아래와 같이가 되고 있습니다.
·정밀도 :월차 30초 이하
·전원 :DC9~12 V
소비 전류 백 라이트 없음때 15mA
백 라이트 첨부때 120mA
·표시 :16 문자 2행의 액정 표시기 백 라이트 첨부
표시 내용
현재 시각시:분:초
타이머 프로그램 설정 시각, 제어 내용 표시
·제어 출력: 2 계통의 On/Off
·설정 : 4개의 스윗치에 의해 아래와 같이 설정
(프로그램 선택, 시각 선택, 시각 변경, 설정)
-현재 시각 설정, 변경
-타이머 제어하는/하지 않는다
-타이머 제어 설정 9 프로그램까지 설정
【시계의 정밀도와 발진 소자】
여기서 시계를 만들기 위해서(때문에) 필요한 정밀도가 어느 정도인지를 설명합니다.
우선, 목표로 할 때 각정밀도를 어느 정도로 할까를 결정합시다.
목표 정밀도 : 월차 30초 이하
이 정밀도를 내기 위해서(때문에)는, 어느 정도의 정밀도가 필요한가라고 하면(자),
30초 ÷ (30일×24시간×3600초) = 0. 0000116
즉 11ppm 이하의 정밀도가 필요라는 것이 됩니다.
이만큼의 정밀도를, 사용하는 온도 범위, 전원 변동 범위, 경년 변화
의 각 조건의 변동 범위에서 유지하는 것이 필요합니다.
이것을 만족하는 발진 소자로서는, 통상의 수정진동자에서는, 조금
엄격해집니다. (보통 수정 발진 회로의 정밀도는 수십 ppm입니다)
거기서 특별 고정밀도의 수정 발진 유니트를 사용합니다. 이 유니트의
정밀도는 아래와 같이 되어 있어, 상기의 정밀도보다 수배 좋은 정밀도와
되어 있기 때문에, 이것으로 실현될 수 있게 됩니다.
(쿄세라사 카탈로그보다)
품명 KTXO-18 시리즈 쿄세라제 출력 주파수 12. 8MHz 온도 특성 ±3ppm -20~+60℃ 전원 변동 특성 ±0. 3ppm +5V±5% 경년 변화 ±1ppm 년 주파수 가변 범위 ±3 ppm 이상 내장 트리머
이와 같이 고정밀도의 발진 유니트를 간단하게 입수할 수 있는 것은, 아마츄어
에 있어 고마운 일입니다.
【시각 카운트 방법】
그런데 필요 충분한 정밀도의 발진 소자가 손에 들어 왔으므로, 이것을 사용해 PIC로
시계로서 작동시키는 방법을 생각해 보겠습니다.
즉 1초를 만들어 내려면 어떻게 하면 할 수 있는가 하는 것입니다.
발진 유니트의 출력 주파수는 12. 8 MHz이기 때문에, PIC16F84를 외부 발진
회로에서의 사용법으로 해, 직접 12. 8 MHz를 클락으로서 움직입니다.
(조금 고눈의 클락이 됩니다만, 5 V전원에서는 안정에 동작합니다)
그렇다면, 다음은 어떻게 1초를 만들지가 과제가 됩니다. 이번은 아래와 같이
(와)과 같은 방법으로 1초를 만들어 냈습니다.
12. 8 MHz 클락 → 1/4의 사이클 타임(12. 8÷4=3. 2)
→ 타이머 0을 프리스케이라 4배로프리 런시킨다
(3. 2MHz÷(4×256)=3125 Hz)
→ 타이머 0의 카운트업 세치기를 3125회 카운트 한다
(3125 Hz÷3125=1 Hz(=1초))
이렇게 하면(자), 타이머 0의 카운트업 세치기가, 320μsec마다 발생
하게 됩니다. 따라서, 이 세치기 처리를 여유를 가져 실행 완료
하는 것이 필요하게 됩니다. 반의 150μsec 이하 정도로 실행 완료한다
같게 생각합니다.
한층 더 주의가 필요한 (일)것은, 타이머 0의 세치기 처리에서는, 결코 TMR0
레지스터세트를 실행해서는 안 된다고 하는 것입니다.
이것은, 이 명령을 실행하면(자), 프리스케이라가 일단 0에 클리어 되기 때문에(위해),
여기서 시간 카운트에 오차가 나와 버리기 때문입니다.
따라서, 타이머 0은 완전하게 프리 런 시킨 상태로, 세치기가 정확하게
일정 주기(3125 Hz 즉 320μsec마다)에 접어드는 것처럼 합니다.
【시계 유니트의 구성】
본시계 유니트의 전체 회로도는, 아래와 같이 됩니다. 전체를 제어한다
의는 PIC16F84로, 이것에 16 문자 2행의 액정 표시기를 접속합니다.
발진 회로는 외부 발진 회로라고 하는 형태로, OSC1(16 핀)에 발진 유니트의
출력을 저항으로 레벨을 조정해 접속합니다.
그리고는 누르는 보턴 스윗치를 4개, AC스윗치 제어가 2 계통이 되고 있다
만으로, 매우 간단한 회로 구성이 되고 있습니다.
AC스윗치에는, 도대체 모듈형의 solid state relay(SSR)를
사용했습니다. 본래는, 제로 크로스 스윗치가 노이즈에도 강하고 좋습니다만,
이번은 소지의 제로 크로스 기능 없음의 것을 그대로 사용했습니다.
★ 시계 유니트 회로도(클릭하면 직접 표시합니다)
【조립】
이번 시계 유니트는, 1매의 자작 프린트 기판에 모든 부품을 실장
하고 있습니다. 액정 표시기아래에 PIC나, 발진 유니트등을 배치 섬 해
가, 부품 점수는 매우 적기 때문에, 편하게 실장할 수 있습니다.
★ 시계 유니트 패턴도(해동해 WinBorad로 란 주세요)상기 회로를 왼쪽 사진과 같은, 1매의 프린트 기판상에
짜 세우고 있습니다. 케이스에 실장하기 위해서는
좀 더 스윗치, AC스윗치, 표시부와 나누는 것이
하기 쉽다고 생각합니다.조립상에서 주의하는 것은, AC스윗치의 출력측의
주위는 가능한 한 넓게 비워 두는 것.
액정 표시기의 아래 쪽은 키가 큰 부품이 배치되지 않는다
같게 하는 것 정도입니다.
【프로그램】
다음은 실제로 시계 기능을 실현하기 위한 프로그램의 설명입니다. 실제의
기능은 프로그램만으로 대부분 만들어지고 있기 때문에, 반대로, 여러분의 아이
데아 나름으로, 어떠한 시계도 만드는 것이 가능해집니다.이번, 표시에는, 액정 표시기를 사용했습니다.
그 표시 내용은 왼쪽 사진과 같이, 위쪽의 행에는
현재 시각을, 아래 쪽의 행으로, 타이머 설정 표시에 사용한다
그렇다고 하는 것으로 구분하여 사용하고 있습니다.
《표시 내용》
실제의 표시 내용의 사양은 밑그림과 같이 했습니다.
![]()
《프로그램 플로우》
프로그램의 흐름을 설명합니다. 크게 나누어 메인 프로그램과
세치기 처리 프로그램이 있습니다.
밑그림이 프로그램의 개략 플로우도입니다.
세치기 처리 프로그램은 320μsec의 반 150μsec 이내에서 실행
(을)를 완료시킨다, 라고 하는 목표가 있으니까, 여기에서는 시각의 데이터의 카
운트압인 만큼 해, 실제의 표시 변경이나, 타이머의 시각 일치등의
처리는 모두 메인 프로그램의 (분)편으로 실행시키고 있습니다.
이 결과, 20μsec 정도의 고속 처리가 되었습니다.
이것을 서로 동기를 취하기 위해서(때문에), SECFLG라고 하는 플래그를 사용하고 있습니다.
즉, 세치기 처리로 세치기가 3125회 접어들었을 때에 SECFLG를 On
(으)로 해둡니다. 메인 프로그램에서는 스윗치의 입력을 상시 체크
하면서, 동시에 SECFLG도 체크해, On때로는, 표시의 갱신과
타이머의 시각 일치를 확인해, 일치하고 있으면(자) 외부 출력의 On/Of제어를
실행합니다.
타이머 설정용의 프로그램 설정에서는, CH0만 특별 취급이 되어 있어
현재 시각 변경용의 프로그램 기능으로 하고 있기 때문에, CH0때만
다른 처리 내용이 되고 있습니다.
스윗치가 연속해 밀리고 있었을 때에는, 0. 2초간격으로 같은 처리를
반복하도록(듯이) 하고 있습니다. 이것을 처리하기 위해서 SKEW라고 하는 카운터
(을)를 사용하고 있습니다.
![]()
상기를 실현하는 프로그램 원시 파일은 아래와 같이가 되고 있습니다.
다운로드해 해동해, MPLAB로 사용해 주세요.
★ 시계 유니트 소스 프로그램 파일