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 1818 15
REKLAMA
  • #1 11281194
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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
  • #3 11281311
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    Słuszna uwaga.

    Wziąłem na tapetę funkcję delay:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #7 11281451
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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"
  • REKLAMA
  • #9 11281551
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    wywal iom128.h i powiedz czy pomogło

    edit: wywal=nie include'uj go
  • #11 11282179
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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  
    Posty: 567
    Pomógł: 182
    Ocena: 65
    W przypadku programu dla ATmega32 też używasz "avr-g++" do linkowania?
  • #13 11282297
    alagner
    Poziom 26  
    Posty: 768
    Pomógł: 85
    Ocena: 29
    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  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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
    VIP Zasłużony dla elektroda
    Posty: 13906
    Pomógł: 1292
    Ocena: 809
    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...
    Załączniki:
    • atmega128.zip (455 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #16 11283269
    Martin_250
    Poziom 12  
    Posty: 55
    Pomógł: 1
    Ocena: 6
    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.

Podsumowanie tematu

✨ W dyskusji poruszono problem z działaniem funkcji _delay_ms w kodzie dla mikrokontrolera Atmega128, gdzie przy aktywnym przerwaniu TIMER0_OVF_vect kod w pętli while przestaje być wykonywany. Użytkownik zauważył, że po wyłączeniu przerwań funkcja delay działa poprawnie, co sugeruje konflikt między przerwaniami a funkcją opóźnienia. W odpowiedziach zasugerowano sprawdzenie optymalizacji kodu oraz ewentualne problemy z konfiguracją fuse bits. Ostatecznie rozwiązaniem okazał się problem z trybem zgodności z Atmega103, który został naprawiony przez zmianę jednego fuse bitu, co przywróciło prawidłowe działanie programów.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA