BASIC4MCU | 질문게시판 | 답변 : av128 외부인터럽트 질문
페이지 정보
작성자 master 작성일2019-12-04 19:03 조회2,836회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=11035
본문
// MCU BASIC: https://www.basic4mcu.com// DateTime : 2019-12-04 오후 6:56:55// by Ok-Hyun Park//현재 아트메가128에 키패드,세그먼트,스위치연결되어있는데요키패드에서*을 누르면 소등되고 모든값이 초기화되도록 되어있습니다.근데#을 누르면 저장되어야하는데 숫자 0 이 계속뜨네요.//A[i]=0xff; //#이 눌러짐을 확인하기 위해 눌러지면 세그먼트 불 모두 소등 // 이부분 코딩값이 잘못된거 같은데 질문드립니다 ㅠㅠ....//또-----표시된곳 스위치 4개가 덧셈,뺄셈,최솟값표시,최대값 표시가 나오게해야하는데스위치 누르면 반응은하는데#자체가 안되니까 값이 이상하게나오네요 ㅠㅠㅠㅠㅠㅠㅠ저장함수와 스위치 코딩좀 봐주세요//#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>//unsigned char SEG[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83};unsigned char C[3]={0b00001011,0b00001110,0b00001111};unsigned char A[]={0xff,0xff,0xff,0xff};unsigned int RESULT[4]={0,0,0,0};unsigned int G[7]={ };unsigned char n;char num;int Gap[7]={ };int i,isr,a,p,y,t,u=0,s=0,loop;//----------------------------------------------------------------------------int StoreNumber(void){int v[4];for(int h=0; h<4; h++){RESULT[h]=A[h];for(int n=0; n<10; n++){if (RESULT[h]==SEG[n])v[h]=n;else if(RESULT[h]==0xff )v[h]=0;}y=(v[3]*1000)+(v[2]*100)+(v[1]*10)+(v[0]);}return y;}//----------------------------------------------------------------------------char Keypad(){char n=0xff;//PORTC=~4; _delay_ms(1);if ((PINF&0x10)==0){ n=SEG[1]; }else if((PINF&0x20)==0){ n=SEG[4]; }else if((PINF&0x40)==0){ n=SEG[7]; }else if((PINF&0x80)==0){ // '*'for(int i=0;i<4; i++)A[i]=0xff; // * 누르면 세그먼트값 모두 지우기}//PORTC=~1; _delay_ms(1);if ((PINF&0x10)==0){ n=SEG[2]; }else if((PINF&0x20)==0){ n=SEG[5]; }else if((PINF&0x40)==0){ n=SEG[8]; }else if((PINF&0x80)==0){ n=SEG[0]; }//PORTC=~2; _delay_ms(1);if ((PINF&0x10)==0){ n=SEG[3]; }else if((PINF&0x20)==0){ n=SEG[6]; }else if((PINF&0x40)==0){ n=SEG[9]; }else if((PINF&0x80)==0){ // '#'for(int i=0; i<4; i++)G[u++]=StoreNumber();A[i]=0xff; // # 눌러지면 세그먼트 불 모두 소등}//return n;}//void NumberInput(){char temp=0;num=Keypad(); // Keypad함수의 반환값인 SEG배열을 num에 대입if(num!=0xff){A[3]=A[2]; _delay_ms(1000);A[2]=A[1]; _delay_ms(1000);A[1]=A[0]; _delay_ms(1000);A[0]=num; _delay_ms(1000);}//a=0;for(int i=0; i<50; i++){PORTB=~(1<<temp); PORTA=A[a]; if(++a>3)a=0;if(++temp>7)temp=0;_delay_ms(2);}}//void ReadNum(){for(int g=0; g<u; g++)Gap[g]=G[g];}//void Unit(int sum){sum=isr%10000;A[3]=SEG[sum/1000]; //1000의 자리A[2]=SEG[sum/100%10]; //100의자리A[1]=SEG[sum/10 %10]; //10의자리A[0]=SEG[sum %10]; //1의자리}//----------------------------------------------------------------------------ISR(INT0_vect){}//ISR(INT4_vect){ //덧셈PORTB=~1;isr=0;for(int g=0; g<u; g++)isr+=G[g];Unit(0);}//ISR(INT5_vect){ //곱셈int sum=0,isr=1;PORTB=~2;for(int g=0; g<u; g++)isr*=G[g];sum=isr%10000;A[3]=SEG[sum/1000]; //1000의 자리A[2]=SEG[sum/100%10]; //100의자리A[1]=SEG[sum/10 %10]; //10의자리A[0]=SEG[sum %10]; //1의자리}//ISR(INT6_vect){PORTB=~4; //최소isr=G[0];for(int g=0; g<u; g++)if(G[g]<isr)isr=G[g];Unit(0);}//ISR(INT7_vect){PORTB=~8;isr=0;for(int g=0; g<u; g++){if(G[g]>isr)isr=G[g];}Unit(0);}//int main(){DDRA=0xff; DDRB=0xff; DDRC=0x0f;PORTE=0xf0; // PORTE의 4~7풀업PORTF=0xf0; // PORTF 0 풀업EIMSK=0xF1; EICRA=0xAA; EICRB=0xAA; // INT4~7,0 // INT0 하강에지SREG=0x80;while(1){NumberInput();}}
오류가 많아서 몇개만 체크 해드립니다.
//
PORTC=0b00001111; _delay_ms(1);위 아래가 1(비트0)과 4(비트2) 이므로 2(비트1) 일 것 같은데 0b00001111를 출력하고 있습니다.//
for(int i=0; i<4; i++)G[u++]=StoreNumber();A[i]=0xff; // # 눌러지면 세그먼트 불 모두 소등for()문을 마치면 i는 4가 됩니다.unsigned char A[]={0xff,0xff,0xff,0xff};A[] 배열은 4개로 선언되어서 A[0]~A[3]까지만 사용해야 합니다.
A[4]는 배열 범위를 벗어나므로
다음에 선언된 RESULT[] 배열을 침범하게 됩니다.
//
for(int g=0; g<u; g++)if(G[g]<isr)isr=G[g];
u=0 초기값 설정 후 u 값을 변경하지 않고 있으므로
g<u 조건을 만족하지 못해서 for()문은 실행되지 못합니다.
//
// INT4~7은 EICRB=0xAA;를 설정 해줘야합니다.
INT0 인터럽트 함수가 없으면 심각한 오동작을 일으킵니다.
//
여기까지만 하죠...
댓글 0
조회수 2,836등록된 댓글이 없습니다.