اطلاعیه

Collapse
No announcement yet.

مشکل جدی با برنامه پورت سریال در کدویژن

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

    مشکل جدی با برنامه پورت سریال در کدویژن

    سلام. من یه برنامه به زبان C تو محیط کدویژن نوشتم که برای ارتباط از طریق پورت سریال است. تا قسمتی درست کار می کنه اما یک مشکل خفن و اعصاب خورد کن داره که به نظر منطقی نیست. من که هرچی فکر کردم عقلم به جایی نرسید. من کامل توضیح می دم که مشکل چیه ببینید شما می تونید یه کاری واسه ما بکنید.
    متن برنامه رو اینجا اوردم.این برنامه واسه ارتباط بین دو میکرو که یکی فرستنده و دیگری گیرنده است نوشته شده.( بعدا گسترش می دم تا هر دوشون بتونن هم بفرستن و هم بگیرن ) .نیازی به فایل پروتئوس هم نیست. اما اگه صلاح دیدین بزارم. ضمنا من هم تو پروتئوس بستمش و هم تو عمل اما جواب نداد. برنامه فرستنده که چیزی نداره و هم تو عمل و هم تو پروتئوس جواب می ده.
    توضیح: فرستنده یه اسم مثل ali را می فرسته و گیرنده باید آن را گرفته و روی LCD نشان می دهد.فرستنده درست عمل می کند و اسم را اینطوره می فرسته :

    char esm[10]="ALI"
    while (1)
    {
    // Place your code here
    delay_ms(100);
    sprintf(str,"#%s\r",esm);
    puts(str);
    delay_ms(100);
    }; \\ End of while

    گیرنده هم تا حدودی درست عمل می کند. اینم برنامه گیرنده :

    #include <mega16.h>
    // Alphanumeric LCD Module functions
    #asm
    .equ __lcd_port=0x18 ;PORTB
    #endasm
    #include <lcd.h>
    #define RXB8 1
    #define TXB8 0
    #define UPE 2
    #define OVR 3
    #define FE 4
    #define UDRE 5
    #define RXC 7

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<OVR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 16
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE<256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;
    bit receive_complete=0;

    #pragma savereg-
    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    #asm
    push r26
    push r27
    push r30
    push r31
    in r26,sreg
    push r26
    #endasm
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    if(data=='#&#039
    {
    rx_buffer[0]=data;
    rx_wr_index=1;
    }
    else if(rx_wr_index>=1 && data!='\r&#039
    {
    rx_buffer[rx_wr_index]=data;
    rx_wr_index++;
    }
    else if(data=='\r&#039
    {
    receive_complete=1;
    }
    else
    {
    rx_wr_index=0;
    }

    if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    };
    };
    #asm
    pop r26
    out sreg,r26
    pop r31
    pop r30
    pop r27
    pop r26
    #endasm
    } /* END OF INTERRUPT */
    #pragma savereg+

    // Standard Input/Output functions
    #include <stdio.h>

    void main(void)
    {
    // Declare your local variables here
    char str[30];

    PORTA=0x00;
    DDRA=0x00;

    PORTB=0x00;
    DDRB=0x00;

    PORTC=0x00;
    DDRC=0x00;

    PORTD=0x00;
    DDRD=0x00;

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: Off
    // USART Mode: Asynchronous
    // USART Baud Rate: 1200
    UCSRA=0x00;
    UCSRB=0x90;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

    // LCD module initialization
    lcd_init(16);
    // Global enable interrupts
    #asm("sei&quot
    lcd_clear();
    lcd_gotoxy(0,0);

    while (1)
    {
    // Place your code here
    if(receive_complete)
    {
    lcd_clear();
    lcd_gotoxy(0,0);
    sprintf(str,"%s",rx_buffer);
    lcd_puts(str);
    receive_complete=0;
    }
    };
    }

    من مدار را هم در عمل امتحان کردم و هم در پروتئوس. هیچ چی روی LCD نشان داده نمی شه. اول فکر کردم متغیر receive_complete هیچ وقت یک نمی شه و برنامه وارد if(receive_complete) نمی شه تا اطلاعات را روی LCD نشان بده. اما بعد که با AVR STUDIO برنامه را DEBUG کردم دیدم که اطلاعات دریافت می شه و با رسیدن کاراکتر ENTER متغیر receive_complete هم یک می شه و برنامه وارد حلقه if(receive_complete) می شه اما همه اطلاعات را روی LCD نشان نمی ده. فقط کاراکتر # را روی LCD نشان می ده که تو عمل هم همینطوره. خیلی باهاش ور رفتم. واقعا مشکل عجیبیه.
    من برنامه رو دقیق و کامل توی AVR STUDIO دیباگ کردم و به نظر همه چیز درست بود و اطلاعات تا رسیدن کاراکتر '\r' دریافت میشد.

    به نظر شما چرا برنامه فقط کاراکتر اول از آرایه rx_buffer ( که از اطلاعات دریافتی پر شده است ) را نشان می دهد؟ یا مشکل از جای دیگه ای است؟

    #2
    پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

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

    http://rapidshare.com/files/154791690/serial.rar.html

    دیدگاه


      #3
      پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

      سلام.
      یعنی دوستان هیچ نظری ندارند؟
      برنامه رو یه نگاه بندازید اگه متوجه نمیشید بیشتر توضیح بدم.برنامه با یک کاراکتر کنترلی (در اینجا # ) اخر کلمه ارسالی از فرستنده را متوجه شده و اطلاعات دریافتی را باید روی lcd نشان دهد که متاسفانه نمی دونم چرا این کار رو نمی کنه.
      اقای حسام الدین و دوستانی که به کدویژن وارد هستند خواهشا شما یه کمکی بکنید.... :cry2:

      دیدگاه


        #4
        پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

        من این برنامه رو نوشتم و تقریباً جواب داد. من همیشه از توابع gets و puts استفاده میکنم و از همین توابع که استفاده کردم جواب داد. امیدوارم حداقل یه کمک کوچیکی بکنه. در ضمن تو تو گیرنده وقفه رو فعال نکردم.
        فایل پروتئوسش هم هست که باید ورژن 7 به بالا داشته باشی
        فایل های پیوست شده

        دیدگاه


          #5
          پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

          سلام.
          از جوابی که دادید ممنونم .
          این توابع همیشه درست حسابی جواب نمیدن و در برنامه ای که گذاشتید هم همینطوره و فقط 2 ثانیه اول درست جواب میده. یعنی فقط یکبار اسم ALI را روی LCD درست نشون میده . البته من تو پروتئوس این مطلب رو دیدم. شاید تو عمل اینطوری نباشه. به هر حال این توابع مشکل عدم همزمانی بین ارسال و دریافت را دارند.
          و مطلب دیگه اینکه من در پروژه ام به وقفه نیاز شدیدی دارم و بهتره از وقفه استفاده کنم.

          کسی از دوستان تابحال با وقفه درگاه سریال برای دریافت یک عدد چند رقمی یا یک رشته ( نه یک عدد یا یک کاراکتر ) کار نکرده؟؟؟

          دیدگاه


            #6
            پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

            salam doste aziz
            shoma az codevision estefade ****d
            az dastorate asembli aste fade na****d hamishe dar barname nevisi hatal emkan az ye zaban barname nevisi estefade ****d
            barnamatona hamontor ke goftam
            benavisid bad age dar barnamaton moshkeli bod
            ba ham hal mi****m movafagh bashid

            دیدگاه


              #7
              پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

              سلام.
              اولا خواهشا فارسی بنویسید.( ضمنا از قوانین انجمن است.)
              دوما خب من همیشه از یک زبان برنامه نویسی استفاده کردم و اونم C بوده و ضمنا این برنامه که بالا گذاشتم رو تو کدویژن نوشتمش. مشکل من یه چیز دیگه ای است.

              دیدگاه


                #8
                پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

                این ارتباط سریال برا همه شده درد سر
                جناب kasper من هم دارم با این سریال کار میکنم
                من تونستم با فشار دادن 4کلید چهار کد مختلف رو بفرستم و هم رو lcdفرستنده و هم lcd گیرنده اونارو ببینم
                چون مدت 3 ما است پستی نبوده گذاشتن فایل ها بی فایده است یا مشکل حل شده یا داستان فراموش شده
                با این حال اگه کدا لازم بود بفرماید براتون می فرستم

                دیدگاه


                  #9
                  پاسخ : مشکل جدی با برنامه پورت سریال در کدویژن

                  مشکل از کدهای تو اینتراپته هست
                  بگرد بروژه پیدا می کنی که اینتراپت رو درست فعال کرده
                  هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
                  بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
                  میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

                  تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

                  دیدگاه

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