سلام..
در اموزش های اقای کی نژاد یکسری سورس های اماده کدویژن هست و بنده برای برنامه ای از این سورس ها استفاده کردم(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;
}
}
}

