BASIC4MCU | 질문게시판 | 답변 : atmega128 스톱워치 작성 중 외부 인터럽트 관련 질문 드립니다.
페이지 정보
작성자 master 작성일2022-05-23 03:26 조회1,451회 댓글1건본문
일단은 INT0~INT7모두 다른 곳에 연결이 되어 있는 상태이고, 위 사진의 나수셈 기호를 시작버튼, INT0를 인터럽트로 사용하고 싶어서 PC7 = 0;으로 해두고 PC7와 PD0를 연결해보았는데 인터럽트가 발생되지 않았습니다.
//
PC7 = 0;으로 해두면 안되고 ('/'키가 아닌 '+'키로 인터럽트가 걸림)
PC0 = 0로 해야합니다.
//
키패드 회로를 보면 NOT GATE가 A12~A15에 연결되어 있고 PC4~PC7입니다.
PC0~PC3은 출력이고, PC4~PC7은 입력이죠
DDRC=0x0f;
포트 출력 설정은 제대로 했는데
keyScan() 함수를 보면 입력과 출력을 바꿔서 하는 것으로 보입니다.
포트입출력을 반대로 생각하고 있기 때문에 전체적으로 꼬이고 있는 것 아닌가 싶기도 하고요
//
INT0~INT7모두 다른 곳에 연결이 되어 있는 상태이고 <--- 회로 상태에 따라서 임의로 연결하면 고장 날 수도 있습니다.
//
#include
#define F_CPU 14745600UL
#include
#include
//
void Num_divide(unsigned char* divide_num,int num){
int buffer=0;
divide_num[3]=num /1000; buffer=num %1000;
divide_num[2]=buffer/100; buffer=buffer%100;
divide_num[1]=buffer/10;
divide_num[0]=buffer%10;
}
//
unsigned char keyScan(void){
unsigned char i=0,getPinData=0,key_num=0;
//
for(i=0;i<4;i++){
PORTC&=~(1<
getPinData=PINC&0xF0;
if(getPinData){
switch(getPinData){
case 0x10: key_num=i*4+1; break;
case 0x20: key_num=i*4+2; break;
case 0x40: key_num=i*4+3; break;
case 0x80: key_num=i*4+4; break;
}
return key_num;
}
}
return key_num;
}
//
volatile unsigned char SEG[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90,0x88,0x83,0xc4,0xa1,0x84,0x8e};
volatile unsigned char DGT[]={0x1f,0x2f,0x4f,0x8f};
volatile unsigned char Count=0,sec=0;
volatile int c[16]={10,10,0,10,10,1,2,3,10,4,5,6,10,7,8,9};
//
int KEYIN(void){
int num,Keynum;
Keynum=keyScan();
if(Keynum>15)num=10; else num=c[Keynum];
return num;
}
//
ISR(INT0_vect){
unsigned char FND_Print[4]={0,};
int i=0;
//Num_divide(FND_Print,(int)sec);
//if(keyScan()==16){ // ??
while(1){
FND_Print[i]=KEYIN(); if(++i>3)i=0;
PORTE=DGT[0]; PORTB=SEG[FND_Print[0]]; _delay_ms(1);
PORTE=DGT[1]; PORTB=SEG[FND_Print[1]]; _delay_ms(1);
PORTE=DGT[2]; PORTB=SEG[FND_Print[2]]; _delay_ms(1);
PORTE=DGT[3]; PORTB=SEG[FND_Print[3]]; _delay_ms(1);
PORTC&=~1; _delay_us(1); if(PIND&1)break;
}
//}
}
//
ISR(INT1_vect){ TCCR0=7; }
//
ISR(TIMER0_OVF_vect){
TCNT0=112;
if(++Count==100){ Count=0; sec++; }
}
//
int main(void){
DDRB=0xff; DDRE=0xf0; PORTC=0x0E; DDRC=0x0f;
//TCCR0=7;
TCNT0=112; TIMSK=0x01; // 14745600Hz/1024/(256-112)=100Hz,10ms
EICRA=0xF; EIMSK=0x03; // INT0,INT1 상승엣지 트리거 모드
sei();
while(1){
PORTE=DGT[0]; PORTB=0xbf; _delay_ms(1);
PORTE=DGT[1]; PORTB=0xbf; _delay_ms(1);
PORTE=DGT[2]; PORTB=0xbf; _delay_ms(1);
PORTE=DGT[3]; PORTB=0xbf; _delay_ms(1);
}
}
뭘 하려고 작성한 코드인지 알 수 없는 부분이 많아서 전부 체크하지는 못합니다.
댓글 1
조회수 1,451마프하나님의 댓글
마프하나 작성일조언 해주셔서 감사합니다. 알려주신것을 다시 살펴보고 좀더 고민해보겠습니다.