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

[Atmega128] [Atmega128][C] - Timer0 blokuje _delay_ms przy aktywnym przerwaniu TIMER0_OVF_vect

Martin_250 05 Wrz 2012 15:52 1767 15
REKLAMA
  • #1 11281194
    Martin_250
    Poziom 12  
    Witam Serdecznie

    Na początek kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problem następujący:
    Przy aktywnym timerze kod w pętli while przestaje być wykonywany w momencie napotkania _delay_ms o dowolnej wartości.
    Jeśli wyrzucę przerwania od timera ( //sei(); ), delay działa nawet z wartościami rzędu 5000 i więcej.
    Atmega działa na wewnętrznym oscylatorze 4Mhz, a kod piszę w Eclipse.
    Czyżby w momencie aktywnych przerwań niemożliwym było korzystanie z jakichkolwiek opóźnień w programie głównym?
    Trochę mnie to wprawiło w zakłopotanie, gdyż mam do napisania obsługę programowego pwm dla 8 ledów rgb z akcelerometrem i komunikacją radiową na pokładzie.
  • REKLAMA
  • REKLAMA
  • #3 11281311
    Martin_250
    Poziom 12  
    Zapala najpierw jedną diodę, później drugą. Nie ma robić nic konkretnego oprócz pokazania tego, że instrukcje po delay przestają być wykonywane.
    Jeżeli wyłączę przerwania to nawet jeśli będzie tu _delay_ms(10000); zapali się pierwsza dioda, a po 10 sekundach druga.
  • REKLAMA
  • #4 11281334
    dondu
    Moderator na urlopie...
    1. W jaki sposób stwierdzasz to:

    Martin_250 napisał:
    Przy aktywnym timerze kod w pętli while przestaje być wykonywany w momencie napotkania _delay_ms o dowolnej wartości.


    2. Czy masz włączoną optymalizację kodu? Jaką?
  • #5 11281397
    Martin_250
    Poziom 12  
    Słuszna uwaga.

    Wziąłem na tapetę funkcję delay:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 11281451
    Martin_250
    Poziom 12  
    Nie widziałem wówczas punktu 2.
    W zasadzie nic od czasu instalacji eclipse wraz z pluginem dla avr nie zmieniałem. Jeżeli masz na myśli pre build steps jest tam czysto.

    A odnosząc się do mojej próby debugowania samej funkcji delay za pomocą diody:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    to efekt jest ten sam również przy nieaktywnym timerze.
    Problem chyba leży faktycznie w kompilacji.
  • #8 11281456
    dondu
    Moderator na urlopie...
    W takim razie Twój problem leży w jeszcze innym miejscu: Ignorowanie warningów stojąc na 10-tym stopniu
    ponieważ bez włączonej optymalizacji otrzymałeś komunikat podczas kompilacji:
    Cytat:
    ../avr/include/util/delay.h: warning: #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"
  • #9 11281551
    Martin_250
    Poziom 12  
    Bardzo ciekawy link, przeczytałem w całości.
    Werror aktywne, oraz wszelkie opcje analizy kodu są włączone. Optymalizacja S.
    Konsola:
    
    **** Build of configuration Release for project program1 ****
    
    make all 
    Building file: ../main.c
    Invoking: AVR Compiler
    avr-gcc -Werror -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega128 -DF_CPU=4000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o "main.o" "../main.c"
    Finished building: ../main.c
     
    Building target: program1.elf
    Invoking: AVR C++ Linker
    avr-g++ -Wl,-Map,program1.map,--cref -mmcu=atmega128 -o "program1.elf"  ./main.o   
    Finished building target: program1.elf
     
    Invoking: AVR Create Extended Listing
    avr-objdump -h -S program1.elf  >"program1.lss"
    Finished building: program1.lss
     
    Create Flash image (ihex format)
    avr-objcopy -R .eeprom -O ihex program1.elf  "program1.hex"
    Finished building: program1.hex
     
    Create eeprom image (ihex format)
    avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex program1.elf  "program1.eep"
    Finished building: program1.eep
     
    Invoking: Print Size
    avr-size --format=avr --mcu=atmega128 program1.elf
    AVR Memory Usage
    ----------------
    Device: atmega128
    
    Program:     318 bytes (0.2% Full)
    (.text + .data + .bootloader)
    
    Data:          1 bytes (0.0% Full)
    (.data + .bss + .noinit)
    
    
    Finished building: sizedummy
     
    
    **** Build Finished ****

    Oraz problems:
    
    Odnosnie: ISR(TIMER0_OVF_vect)
    
    Bad function name "__vector_16" (pattern /^[a-z]/)	main.c
    
    
  • #10 11281637
    alagner
    Poziom 26  
    wywal iom128.h i powiedz czy pomogło

    edit: wywal=nie include'uj go
  • #11 11282179
    Martin_250
    Poziom 12  
    Nie to nie kwestia iom128.
    Eclipse ma to do siebie, że kreśli wszystkie nazwy rejestrów itp. użytych w source jeżeli się tego nie załączy. W zasadzie nie jest potrzebny bo jest podbierany przy kompilacji przez io.h, ale wygodniej się pisze jeżeli podkreślenia są miarodajne.

    Zupełnie nie mam pomysłu w czym jest problem, sprawdziłem na drugiej atmedze 128 i jest to samo, natomiast atmega32 w innym układzie chodzi pięknie..
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Nic nie zmieniają.
  • #12 11282294
    Andrzej__S
    Poziom 28  
    W przypadku programu dla ATmega32 też używasz "avr-g++" do linkowania?
  • #13 11282297
    alagner
    Poziom 26  
    no to przychodzi mi do głowy wersja radykalna: przeinstaluj toolchain i biblioteki.
    Przeklepałem ten kod do siebie i nie ma siły, działa dobrze, warningami nie rzuca.
  • #14 11282771
    Martin_250
    Poziom 12  
    Tak cały czas pozostaje w środowisku eclipse z winavr.
    Właśnie skończyłem przeinstalowywanie całego pakietu od początku z nowym projektem włącznie i wciąż to samo.
    Zastanawiam się czy mogą mieć na to wpływ jakieś elementy sprzętowe..

    @alagner U mnie też warningów brak, tylko w układzie nie działa tak jak powinno.

    Generalnie to zrobię kilka flag i delay mi w ogóle nie potrzebne. Nie mniej jednak jest to zastanawiający przypadek zwłaszcza, że przecież to są tylko pętle z licznikiem. Pewnie w wolnym czasie zagłębię się w temat debugowania avrów, możliwość zobaczenia co się dzieje z procesorem byłaby w tym przypadku zbawienna.
  • #15 11283267
    dondu
    Moderator na urlopie...
    W załączniku plik hex zawierający program z Twojego pierwszego postu, skompilowany w AVR Studio 4 dla Atmega128 optymalizacja -0s. Spróbuj zanim cokolwiek będziesz przeinstalowywał.

    Cytat:
    Build started 6.9.2012 at 03:59:00
    avr-gcc -mmcu=atmega128 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT dd.o -MF dep/dd.o.d -c ../dd.c
    avr-gcc -mmcu=atmega128 -Wl,-Map=PROBY.map dd.o -o PROBY.elf
    avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature PROBY.elf PROBY.hex
    avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings -O ihex PROBY.elf PROBY.eep || exit 0
    avr-objdump -h -S PROBY.elf > PROBY.lss

    AVR Memory Usage
    ----------------
    Device: atmega128

    Program: 310 bytes (0.2% Full)
    (.text + .data + .bootloader)

    Data: 1 bytes (0.0% Full)
    (.data + .bss + .noinit)


    Build succeeded with 0 Warnings...
  • #16 11283269
    Martin_250
    Poziom 12  
    Dziękuję za fatygę.

    Wgrałem hexa i jednak ten sam efekt.

    ....

    Udało się. Problem rozwiązany.
    Wszystkiemu winien był niepozorny tryb zgodności z Atmega103.
    Jeden fuse bit i wszystkie programy działają idealnie.
REKLAMA