마음 속 하늘은 항상 맑음~!

새로운 터치 센서 코드 본문

카테고리 없음

새로운 터치 센서 코드

파르셀수스 2021. 8. 13. 22:50

 새로운 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.

 

 완벽하지는 않지만 큰 문제없이 작동하는 것 같다.