NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3422 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 12 از 12

موضوع: مشکل usart در atmega128

  1. #1
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض مشکل usart در atmega128

    با سلام

    من با توابع getchar() و Putchar() توی میکرو ATMEGA32 ارتباط سریال بین میکرو با میکروی دیگه و حتی ارتباط RS485 با یه PLC به صورت 16 بیتی برقرار کردم. بدون هیچ مشکلی دیتا ارسال و دریافت می شد.

    اما الان برای اولین بار اومدم از میکروی ATMEGA128 اسافاده کردم که از USART0 اطلاعات را از یه میکرو ATMEGA128 دیگه دریافت کنم و با USART1 توسط ارتباط RS485 به یه PLC انتقال بدم، امکان نداره . یعنی بین دو میکرو هم مگا 128 هم نمیتونم ارتباط USART برقرار کنم.

    این را هم میدونم که توابع getchar() و putchar() در مگا128 به صورت putchar و getchar برای USART0 و putchar1 و getchar1 برای USAR1 استفاده می شود.


    حالا سوالم اینه که آیا نکته خاصی داره که باید رعایت کنم؟ مگر همه چیز شبه همون میکرو مگا32 نیست؟ با یه سری تفاوت اسمی؟ پس چرا دیتا چرت و پرت ارسال و دریافت میشه؟

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نام
    Advertising world
    نوشته ها
    Many
     

  3. #2
    کاربر فعال
    تاریخ عضویت
    Feb 2012
    نام
    مصطفی
    نوشته ها
    273
    تشکر
    195
    تشکر شده 128 بار در 93 پست

    پیش فرض

    برای استفاده از usart1 باید jtag و atmega103 رو غیر فعال کنی.

  4. کاربران : 3 تشکر کرده اند از شما mstkmn برای ارسال این پست سودمند:


  5. #3
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض

    این مطلب که شما گفتی را نمیدونستم ، اما من با Usart0 هم مشکل دارم

    از مگا 128 به مگا 128 با Usart0 میفرستم ، نمیدونم دیتا اشتباه ارسال میشه یا اشتباه دریافت میشه!! به هر حال جواب نمیده!!!


    اما با مگا 32 به مگا32 نتیجه گرفتم حتی با RS485 و ارسال و دریافت دیتا با PLC !!!!!

  6. #4
    کاربر علاقه مند
    تاریخ عضویت
    Feb 2011
    نوشته ها
    43
    تشکر
    24
    تشکر شده 17 بار در 16 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mahdi20 نمایش پست ها
    با سلام

    من با توابع getchar() و Putchar() توی میکرو ATMEGA32 ارتباط سریال بین میکرو با میکروی دیگه و حتی ارتباط RS485 با یه PLC به صورت 16 بیتی برقرار کردم. بدون هیچ مشکلی دیتا ارسال و دریافت می شد.

    اما الان برای اولین بار اومدم از میکروی ATMEGA128 اسافاده کردم که از USART0 اطلاعات را از یه میکرو ATMEGA128 دیگه دریافت کنم و با USART1 توسط ارتباط RS485 به یه PLC انتقال بدم، امکان نداره . یعنی بین دو میکرو هم مگا 128 هم نمیتونم ارتباط USART برقرار کنم.

    این را هم میدونم که توابع getchar() و putchar() در مگا128 به صورت putchar و getchar برای USART0 و putchar1 و getchar1 برای USAR1 استفاده می شود.


    حالا سوالم اینه که آیا نکته خاصی داره که باید رعایت کنم؟ مگر همه چیز شبه همون میکرو مگا32 نیست؟ با یه سری تفاوت اسمی؟ پس چرا دیتا چرت و پرت ارسال و دریافت میشه؟
    اگه اطلاعات ارسال میشه ولی صحیح نیست یا بقول خودتون چرت و پرته فقط مشکل از تنظیمات BuadRate وکلاک میکرو باید باشه.

  7. تشکرها از این نوشته :


  8. #5
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض

    کریستال میکرو روی کریستال خارجی تنظیم شده و مقدار کریستال خارجی 11059200 هرتز هستش!! مقداری هم که توی رجیستر UBRRL میریزم طبق دیتا شیت و فورمول محاسبه Baud Rate برابر 71 هست که مقدار Baud Rate برابر 9600 بشه!!!


    من توی میکرو فرستنده به یک متغیر Char را با Delay یک عدد اضافه میکنم (a++) و سپس برای میکروی گیرنده ارسال میکنم و در میکروی گیرنده روی LCD نمایش میدم.

    مشکل اول اینجاست که اولا به جای اینکه دیتا از 0 شروع به شمردن کنه و تا 255 بالا بره و دوباره 0 بشه و .... از 102 اقدام به شمردن میکنه و تا 129 و گاهی تا 132 بالا میره و دوباره 102 میشه و ....

    و نکته اینجاست که اطلاعاتی که قراره ارسال بشه در میکروی فرستنده هم روی LCD نمایش داده میشه ولی در آنجا دیتا طبق انتظار از 0 تا 255 شمارش شده و ...

    دوباره هم یادآور بشم که برنامه ای شبیه به این با مگا32 هیچ مشکلی نداشته و دقیقا کار میکنه!!! ولی با USART0 میکرو مگا128 این انتظار براورده نمیشود.

    مشکل این ارتباط کجاست؟؟ من کجای کار دارم اشتباه میکنم؟؟ تفاوتی در USART مگا128 با مگا32 هست؟

    ممنونم از اینکه وقت میذارید و به سوال من پاسخ میدید!!

  9. تشکرها از این نوشته :


  10. #6
    کاربر علاقه مند
    تاریخ عضویت
    Feb 2011
    نوشته ها
    43
    تشکر
    24
    تشکر شده 17 بار در 16 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mahdi20 نمایش پست ها
    کریستال میکرو روی کریستال خارجی تنظیم شده و مقدار کریستال خارجی 11059200 هرتز هستش!! مقداری هم که توی رجیستر UBRRL میریزم طبق دیتا شیت و فورمول محاسبه Baud Rate برابر 71 هست که مقدار Baud Rate برابر 9600 بشه!!!


    من توی میکرو فرستنده به یک متغیر Char را با Delay یک عدد اضافه میکنم (a++) و سپس برای میکروی گیرنده ارسال میکنم و در میکروی گیرنده روی LCD نمایش میدم.

    مشکل اول اینجاست که اولا به جای اینکه دیتا از 0 شروع به شمردن کنه و تا 255 بالا بره و دوباره 0 بشه و .... از 102 اقدام به شمردن میکنه و تا 129 و گاهی تا 132 بالا میره و دوباره 102 میشه و ....

    و نکته اینجاست که اطلاعاتی که قراره ارسال بشه در میکروی فرستنده هم روی LCD نمایش داده میشه ولی در آنجا دیتا طبق انتظار از 0 تا 255 شمارش شده و ...

    دوباره هم یادآور بشم که برنامه ای شبیه به این با مگا32 هیچ مشکلی نداشته و دقیقا کار میکنه!!! ولی با USART0 میکرو مگا128 این انتظار براورده نمیشود.

    مشکل این ارتباط کجاست؟؟ من کجای کار دارم اشتباه میکنم؟؟ تفاوتی در USART مگا128 با مگا32 هست؟

    ممنونم از اینکه وقت میذارید و به سوال من پاسخ میدید!!
    دوست عزیز اولا برنامه رو تو پروتئوس تست کن
    (تنظیمات BuadRate میکرو و شبیه ساز ترمینال رو به درستی انجام بدی)
    اگه اونجا هم مشکل داشت که برنامت ایراد داره
    ولی اگر اونجا مشکلی نداشت مشکل از مدار یا خوده میکروکنترلر هست

    اگه تونستی یه برنامه ساده که اطلاعاتd روی پورت ارسال میکنه HEX رو بده برات تست کنم
    من تو AVR از c استفاده نمیکنم.
    با بسکام خیلی زیاد تو MEGA128 استفاده کردم و تا حالا هیچ مشکلی نداشتم!

  11. تشکرها از این نوشته :


  12. #7
    کاربر فعال
    تاریخ عضویت
    Feb 2012
    نام
    مصطفی
    نوشته ها
    273
    تشکر
    195
    تشکر شده 128 بار در 93 پست

    پیش فرض

    سلام
    توی atmega128 پین های uasart0 و پروگرم مشترک هست و در صورت متصل بودن پروگرمر ممکنه باعث خطا بشه.

  13. تشکرها از این نوشته :


  14. #8
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض

    سلام

    این کد گیرنده

    کد:
    #include <mega128.h>#include <alcd.h>
    #include <delay.h>
    //#include <stdio.h>
    #define F_CPU 11059200UL
     
    #define BaudRate(x) (F_CPU/16ul/(x)-1)
     
     
    void putchar10(char c)
    {
    while ((UCSR0A & (1<<UDRE0))==0);
    UDR0=c;
    }
     
    void putchar11(char c)
    {
    while ((UCSR1A & (1<<UDRE1))==0);
    UDR1=c;
    }
     
    void puts10(char*s)
    {
    while(*s)putchar10(*s++);
    }
     
    void puts11(char*s)
    {
    while(*s)putchar11(*s++);
    }
     
     
    char getchar10(void)
    {   
    while ((UCSR0A & (1<<RXC0))==0);
    return UDR0;   
    }
       
    char getchar11(void)
    {   
    while ((UCSR1A & (1<<RXC1))==0);
    return UDR1;   
    }   
            
    char a;
    unsigned char buff[16];
    
    
    
    
        
    void main(void)
    {
    
    
    lcd_init(16);
    
    
    lcd_puts("hello");
    delay_ms(300);
    
    
    DDRA=0x00;
    DDRC=0xFF;
     
    UCSR0A=0x00;
    UCSR0B=(1<<TXEN0)|(1<<RXEN0);
    UCSR0C=(1<<UCSZ01)|(1<<RXB80);
    UBRR0H=BaudRate(9600UL) / 256;
    UBRR0L=BaudRate(9600UL) & 0xff;
     
    UCSR1A=0x00;
    UCSR1B=(1<<RXEN1)|(1<<TXEN1);
    UCSR1C=(1<<UCSZ11)|(1<<RXB81);
    UBRR1H=BaudRate(9600UL) / 256;
    UBRR1L=BaudRate(9600UL) & 0xff;
    //puts0 ("Mahdi\r");
    //puts1 ("UART Sample\r");
    //puts0 ("Mega128 UART0 Test");
    //puts1 ("Mega128 UART1 Test");
    while(1)
    {
    a=getchar10();
    //sprintf(buff, "%d",a);
    PORTC=a;
    lcd_clear();
    lcd_putchar(a);
    delay_ms(300);
    //putchar0(2);
    //PORTC = getchar1();
    }
     
    }



    و این هم کد فرستنده


    کد:
    #include <mega128.h>#include <delay.h>
    #define F_CPU 11059200UL
     
    #define BaudRate(x) (F_CPU/16ul/(x)-1)
     
     
    void putchar0(char c)
    {
    while ((UCSR0A & (1<<UDRE0))==0);
    UDR0=c;
    }
     
    void putchar1(char c)
    {
    while ((UCSR1A & (1<<UDRE1))==0);
    UDR1=c;
    }
     
    void puts0(char*s)
    {
    while(*s)putchar0(*s++);
    }
     
    void puts1(char*s)
    {
    while(*s)putchar1(*s++);
    }
     
     
    char getchar0(void)
    {   
    while ((UCSR0A & (1<<RXC0))==0);
    return UDR0;   
    }
       
    char getchar1(void)
    {   
    while ((UCSR1A & (1<<RXC1))==0);
    return UDR1;   
    }   
            
        
    void main(void)
    {
    char a;
    
    
    DDRA=DDRC=0xFF;
     
    UCSR0A=0x00;
    UCSR0B=(1<<TXEN0)|(1<<RXEN0);
    UCSR0C=(1<<UCSZ01)|(1<<RXB80);
    UBRR0H=BaudRate(9600UL) / 256;
    UBRR0L=BaudRate(9600UL) & 0xff;
     
    UCSR1A=0x00;
    UCSR1B=(1<<RXEN1)|(1<<TXEN1);
    UCSR1C=(1<<UCSZ11)|(1<<RXB81);
    UBRR1H=BaudRate(9600UL) / 256;
    UBRR1L=BaudRate(9600UL) & 0xff;
    //puts0 ("Mahdi\r");
    //puts1 ("UART Sample\r");
    //puts0 ("Mega128 UART0 Test");
    //puts1 ("Mega128 UART1 Test");
    while(1)
    {
    a++;
    putchar0(a);
    delay_ms(300);
    //PORTA = getchar0();
    //PORTC = getchar1();
    }
     
    }
    یک کاراکتر را ارسال میکنه و روی پورت میریزه ولی نمیتونم بایت دریافتی را روی LCD نشون بدم

    میشه ببینین مشکل کجاست؟؟؟
    ویرایش توسط mahdi20 : 10-12-2014 در ساعت 08:20

  15. تشکرها از این نوشته :


  16. #9
    کاربر علاقه مند
    تاریخ عضویت
    Feb 2011
    نوشته ها
    43
    تشکر
    24
    تشکر شده 17 بار در 16 پست

    پیش فرض

    برنامه ارسالت که تو پروتئوس درست کار میکنه
    فقط تاخیرت یکم زیاد بود
    بقیشو تست میکنم خبر میدم

    نمیشد با بسکام بنویسی
    چرا زندگیو به خودت سخت میکنی آخه

    اون آخر برنامه گیرنده رو که جا انداختی !
    ویرایش توسط mj.vb.net : 09-12-2014 در ساعت 21:34

  17. تشکرها از این نوشته :


  18. #10
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض

    ممنونم از لطفتون

    قبلا با بسکام کار میکردم (5 سال پیش)
    اما از اونجایی که خیلی باگ داشت سوئیچ شدم روی کدویژن. حالاهم کم کم میخوام سوئیچ بشم روی winavr

    دوتا آکولاد جا مونده بود که گذاشتم!!

    بازم تشکر

  19. #11
    کاربر علاقه مند
    تاریخ عضویت
    Dec 2007
    نام
    مهدی اسماعیل زاده
    نوشته ها
    21
    تشکر
    72
    تشکر شده 21 بار در 16 پست

    پیش فرض

    سلام من منتظر بقیش هستما!!!! (شکلک خجالت)

  20. تشکرها از این نوشته :


  21. #12
    کاربر علاقه مند
    تاریخ عضویت
    Feb 2011
    نوشته ها
    43
    تشکر
    24
    تشکر شده 17 بار در 16 پست

    پیش فرض

    نقل قول نوشته اصلی توسط mahdi20 نمایش پست ها
    سلام من منتظر بقیش هستما!!!! (شکلک خجالت)
    دوست عزیز من هر دو رو تو پروتئوس چک کردم و هیچ مشکلی از بابت ارتباطات سریال نبود
    تنظیمات فیوز بیت های مربوط به کلاک میکرو
    سلامت قطعات و البته ال سی دی (من با ال سی دی تست نکردم)

    تغییراتی که تو برنامه برای تست دادم به این شکل هست


    کد:
    #include <mega128.h>
    #include <delay.h>
    #define F_CPU 11059200UL
     
    #define BaudRate(x) (F_CPU/16ul/(x)-1)
     
     
    void putchar0(char c)
    {
    while ((UCSR0A & (1<<UDRE0))==0);
    UDR0=c;
    }
     
    void putchar1(char c)
    {
    while ((UCSR1A & (1<<UDRE1))==0);
    UDR1=c;
    }
     
    void puts0(char*s)
    {
    while(*s)putchar0(*s++);
    }
     
    void puts1(char*s)
    {
    while(*s)putchar1(*s++);
    }
     
     
    char getchar0(void)
    {   
    while ((UCSR0A & (1<<RXC0))==0);
    return UDR0;   
    }
       
    char getchar1(void)
    {   
    while ((UCSR1A & (1<<RXC1))==0);
    return UDR1;   
    }   
            
        
    void main(void)
    {
    char a;
    
    
    
    
    DDRA=DDRC=0xFF;
     
    UCSR0A=0x00;
    UCSR0B=(1<<TXEN0)|(1<<RXEN0);
    UCSR0C=(1<<UCSZ01)|(1<<RXB80);
    UBRR0H=BaudRate(9600UL) / 256;
    UBRR0L=BaudRate(9600UL) & 0xff;
     
    UCSR1A=0x00;
    UCSR1B=(1<<RXEN1)|(1<<TXEN1);
    UCSR1C=(1<<UCSZ11)|(1<<RXB81);
    UBRR1H=BaudRate(9600UL) / 256;
    UBRR1L=BaudRate(9600UL) & 0xff;
    //puts0 ("Abbas Sarami\r");
    //puts1 ("UART Sample\r");
    //puts0 ("Mega128 UART0 Test");
    //puts1 ("Mega128 UART1 Test");
    puts0 ("Abbas Sarami\r");
    
    
    while(1)
    {
     a++;
     putchar0(a);
     delay_ms(1);
    //PORTA = getchar0();
    //PORTC = getchar1();
    }
     
    }

    کد:
    #include <mega128.h>#include <alcd.h>
    #include <delay.h>
    //#include <stdio.h>
    #define F_CPU 11059200UL
     
    #define BaudRate(x) (F_CPU/16ul/(x)-1)
     
     
    void putchar10(char c)
    {
    while ((UCSR0A & (1<<UDRE0))==0);
    UDR0=c;
    }
     
    void putchar11(char c)
    {
    while ((UCSR1A & (1<<UDRE1))==0);
    UDR1=c;
    }
     
    void puts10(char*s)
    {
    while(*s)putchar10(*s++);
    }
     
    void puts11(char*s)
    {
    while(*s)putchar11(*s++);
    }
     
     
    char getchar10(void)
    {   
    while ((UCSR0A & (1<<RXC0))==0);
    return UDR0;   
    }
       
    char getchar11(void)
    {   
    while ((UCSR1A & (1<<RXC1))==0);
    return UDR1;   
    }   
            
    char a;
    unsigned char buff[16];
    
    
    
    
    
    
    
    
        
    void main(void)
    {
    
    
    
    
    //lcd_init(16);
    
    
    
    
    //lcd_puts("hello");
    delay_ms(300);
    
    
    
    
    DDRA=0x00;
    DDRC=0xFF;
     
    UCSR0A=0x00;
    UCSR0B=(1<<TXEN0)|(1<<RXEN0);
    UCSR0C=(1<<UCSZ01)|(1<<RXB80);
    UBRR0H=BaudRate(9600UL) / 256;
    UBRR0L=BaudRate(9600UL) & 0xff;
     
    UCSR1A=0x00;
    UCSR1B=(1<<RXEN1)|(1<<TXEN1);
    UCSR1C=(1<<UCSZ11)|(1<<RXB81);
    UBRR1H=BaudRate(9600UL) / 256;
    UBRR1L=BaudRate(9600UL) & 0xff;
    
    
    putchar10(65);
    //puts0 ("Mahdi\r");
    //puts1 ("UART Sample\r");
    //puts0 ("Mega128 UART0 Test");
    //puts1 ("Mega128 UART1 Test");
    while(1)
    {
    a=getchar10();
    if (a!=0) putchar10(a);
    //sprintf(buff, "%d",a);
    PORTC=a;
    //lcd_clear();
    //lcd_putchar(a);
    delay_ms(300);
    //putchar0(2);
    //PORTC = getchar1();
    }
     
    }
    فقط میتونم بگم کد و تنظیمات برنامه شما هیچ ایرادی نداره (به جز قسمت ال سی دی)

    اگه میتونید شماتیکت رو بزار ببینم

  22. تشکرها از این نوشته :


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

  1. PORTF و ATmega128
    توسط Caspian1361 در انجمن AVR
    پاسخ: 3
    آخرين نوشته: 09-08-2017, 11:55
  2. usart
    توسط asmira در انجمن stm32
    پاسخ: 0
    آخرين نوشته: 27-09-2014, 10:13
  3. atmega128
    توسط safavism در انجمن AVR
    پاسخ: 2
    آخرين نوشته: 23-08-2013, 01:05
  4. نرخ خرابی ATmega128
    توسط sara_327 در انجمن میکروکنترلرهای 8و16 بیتی
    پاسخ: 6
    آخرين نوشته: 11-02-2013, 23:02
  5. پروگزام کردن atmega128
    توسط starsoheil در انجمن AVR
    پاسخ: 15
    آخرين نوشته: 18-03-2012, 23:33

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

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