Notice
Recent Posts
Recent Comments
마음 속 하늘은 항상 맑음~!
새로운 터치 센서 코드 본문
새로운 M118A라는 멀티테스터를 구입해서 전압을 재는데 PT4115의 코일 부분에서 생기는 전압 노이즈로 인해 전압값이 부정확하게 측정되는 현상이 발견.
M118A 멀티테스터로 회로 보완이 필요해졌다. 그런데 재미있는게 그동안 잘되던 터치와 적외선 스위칭 제어회로가 너무 민감해져서 너무 빠르게 민감하게 작동했다.
이 문제의 원인은 PT4115 드라이버 입력에 0.1uF(104) 콘덴서 하나가 없어서 발생했다.
여튼 문제의 해결을 위해서는 다시금 인터럽트 스위칭 코드를 변경해야 했다.
몇몇 방법으로 시도해보고 가장 안정적으로 작동하는 코드로 변경했다.
program _12F675_touch;
var
SWTimer:Byte;
Trigger:Boolean;
{ Declarations section }
procedure Interrupt(); iv 0x0004; ics ICS_AUTO;
begin
if T0IF_bit=1 then begin
{ reset timer0, 1000000 / 256 / 128 = 32ms }
Inc(SWTimer);
TMR0:=0;
T0IF_bit:=0;
end;
if GPIF_bit=1 then begin
// save last input state
if GP5_bit=1 then
Trigger:=True;
// reset GPIF
GPIF_bit:=0;
end;
end;
begin
CMCON:=7;
ANSEL:=0;
{ signal IO }
TRISIO4_bit:=0;
GP4_bit:=0;
{ port change input }
TRISIO5_bit:=1;
{ Interrupt }
IOC5_bit:=1;
{ timer1 }
TMR1CS_bit:=0;
T1CKPS1_bit:=1;
T1CKPS0_bit:=0;
TMR1ON_bit:=1;
{ timer 0 }
PSA_bit:=1;
PS2_bit:=1;
PS1_bit:=1;
PS0_bit:=1;
T0CS_bit:=0;
{ }
TRISIO0_bit:=0;
GP0_bit:=1;
Delay_100ms;
GP0_bit:=0;
SWTimer:=0;
{ Interrupt }
T0IE_bit:=1;
GIE_bit:=1;
while true do begin
// reset watchdog
if T1IF_bit=1 then begin
ClrWDT;
TMR1H:=0;
TMR1L:=0;
T1IF_bit:=0;
end;
// Switching ~100ms
if SWTimer>5 then begin
SWTimer:=0;
if Trigger then
GP4_bit:=not GP4_bit;
Trigger:=False;
end;
end;
end.
완벽하지는 않지만 큰 문제없이 작동하는 것 같다.