اطلاعیه

Collapse
No announcement yet.

دریافت کاراکتر از وقفه SPi

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

    دریافت کاراکتر از وقفه SPi

    سلام
    من یک برنامه نوشتم کمی ایراد داره
    لطفا یکی کمک کنه
    .
    مبکروی مگا هشت کیبرو رو میخونه و با توجه به کلیدی که زده شده یک کد از طریق اس پی آی به میکرو ی مگا 32 ارسال میکنه
    میکرو ی مگا 32 هم با توجه به کد دریافت شده و اینکه بیت shift یک باشه یا نه کاراکتر معادل کلید رو درون آرایه ی l1lcd[] قرار میده
    اینکه تو کدوم خونه اش قرار بگیره رو pos1 مشخص میکنه که با هر بار زدن کلید و اجرای روتین یک واحد اضافه میشه تا اگه کلید بعدی زده شد بره تو خونه ی بعدی
    مشکل الان دقیقا اینه که با هر بار زدن کلید کاراکتر زده شده بی نهایت بار میره خونه های آرایه ریخته میشه
    من چه کار کنم که فقط با یک بار زدن کلید فقز یک بار انجام بشه ؟
    ممنون !
    این هم بخش از کل برنامه : در سمت مگا 32
    .
    .
    [code=cpp]
    #include <mega32.h>
    #include <delay.h>
    #include <string.h>
    #include <stdio.h>
    #include <lcd.h>
    #include <string.h>
    #asm
    .equ __lcd_port = 0x1b ;
    #endasm


    bit control_key = 0 , print_key = 0 , other_key = 0 ;
    bit enter = 0 , delete = 0 , bspace = 0 ;
    bit shift = 0 , normal = 1 ;

    char l1lcd[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
    char l1clr[17] = { 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
    char nt[] , st[] , n ;
    unsigned char pressed_key ;



    interrupt [SPI_STC] void spi_stc_isr(void)
    {
    pressed_key = SPDR ;
    switch(pressed_key)
    {
    case 0x71 : print_key = 1 ; n = 15 ; nt[n] = 'q' ; st[n] = 'Q' ; break ; // q
    case 0x77 : print_key = 1 ; n = 16 ; nt[n] = 'w' ; st[n] = 'W' ; break ; // w
    case 0x65 : print_key = 1 ; n = 17 ; nt[n] = 'e' ; st[n] = 'E' ; break ; // e
    case 0x72 : print_key = 1 ; n = 18 ; nt[n] = 'r' ; st[n] = 'R' ; break ; // r
    case 0x74 : print_key = 1 ; n = 19 ; nt[n] = 't' ; st[n] = 'T' ; break ; // t
    case 0x79 : print_key = 1 ; n = 20 ; nt[n] = 'y' ; st[n] = 'Y' ; break ; // y
    case 0x75 : print_key = 1 ; n = 21 ; nt[n] = 'u' ; st[n] = 'U' ; break ; // u
    case 0x69 : print_key = 1 ; n = 22 ; nt[n] = 'i' ; st[n] = 'I' ; break ; // i
    case 0x6f : print_key = 1 ; n = 23 ; nt[n] = 'o' ; st[n] = 'O' ; break ; // o
    case 0x70 : print_key = 1 ; n = 24 ; nt[n] = 'p' ; st[n] = 'P' ; break ; // p
    case 0x5b : print_key = 1 ; n = 25 ; nt[n] = '[' ; st[n] = '{' ; break ; // [
    case 0x5d : print_key = 1 ; n = 26 ; nt[n] = ']' ; st[n] = '}' ; break ; // ]
    }
    if(print_key==1 && shift==0 && pos1<15)
    {
    l1lcd[pos1] = nt[n] ;
    pos1++ ;
    }
    else if(print_key==1 && shift==1 && pos1<15)
    {
    l1lcd[pos1] = st[n] ;
    pos1++ ;
    }
    }
    [/code]

    #2
    پاسخ : دریافت کاراکتر از وقفه SPi

    []st و []nt آرایه های تهی هستن. باید اندازه ای غیر از صفر داشته باشن.
    در این حالت استفاده از آفست باعث میشه به حافظه ی خارج از حریم آرایه وارد بشه و همینطور پیش میره
    If the wind will not serve, take to the oars

    دیدگاه


      #3
      پاسخ : دریافت کاراکتر از وقفه SPi

      ممنون
      ولی مشکل از اونها نیست چون توی اون ها یک کاراکتر ریختم
      و البته عدد یک هم الان داخل ش گذاشتم
      مشکل اینه که :
      باید با هر بار زدن کلید ( یعنی رسیدن کد به spi میکروی 32 ) وقفه ش فعال بشه
      یک بار عمل داخل روتین رو انجام بده و بعد تمام !!
      اما این عمل بار ها ادامه پیدا میکنه !
      اگر کدی که داخل روتین نوشتم منطقا باید همین کار رو بکنه ، پس احتمالا ایراد باید از سمت میکروی 8 باشه که دایما ارسال میکنه ؟؟؟
      اگه اینطور باشه باید پس از ارسال یک کد پس از زدن کلید ، ارسال تمام بشه !!

      دیدگاه


        #4
        پاسخ : دریافت کاراکتر از وقفه SPi

        آقا خیلی ممنون از پاسخی که دادی
        در حین نوشتن متن بالا برای پاسخ شما به ذهنم رسید مشکل از سمت مگا هشته
        کد هاش رو اصلاح کردم مشکل حل شد
        در سمت مگا هشت دایما ارسال میکرد که گذاشتم ش در روتیم وقفه ارسال شه
        حل شد !

        اما یک ایراد داره :
        کنده ! گاهی نمیزنه گاهی دوتا میزنه !

        دیدگاه

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