اطلاعیه

Collapse
No announcement yet.

دریافت رشته از وقفه یوزارت

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

    دریافت رشته از وقفه یوزارت

    سلام :applause:
    قبلا با همین عنوان سوالی نوشته بودم که مشکل هم حل شد
    اما این بار یک ایراد کوچولو دارم ولی دوباره با همین عنوان مطرح میکنم
    من کدی نوشتم که میکرو ی مگا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



    char l2lcd[17] ;
    unsigned char buffer ;
    int pos2 = 0 ;



    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    buffer = UDR ;
    if(pos2 < 16)
    {
    l2lcd[pos2] = buffer ;
    pos2++ ;
    }
    }
    [/code]

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


    1- شمارنده pos2 رو بعد از 16 بار دریافت صفر کن.
    2- دیتای UDR رو باید اول چک میکردی که درسته یا غلط .
    3- شما می تونی مقدار UDR رو داخل شرطت هم بخونی.
    4- کستینگ بین char و unsigned char : متغیرهای l2lcd و buffer رو یک شکل کن.
    براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

    دیدگاه


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

      ممنون
      ولی همیشه معلوم نیست 16 تا باشه ممکنه یکی باشه یا ده تا
      در مورد ، مورد دوم هم مشکلی نیست
      داخل شرط هم جواب نداد
      مورد چهارم هم همه رو گذاشتم u char
      ولی جواب نداد

      دیدگاه


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

        برنامه و شماتیک پروتئوست رو اگه به زبان سی نوشتی بذار تا بهتر بتونیم کمکت کنیم
        براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

        دیدگاه


          #5
          پاسخ : دریافت رشته از وقفه یوزارت

          هر وقت وقفه ای رخ میده وقفه سراسری بطور اتوماتیک غیر فعال میشه
          در انتهای دستورات داخل تابع وقفه USART باید وقفه سراسری رو دوباره فعال کنی
          [code=c]#asm("sei&quot[/code]

          دیدگاه


            #6
            پاسخ : دریافت رشته از وقفه یوزارت

            نوشته اصلی توسط nabi-j
            هر وقت وقفه ای رخ میده وقفه سراسری بطور اتوماتیک غیر فعال میشه
            در انتهای دستورات داخل تابع وقفه USART باید وقفه سراسری رو دوباره فعال کنی
            [code=c]#asm("sei&quot[/code]
            این چیه ؟
            براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

            دیدگاه


              #7
              پاسخ : دریافت رشته از وقفه یوزارت

              نوشته اصلی توسط m52r65
              این چیه ؟
              دستور فعال سازی وقفه سراسری

              دیدگاه


                #8
                پاسخ : دریافت رشته از وقفه یوزارت

                ممنونم از دوستان بابت پاسخ هاتون
                مشکل م تقریبااااااااااااااااا حل شد
                من در سمت ارسال همیشه 16 کاراکتر ارسال میکنم
                در سمت دریافت هم 16 تا ذریافت میکنم
                انتهای دریافت هم pos2=0 میشه
                این هم کد نهایی :

                روتین وقفه دریافت :
                [code=cpp]
                interrupt [USART_RXC] void usart_rx_isr(void)
                {
                buffer = UDR ;
                if(pos2 < 16)
                {
                l2lcd[pos2] = buffer ;
                pos2++ ;
                if(pos2 == 16) pos2 = 0 ;
                }
                }
                [/code]
                سمت ارسال :
                [code=cpp]
                if(enter == 1)
                {
                for(m=0 ; m<16 ; m++)
                {
                putchar(l1lcd[m]) ;
                delay_ms(1) ;
                }
                for(m=0 ; m<16 ; m++)
                {
                l1lcd[m] = 0x20 ;
                }
                pos1 = 0 ;
                enter = 0 ;
                }
                [/code]
                این هم از متغیر ها :
                [code=cpp]
                bit print_key = 0 , other_key = 0 ;
                bit enter=0 , delete=0 , bspace=0 , shift=0 ;
                char l1lcd[17] = {
                0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
                char l2lcd[17] = {
                0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20, 0x20,0x20,0x20,0x20,0x20,0x20 } ;
                char nt[1] , st[1] , n , m=0 ;
                unsigned char buffer , pressed_key ;
                int pos1=0 , pos2=0 ;
                [/code]
                این هم از روتین spi که l1lcd رو پر میکنه
                [code=cpp]

                interrupt [SPI_STC] void spi_stc_isr(void)
                {
                pressed_key = SPDR ;
                switch(pressed_key)
                {
                /// control keys
                case 0x0d : enter = 1 ; break ; // enter
                case 0x7f : delete = 1 ; break ; // delete
                case 0x08 : bspace = 1 ; break ; // bspace
                case 0x99 : shift = 0 ; PORTD.7 = 1 ; break ; // normal
                case 0x0f : shift = 1 ; PORTD.7 = 0 ; break ; // shift
                /// undefined keys
                case 0x90 : other_key = 1 ; break ; // others define 0x90 in mega8
                /// print keys
                case 0xf0 : print_key = 1 ; n = 49 ; nt[n] = '*' ; st[n] = '*' ; break ; // f0
                case 0xe0 : print_key = 1 ; n = 50 ; nt[n] = '?' ; st[n] = '?' ; break ; // e0
                case 0x60 : print_key = 1 ; n = 1 ; nt[n] = '`' ; st[n] = '~' ; break ; // `~
                case 0x31 : print_key = 1 ; n = 2 ; nt[n] = '1' ; st[n] = '!' ; break ; // 1!
                case 0x32 : print_key = 1 ; n = 3 ; nt[n] = '2' ; st[n] = '@' ; break ; // 2@
                case 0x33 : print_key = 1 ; n = 4 ; nt[n] = '3' ; st[n] = '#' ; break ; // 3#
                case 0x34 : print_key = 1 ; n = 5 ; nt[n] = '4' ; st[n] = '$' ; break ; // 4$
                case 0x35 : print_key = 1 ; n = 6 ; nt[n] = '5' ; st[n] = '%' ; break ; // 5%
                case 0x36 : print_key = 1 ; n = 7 ; nt[n] = '6' ; st[n] = '^' ; break ; // 6^
                case 0x37 : print_key = 1 ; n = 8 ; nt[n] = '7' ; st[n] = '&' ; break ; // 7&
                case 0x38 : print_key = 1 ; n = 9 ; nt[n] = '8' ; st[n] = '*' ; break ; // 8*
                case 0x39 : print_key = 1 ; n = 10 ; nt[n] = '9' ; st[n] = '(' ; break ; // 9(
                case 0x30 : print_key = 1 ; n = 11 ; nt[n] = '0' ; st[n] = &#039' ; break ; // 0)
                case 0x2d : print_key = 1 ; n = 12 ; nt[n] = '-' ; st[n] = '_' ; break ; // -_
                case 0x3d : print_key = 1 ; n = 13 ; nt[n] = '=' ; st[n] = '+' ; break ; // =+
                case 0x2f : print_key = 1 ; n = 14 ; nt[n] = '/' ; st[n] = '|' ; break ; // /|

                case 0x71 : print_key = 1 ; n = 15 ; nt[n] = 'q' ; st[n] = 'Q' ; break ; // qQ
                case 0x77 : print_key = 1 ; n = 16 ; nt[n] = 'w' ; st[n] = 'W' ; break ; // wW
                case 0x65 : print_key = 1 ; n = 17 ; nt[n] = 'e' ; st[n] = 'E' ; break ; // eE
                case 0x72 : print_key = 1 ; n = 18 ; nt[n] = 'r' ; st[n] = 'R' ; break ; // rR
                case 0x74 : print_key = 1 ; n = 19 ; nt[n] = 't' ; st[n] = 'T' ; break ; // tT
                case 0x79 : print_key = 1 ; n = 20 ; nt[n] = 'y' ; st[n] = 'Y' ; break ; // yY
                case 0x75 : print_key = 1 ; n = 21 ; nt[n] = 'u' ; st[n] = 'U' ; break ; // uU
                case 0x69 : print_key = 1 ; n = 22 ; nt[n] = 'i' ; st[n] = 'I' ; break ; // iI
                case 0x6f : print_key = 1 ; n = 23 ; nt[n] = 'o' ; st[n] = 'O' ; break ; // oO
                case 0x70 : print_key = 1 ; n = 24 ; nt[n] = 'p' ; st[n] = 'P' ; break ; // pP
                case 0x5b : print_key = 1 ; n = 25 ; nt[n] = '[' ; st[n] = '{' ; break ; // [[
                case 0x5d : print_key = 1 ; n = 26 ; nt[n] = ']' ; st[n] = '}' ; break ; // ]]

                case 0x61 : print_key = 1 ; n = 27 ; nt[n] = 'a' ; st[n] = 'A' ; break ; // aA
                case 0x73 : print_key = 1 ; n = 28 ; nt[n] = 's' ; st[n] = 'S' ; break ; // sS
                case 0x64 : print_key = 1 ; n = 29 ; nt[n] = 'd' ; st[n] = 'D' ; break ; // dD
                case 0x66 : print_key = 1 ; n = 30 ; nt[n] = 'f' ; st[n] = 'F' ; break ; // fF
                case 0x67 : print_key = 1 ; n = 31 ; nt[n] = 'g' ; st[n] = 'G' ; break ; // gG
                case 0x68 : print_key = 1 ; n = 32 ; nt[n] = 'h' ; st[n] = 'H' ; break ; // hH
                case 0x6a : print_key = 1 ; n = 33 ; nt[n] = 'j' ; st[n] = 'J' ; break ; // jJ
                case 0x6b : print_key = 1 ; n = 34 ; nt[n] = 'k' ; st[n] = 'K' ; break ; // kK
                case 0x6c : print_key = 1 ; n = 35 ; nt[n] = 'l' ; st[n] = 'L' ; break ; // lL
                case 0x3b : print_key = 1 ; n = 36 ; nt[n] = ';' ; st[n] = ':' ; break ; // ;:
                case 0x27 : print_key = 1 ; n = 37 ; nt[n] = '`' ; st[n] = '"' ; break ; // '"

                case 0x7a : print_key = 1 ; n = 38 ; nt[n] = 'z' ; st[n] = 'Z' ; break ; // zZ
                case 0x78 : print_key = 1 ; n = 39 ; nt[n] = 'x' ; st[n] = 'X' ; break ; // xX
                case 0x63 : print_key = 1 ; n = 40 ; nt[n] = 'c' ; st[n] = 'C' ; break ; // cC
                case 0x76 : print_key = 1 ; n = 41 ; nt[n] = 'v' ; st[n] = 'V' ; break ; // vV
                case 0x62 : print_key = 1 ; n = 42 ; nt[n] = 'b' ; st[n] = 'B' ; break ; // bB
                case 0x6e : print_key = 1 ; n = 43 ; nt[n] = 'n' ; st[n] = 'N' ; break ; // nN
                case 0x6d : print_key = 1 ; n = 44 ; nt[n] = 'm' ; st[n] = 'M' ; break ; // mM
                case 0x2c : print_key = 1 ; n = 45 ; nt[n] = ',' ; st[n] = '<' ; break ; // ,<
                case 0x2e : print_key = 1 ; n = 46 ; nt[n] = '.' ; st[n] = '>' ; break ; // .>
                case 0x3f : print_key = 1 ; n = 47 ; nt[n] = '/' ; st[n] = '?' ; break ; // /?
                case 0x20 : print_key = 1 ; n = 48 ; nt[n] = ' ' ; st[n] = ' ' ; break ; // space
                }
                if(print_key==1 && shift==0 && pos1<16)
                {
                l1lcd[pos1] = nt[n] ;
                pos1++ ;
                print_key = 0 ;
                }
                else if(print_key==1 && shift==1 && pos1<16)
                {
                l1lcd[pos1] = st[n] ;
                pos1++ ;
                print_key = 0 ;
                }
                else if(pos1>=16) print_key=0 ;[/code]
                :biggrin:

                دیدگاه

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