사용자 도구

사이트 도구

English

modularfaduino:managedprogram:index

제어용 기초 소스 만들기

loop안에서 로직처리를 실행 하는게 아니라, 별도로 20mS마다 발생되는 인터럽트를 이용해서 로직처리를 불러서 실행시키도록 변경하였습니다.

#include "CFMEGA.h"
CFNET cfnet;
 
uint8_t X[128]; // Input Coil
uint8_t Y[128]; // Output Coil
 
void distribute_value(uint16_t val, uint8_t where) {
    for (int i = 0; i < 16; i++) {
        X[where++] = val & 1;
        val >>= 1;
    }
}
 
void input_proc() {
    for (int i = 0; i < 8; i++) {
        distribute_value(cfnet.digitalRead(i), i * 16);
    }
}
 
uint16_t collect_value(uint8_t where) {
    uint16_t tempV = 0;
    for (int i = 0; i < 16; i++) {
        tempV |= (Y[where++] & 1) << i;
    }
    return tempV;
}
 
void output_proc() {
    for (int i = 0; i < 8; i++) {
        cfnet.digitalWrite(i, collect_value(i * 16));
    }
}
 
 
ISR(TIMER5_OVF_vect)
{
  TCNT5 = 198; // for 20mS
  sei(); // 전역 인터럽트 활성화
  input_proc();
  logic_proc();
  output_proc();
}
 
void setup() { 
  TCCR5B = 5; // Clock source from system clock/1024
  TIMSK5 |= 1;	//TOV interrupt set.
  sei(); // 전역 인터럽트 활성화
}
 
void loop() {
  // 유저 소스 
  // 이 안에서는 delay를 자유롭게 사용가능
}
 
// 20mS마다 한번씩 실행하는 LOGIC 처리기
 
void logic_proc()
{
  Y[0] = X[0];  // Main Logic Program
}

다소 복잡해보이지만 이렇게 하는 이유는 "순차제어 실행방식"과 병행하기 위해서입니다.

  • loop 함수안에서는 기존 아두이노에서 코딩하는 방법 그대로를 사용하세요. delay또는 Serial함수를 써도 좋습니다.
  • logic_proc 함수 안에서는 "스캔 루프 실행 방식"을 사용하는 로직 처리를 해주세요.
  • 결과적으로 "순차 제어 실행"과 "스캔 루프 실행"를 동시에 사용할 수 있게 됩니다.

주의사항

  • loop 함수에는 인터럽을 금지시키는 명령어를 쓰면 안됩니다. 그러면 Timer인터럽도 같이 중지가 되면서 로직처리가 멈추게 됩니다.
  • logic_proc함수 안에서는 시간을 지연시키는 delay 또는 Serial함수를 쓰지 마세요. 재빨리 실행을 끝마쳐야 합니다. 그래야 20mS마다 원활하게 반복 수행시킬 수 있습니다.

왜 20mS 간격인가?

20mS는 0.02초 입니다. 즉 1초에 50번 수행됩니다. 이 정도 속도면 자동화쪽 응용에는 무리없는 수준입니다. 물론 이보다 속도를 높여 1초에 100번이상으로도 할수 있습니다만, 그렇게 되면 loop안에서 수행되는 메인 프로그램이 실행되는 시간이 그만큼 줄어들게 됩니다.

알림

이 소스는 여러분의 책임하에 운영하시기 바랍니다. 본 소스가 실제 프로젝트에 적용되었을 경우, 당사는 오류및 사고에 대한 어떠한 책임도 지지 않습니다. 이에 대한 동의가 있을 경우에만 본 소스를 사용하시기 바랍니다. 본 소스는 참고용으로 제작되었습니다. 또한 본 소스에 대한 기술문의는 받고 있지 않습니다. 이점 양해바랍니다.

Modular FADUINO

modularfaduino/managedprogram/index.txt · 마지막으로 수정됨: 2024/10/31 03:41 저자 Comfile Technology