اطلاعیه

Collapse
No announcement yet.

uart

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

    uart

    سلام
    کدی نوشتم که از پورت uart عبارت dxxxx را دریافت و بر روی نمایشگر سون سگمنت چهار رقمی نما یش دهد . x عددی بین 1 تا 9 می باشد.نمی دونم کدوم خط اشتباه است دوستان راهنمایی بفرمایید.
    با تشکر

    [code=c]
    #include <mega32.h>
    #include <stdio.h>
    #include <delay.h>
    #include <string.h>
    #define SIM
    const char num[]={
    0x3F,0x06,0x5B,0x4F,0x66,
    0x6D,0x7D,0x07,0x7F,0x6F
    };
    char temp, data[9],index=0;
    char flag,refresh;

    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    //dadeh ra bekhan
    flag=1;
    data[index++]=UDR;
    data[index]=0x00;//null
    temp=data[index++];
    }



    void main(void)
    {
    DDRA=0xFF;
    DDRB=0x0F;



    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x90;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19;
    TIMSK=0x00;

    while (1)
    {
    if(flag)
    {
    delay_ms(500);
    #asm("cli&quot
    flag=0;
    index=0;


    for(refresh=0;refresh<200;refresh++)
    {
    #ifdef SIM
    PORTA=0x00;
    #endif
    temp=data[index++];
    PORTA=num[temp];
    PORTB=~0x01;
    delay_ms(1);

    #ifdef SIM
    PORTA=0x00;
    #endif temp=data[index++];
    PORTA=num[temp];
    PORTB=~0x02;
    delay_ms(1);

    #ifdef SIM
    PORTA=0x00;
    #endif
    temp=data[index++];
    PORTA=num[temp];
    PORTB=~0x04;
    delay_ms(1);

    #ifdef SIM
    PORTA=0x00;
    #endiftemp=data[index++];
    PORTA=num[temp];
    PORTB=~0x08;
    delay_ms(1);
    }
    }
    }

    }
    [/code]
    اگر کشتي شما به درد نميخورد از آن بيرون بپريدو شنا کنيد(جاناتان ونيترز)

    #2
    پاسخ : uart

    سلام

    مشکل برنامه چیه؟

    سخت افزار و .....

    چیزی نمایش میده ؟ نمیده؟

    یه توضیحاتی بدین ببینیم کجاش اشکال داره.

    روال اینه که مقدار رو بخونی و روی پورتی که خروجی تعریف کردید بریزید.
    دوست عزیز اگه مفید بود روی تشکر بزن

    دیدگاه


      #3
      پاسخ : uart

      تشکر بابت پیگیریتون
      این کد مشکل نرم افزاری داره از uart دیتا می یاد ولی نمی تونه سون سگمنت نشان بدهد .
      یک سوال من می خوام عکس شبیه سازی شده کد رو تو پرتئوس اینجا بزارم ،میشه بفرمایید چطوری میشه این کار رو انجام داد . :rolleyes:
      اگر کشتي شما به درد نميخورد از آن بيرون بپريدو شنا کنيد(جاناتان ونيترز)

      دیدگاه


        #4
        پاسخ : uart

        خواهش
        یه جای پلود کنید و لینکشو اینجا بزارید.
        دوست عزیز اگه مفید بود روی تشکر بزن

        دیدگاه


          #5
          پاسخ : uart

          مشکلتون در برنامه وقفه یوزارتتونه:
          بیاید با هم بررسیش کنیم:
          کد:
          flag=1;
          خب تو این خط فلگ رو یک میکنید
          تا اینجا درست.
          کد:
          data[index++]=UDR;
          مشکل اصلی برنامه تون این خطه:
          تو این خط با فرض اینکه ایندکس صفر باشه :
          اول مقدار data[0] برابر UDR میشه.
          بعد مقدار ایندکس یک میشه.خب بریم خط بعد:
          کد:
          data[index]=0x00;//null
          تو این خط شما مقدار data[0] رو صفر میکنید.
          ..........................
          ااااااا چی شد؟
          تو خط قبلی مقدار UDR رو ریختی توی data بعد اومدی اونو صفر کردی؟
          خب این خط اشتباهه.
          حق هم داره که چیزی نشون نده. چون همش صفر رو میریزی تو آرایه data.
          ببین اینجوری تصحیحش کن:
          کد:
          //dadeh ra bekhan
            flag=1;
            data[++index]=UDR;
            data[index]=0x00;//null 
            temp=data[index++];
          به همین راحتی.
          موفق باشید
          براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

          دیدگاه


            #6
            پاسخ : uart

            نوشته اصلی توسط m52r65
            مشکلتون در برنامه وقفه یوزارتتونه:
            بیاید با هم بررسیش کنیم:
            کد:
            flag=1;
            خب تو این خط فلگ رو یک میکنید
            تا اینجا درست.
            کد:
            data[index++]=UDR;
            مشکل اصلی برنامه تون این خطه:
            تو این خط با فرض اینکه ایندکس صفر باشه :
            اول مقدار data[0] برابر UDR میشه.
            بعد مقدار ایندکس یک میشه.خب بریم خط بعد:
            کد:
            data[index]=0x00;//null
            تو این خط شما مقدار data[0] رو صفر میکنید.
            ..........................
            ااااااا چی شد؟
            تو خط قبلی مقدار UDR رو ریختی توی data بعد اومدی اونو صفر کردی؟
            خب این خط اشتباهه.
            حق هم داره که چیزی نشون نده. چون همش صفر رو میریزی تو آرایه data.
            ببین اینجوری تصحیحش کن:
            کد:
            //dadeh ra bekhan
              flag=1;
              data[++index]=UDR;
              data[index]=0x00;//null 
              temp=data[index++];
            به همین راحتی.
            موفق باشید
            فکر کنم میخواستند مقدار قبلی داده را یعنی یک اندیس قبل را با هر بارگذاری صفر یا پاک کنند که شاید دلیلی داشته!
            دوست عزیز اگه مفید بود روی تشکر بزن

            دیدگاه


              #7
              پاسخ : uart

              نوشته اصلی توسط david24
              فکر کنم میخواستند مقدار قبلی داده را یعنی یک اندیس قبل را با هر بارگذاری صفر یا پاک کنند که شاید دلیلی داشته!
              فک کنم شما متوجه منظور من نشدید.
              اگر یه کم دقت کنید می بینید منظور من متفاوت از اون چیزیه که شما تو این پست فرمودید.
              ........
              من به صفر کردن اون اندیس کاری ندارم.
              ایشون اول میاد مقدار بافر یوزارت رو می خونن و میریزن توی یه آرایه با اندیس خاص.
              و بعدش میان همنو اندیس رو صفر می کنن نه اون اندیس قبل ترش رو
              ..............
              در صورتی که آرایه در اندیس بالاترش ریخته نمیشه.
              ................
              به کد تصحیحی من نگاه کنید متوجه تفاوت کد میشید....
              یه تفاوت جزیی ولی خیلی خیلی مهم و یه ترفند برنامه نویسی.
              براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

              دیدگاه


                #8
                پاسخ : uart

                نوشته اصلی توسط m52r65
                مشکلتون در برنامه وقفه یوزارتتونه:
                بیاید با هم بررسیش کنیم:
                کد:
                flag=1;
                خب تو این خط فلگ رو یک میکنید
                تا اینجا درست.
                کد:
                data[index++]=UDR;
                مشکل اصلی برنامه تون این خطه:
                تو این خط با فرض اینکه ایندکس صفر باشه :
                اول مقدار data[0] برابر UDR میشه.
                بعد مقدار ایندکس یک میشه.خب بریم خط بعد:
                کد:
                data[index]=0x00;//null
                تو این خط شما مقدار data[0] رو صفر میکنید.
                ..........................
                ااااااا چی شد؟
                تو خط قبلی مقدار UDR رو ریختی توی data بعد اومدی اونو صفر کردی؟
                خب این خط اشتباهه.
                حق هم داره که چیزی نشون نده. چون همش صفر رو میریزی تو آرایه data.
                ببین اینجوری تصحیحش کن:
                کد:
                //dadeh ra bekhan
                  flag=1;
                  data[++index]=UDR;
                  data[index]=0x00;//null 
                  temp=data[index++];
                به همین راحتی.
                موفق باشید

                مچکرم از اینکه وقت گذاشتین اما متاسفانه کدی که شمانوشتید اشتباه جواب نگرفتم
                اگر کشتي شما به درد نميخورد از آن بيرون بپريدو شنا کنيد(جاناتان ونيترز)

                دیدگاه


                  #9
                  پاسخ : uart

                  نوشته اصلی توسط سمیه رحمانی

                  مچکرم از اینکه وقت گذاشتین اما متاسفانه کدی که شمانوشتید اشتباه جواب نگرفتم
                  کسی که دنبال کپی پیس باشه صبر نداشته باشه بهتر از این نمی شه :NO:
                  دوست عزیز اگه مفید بود روی تشکر بزن

                  دیدگاه


                    #10
                    پاسخ : uart

                    نوشته اصلی توسط m52r65
                    فک کنم شما متوجه منظور من نشدید.
                    اگر یه کم دقت کنید می بینید منظور من متفاوت از اون چیزیه که شما تو این پست فرمودید.
                    ........
                    من به صفر کردن اون اندیس کاری ندارم.
                    ایشون اول میاد مقدار بافر یوزارت رو می خونن و میریزن توی یه آرایه با اندیس خاص.
                    و بعدش میان همنو اندیس رو صفر می کنن نه اون اندیس قبل ترش رو
                    ..............
                    در صورتی که آرایه در اندیس بالاترش ریخته نمیشه.
                    ................
                    به کد تصحیحی من نگاه کنید متوجه تفاوت کد میشید....
                    یه تفاوت جزیی ولی خیلی خیلی مهم و یه ترفند برنامه نویسی.
                    توجه کردم و خیلی خیلی هم مهم و جزء ترفنده ولی مشکل جای دیگست.++/++
                    دوست عزیز اگه مفید بود روی تشکر بزن

                    دیدگاه


                      #11
                      پاسخ : uart

                      نوشته اصلی توسط سمیه رحمانی

                      مچکرم از اینکه وقت گذاشتین اما متاسفانه کدی که شمانوشتید اشتباه جواب نگرفتم
                      کد:
                      //dadeh ra bekhan
                        flag=1;
                        data[++index]=UDR;
                        data[index-1]=0x00;//null 
                        temp=data[index];
                      کد رو به صورت بالا تغییر بدید و خبرش رو بدید
                      براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                      دیدگاه


                        #12
                        پاسخ : uart

                        نوشته اصلی توسط m52r65
                        کد:
                        //dadeh ra bekhan
                          flag=1;
                          data[++index]=UDR;
                          data[index-1]=0x00;//null 
                          temp=data[index];
                        کد رو به صورت بالا تغییر بدید و خبرش رو بدید
                        باز هم هیچ تغییری نکرد. :sad:
                        اگر کشتي شما به درد نميخورد از آن بيرون بپريدو شنا کنيد(جاناتان ونيترز)

                        دیدگاه


                          #13
                          پاسخ : uart

                          به صورت زیر تغییر بدید و خبرشو بدید.

                          کد:
                          #include <mega32.h>
                          #include <stdio.h>
                          #include <delay.h>
                          #include <string.h>
                          #define SIM
                          const char num[]={
                          0x3F,0x06,0x5B,0x4F,0x66,
                          0x6D,0x7D,0x07,0x7F,0x6F
                          };
                          char temp, data[9],index=0;
                          char flag,refresh;
                           
                          interrupt [USART_RXC] void usart_rx_isr(void)
                          {
                            //dadeh ra bekhan
                            flag=1;
                            data[++index]=UDR;
                            data[index-1]=0x00;//null 
                            temp=data[index];
                          }
                           
                           
                           
                          void main(void)
                          {
                          DDRA=0xFF;
                          DDRB=0x0F;
                           
                           
                           
                          // USART Baud Rate: 9600
                            UCSRA=0x00;
                            UCSRB=0x90;
                            UCSRC=0x86;
                            UBRRH=0x00;
                            UBRRL=0x19;
                            TIMSK=0x00;
                           
                          while (1)
                             { 
                             if(flag)
                              {
                                delay_ms(500);
                                #asm("cli")
                                flag=0;
                                index=0;
                              
                              
                              for(refresh=0;refresh<200;refresh++)
                              {
                                #ifdef SIM
                                  PORTA=0x00;
                                #endif
                                PORTA=num[temp];
                                PORTB=~0x01;
                                delay_ms(1);
                           
                                #ifdef SIM
                                  PORTA=0x00;
                                #endif 
                                PORTA=num[temp];
                                PORTB=~0x02;
                                delay_ms(1);
                           
                                #ifdef SIM
                                  PORTA=0x00;
                                #endif
                                PORTA=num[temp];
                                PORTB=~0x04;
                                delay_ms(1);
                           
                                #ifdef SIM
                                  PORTA=0x00;
                                PORTA=num[temp];
                                PORTB=~0x08;
                                delay_ms(1);
                              }
                              }
                              }
                              
                          }
                          براي جوينده ي علم محدوديتي نيست. "ولو بالسين"

                          دیدگاه


                            #14
                            پاسخ : uart

                            بازم نشد
                            اما خودم جواب پیداکردم مرسی از پیگیریتون :redface:
                            اگر کشتي شما به درد نميخورد از آن بيرون بپريدو شنا کنيد(جاناتان ونيترز)

                            دیدگاه

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