13 1 int pin 8 volatile int state

  • Slides: 27
Download presentation

예제 13. 1의 스케치 int pin = 8; volatile int state = LOW; void

예제 13. 1의 스케치 int pin = 8; volatile int state = LOW; void setup() { pin. Mode(pin, OUTPUT); attach. Interrupt(0, toggle, CHANGE); } void toggle() { state = !state; } 0번 인터럽트 사용 인터럽트가 호출되면 함수 ‘toggle()’를 호출 함수 호출 때 마다 state 값 반전 (HIGH이면 LOW로, LOW이면 HIHG 반전) void loop() { digital. Write(pin, state); } 10

예제 13. 2의 스케치 1 byte LED[8] = {22, 24, 26, 28, 30, 32,

예제 13. 2의 스케치 1 byte LED[8] = {22, 24, 26, 28, 30, 32, 34, 36}; byte LED_Data = 0 x 01; volatile byte Time_STOP = 0; void setup() { byte i; for(i=0; i<8; i++) pin. Mode(LED[i], OUTPUT); attach. Interrupt(0, toggle, RISING); } LED 모듈 연결 핀을 배열로 선언 LED 모듈에 출력할 초기값 인터럽트 서비스 루틴 선언, 인터럽트 0(Pin 2) void LED_display(byte data) { byte i; for(i=0; i<8; i++) digital. Write(LED[i], bit. Read(data, i)); } LED를 한 bit씩 ON 시키는 함수 void toggle() { if(Time_STOP == 0) Time_STOP = 1; else Time_STOP = 0; } 외부 인터럽트가 발생하면 호출될 함수 16

예제 13. 2의 스케치 2 void loop() { LED_display(LED_Data); if(Time_STOP == 0) { if(LED_Data

예제 13. 2의 스케치 2 void loop() { LED_display(LED_Data); if(Time_STOP == 0) { if(LED_Data == 0 x 80) LED_Data = 0 x 01; else LED_Data <<= 1; } Time_STOP가 ‘ 0’ 이면 on될 LED를 우측으로 쉬프트 delay(100); 0. 1초 시간지연 } 17

Array FND 모듈 스톱워치 Mega 보드 디지털입출력 핀 연결 모듈 2 3 22 24

Array FND 모듈 스톱워치 Mega 보드 디지털입출력 핀 연결 모듈 2 3 22 24 26 28 30 32 34 36 38 40 42 44 BT 0 BT 1 A B C D E F G H C 0 C 1 C 2 C 3 SWITCH모듈 Array-FND 모듈 20

예제 13. 3의 스케치 1 byte FND[8] = {22, 24, 26, 28, 30, 32,

예제 13. 3의 스케치 1 byte FND[8] = {22, 24, 26, 28, 30, 32, 34, 36}; 세그먼트의 a~g와 dot 핀 지정 byte FND_CON[4] = {38, 40, 42, 44}; 4개의 FND 선택 핀 지정 byte FND_DATA_TBL[ ]={0 x 3 F, 0 X 06, 0 X 5 B, 0 X 4 F, 0 X 66, 0 X 6 D, 0 X 7 C, 0 X 07, 0 X 7 F, 0 X 67, 0 X 7 C, 0 X 39, 0 X 5 E, 0 X 79, 0 X 71, 0 X 08, 0 X 80}; 0~9, A~B, _, dot 표현 데이터 volatile byte time_10 ms=0, time_100 ms=0; volatile byte time_1 s=0, time_10 s=0; volatile byte Time_STOP = 0; 스톱워치 구현에 사용하는 변수 void setup() { byte z; for(z=0; z<8; z++) pin. Mode(FND[z], OUTPUT); for(z=0; z<4; z++) pin. Mode(FND_CON[z], OUTPUT); attach. Interrupt(0, blink 1, RISING); attach. Interrupt(1, blink 2, RISING); Int 0 => pin 2 Int 1 => pin 3 } 23

예제 13. 3의 스케치 2 void FND_display(byte data) { byte z; for(z=0; z<8; z++)

예제 13. 3의 스케치 2 void FND_display(byte data) { byte z; for(z=0; z<8; z++) digital. Write(FND[z], bit. Read(data, z)); } FND_DATA_TBL 배열값을 Array. FND에 표현하는 함수 void FND_control(byte data) { byte z; for(z=0; z<4; z++) { if(z == data) digital. Write(FND_CON[z], LOW); else digital. Write(FND_CON[z], HIGH); } } Array. FND 중 출력할 FND를 선택하는 함수 void loop() { FND_control(0); FND_display(FND_DATA_TBL[time_10 s]); delay(2); C 0선택 왼쪽에서 첫번째 FND 선택 2 ms 대기 FND_control(1); FND_display(FND_DATA_TBL[time_1 s]|0 x 80); delay(2); C 1선택 왼쪽에서 2번째 FND 선택 2 ms 대기 24

예제 13. 3의 스케치 3 FND_control(2); FND_display(FND_DATA_TBL[time_100 ms]); delay(3); C 2선택 왼쪽에서 3번째 FND

예제 13. 3의 스케치 3 FND_control(2); FND_display(FND_DATA_TBL[time_100 ms]); delay(3); C 2선택 왼쪽에서 3번째 FND 선택 3 ms 대기 FND_control(3); FND_display(FND_DATA_TBL[time_10 ms]); delay(3); C 3선택 왼쪽에서 4번째 FND 선택 3 ms 대기 if(Time_STOP==1) return; time_10 ms++; if(time_10 ms == 10) { time_10 ms = 0; time_100 ms++ ; } 인터럽트에 의한 Stop/Resume 처리 여기까지 사용된 딜레이 함수가 약 10 ms, time_10 ms는 10 ms마다 증가 됨. if(time_100 ms == 10) { time_100 ms = 0; time_1 s++ ; } 25

예제 13. 3의 스케치 4 if(time_1 s == 10) { time_1 s = 0;

예제 13. 3의 스케치 4 if(time_1 s == 10) { time_1 s = 0; time_10 s++ ; } if(time_10 s == 10) { time_10 s = 0; } } void blink 1() { if(Time_STOP == 0) Time_STOP = 1; else Time_STOP = 0; } void blink 2() { time_10 ms=0; time_100 ms=0; time_10 s=0; } 26