اطلاعیه

Collapse
No announcement yet.

مشکل با atmega64/128

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

    مشکل با atmega64/128

    سلام
    من با میکروهای atmega8، atmega16 و atmega32 کار کردم و هیچ مشکلی نداشتم. اما یه بورد با atmega128 طراحی کردم که به هیچ وجه نمی تونتم باهاش ارتباط سریال برقرار کنم. حتی آی سی رو با mega64 هم جایگزین کردم اما فرقی نکرد. بقیه قسمت های میکرو درست کار می کند اما زیر برنامه های مربوط به uart به هیچ وجه کار نمی کند. کدهای نوشته شده برای قسمت ارسال و دریافت به شکل زیر است:
    int USART_Send(char CH)
    {
    while ( !( UCSR0A & (1<<UDRE0)));
    UDR0=CH;
    return 0;
    }


    int USART_Rcv(void)
    {
    while ( !(UCSR0A & (1<<RXC0)));
    return UDR0;
    }

    وقتی از دستور a= USART_Rcv و یا USART_Send(a) در برنامه استفاده می کنم برنامه در این دستورات گیر می کند و هیچ وقت از حلقه while بیرون نمی آید. می خواستم بدونم راه اندازی بخش uart در mega64/128 با بقیه میکروها فرقی دارد و چیز خاصی رو باید در نظر بگیرم؟
    ممنون

    #2
    پاسخ : مشکل با atmega64/128

    اگه کسی یه برنامه تست سریال هم برای mega64/128 داشته باشه و برام بفرسته شاید مشکلم حل شه. مرسی

    دیدگاه


      #3
      پاسخ : مشکل با atmega64/128

      نوشته اصلی توسط elham2
      اگه کسی یه برنامه تست سریال هم برای mega64/128 داشته باشه و برام بفرسته شاید مشکلم حل شه. مرسی
      سلام
      با چه برنامه ای کار میکنید ؟
      [b]چگونه همه پایه های میکروکنترلر AVR را PWM کنیم؟
      معرفی نرم افزارEasy 7segment (برای راه اندازی آسانتر 7segment )
      معرفی نرم افزار Codewizard PWM
      با من بیشتر آشنا شوید

      دیدگاه


        #4
        پاسخ : مشکل با atmega64/128

        مشکل را کامل مطرح کن، رجیستر ها را چطور تنظیم کردی؟
        کامپایلرت چیه؟
        به شخصه 3-4 تا مثال برای مگا128 توی تالار گذاشتم ولی انگار ایجاد پست از سرچ راحت تره :-))
        این مثال کدویژن، با تغییرات بسیار جزیی میشه با GCC کامپایل کرد
        [code=c]
        #include <mega128.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)
        {
        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"
        while(1)
        {
        PORTA = getchar0();
        PORTC = getchar1();
        }

        }[/code]
        موفق باشید
        امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

        دیدگاه


          #5
          پاسخ : مشکل با atmega64/128

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

          دیدگاه


            #6
            پاسخ : مشکل با atmega64/128

            سلام

            من با این برنامه ای که شما زحمت کشیدین و گذاشتین ارتباط Usart را برقرار کردم :wow: خیلی خیلی ممنونم

            فقط من توی مگا32 چون از توابع خود کدویژن استفاده میکردم، برای ارسال سه بایت پشت سر هم مقدار بافر را روی 24 تنظیم میکردم و بدون خراب شدن اطلاعات، دیتا را ارسال و دریافت میکردم.

            حالا اینجا که با رجیسترها کار شده، چطوری میتونم از بافر استفاده کنم، که برای ارسال سه بایت پشت سر هم مشکل over write به وجود نیاد؟


            اما یه سوال دیگه هم داشتم اینه که من دیتا را دریافت میکنم و میتونم بریزم روی پورت، اما امکان نشان دادن اون بر روی LCD نیست!! مشکل چی میتونه باشه!! از توابع lcd_puts و lcd_putchhar و lcd_putsf استفاده کردم.

            بازم از راهنمائیهاتون ممنونم.

            دیدگاه


              #7
              پاسخ : مشکل با atmega64/128

              نوشته اصلی توسط ok20
              حالا اینجا که با رجیسترها کار شده، چطوری میتونم از بافر استفاده کنم، که برای ارسال سه بایت پشت سر هم مشکل over write به وجود نیاد؟
              در این روش (polling) فقط کافیه ورودی تابع puts را آدرس pointer بافر مورد نظر بدید:
              [code=c]
              char buffer[5]={0x31,0x32,0x33,0x34,0x35};
              ...
              puts0 ((char*)&buffer);
              [/code]
              اما یه سوال دیگه هم داشتم اینه که من دیتا را دریافت میکنم و میتونم بریزم روی پورت، اما امکان نشان دادن اون بر روی LCD نیست
              برنامتون را بذارید تا ایرادش مشخص بشه
              موفق باشید
              امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

              دیدگاه


                #8
                پاسخ : مشکل با atmega64/128

                کد:
                char buffer[5]={0x31,0x32,0x33,0x34,0x35};
                دقیق نفهمیدم. این کد چیکار میکنه؟ داره به هر کاراکتر از آرایه buffer آدرس خواسی میده؟ اگر اینه، با آدرس رجیسترها قاطی نمیشه؟!!!!


                این هم کد فرستنده و گیرنده و فایل پروتئوسش (چرا نمیشه توی سایت پلود کنم؟)

                http://melecamp.persiangig.com/other/usart.rar/download

                ممنونم از اینکه با حوصله به سوالاتم پاسخ میدید :redface:

                دیدگاه


                  #9
                  پاسخ : مشکل با atmega64/128

                  نوشته اصلی توسط ok20
                  کد:
                  char buffer[5]={0x31,0x32,0x33,0x34,0x35};
                  دقیق نفهمیدم. این کد چیکار میکنه؟
                  به این دستور آرایه ، بردار ، بافر و... گفته میشه :biggrin:
                  ... داره به هر کاراکتر از آرایه buffer آدرس خواسی میده؟
                  :eek: خیر، فقط یکسری متغیر که بصورت منظم پشت سر هم در SRAM قرار گرفته اند
                  با آدرس رجیسترها قاطی نمیشه؟!!!!
                  چه ربطی به رجیسترها داره ؟؟؟؟؟ این آرایه روی SRAM هست و آدرسش هم به SRAM برمیگرده
                  پیشنهاد میکنم در مورد Pointer ها مطالعه کنید :read:
                  ----------------------------------------------------------------------------------------------------
                  این هم کد فرستنده و گیرنده و فایل پروتئوسش
                  اولاً توی برنامه نوشته شده :
                  کد:
                  #define F_CPU 11059200UL
                  پس چرا توی شبیه سازی 8MHz گذاشتی ؟
                  ثانیاً ، میشه توضیح بدی کرکتر متناظر 0x02 , 0x01 , 0x00 و ... طبق استاندارد ASCII چی میشه که شما انتظار دارید روی LCD ببینید ؟

                  موفق باشید
                  امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                  دیدگاه


                    #10
                    پاسخ : مشکل با atmega64/128

                    ممنون از توضیحات مفیدتون

                    پس چرا توی شبیه سازی 8MHz گذاشتی ؟

                    آخه گفتم شاید کریستال خارجیش درست کار نمیده، منم گذاشتم رو 8 مگ!!

                    ثانیاً ، میشه توضیح بدی کرکتر متناظر 0x02 , 0x01 , 0x00 و ... طبق استاندارد ASCII چی میشه که شما انتظار دارید روی LCD ببینید ؟
                    از این استانداردی که شما گفتی اطلاعاتی ندارم!!

                    راستش من با sprintf مقدار را توی متغیر Buff[16] ریختم و با lcd_putsf هم نمایش دادم! ولی باز هم چیزی روی LCD نشد نشون بدیم!!
                    اصلا برای همین هم بود که اسم توابع شما را تغییر دادم که با مال تابع کتابخانه ای stdio قاطی نشه!!

                    اینجوری

                    کد:
                    #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;
                    int b;
                    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 ("Abbas Sarami\r");
                    //puts1 ("UART Sample\r");
                    //puts0 ("Mega128 UART0 Test");
                    //puts1 ("Mega128 UART1 Test");
                    while(1)
                    {
                    a=getchar10();
                    b=a;
                    sprintf(buff, "%d",b);
                    PORTC=a;
                    lcd_clear();
                    lcd_puts(buff);
                    delay_ms(300);
                    }
                     
                    }

                    دیدگاه


                      #11
                      پاسخ : مشکل با atmega64/128

                      نوشته اصلی توسط ok20
                      از این استانداردی که شما گفتی اطلاعاتی ندارم!!
                      چرا؟ یک برنامه نویس حتماً باید جدول ascii را بشناسه (البته نیازی به حفظ کردن نیست :mrgreen
                      این کد ساده را ببین:
                      برای ارسال
                      [code=c]
                      void My_putchar0(char c)
                      {
                      while ((UCSR0A & (1<<UDRE0))==0);
                      UDR0=c;
                      }

                      void My_puts0(char*s)
                      {
                      while(*s)My_putchar0(*s++);
                      }

                      char My_getchar0(void)
                      {
                      while ((UCSR0A & (1<<RXC0))==0);
                      return UDR0;
                      }


                      void main(void)
                      {

                      UCSR0A=0x00;
                      UCSR0B=(1<<TXEN0)|(1<<RXEN0);
                      UCSR0C=(1<<UCSZ01)|(1<<RXB80);
                      UBRR0H=BaudRate(9600UL) / 256;
                      UBRR0L=BaudRate(9600UL) & 0xff;

                      delay_ms(100);
                      My_putchar0 (0);
                      My_putchar0 (1);
                      My_putchar0 (2);
                      My_putchar0 (3);
                      My_putchar0 (4);
                      My_putchar0 (5);
                      while(1)
                      {
                      }
                      }
                      [/code]
                      دریافت:
                      [code=c]
                      void main(void)
                      {

                      UCSR0A=0x00;
                      UCSR0B=(1<<TXEN0)|(1<<RXEN0);
                      UCSR0C=(1<<UCSZ01)|(1<<RXB80);
                      UBRR0H=BaudRate(9600UL) / 256;
                      UBRR0L=BaudRate(9600UL) & 0xff;

                      lcd_init(16);
                      lcd_clear();
                      lcd_gotoxy(0,0);

                      while(1)
                      {
                      a=My_getchar0();
                      sprintf(buff,"%d",a);
                      lcd_puts(buff);
                      }

                      }
                      [/code]

                      اگه کدهای فوق را متوجه نشدی باید بری سراغ یادگیری مفاهیم اولیه زبان C
                      موفق باشید
                      امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                      دیدگاه


                        #12
                        پاسخ : مشکل با atmega64/128

                        خدا خیرت بده :applause:

                        مشکلم حل شد :wow:

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

                        دیدگاه


                          #13
                          پاسخ : مشکل با atmega64/128

                          :cry2:

                          سلام
                          من توی پروتئوس جواب گرفتم اما الان که PCB زدم و پروگرام کردم، یه کاراکتر تعریف کردم که دائماً یکی بهش اضافه بشه و توسط میکروی master ارسال بشه برای میکروی slaveو اون هم که دیتا را دریافت کرد روی ال سی دی نشون بده.

                          توی پروتئوس از 0 شروع به شمردن میکنه و تا 255 میره و دوباره 0 میشه.

                          اما برنامه را که روی میکرو ریختم و با کریستال خارجی 11059200 کار میکنم ، از 192 شروع به شمردن میکنه به ترتیب زیر افزایش میده و دوباره 192 میشهو همینطور سیکل ادامه پیدا میکنه!!!

                          192
                          193
                          194
                          195
                          196
                          197
                          198
                          199
                          200
                          201
                          202
                          203
                          197
                          198
                          199
                          200
                          201
                          202
                          203
                          204
                          205
                          206
                          207
                          208
                          204
                          205
                          206
                          207
                          208
                          209
                          .....

                          همینطور که دیدین جلو میره و یه جا بر مرگرده عقب.
                          انگار یادش رفته تا چند شمرده :biggrin:
                          از اعداد 0 تا 192 هم هیچ خبری نیست!!! جالب اینجاست توی پروتئوس با اوسیلاتور داخلی دقیق میشمره هیچ ایرادی هم نداره!!!

                          مشکل از کجاست؟؟ سخت افزاری هستش؟!!

                          دیدگاه


                            #14
                            پاسخ : مشکل با atmega64/128

                            نوشته اصلی توسط ok20
                            من توی پروتئوس جواب گرفتم اما الان که PCB زدم و پروگرام کردم، یه کاراکتر تعریف کردم که دائماً یکی بهش اضافه بشه و توسط میکروی master ارسال بشه برای میکروی slaveو اون هم که دیتا را دریافت کرد روی ال سی دی نشون بده.

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

                            موفق باشید
                            امام علی (علیه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

                            دیدگاه


                              #15
                              پاسخ : مشکل با atmega64/128

                              فیوز بیت های کریستال را روی 1111 تنظیم کردم!!!

                              کریستال را هم عوض کردم!!!

                              :angry:

                              دیدگاه

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