ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 4 از 4
  1. #1
    2015/09/06
    67
    10

    دریافت کاراکتر از وقفه 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. #2
    2015/01/24
    Telegram: @Ashit_Axar
    395
    296

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

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

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

    ممنون
    ولی مشکل از اونها نیست چون توی اون ها یک کاراکتر ریختم
    و البته عدد یک هم الان داخل ش گذاشتم
    مشکل اینه که :
    باید با هر بار زدن کلید ( یعنی رسیدن کد به spi میکروی 32 ) وقفه ش فعال بشه
    یک بار عمل داخل روتین رو انجام بده و بعد تمام !!
    اما این عمل بار ها ادامه پیدا میکنه !
    اگر کدی که داخل روتین نوشتم منطقا باید همین کار رو بکنه ، پس احتمالا ایراد باید از سمت میکروی 8 باشه که دایما ارسال میکنه ؟؟؟
    اگه اینطور باشه باید پس از ارسال یک کد پس از زدن کلید ، ارسال تمام بشه !!
  4. #4
    2015/09/06
    67
    10

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

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

    اما یک ایراد داره :
    کنده ! گاهی نمیزنه گاهی دوتا میزنه !
نمایش نتایج: از 1 به 4 از 4

موضوعات مشابه

  1. وقفه دریافت سریال
    توسط masror_d در انجمن میکروکنترلرهای AVR
    پاسخ: 11
    آخرين نوشته: 2016/08/12, 20:57
  2. دریافت کاراکتر از وقفه usart و ارسال ش با وقفه spi
    توسط davoud.arabee در انجمن برنامه نويسي و اينترفيس
    پاسخ: 5
    آخرين نوشته: 2016/04/01, 21:42
  3. دریافت کاراکتر از کیبرد و تبدیل به رشته
    توسط davoud.arabee در انجمن برنامه نويسي و اينترفيس
    پاسخ: 4
    آخرين نوشته: 2016/02/06, 12:02
  4. چطور چند کاراکتر از وقفه uart دریافت کنم ؟
    توسط mehrdad3264 در انجمن میکروکنترلرهای AVR
    پاسخ: 8
    آخرين نوشته: 2014/09/05, 22:23
  5. پاسخ: 4
    آخرين نوشته: 2010/08/13, 10:55

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •