اطلاعیه

Collapse
No announcement yet.

کمک در مورد winavr

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

    کمک در مورد winavr

    سلام من این برنامه C به زبان winavr رو دارم ولی بلد نیستم با این برنامه کار کنم از دوستان لطفا یه نفر بگه
    این برنامه رو چطوری باید کامپایل کرد وفایل hex رو ساخت. این آموزشهایی هم که هست هیچ کدوم کمکم نکرد
    اگر کسی لطف کنه و فایل هگزش رو برام بسازه که دیگه خیلی خیلی ممنونش میشم.



    /*********************************************
    * Chip type : ATmega16
    * Clock frequency : 4,000000 MHz
    *********************************************/
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <inttypes.h>
    #include <avr/iom16.h>

    #define F_OSC 4000000 /* oscillator-frequency in Hz */
    #define UART_BAUD_RATE 9600
    #define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC) ((F_OSC)/((UART_BAUD_RATE)*16l)-1)

    void delay_ms(unsigned short ms) {
    unsigned short outer1, outer2;
    outer1 = 200;
    while (outer1) {
    outer2 = 1000;
    while (outer2) {
    while ( ms ) ms--;
    outer2--;
    }
    outer1--;
    }
    }

    void usart_putc(unsigned char c) {
    // wait until UDR ready
    while(!(UCSRA & (1 << UDRE)));
    UDR = c; // send character
    }

    void uart_puts (char *s) {
    // loop until *s != NULL
    while (*s) {
    usart_putc(*s);
    s++;
    }
    }

    void init(void) {
    // set baud rate
    UBRRH = (uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)> >8);
    UBRRL = (uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_OSC);

    // Enable receiver and transmitter; enable RX interrupt
    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);

    //asynchronous 8N1
    UCSRC = (1 << URSEL) | (3 << UCSZ0);
    }

    // INTERRUPT can be interrupted
    // SIGNAL can't be interrupted
    SIGNAL (SIG_UART_RECV) { // USART RX interrupt
    unsigned char c;
    c = UDR;
    usart_putc(c);
    }

    int main(void) {
    init(); // init USART
    sei(); // enable interrupts

    // send initial character
    while(!(UCSRA & (1 << UDRE)));
    UDR = 0x43; // "C"
    while(!(UCSRA & (1 << UDRE)));
    UDR = 0x0d;

    // enable PD5 as output
    DDRD |= (1<<PD5);
    while (1) {
    // PIN5 PORTD clear -> LED off
    PORTD &= ~(1 << PD5);
    delay_ms(500);
    // PIN5 PORTD set -> LED on
    PORTD |= (1 << PD5);
    delay_ms(500);
    }
    return 0;
    {




    Makefile:

    MCU=atmega16
    CC=avr-gcc
    OBJCOPY=avr-objcopy
    # optimize for size:
    CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues
    #-------------------
    all: usart.hex
    #-------------------
    usart.hex : usart.out
    $(OBJCOPY) -R .eeprom -O ihex usart.out usart.hex
    usart.out : usart.o
    $(CC) $(CFLAGS) -o usart.out -Wl,-Map,usart.map usart.o
    usart.o : usart.c
    $(CC) $(CFLAGS) -Os -c usart.c
    # you need to erase first before loading the program.
    # load (program) the software into the eeprom:
    load: usart.hex
    uisp -dlpt=/dev/parport0 --erase -dprog=dapa
    uisp -dlpt=/dev/parport0 --upload if=usart.hex -dprog=dapa -v=3 --hash=32
    #-------------------
    clean:
    rm -f *.o *.map *.out
    #-------------------

    #2
    پاسخ : کمک در مورد winavr

    از هیدرهایی که استفاده شده ، میشه حدس زد که کد قدیمیآ‌ای هست.

    ۱. فایل singnal.h مدتیه که دیگه استفاده نمیآ‌شه و باید بجاش از interrupt.h استفاده کرد.
    پس خط شمارهٔ ۷ رو باید حذف یا کامنت کرد.

    ۲. نیازی به الحاق کردن فایل iom16.h بطور مستقیم نیست ، و میشه در هنگام کامپایل از سوییچ mmcu=atmega16- استفاده کرد.همونطور که میآ‌بینید در Makefile هم منظور شده.
    فایل iom16.h بصورت اتوماتیک در هنگام کامپایل استفاده میشه.
    پس خط شمارهٔ ۹ رو هم باید کامنت کرد.

    .. بقیهٔ کد رو مطالعه نکردم ..

    برای کامپایل این برنامه ، چون همش یک فایل main.c هست ، استفاده مستقیم از خط فرمان و تعامل بی واسطه با avr-gcc کار مشکلی نیست. با توجه به اینکه یک فایل هست نیازی به لینک کردن هم نیست.

    برای کامپایل کد و ساختن Object File آن میآ‌نویسیم :

    avr-gcc main.c -mmcu=atmega16 -o main.o


    حالا برای استخراج فرمت hex از فایل object از avr-objcopy استفاده میآ‌کنیم :

    avr-objcopy main.o output.hex -O ihex


    Makefile قابل استفاده و نمونه کامپایل شدهٔ کد رو الحاق کردم، سولی داشتید در خدمتم.
    فایل های پیوست شده
    چگونه هوشمندانه بپرسیم

    دیدگاه


      #3
      پاسخ : کمک در مورد winavr

      سلام خیلی ممنون دوست عزیز, الان این فایل output.hex که الصاق کردید از روی همین برنامه بدست آمده و قابل انتقال به میکرو هست؟

      دیدگاه


        #4
        پاسخ : کمک در مورد winavr

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

        دیدگاه

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