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 }
다소 복잡해보이지만 이렇게 하는 이유는 "순차제어 실행방식"과 병행하기 위해서입니다.
20mS는 0.02초 입니다. 즉 1초에 50번 수행됩니다. 이 정도 속도면 자동화쪽 응용에는 무리없는 수준입니다. 물론 이보다 속도를 높여 1초에 100번이상으로도 할수 있습니다만, 그렇게 되면 loop안에서 수행되는 메인 프로그램이 실행되는 시간이 그만큼 줄어들게 됩니다.
이 소스는 여러분의 책임하에 운영하시기 바랍니다. 본 소스가 실제 프로젝트에 적용되었을 경우, 당사는 오류및 사고에 대한 어떠한 책임도 지지 않습니다. 이에 대한 동의가 있을 경우에만 본 소스를 사용하시기 바랍니다. 본 소스는 참고용으로 제작되었습니다. 또한 본 소스에 대한 기술문의는 받고 있지 않습니다. 이점 양해바랍니다.