اطلاعیه

Collapse
No announcement yet.

متوقف شدن کیپد بع از انجام کار

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    متوقف شدن کیپد بع از انجام کار


    سلام وقتتون بخیر
    من یه کد نوشتم که یک عدد از کیپد گرفته و با استفاده از اون تایمر شروع به کار میکنه و بازر شروع به کار میکنه و با استفاده از یک وقفه خارجی میشه اونو غیر فعال کرد اما وقته میخوام دوباره اونو راه اندازی کنم کیپد به هم میریزه و قفل میشه نمیدونم چرا اینم کد من هستش
    ممنون میشم کمکم کنید
    include <mega16.h>
    include <delay.h>
    // Alphanumeric LCD functions
    include <alcd.h>
    include <stdio.h>
    // Declare your global variables here
    int Start=0;
    //..keypad
    char Buffer[],Number;
    int Counter;
    char radif=0 ,soton=4,jaygah=0;
    char shift[4]= {0xFE,0xFD,0xFB, 0xF7};
    char leyoutkeypad[16]={'7','8','9','/',
    '4','5','6','*',
    '1','2','3','-',
    'C','0','=','+'};
    //..

    //..Timer
    int Msec,Sec,Min,TurnON=5;
    int Alarm=0;
    //..

    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    PORTD.7=0;
    TurnON=5;
    Alarm=0;
    lcd_clear();
    Counter=0;

    Start=0;
    }

    // Timer1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    if(TurnON==0)
    {
    sprintf(Buffer,"Time=%02d:%02d",Min,Sec);
    lcd_gotoxy(0,1);
    lcd_puts(Buffer);
    Msec++;

    if(Msec==100)
    {
    Sec++;
    Msec=0;
    }
    if(Sec==60)
    {
    Min++;
    Sec=0;
    }
    if(Min==Counter)
    {
    Alarm=1;
    lcd_clear();
    if(Alarm==1)
    {
    PORTD.7=1;
    lcd_gotoxy(3,0);
    lcd_puts("Times UP!!");
    delay_ms(500);
    lcd_clear();
    delay_ms(500);
    }
    }
    }

    }

    void main(void)
    {
    DDRA=0x0F;
    PORTA=0xF0;

    DDRD.0=0;
    PORTD.0=1;

    DDRD.2=0;//(Stop Buttom)
    PORTD.2=1;

    DDRD.7=1;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Disconnected
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer Period: 10 ms
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x27;
    OCR1AL=0x0F;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    // INT2: Off
    GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
    MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
    MCUCSR=(0<<ISC2);
    GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);

    lcd_init(16);

    // Global enable interrupts

    #asm("sei")
    while (1)
    {

    if(PIND.0==0)
    {
    lcd_gotoxy(0,0);
    lcd_puts("Counter:");
    Start=1;
    }
    if(Start==1)
    {
    for(radif=0 ; radif<=3 ; radif++)
    {
    PORTA = shift[radif];
    if(PINA.4==0){soton=0;}
    if(PINA.5==0){soton=1;}
    if(PINA.6==0){soton=2;}
    if(PINA.7==0){soton=3;}
    if(soton != 4)
    {
    jaygah=radif * 4 +soton;
    Number=leyoutkeypad[jaygah];
    soton= 4;

    while(PINA.4==0){}
    while(PINA.5==0){}
    while(PINA.6==0){}
    while(PINA.7==0){}

    if(Number=='1')
    {
    Counter=1;
    lcd_putchar(Number);
    }
    if(Number=='2')
    {
    Counter=2;
    lcd_putchar(Number);
    }
    if(Number=='3')
    {
    Counter=3;
    lcd_putchar(Number);
    }
    if(Number=='4')
    {
    Counter=4;
    lcd_putchar(Number);
    }
    if(Number=='5')
    {
    Counter=5;
    lcd_putchar(Number);
    }
    if(Number=='6')
    {
    Counter=6;
    lcd_putchar(Number);
    }
    if(Number=='7')
    {
    Counter=7;
    lcd_putchar(Number);
    }
    if(Number=='8')
    {
    Counter=8;
    lcd_putchar(Number);
    }
    if(Number=='9')
    {
    Counter=9;
    lcd_putchar(Number);
    }
    if(Number=='C')
    {
    TurnON=0;
    Start=0;
    }
    }
    delay_ms(50);
    }
    }

    }
    }


    [/CODE][/CODE]


    #2
    نوشته اصلی توسط Ezaxx نمایش پست ها
    سلام وقتتون بخیر
    من یه کد نوشتم که یک عدد از کیپد گرفته و با استفاده از اون تایمر شروع به کار میکنه و بازر شروع به کار میکنه و با استفاده از یک وقفه خارجی میشه اونو غیر فعال کرد اما وقته میخوام دوباره اونو راه اندازی کنم کیپد به هم میریزه و قفل میشه نمیدونم چرا اینم کد من هستش
    ممنون میشم کمکم کنید
    include <mega16.h>
    include <delay.h>
    // Alphanumeric LCD functions
    include <alcd.h>
    include <stdio.h>
    // Declare your global variables here
    int Start=0;
    //..keypad
    char Buffer[],Number;
    int Counter;
    char radif=0 ,soton=4,jaygah=0;
    char shift[4]= {0xFE,0xFD,0xFB, 0xF7};
    char leyoutkeypad[16]={'7','8','9','/',
    '4','5','6','*',
    '1','2','3','-',
    'C','0','=','+'};
    //..

    //..Timer
    int Msec,Sec,Min,TurnON=5;
    int Alarm=0;
    //..

    // External Interrupt 0 service routine
    interrupt [EXT_INT0] void ext_int0_isr(void)
    {
    PORTD.7=0;
    TurnON=5;
    Alarm=0;
    lcd_clear();
    Counter=0;

    Start=0;
    }

    // Timer1 output compare A interrupt service routine
    interrupt [TIM1_COMPA] void timer1_compa_isr(void)
    {
    if(TurnON==0)
    {
    sprintf(Buffer,"Time=%02d:%02d",Min,Sec);
    lcd_gotoxy(0,1);
    lcd_puts(Buffer);
    Msec++;

    if(Msec==100)
    {
    Sec++;
    Msec=0;
    }
    if(Sec==60)
    {
    Min++;
    Sec=0;
    }
    if(Min==Counter)
    {
    Alarm=1;
    lcd_clear();
    if(Alarm==1)
    {
    PORTD.7=1;
    lcd_gotoxy(3,0);
    lcd_puts("Times UP!!");
    delay_ms(500);
    lcd_clear();
    delay_ms(500);
    }
    }
    }

    }

    void main(void)
    {
    DDRA=0x0F;
    PORTA=0xF0;

    DDRD.0=0;
    PORTD.0=1;

    DDRD.2=0;//(Stop Buttom)
    PORTD.2=1;

    DDRD.7=1;

    // Timer/Counter 1 initialization
    // Clock source: System Clock
    // Clock value: 1000.000 kHz
    // Mode: CTC top=OCR1A
    // OC1A output: Disconnected
    // OC1B output: Disconnected
    // Noise Canceler: Off
    // Input Capture on Falling Edge
    // Timer Period: 10 ms
    // Timer1 Overflow Interrupt: Off
    // Input Capture Interrupt: Off
    // Compare A Match Interrupt: On
    // Compare B Match Interrupt: Off
    TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
    TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
    TCNT1H=0x00;
    TCNT1L=0x00;
    ICR1H=0x00;
    ICR1L=0x00;
    OCR1AH=0x27;
    OCR1AL=0x0F;
    OCR1BH=0x00;
    OCR1BL=0x00;

    // Timer(s)/Counter(s) Interrupt(s) initialization
    TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

    // External Interrupt(s) initialization
    // INT0: On
    // INT0 Mode: Falling Edge
    // INT1: Off
    // INT2: Off
    GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
    MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
    MCUCSR=(0<<ISC2);
    GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);

    lcd_init(16);

    // Global enable interrupts

    #asm("sei")
    while (1)
    {

    if(PIND.0==0)
    {
    lcd_gotoxy(0,0);
    lcd_puts("Counter:");
    Start=1;
    }
    if(Start==1)
    {
    for(radif=0 ; radif<=3 ; radif++)
    {
    PORTA = shift[radif];
    if(PINA.4==0){soton=0;}
    if(PINA.5==0){soton=1;}
    if(PINA.6==0){soton=2;}
    if(PINA.7==0){soton=3;}
    if(soton != 4)
    {
    jaygah=radif * 4 +soton;
    Number=leyoutkeypad[jaygah];
    soton= 4;

    while(PINA.4==0){}
    while(PINA.5==0){}
    while(PINA.6==0){}
    while(PINA.7==0){}

    if(Number=='1')
    {
    Counter=1;
    lcd_putchar(Number);
    }
    if(Number=='2')
    {
    Counter=2;
    lcd_putchar(Number);
    }
    if(Number=='3')
    {
    Counter=3;
    lcd_putchar(Number);
    }
    if(Number=='4')
    {
    Counter=4;
    lcd_putchar(Number);
    }
    if(Number=='5')
    {
    Counter=5;
    lcd_putchar(Number);
    }
    if(Number=='6')
    {
    Counter=6;
    lcd_putchar(Number);
    }
    if(Number=='7')
    {
    Counter=7;
    lcd_putchar(Number);
    }
    if(Number=='8')
    {
    Counter=8;
    lcd_putchar(Number);
    }
    if(Number=='9')
    {
    Counter=9;
    lcd_putchar(Number);
    }
    if(Number=='C')
    {
    TurnON=0;
    Start=0;
    }
    }
    delay_ms(50);
    }
    }

    }
    }


    [/CODE][/CODE]

    با سلام و درود،
    در مورد مشکل پیش اومده بیشتر توضیح بدید ، یعنی اگر یکبار از کیپد استفاده کنید ، دیگه کار نمیکنه؟
    چیزی که به نظر میرسه این هست که با استفاده از کیپد، یکی از متغییر های شما یک مقداری به خودش میگیره که بعد انجام کار ریست نمیشه ( به مقدار پیشفرض خودش بر نمیگرده )

    ​​​​
    ​​​​​

    دیدگاه


      #3
      نوشته اصلی توسط HS1386 نمایش پست ها

      با سلام و درود،
      در مورد مشکل پیش اومده بیشتر توضیح بدید ، یعنی اگر یکبار از کیپد استفاده کنید ، دیگه کار نمیکنه؟
      چیزی که به نظر میرسه این هست که با استفاده از کیپد، یکی از متغییر های شما یک مقداری به خودش میگیره که بعد انجام کار ریست نمیشه ( به مقدار پیشفرض خودش بر نمیگرده )

      ​​​​
      ​​​​​
      بله دقیقا این طوره کیپد به حالت اولیه خودش دیگ برنمیکنه و و رفرشینک پایه ها انجام دیگ نمیشه
      من مجبورم شدم یه وقفه ی خارجی ایجاد کنم و ریجستر ها رو تنها بزارم و قسمت تابعش رو حذف کنم که با زدن کلید وقفه برنامه ریست بشه و دوباره از قسمت تابع main دوباره شروع به راه اندازی بشه تا کیپد دوباره به حالت اولیه برگرده ولی خو این کار درستی نیست.
      ولی هیچ راه حلی دیگ ای به ذهنم نمیرسه
      هر کاری کردم تا کیپد بره به حالت اولیه خودش اصلا این اتفاق نمیافته.
      راه حلی برای این نداری؟؟

      دیدگاه


        #4
        الان با پایه PORTD.7 داری میکرو رو ریست سخت افزاری میکنی تا همه چی از اول شروع بشه؟؟
        اگه اینکارو میکنی دیگه نکن،این روش کاملا اشتباهه با اینکار تنظیمات حین برنامه بهم میریزه و اصلا پیشنهاد نمیشه.
        شما یه متغیر بذار و با مقدار دهی اون بعد از وارد شدن به interrupt یا int_timer تو حلقه اصلی تصمیم بگیر چکار میخوای بکنی.
        نکته بعدی اینه که وقتی شما وارد اینتراپت تایمر میشی باید بعد از اجرای برنامه داخل تایمر اونو با نوشتن کد غیرفعال کنی در غیر اینصورت به محض وارد شدن به اینتراپت تایمر دیگه از چرخه خارج نمیشی و شرط کیبورد هنوز خوانده نشده یا نیمه کاره یا حین خوانده شدن رها شده و دوباره اینتراپت تایمر اجرا میشه و مجدد میاد ادامه دستورات کیبورد رو میخونه،این روند برای همیشه ادامه داره و نمیذاره دستورات کیبورد کامل بشه و اصلا شما نمیدونی که برنامه داره کدوم قسمت از کیبورد رو میخونه و اجرا میکنه(علت بهم ریختگی کیپد).
        برنامه که توضیح دادی خیلی سادست ولی شما خیلی پیچیده نوشتی و شرطهای زیادی گذاشتی که اصلا نیاز نیست،یه الگوریتم درست داشته باش و انقد داخل اینتراپت تایمر نمون،این سبک کدنویسی اصلا پیشنهاد نمیشه و یجورایی اشتباهه.
        اگه یه شماتیک میذاشتی خیلی بهتر میشد یا حداقل سخت افزار رو توصیف میکردی تا متوجه بشیم قضیه چیه.

        دیدگاه


          #5
          این عکس مال شبیه سازی منه PORTD.7 مال فعال شدن بازر هستش
          بعد اینکه من داخل کد هر کاری میکنم که برگرده به حالت اولیه خودش برنمیگرده
          وقفه ی عمومی رو غیر فعال میکنم باز هم هیچ همون شکلیه.
          #include <mega16.h>
          include <delay.h>
          // Alphanumeric LCD functions
          #include <alcd.h>
          include <stdio.h>
          // Declare your global variables here
          int Start=0;
          //..keypad
          char Buffer[],Number;
          int Counter;
          char radif=0 ,soton=4,jaygah=0;
          char shift[4]= {0xFE,0xFD,0xFB, 0xF7};
          char leyoutkeypad[12]={'1','2','3',
          '4','5','6',
          '7','8','9',
          '*','0','#'};
          //..

          //..Timer
          int Msec,Sec,Min,TurnON=5;
          //..


          interrupt [EXT_INT0] void ext_int0_isr(void)
          {
          Number=18;
          PORTD.7=0;
          #asm("cli")
          }

          // Timer1 output compare A interrupt service routine
          interrupt [TIM1_COMPA] void timer1_compa_isr(void)
          {
          if(TurnON==0)
          {
          sprintf(Buffer,"Time=%02d:%02d",Min,Sec);
          lcd_gotoxy(0,1);
          lcd_puts(Buffer);
          Msec++;

          if(Msec==100)
          {
          Sec++;
          Msec=0;
          }
          if(Sec==60)
          {
          Min++;
          Sec=0;
          }
          if(Min==Counter)
          {
          lcd_clear();
          PORTD.7=1;
          TurnON=5;
          //if(Alarm==1)
          //{
          //lcd_gotoxy(3,0);
          //lcd_puts("Times UP!!");
          //delay_ms(500);
          //lcd_clear();
          //delay_ms(500);
          //Msec=0;
          //}
          }
          }

          }

          void main(void)
          {
          DDRA=0x0F;
          PORTA=0xF0;

          DDRD.0=0;
          PORTD.0=1;

          DDRD.2=0;//(Stop Buttom)
          PORTD.2=1;

          DDRD.7=1;
          // Timer/Counter 1 initialization
          // Clock source: System Clock
          // Clock value: 1000.000 kHz
          // Mode: CTC top=OCR1A
          // OC1A output: Disconnected
          // OC1B output: Disconnected
          // Noise Canceler: Off
          // Input Capture on Falling Edge
          // Timer Period: 10 ms
          // Timer1 Overflow Interrupt: Off
          // Input Capture Interrupt: Off
          // Compare A Match Interrupt: On
          // Compare B Match Interrupt: Off
          TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
          TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (1<<WGM12) | (0<<CS12) | (1<<CS11) | (0<<CS10);
          TCNT1H=0x00;
          TCNT1L=0x00;
          ICR1H=0x00;
          ICR1L=0x00;
          OCR1AH=0x27;
          OCR1AL=0x0F;
          OCR1BH=0x00;
          OCR1BL=0x00;

          // Timer(s)/Counter(s) Interrupt(s) initialization
          TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (1<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

          // External Interrupt(s) initialization
          // INT0: On
          // INT0 Mode: Falling Edge
          // INT1: Off
          // INT2: Off
          GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
          MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
          MCUCSR=(0<<ISC2);
          GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);

          lcd_init(16);

          // Global enable interrupts

          while (1)
          {
          if(PIND.0==0)
          {
          lcd_clear();
          lcd_gotoxy(0,0);
          lcd_puts("Counter:");
          Start=1;
          }
          if(Start==1)
          {
          for(radif=0 ; radif<=3 ; radif++)
          {
          PORTA = shift[radif];
          if(PINA.4==0){soton=0;}
          if(PINA.5==0){soton=1;}
          if(PINA.6==0){soton=2;}
          if(PINA.7==0){soton=3;}
          if(soton != 4)
          {
          jaygah=radif * 3 +soton;//3= tedad soton hay keypad
          Number=leyoutkeypad[jaygah];
          soton= 4;

          while(PINA.4==0){}
          while(PINA.5==0){}
          while(PINA.6==0){}
          while(PINA.7==0){}

          if(Number=='1')
          {
          Counter=1;
          lcd_putchar(Number);
          }
          if(Number=='2')
          {
          Counter=2;
          lcd_putchar(Number);
          }
          if(Number=='3')
          {
          Counter=3;
          lcd_putchar(Number);
          }
          if(Number=='4')
          {
          Counter=4;
          lcd_putchar(Number);
          }
          if(Number=='5')
          {
          Counter=5;
          lcd_putchar(Number);
          }
          if(Number=='6')
          {
          Counter=6;
          lcd_putchar(Number);
          }
          if(Number=='7')
          {
          Counter=7;
          lcd_putchar(Number);
          }
          if(Number=='8')
          {
          Counter=8;
          lcd_putchar(Number);
          }
          if(Number=='9')
          {
          Counter=9;
          lcd_putchar(Number);
          }
          if(Number=='#')
          {
          TurnON=0;
          Start=0;
          #asm("sei")
          }
          }
          delay_ms(50);
          }
          }
          }

          }
          zz0.1c4d3muw2txzz

          دیدگاه


            #6
            نوشته اصلی توسط saeiddiod نمایش پست ها
            الان با پایه PORTD.7 داری میکرو رو ریست سخت افزاری میکنی تا همه چی از اول شروع بشه؟؟
            اگه اینکارو میکنی دیگه نکن،این روش کاملا اشتباهه با اینکار تنظیمات حین برنامه بهم میریزه و اصلا پیشنهاد نمیشه.
            شما یه متغیر بذار و با مقدار دهی اون بعد از وارد شدن به interrupt یا int_timer تو حلقه اصلی تصمیم بگیر چکار میخوای بکنی.
            نکته بعدی اینه که وقتی شما وارد اینتراپت تایمر میشی باید بعد از اجرای برنامه داخل تایمر اونو با نوشتن کد غیرفعال کنی در غیر اینصورت به محض وارد شدن به اینتراپت تایمر دیگه از چرخه خارج نمیشی و شرط کیبورد هنوز خوانده نشده یا نیمه کاره یا حین خوانده شدن رها شده و دوباره اینتراپت تایمر اجرا میشه و مجدد میاد ادامه دستورات کیبورد رو میخونه،این روند برای همیشه ادامه داره و نمیذاره دستورات کیبورد کامل بشه و اصلا شما نمیدونی که برنامه داره کدوم قسمت از کیبورد رو میخونه و اجرا میکنه(علت بهم ریختگی کیپد).
            برنامه که توضیح دادی خیلی سادست ولی شما خیلی پیچیده نوشتی و شرطهای زیادی گذاشتی که اصلا نیاز نیست،یه الگوریتم درست داشته باش و انقد داخل اینتراپت تایمر نمون،این سبک کدنویسی اصلا پیشنهاد نمیشه و یجورایی اشتباهه.
            اگه یه شماتیک میذاشتی خیلی بهتر میشد یا حداقل سخت افزار رو توصیف میکردی تا متوجه بشیم قضیه چیه.

            این مال شبیه سازی من هستش و پایین یه سری توضیح هم دادم ممنون میشم چکشون کنید

            دیدگاه


              #7
              نوشته اصلی توسط saeiddiod نمایش پست ها
              الان با پایه PORTD.7 داری میکرو رو ریست سخت افزاری میکنی تا همه چی از اول شروع بشه؟؟
              اگه اینکارو میکنی دیگه نکن،این روش کاملا اشتباهه با اینکار تنظیمات حین برنامه بهم میریزه و اصلا پیشنهاد نمیشه.
              شما یه متغیر بذار و با مقدار دهی اون بعد از وارد شدن به interrupt یا int_timer تو حلقه اصلی تصمیم بگیر چکار میخوای بکنی.
              نکته بعدی اینه که وقتی شما وارد اینتراپت تایمر میشی باید بعد از اجرای برنامه داخل تایمر اونو با نوشتن کد غیرفعال کنی در غیر اینصورت به محض وارد شدن به اینتراپت تایمر دیگه از چرخه خارج نمیشی و شرط کیبورد هنوز خوانده نشده یا نیمه کاره یا حین خوانده شدن رها شده و دوباره اینتراپت تایمر اجرا میشه و مجدد میاد ادامه دستورات کیبورد رو میخونه،این روند برای همیشه ادامه داره و نمیذاره دستورات کیبورد کامل بشه و اصلا شما نمیدونی که برنامه داره کدوم قسمت از کیبورد رو میخونه و اجرا میکنه(علت بهم ریختگی کیپد).
              برنامه که توضیح دادی خیلی سادست ولی شما خیلی پیچیده نوشتی و شرطهای زیادی گذاشتی که اصلا نیاز نیست،یه الگوریتم درست داشته باش و انقد داخل اینتراپت تایمر نمون،این سبک کدنویسی اصلا پیشنهاد نمیشه و یجورایی اشتباهه.
              اگه یه شماتیک میذاشتی خیلی بهتر میشد یا حداقل سخت افزار رو توصیف میکردی تا متوجه بشیم قضیه چیه.
              با کلید D.2 که مال وقفه خارجی هستش این کار رو انجام داده بودم
              رجیستر های وقفه رو ایجاد کردم در برنامه و صورت وقفه رو پاک کرده بودم که با استفاده از اون بتونم برنامه رو ریست کنم.

              دیدگاه


                #8
                نوشته اصلی توسط Ezaxx نمایش پست ها

                با کلید D.2 که مال وقفه خارجی هستش این کار رو انجام داده بودم
                رجیستر های وقفه رو ایجاد کردم در برنامه و صورت وقفه رو پاک کرده بودم که با استفاده از اون بتونم برنامه رو ریست کنم.
                تو حلقه اصلی انتهای برنامه موقعی که شرطهای کیپد داره خونده میشه وقفه اصلی هر بار داره فعال میشه.تو اینتراپت تایمر هم شما دوتا delay پونصد میلی ثانیه داری که میشه یک ثانیه،فکر کنم میکرو تو چرخه کاری از نظر زمانبندی فرصت خوندن کیپد رو نداره.
                تو اینتراپت صفر شما فقط مقدار متغیر کیپد رو ریست میکنید و بازر رو غیرفعال و اینتراپت سراسری رو هم غیر فعال میکنید که دوباره تو حلقه اصلی موقع خوندن دستورات کیپد اینتراپت سراسری فعال میشه.

                شما این روش رو انجام بده ببین نتیجه میگیری.
                ۱ : دستور فعال کردن اینتراپت سراسری تو قسمت انتهای شرطهای کیپد رو پاک کن.
                ۲ : تو اینتراپت صفر تایمر رو غیر فعال کن با این دستور TCCR1B=0.
                ببین میکرو کیپد رو میخونه یا نه.بیزحمت نتیجه رو اطلاع بده.

                دیدگاه


                  #9
                  ✅کد اصلاح شده و درست✅
                  include <mega16.h>
                  include <alcd.h>
                  include <stdio.h>
                  include <delay.h>
                  // Declare your global variables here

                  int Start=0;
                  //..keypad
                  char Buffer[16],Number;
                  int Counter;
                  char radif=0 ,soton=4,jaygah=0;
                  //..

                  //..Timer
                  int Msec,Sec,Min,TurnON=5;
                  int Alarm=0;
                  //..

                  // External Interrupt 0 service routine
                  interrupt [EXT_INT0] void ext_int0_isr(void)
                  {
                  TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
                  lcd_clear();
                  PORTD.7=0;
                  Msec=0;
                  Sec=0;
                  Min=0;
                  TurnON=5;
                  }

                  // Timer 0 output compare interrupt service routine
                  interrupt [TIM0_COMP] void timer0_comp_isr(void)
                  {

                  if(TurnON==0)
                  {
                  lcd_gotoxy(0,1);
                  sprintf(Buffer,"Time=%02d:%02d",Min,Sec);
                  lcd_puts(Buffer);

                  Msec++;
                  if(Msec==100)
                  {
                  Sec++;
                  Msec=0;
                  }
                  if(Sec==60)
                  {
                  Min++;
                  Sec=0;
                  }
                  if(Min==Counter)
                  {
                  Min=Counter;
                  Alarm=1;
                  lcd_clear();
                  PORTD.7=1;
                  if(Alarm==1)
                  {
                  lcd_gotoxy(3,0);
                  lcd_puts("Times UP!!");
                  delay_ms(500);
                  lcd_clear();
                  delay_ms(500);
                  }
                  Msec=0;
                  Sec=0;
                  }

                  }

                  }

                  void main(void)
                  {

                  DDRA=0x0F;
                  PORTA=0xF0;

                  DDRD.0=0;
                  PORTD.0=1;

                  DDRD.2=0;//(Stop Buttom)
                  PORTD.2=1;

                  DDRD.7=1;

                  // Timer/Counter 0 initialization
                  // Clock source: System Clock
                  // Clock value: 7.813 kHz
                  // Mode: CTC top=OCR0
                  // OC0 output: Disconnected
                  // Timer Period: 9.984 ms
                  //TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (0<<CS01) | (1<<CS00);
                  TCNT0=0x00;
                  OCR0=0x4D;

                  // Timer(s)/Counter(s) Interrupt(s) initialization
                  TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (1<<OCIE0) | (0<<TOIE0);

                  // External Interrupt(s) initialization
                  // INT0: On
                  // INT0 Mode: Falling Edge
                  // INT1: Off
                  // INT2: Off
                  GICR|=(0<<INT1) | (1<<INT0) | (0<<INT2);
                  MCUCR=(0<<ISC11) | (0<<ISC10) | (1<<ISC01) | (0<<ISC00);
                  MCUCSR=(0<<ISC2);
                  GIFR=(0<<INTF1) | (1<<INTF0) | (0<<INTF2);
                  lcd_init(16);
                  #asm("sei")

                  while (1)
                  {


                  if(PIND.0==0)
                  {
                  lcd_clear();
                  lcd_gotoxy(0,0);
                  lcd_puts("Counter:");
                  Start=1;
                  }
                  if(Start==1)
                  {
                  char shift[4]= {0xFE,0xFD,0xFB, 0xF7};
                  char leyoutkeypad[12]={'1','2','3',
                  '4','5','6',
                  '7','8','9',
                  '*','0','#'};
                  for(radif=0 ; radif<=3 ; radif++)
                  {
                  PORTA = shift[radif];
                  if(PINA.4==0){soton=0;}
                  if(PINA.5==0){soton=1;}
                  if(PINA.6==0){soton=2;}
                  if(PINA.7==0){soton=3;}
                  if(soton != 4)
                  {
                  jaygah=radif * 3 +soton;//3= tedad soton hay keypad
                  Number=leyoutkeypad[jaygah];
                  soton= 4;

                  while(PINA.4==0){}
                  while(PINA.5==0){}
                  while(PINA.6==0){}
                  while(PINA.7==0){}

                  if(Number=='1')
                  {
                  Counter=1;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='2')
                  {
                  Counter=2;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='3')
                  {
                  Counter=3;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='4')
                  {
                  Counter=4;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='5')
                  {
                  Counter=5;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='6')
                  {
                  Counter=6;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='7')
                  {
                  Counter=7;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='8')
                  {
                  Counter=8;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='9')
                  {
                  Counter=9;
                  lcd_gotoxy(8,0);
                  lcd_putchar(Number);
                  }
                  if(Number=='#')
                  {
                  TurnON=0;
                  Start=0;
                  TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (0<<CS01) | (1<<CS00);

                  }
                  }
                  delay_ms(50);
                  }
                  }

                  }
                  }​

                  دیدگاه


                    #10
                    نوشته اصلی توسط saeiddiod نمایش پست ها
                    تو حلقه اصلی انتهای برنامه موقعی که شرطهای کیپد داره خونده میشه وقفه اصلی هر بار داره فعال میشه.تو اینتراپت تایمر هم شما دوتا delay پونصد میلی ثانیه داری که میشه یک ثانیه،فکر کنم میکرو تو چرخه کاری از نظر زمانبندی فرصت خوندن کیپد رو نداره.
                    تو اینتراپت صفر شما فقط مقدار متغیر کیپد رو ریست میکنید و بازر رو غیرفعال و اینتراپت سراسری رو هم غیر فعال میکنید که دوباره تو حلقه اصلی موقع خوندن دستورات کیپد اینتراپت سراسری فعال میشه.

                    شما این روش رو انجام بده ببین نتیجه میگیری.
                    ۱ : دستور فعال کردن اینتراپت سراسری تو قسمت انتهای شرطهای کیپد رو پاک کن.
                    ۲ : تو اینتراپت صفر تایمر رو غیر فعال کن با این دستور TCCR1B=0.
                    ببین میکرو کیپد رو میخونه یا نه.بیزحمت نتیجه رو اطلاع بده.
                    کد رو روش وقت گذاشتم که ببینم مشکل چیه
                    فهمیدم که شما حتی اگر تایمر رو هم با استفاده از رجیستر ها هم غیر فعال کنی باز هم فعال درست کار نمیکنه دلیلش هم اینه که کیپد تنها یک بار توسط میکرو خوانده میشه و وقتی که کارش تموم میشه و میخواد دوباره راه اندازی بشه و اونو بخونه دیگ نمیتونه
                    پس برای همین باید کد ها مربوط به کیپد رو هم همون شیفت دادن و همچنین ارایه مربوط به اون رو داخل حلقه while قرار بدید تا وقتی کار تموم میشه و تو راه اندازی دوباره کیپد درست کار کنه

                    دیدگاه

                    لطفا صبر کنید...
                    X