ATmega128, Interrupt, 인터럽트, FND,제어 - 0209
ATmega128, Interrupt, 인터럽트, FND,제어
[ 간략 설명 ]
◈ ATmega128, Interrupt, 인터럽트, FND,제어
◈ 인터럽트 제어 실습
ATmega128, Interrupt, 인터럽트, FND, 제어
캡쳐내용 넣기~~~~
◆◆ ATmega128 외부 인터럽트 제어 - LED P.138 ◆◆
/*
외부 인터럽트 제어 실습 - LED
SW8을 누르고 있는 동안에 LED가 룰렛 동작
0209A_Interrupt_p138.c
*/
#include <mega128.h>
#include <delay.h>
unsigned char Led = 0xfe;
void main(void)
{
//포트 초기화
DDRC = 0xff;
DDRE = 0b00000010;
PORTC = Led;
//인터럽트 초기화
EICRB = 0b00000000; // 외부 인터럽트 4 : low 레벨
EIMSK = 0b00010000; // 외부 인터럽트4 인에이블 (SW 선택)
SREG = 0x80; // 전역 인터럽트 인에이블 비트 셋
while(1); //무한대기
}//end main
//외부 인터럽트4 서비스 루틴
interrupt [EXT_INT4] void External_int7(void){
//LED 순차 점멸
Led <<=1;
Led |= 0x01;
if(Led == 0xff) Led = 0xfe;
PORTC = Led;
delay_ms(100);
}//
◆◆ ATmega128 외부 인터럽트 제어 - FND P.139 ◆◆
/*
외부 인터럽트 제어 실습 - FND p.139
SW8,14,15,16 을 누를때마다 외부 인터럽트가 발생하여
첫 번째 FND에 interrupt 숫자가 표시 되도록
0209A_Interrupt_p139.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[] = { 0x66, 0x6d, 0x7d, 0x07 };
void main(void)
{
DDRB = 0xff;
DDRE = 0b00000001;
DDRF = 0xf0;
PORTF = 0b00000000;
EICRB = 0b101010; // 하강 EDGE
EIMSK = 0b11110000;
SREG = 0x80;
while(1);
}//end main
interrupt [EXT_INT4] void Ex_int4(void){
PORTB = Seg_pat[0];
}//
interrupt [EXT_INT5] void Ex_int5(void){
PORTB = Seg_pat[1];
}//
interrupt [EXT_INT6] void Ex_int6(void){
PORTB = Seg_pat[2];
}//
interrupt [EXT_INT7] void Ex_int7(void){
PORTB = Seg_pat[3];
}//
◆◆ ATmega128 외부 인터럽트 제어 - FND P.140 ◆◆
/*
외부 인터럽트 제어 실습 - FND - p.140
INT4,5,6,7이 눌려질 때마다 외부 인터럽트가 발생하여
FND1,2,3,4에 interrupt 숫자가 표시 되도록...
0209A_Interrupt_p140.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
void main(void)
{
DDRB = 0xff;
DDRE = 0b00000010;
DDRF = 0xf0;
PORTF = 0b11100000;
EICRB = 0b10101010;
EIMSK = 0b11110000;
SREG = 0x80;
while(1);
}//end main
interrupt [EXT_INT4] void Ex_int4(void){
PORTF = 0b01110000;
PORTB = Seg_pat[4];
}//end4
interrupt [EXT_INT5] void Ex_int5(void){
PORTF = 0b10110000;
PORTB = Seg_pat[5];
}//end5
interrupt [EXT_INT6] void Ex_int6(void){
PORTF = 0b11010000;
PORTB = Seg_pat[6];
}//end6
interrupt [EXT_INT7] void Ex_int7(void){
PORTF = 0b11100000;
PORTB = Seg_pat[7];
}//end7
◆◆ ATmega128 외부 인터럽트 제어 - FND P.141 ◆◆
/*
외부 인터럽트 제어 - FND p.141
SW8을 누르면 첫번째 FND 숫자 업 카운트
SW14를 누르면 두번째 FND 숫자 다운 카운트
0209A_Interrupt_p141.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
void main(void)
{
DDRB = 0xff;
DDRE = 0b00000010;
DDRF = 0xf0;
PORTF = 0b11110000;
EICRB = 0b10101010;
EIMSK = 0b11110000;
SREG = 0x80;
while(1);
}//end main
interrupt [EXT_INT4] void External_int4(void){
int i = 0;
for( i=0 ; i<10 ; i++){
PORTF = 0b11000000; //추가
PORTB = Seg_pat[i];
delay_ms(300);
}//endfor
//while(1); //while 삭제
}//end4
interrupt [EXT_INT5] void External_int5(void){
int i = 0;
for( i=0 ; i<10 ; i++){
PORTF = 0b00110000; //추가
PORTB = Seg_pat[9-i];
delay_ms(300);
}//endfor
// while(1); //while 삭제
}//end5
◆◆ ATmega128 외부 인터럽트 제어 - FND P.142 ◆◆
/*
외부 인터럽트 제어 - FND p.142
SW8를 누르면 FND1,2 숫자가 업 되고,
SW14를 누르면 FMD3,4 숫자가 다운 된다.
0209E_Interrupt_p142.c
*/
#include <mega128.h>
#include <delay.h>
char Seg_pat[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f };
int Num = 0, Num1 = 0;
void main(void)
{
int N1, N10, N2, N20;
DDRB = 0xff;
DDRE = 0b00000010;
DDRF = 0xff;
PORTF = 0b11100000;
EICRB = 0b10101010; //하강 EDGE
EIMSK = 0b11110000;
SREG = 0x80;
while(1){
N1 = Num % 10;
N10 = Num /10;
N2 = Num1 % 10;
N20 = Num1 /10;
PORTF =0b11100000; // 0xe0
PORTB = Seg_pat[N1];
delay_ms(5);
PORTF = 0b11010000; // 0xd0
PORTB = Seg_pat[N10];
delay_ms(5);
PORTF = 0xb0; // 0b10110000
PORTB = Seg_pat[N2];
delay_ms(5);
PORTF = 0x70; // 0b01110000
PORTB = Seg_pat[N20];
delay_ms(5);
if( Num >99) Num = 0;
if( Num1 < 0) Num1 = 99;
}//endwhile
}//end main
interrupt [EXT_INT4] void Ex_int4(void){
Num++;
}//end4
interrupt [EXT_INT5] void Ex_int5(void){
Num1--;
}//end5
◆◆ ATmega128 외부 인터럽트 제어 - FND P.143 ◆◆
/*
외부 인터럽트 제어 - FND p.143
INT4,5,6,7 눌려질때 FND1,2,3,4 interrupt 발생 횟수가 표시
0209F_Interrupt_p143.c
*/
#include <mega128.h>
#include <delay.h>
char Seg[10] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x27, 0x7f, 0x67 };
int Num;
void main(void)
{
int N1, N10;
DDRE = 0x00;
DDRF = 0xff;
EICRB = 0b10101010;
EIMSK = 0b11110000;
SREG = 0x80;
while(1){
N1 = Num %10;
N10 = Num /10;
PORTF = 0xe0;
PORTB = Seg[N1];
delay_ms(5);
PORTF = 0xd0;
PORTB = Seg[N10];
delay_ms(5);
if( Num > 99) Num = 0;
if( Num <0 ) Num = 99;
}//endwhile
}//end main
interrupt [EXT_INT4] External_int4(void){
Num++;
}//end4
interrupt [EXT_INT5] External_int5(void){
Num++;
}//end5
interrupt [EXT_INT6] External_int6(void){
Num++;
}//end6
interrupt [EXT_INT7] External_int7(void){
Num--;
}//end7
'Edu > 유비쿼터스설비제어과정' 카테고리의 다른 글
ATmega128, Interrupt, 제어, 응용 - 0216 (0) | 2011.02.16 |
---|---|
ATmega128, AVR, Interrupt 제어 - 0215 (0) | 2011.02.16 |
- 0214 (0) | 2011.02.16 |
AVR, ATmega128, 인터럽트,FND - 0211 (0) | 2011.02.11 |
AVR, ATmega128, Interrupt, FND, CodeVision - 0210 (0) | 2011.02.10 |
LED40, NE555, 순차회로, 프로테우스 - 0208 (0) | 2011.02.09 |
LM358, OP 앰프,풍차점멸기 - 0207 (0) | 2011.02.07 |
OP Amp Basic Circuit with Proteus - 0121 (0) | 2011.02.01 |
가변순차기회로, 4017, NE555 - 0131 (0) | 2011.01.31 |
인터럽트, ATmega128 - 0127 (0) | 2011.01.27 |