اطلاعیه

Collapse
No announcement yet.

کمک برای WIN AVR

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

    کمک برای WIN AVR

    آقا من تا حالا با Win AVR کار نکردم

    یه برنامه گرفتم از اینترنت که با WinAVR یا AVR GCC نوشته شده

    میخوام توش تغییراتی بدم

    کسی میتونه کمک کنه؟؟؟

    مشکلم اینه که برنامه از چند بخش تشکیل شده و مثلا همه تو یک فایل با نام Main نیست و وقتی برای اصلی Make file رو میسازم برای فایل های ضمیمه و کتابخانه ها Error میگیره و نمیشناسشون

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

    خیلی فوریه

    #2
    پاسخ : کمک برای WIN AVR

    خوشحال میشم کمک کنم.
    برنامه رو بزارید ببینیم
    چگونه هوشمندانه بپرسیم

    دیدگاه


      #3
      پاسخ : کمک برای WIN AVR

      با تشکر از دوست عزیز

      آقا من برنامه رو درست کردم

      یعنی همه File ها رو تو یک فایل تحت نام main جا دادم و پس از آنکه Makefile رو براش ساختم جواب داد

      اما نمیدونم چجوری میشه با پوشه های جداگانه کار کرد

      چون به این نحوی که من نوشتم برنامه خیلی بزرگ شده و حدود 1700 خط شده

      برای همین فکر کنم روش نویسنده اصلی برنامه درست بوده.

      بزودی برنامه رو میزارم. آخه الان فقط Dialup دارم

      با تشکر

      دیدگاه


        #4
        پاسخ : کمک برای WIN AVR

        با سلام به دوستان گرام

        آقا ما به یه مشکل دیگه تو برنامه مواجه شدیم

        یه برنامه نوشته بودیم که برای ATmega32 بود و حالا تبدیلش کردم به ATmega128

        تو برنامه قبلی از USART استفاده کرده بودم
        اما چون ATmega128 دوتا Usart داره ایراد میگیره

        وقتی برای رجیسترهای Usart هم شماره میزام (مثلا UCSRA رو به UCSRA.0 یا UCSRA0 تبدیل میکنم هم جواب نمیده)

        چه کار کنم؟؟؟

        دیدگاه


          #5
          پاسخ : کمک برای WIN AVR

          اینم بخشی از برنامه و Errorهاش

          //**************************************************
          //Function to receive a single byte
          //*************************************************
          unsigned char receiveByte( void )
          {
          unsigned char data, status;

          while(!(UCSRA & (1<<RXC))); // Wait for incomming data

          status = UCSRA;
          data = UDR;

          return(data);
          }

          //************************************************** *
          //Function to transmit a single byte
          //************************************************** *
          void transmitByte( unsigned char data )
          {
          while ( !(UCSRA & (1<<UDRE)) )
          ; /* Wait for empty transmit buffer */
          UDR = data; /* Start transmition */
          }


          //************************************************** *
          //Function to transmit hex format data
          //first argument indicates type: CHAR, INT or LONG
          //Second argument is the data to be displayed
          //************************************************** *
          void transmitHex( unsigned char dataType, unsigned long data )
          {
          unsigned char count, i, temp;
          unsigned char dataString[] = "0x ";

          if (dataType == CHAR) count = 2;
          if (dataType == INT) count = 4;
          if (dataType == LONG) count = 8;

          for(i=count; i>0; i--)
          {
          temp = data % 16;
          if((temp>=0) && (temp<10)) dataString [i+1] = temp + 0x30;
          else dataString [i+1] = (temp - 10) + 0x41;

          data = data/16;
          }

          transmitString (dataString);
          }

          //************************************************** *
          //Function to transmit a string in Flash
          //************************************************** *
          void transmitString_F(char* string)
          {
          while (pgm_read_byte(&(*string)))
          transmitByte(pgm_read_byte(&(*string++)));
          }

          //************************************************** *
          //Function to transmit a string in RAM
          //************************************************** *
          void transmitString(unsigned char* string)
          {
          while (*string)
          transmitByte(*string++);
          }




          void port_init(void)
          {
          PORTA = 0x00;
          DDRA = 0x00;
          PORTB = 0xEF;
          DDRB = 0xBF; //MISO line i/p, rest o/p
          PORTC = 0x00;
          DDRC = 0x00;
          PORTD = 0x00;
          DDRD = 0xFE;
          }

          //UART0 initialize
          // desired baud rate: 19200
          // actual: baud rate:19231 (0.2%)
          // char size: 8 bit
          // parity: Disabled
          void uart0_init(void)
          {
          UCSRB = 0x00; //disable while setting baud rate
          UCSRA = 0x00;
          UCSRC = (1 << URSEL) | 0x06;
          UBRRL = 0x19; //set baud rate lo
          UBRRH = 0x00; //set baud rate hi
          UCSRB = 0x18;
          }

          //call this routine to initialize all peripherals
          void init_devices(void)
          {
          cli();
          port_init();
          spi_init();
          uart0_init();

          MCUCR = 0x00;
          GICR = 0x00;
          TIMSK = 0x00; //timer interrupt sources
          //all peripherals are now initialized
          }


          avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o
          main.c: In function 'receiveByte':
          main.c:250: error: 'UCSRA' undeclared (first use in this function)
          main.c:250: error: (Each undeclared identifier is reported only once
          main.c:250: error: for each function it appears in.)
          main.c:253: error: 'UDR' undeclared (first use in this function)
          main.c: In function 'transmitByte':
          main.c:263: error: 'UCSRA' undeclared (first use in this function)
          main.c:265: error: 'UDR' undeclared (first use in this function)
          main.c: In function 'uart0_init':
          main.c:335: error: 'UCSRB' undeclared (first use in this function)
          main.c:336: error: 'UCSRA' undeclared (first use in this function)
          main.c:337: error: 'UCSRC' undeclared (first use in this function)
          main.c:337: error: 'URSEL' undeclared (first use in this function)
          main.c:338: error: 'UBRRL' undeclared (first use in this function)
          main.c:339: error: 'UBRRH' undeclared (first use in this function)
          main.c: In function 'init_devices':
          main.c:352: error: 'GICR' undeclared (first use in this function)
          make.exe: *** [main.o] Error 1

          > Process Exit Code: 2
          > Time Taken: 00:01

          دیدگاه


            #6
            پاسخ : کمک برای WIN AVR

            کسی نیست که کمکمون کنه؟؟؟

            اقا ما WinAR بلد نیستیم

            با ATmeg32 که یکدونه یوزارت داره جواب گرفتم اما با ATmega128 که دوتا یوزارت داره با مکل برخوردم

            هرجور اندیس میزارم جواب نمیده و ارور میگیره

            جالبه برنامه 32 رو تو Proteus با مدار 128 جواب گرفتم


            چکار کنم؟؟؟؟؟

            دیدگاه


              #7
              پاسخ : کمک برای WIN AVR

              در مورد مشکل دومتون در رابطه با atmega128
              اول برنامه io.h رو الحاق نکردید.
              من اینکارو اینحام دادم + اینکه رجیسترهای Uart شمارهٔ صفر رو جایگزین کردم ،
              یعنی بجای UCSRC نوشتم UCSR0C و به همین منوال ...

              البته معلوم نیست CHAR ، INT و LONG چی هستن ، اونهارو کامنت کردم.
              بیت URSEL هم برای atmega128 تعریف نشده ، از دیتاشیت ببینید بیت چندم هست ، من بجاش عدد 7 رو قرار دادم ( توی mega32 بیت هفتم هست )
              ظاهرا توی atmeg128 هم رجیستر GICR نداریم ، اون هم کامنت کردم.
              حالا ببینید با این توضیحات بنده مشکلتون حل میشه یا نه ...

              سورس ادیت شده رو در اینجا ببینید.

              چگونه هوشمندانه بپرسیم

              دیدگاه


                #8
                پاسخ : کمک برای WIN AVR

                ای کاش زودتر پاسخ شما رو میدیدم و کامنت جدید رو باز نمیکردم

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

                باز هم کمال تشکر

                اما در مورد رجیستر URSEL و GICR سوالم رو در کامنت جدید مطرح کردم

                اگه جای URSEL عدد 7 بزارم مشکل حله؟؟

                باید GICR رو حذف کنم؟؟؟
                برای GICR کامنت جدید رو ببینید
                آخری برای چی هست؟؟؟

                اگه URSEL مقدار 7 داشته باشه پس از هر شیفت هر بار مقدار جدیدی ایجاد میشه اما اگه مقدار ثابت 7 بزاریم که همیشه 7 رو شیفت میده
                بهتر نیست هفت رو تو یه رجیستر بریزم و اون رجیستر رو شیفت بدم؟؟؟

                دیدگاه


                  #9
                  پاسخ : کمک برای WIN AVR

                  نوشته اصلی توسط ehsan_akbari
                  اگه URSEL مقدار 7 داشته باشه پس از هر شیفت هر بار مقدار جدیدی ایجاد میشه اما اگه مقدار ثابت 7 بزاریم که همیشه 7 رو شیفت میده
                  بهتر نیست هفت رو تو یه رجیستر بریزم و اون رجیستر رو شیفت بدم؟؟؟
                  اگر به نحوهٔ تعریف URSEL در فایلهای هیدر میکروها نگاه کنید ، متوجه خواهید شد که یک define# ساده هست.

                  کد PHP:
                  /* UCSRC */
                  #define URSEL  7
                  #define UMSEL  6
                  #define UPM1  5
                  #define UPM0  4
                  #define USBS  3
                  #define UCSZ1  2
                  #define UCSZ0  1
                  #define UCPOL  0 
                  چگونه هوشمندانه بپرسیم

                  دیدگاه

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