سلام دوستان
برای یه مگا 8 برنامه نوشتم و پورت B رو به عنوان ورودی با سطح منطقی یک تعریف کردم، در حالت عادی برنامه درست عمل می کنه ولی وقتی تو همون برنامه میخوام از تایمر یک استفاده کنم دیگه پورت B به عنوان ورودی فعال نمی شه. البته تو شبیه سازی پروتئوس درست جواب میده ولی در عمل نه. علت چیه؟!!
اینم برنامه برای بررسی بیشتر:
برای یه مگا 8 برنامه نوشتم و پورت B رو به عنوان ورودی با سطح منطقی یک تعریف کردم، در حالت عادی برنامه درست عمل می کنه ولی وقتی تو همون برنامه میخوام از تایمر یک استفاده کنم دیگه پورت B به عنوان ورودی فعال نمی شه. البته تو شبیه سازی پروتئوس درست جواب میده ولی در عمل نه. علت چیه؟!!
اینم برنامه برای بررسی بیشتر:
کد:
#include<stdio.h> #include<delay.h> #include<mega8.h> void up(void) { PORTC.3=1; while((PINB&0x22)==0x00); PORTC.3=0; } void down(void) { PORTC.5=1; while((PINB&0x12)==0x00); PORTC.5=0; } // Timer 1 overflow interrupt service routine interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0xE0; TCNT1L=0xBF; PORTD.1^=1; PORTD.0=~PIND.1; } void main(void) { // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 15.625 kHz // Mode: Normal top=FFFFh // OC1A output: Discon. // OC1B output: Discon. // Noise Canceler: Off // Input Capture on Falling Edge // Timer 1 Overflow Interrupt: On // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x03; TCNT1H=0xE0; TCNT1L=0xBF; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Global enable interrupts #asm("sei") DDRB=0x00; PORTB=0xff; DDRC=0xff; PORTC=0x00; DDRD=0xFF; while (1) { // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x00; PORTD=0; //flasher off if((PINB&0x2E)==0x04) { delay_ms(100); if((PINB&0x2E)==0x04) { TIMSK=0x04; up(); } } else if((PINB&0x1E)==0x08) { delay_ms(100); if((PINB&0x1E)==0x08) { TIMSK=0x04; down(); } } }; }
دیدگاه