C-05 การอินเตอร์รัพท์ INT0
ทดลองโปรแกรมการอินเตอร์รัพท์จากภายนอก โดยปกติให้ทำงานบบที่ 1 พอถูกอินเตอร์รัพท์ก็ให้ทำงานแบบที่ 2
1. เปิดโปรเจคใหม ดูตัวอย่างจาก C-01 การเขียนโปรแกรมภาษา C
เพิ่มจำลองการทำงานของสวิทช์ และ LED
D1 VDD D1_NODE
D2 VDD D2_NODE
D3 VDD D3_NODE
D4 VDD D4_NODE
D5 VDD D5_NODE
D6 VDD D6_NODE
D7 VDD D7_NODE
D8 VDD D8_NODE
R1 D1_NODE PB0 0.62K
R2 D2_NODE PB1 0.62K
R3 D3_NODE PB2 0.62K
R4 D4_NODE PB3 0.62K
R5 D5_NODE PB4 0.62K
R6 D6_NODE PB5 0.62K
R7 D7_NODE PB6 0.62K
R8 D8_NODE PB7 0.62K
R9 VDD PD2 10K
K0 PD2 VSS MONOSTABLE(0.1m)
2. เขียนโปรแกรมใหม่
#include <avr\io.h> // Most basic include files
#include <avr\interrupt.h> // Add the necessary ones
#include <avr\signal.h> // here
#include <util/delay.h>
#define DataPort PORTB // Using PortB as our Dataport
#define DataDDR DDRB
unsigned char temp;
// Interrupt handler example for INT0
//
SIGNAL(SIG_INTERRUPT0) {
for(unsigned char i=0;i<10;i++)
{
DataPort = 0x0f;
_delay_ms(50);
DataPort = 0xf0;
_delay_ms(50);
}
}
// ***********************************************************
// Main program
//
int main(void) {
EIMSK |= _BV(INT0); //Enable INT0
EICRA |= _BV(ISC01); //Trigger on falling edge of INT0
sei();
DataDDR = 0xFF;
temp = 0x01;
while(1) { // Infinite loop; define here the
DataPort = ~temp;
if(temp==0x80) temp = 0x01;
else temp<<=1;
_delay_ms(100); // Software debouncing control
}
}