Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[ethernut][ZL9AVR][gcc] Problem z działaniem systemu Nut/OS

Skyttop 20 Nov 2009 16:40 988 0
  • #1
    Skyttop
    Level 11  
    Witam. Do uruchomienia Nut/OS zakupiłem płytkę ZL9AVR z ATmega128. Zacząłem od najprostszej rzeczy, czyli od programu HelloWorld z kursu Ethernet i AVR'y" z Elektroniki Praktycznej. Program ma za zadanie wysłać tekst "Hello world" na port szeregowy. Kompiluje się bez problemu, zaprogramowałem uC i nic. Po odpaleniu terminala program nie wysyłał nic na port szeregowy. Ale po wciśnięciu za którymś razem przycisku reset w końcu otrzymałem to, co chciałem. Udało mi się w ten sposób zaledwie kilka razy. Czyli system zachowuje się niestabilnie. Kod poniżej:

    Code:

    #include <dev/board.h>
    #include <stdio.h>
    #include <io.h>

    #define UART_SPEED 38400

    main()
    {
        u_long baudrate = UART_SPEED;

        NutRegisterDevice (&DEV_DEBUG, 0, 0);
        freopen (DEV_DEBUG_NAME, "w", stdout);
        _ioctl(_fileno(stdout), UART_SETSPEED, &baudrate);

        printf("Hello, world!\n");

        for(;;);
    }


    Plik makefile:
    Code:

    #
    # makefile dla zestawu Ethernut BTC.
    # nie modyfikuj, jesli nie znasz sie na Makefilach ;)
    #

    include Sources

    # architektura, na ktora Ethernut ma byc kompilowany
    ARCH=avr

    # nazwa polecenia kompilatora GCC
    CC=avr-gcc

    # opcje kompilatora C
    CFLAGS= $(MY_CFLAGS) -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1

    # nazwa polecenia programu objcopy
    OBJCOPY=avr-objcopy

    # nazwa polecenia programu crurom
    CRUROM=crurom



    #nazwa pliku kompilatora GCC (np. avr-gcc.exe)
    GCCNAME=$(shell which $(CC).exe)

    # katalog, w którym jest zainstalowane GCC
    GCCDIR=$(dir $(GCCNAME))


    OBJS = $(SOURCES:.c=.o)

    CFLAGS= $(MY_CFLAGS) -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1

    all:   $(OBJS)
    ifneq "$(CRUROM_DIR)" ""
       ${CRUROM} -r -o$(CRUROM_DIR)_crurom.c $(CRUROM_DIR)
       ${CC} -c $(CRUROM_DIR)_crurom.c -o $(CRUROM_DIR)_crurom.o $(CFLAGS) -I$(GCCDIR)../NutOS/$(ARCH)/include
       ${CC} -o $(OUTPUT).elf -Wl,--defsym=main=0 -mmcu=atmega128 $(GCCDIR)../NutOS/$(ARCH)/lib/nutinit.o $(OBJS)  $(CRUROM_DIR)_crurom.o -L$(GCCDIR)../NutOS/$(ARCH)/lib $(LIBS)

    else
       ${CC} -o $(OUTPUT).elf -Wl,--defsym=main=0 -mmcu=atmega128 $(GCCDIR)../NutOS/$(ARCH)/lib/nutinit.o $(OBJS) -L$(GCCDIR)../NutOS/$(ARCH)/lib $(LIBS)
    endif
       ${OBJCOPY} -O ihex -R .eeprom $(OUTPUT).elf $(OUTPUT).hex
       ${OBJCOPY} -O binary -R .eeprom $(OUTPUT).elf $(OUTPUT).bin

    %.o:   %.c
       ${CC} -c $^ -o $@ $(CFLAGS) -I$(GCCDIR)../NutOS/$(ARCH)/include

    clean:
       rm -f $(OBJS) $(OUTPUT).bin $(OUTPUT).hex $(OUTPUT).elf
    ifneq "$(CRUROM_DIR)" ""
       rm -f $(CRUROM_DIR)_crurom.c $(CRUROM_DIR)_crurom.o
    endif

    isp: all
       avrdude -V -c stk200 -p m128 -Uflash:w:$(OUTPUT).hex


    plik sources:
    Code:
     
    

    #nazwa pliku wyjsciowego - bez rozszerzenia
    #musi byc taka sama jak nazwa projektu w AvrStudio (jesli uzywamy)
    OUTPUT = hello

    #lista plikow zrodlowych projektu
    SOURCES = hello.c

    #dodatkowe flagi kompilatora GCC
    MY_CFLAGS = -Os

    #dolaczone biblioteki
    LIBS =  -lnutarch -lnutos -lnutdev -lnutarch -lnutcrt

    #katalog z systemem plikow do umieszczenia w pamieci flash mikrokontrolera
    #jesli nie potrzebujemy, zostawic pusty
    CRUROM_DIR =


    Może ktoś spotkał się z podobnym problemem? Próbowałem nawet wysyłać przez port szeregowy w pętli nieskończonej, ale nadal nic. Do programowania używam zmodyfikowany STK500 na USB, więc zmieniałem już nawet stk200 na stk500 w pliku makefile, ale nie sądzę, aby miało to jakieś znaczenie. Proszę o pomoc.