سلام..
در اموزش های اقای کی نژاد یکسری سورس های اماده کدویژن هست و بنده برای برنامه ای از این سورس ها استفاده کردم(AVR_Counter0) .البته با تغییر و پروژه کار نمیکرد..خیلی دنبال ایراد کار گشتم تا تصمیم گرفتم خود سورس اصلی رو پروگرم کنم اما باز هم کار نمیکرد..حدود 4 ساعت کد ها رو عوض کردم و تغییر دادم حتی میکرو و سگمنت ها رو عوض کردم اما هیچ عکس العملی از میکرو دیده نمیشد..
اخرش فهمیدم حذف کردن دستور اسمبلی
در داخل وقفه تایمر 0 باعث شد برنامه بدرستی کار کنه..
حالا هم میخواستم ببینم من چه تنظیمی رو برای میکرو انجام ندادم؟
و اینکه بکار بردن وقفه های تو در تو چطوری هست و بکار بردن دستور بالا چطوری صحیح هست؟
درضمن من از میکرو mega16a استفاده کردم و فرکانس 8 ...
این کد برنامه اصلی هست:
در اموزش های اقای کی نژاد یکسری سورس های اماده کدویژن هست و بنده برای برنامه ای از این سورس ها استفاده کردم(AVR_Counter0) .البته با تغییر و پروژه کار نمیکرد..خیلی دنبال ایراد کار گشتم تا تصمیم گرفتم خود سورس اصلی رو پروگرم کنم اما باز هم کار نمیکرد..حدود 4 ساعت کد ها رو عوض کردم و تغییر دادم حتی میکرو و سگمنت ها رو عوض کردم اما هیچ عکس العملی از میکرو دیده نمیشد..
اخرش فهمیدم حذف کردن دستور اسمبلی
کد:
#asm ("sei");
حالا هم میخواستم ببینم من چه تنظیمی رو برای میکرو انجام ندادم؟
و اینکه بکار بردن وقفه های تو در تو چطوری هست و بکار بردن دستور بالا چطوری صحیح هست؟
درضمن من از میکرو mega16a استفاده کردم و فرکانس 8 ...
این کد برنامه اصلی هست:
کد:
#include <mega32.h> #include <delay.h> #define nokey_code 12 // 7 segment codes flash unsigned char display_codes[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; //keyboard codes flash unsigned char keyboard_codes[]={0x76,0x6E,0x5E,0x3E,0x75,0x6D,0x5D,0x3D,0x73,0x6B,0x5B,0x3B}; volatile unsigned char digits[]={0,0,0,0,0,0},leds=0; // initial values for display ( ------ ) volatile unsigned char key_code=nokey_code; volatile unsigned long counter=0; void main() { unsigned char i; unsigned long counter_copy; DDRC=(1<<DDC7)|(1<<DDC6)|(1<<DDC5)|(1<<DDC4)|(1<<DDC3)|(1<<DDC2)|(1<<DDC1)|(1<<DDC0); PORTA=(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4)|(1<<PORTA3)|(1<<PORTA2)|(1<<PORTA1)|(1<<PORTA0); DDRA=(1<<DDA6)|(1<<DDA5)|(1<<DDA4)|(1<<DDA3)|(1<<DDA2)|(1<<DDA1)|(1<<DDA0); //initialize external interrupt PORTD=(1<<PORTD2); MCUCR=(1<<ISC01); GICR=(1<<INT0); //initialize timer OCR0=124; TCCR0=(1<<WGM01)|(1<< CS01)|(1<<CS00); TIMSK=(1<<OCIE0); #asm("sei"); while(1) { if (key_code!=nokey_code) { leds=1; // Turn on LED if any key pressed counter=0; // Reset counter } else leds=0; counter_copy=counter; for (i=0;i<6;i++) { digits[i]=counter_copy%10; counter_copy/=10; } } } //------------------------------------------------------------------------------------------------------------------ interrupt [EXT_INT0] void external_INT0_isr(void) { if(++counter==1000000)counter=0; } //------------------------------------------------------------------------------------------------------------------ interrupt [TIM0_COMP] void timer0_compare_isr(void) { static unsigned char select=0; static unsigned char x20=0; unsigned char temp , i; #asm("sei"); // Turn off all 7segments and LEDs PORTA|=(1<<PORTA6)|(1<<PORTA5)|(1<<PORTA4)|(1<<PORTA3)|(1<<PORTA2)|(1<<PORTA1)|(1<<PORTA0); if (select)PORTC =display_codes[digits[select-1]]; else PORTC=leds; PORTA &=~(1<<select); if(++select==7)select=0; if (++x20==20) { x20=0; DDRB=(1<<DDB2)|(1<<DDB1)|(1<<DDB0); PORTB=(1<<PORTB6)|(1<<PORTB5)|(1<<PORTB4)|(1<<PORTB3); delay_us(5); // delay for signal stablization temp=(PINB & 0X78); DDRB=(1<<DDB6)|(1<<DDB5)|(1<<DDB4)|(1<<DDB3); PORTB=(1<<PORTB2)|(1<<PORTB1)|(1<<PORTB0); delay_us(5); // delay for signal stablization temp |=(PINB & 0X07); for(i=0;i<12;i++) { if(temp==keyboard_codes[i]) { key_code=i; break; } else key_code=nokey_code; } } }