logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

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

Skyttop 20 Lis 2009 16:40 1084 0
  • #1 7286066
    Skyttop
    Poziom 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:

    
    #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:
    
    #
    # 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:
     
    
    #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.
REKLAMA