Elektroda.pl
Elektroda.pl
X
Sklep HeluKabel
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[AT90USB162][C/AS6] - AS6 ignoruje ustawienie F_CPU? Nie działają opóźnienia

adammruk 12 Wrz 2012 13:38 1473 3
  • #1 12 Wrz 2012 13:38
    adammruk
    Poziom 16  

    Witam. Zrobiłem ostatnio sobie płytkę testową pod ten układ, FLIP wykrywa go, da się zaprogramować, jednak program nie działa poprawnie. Podłączona dioda miga bardzo szybko, i to niezależnie od tego jakie opóźnienie ustawię (nawet na skrajnych liczbach nie widać różnicy), dioda też miga dość słabo (jest to zielona dioda superjasna), na częstotliwość nie wpływa też ustawienie F_CPU. Optymalizacja ustawiona na -Os, w ustawieniach wpisane F_CPU=8000000UL, układ chodzi na zewnętrznym kwarcu 8MHz, z kondensatorami 12pF, połączenia poprawne (przynajmniej tak wskazuje miernik), fusebity takie jak fabrycznie były ustawione. Co może być nie tak? Poniżej schemat (nic specjalnego, zasilanie, usb, kwarc, dwa przyciski i wyprowadzone wszystkie porty) oraz program.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    [AT90USB162][C/AS6] - AS6 ignoruje ustawienie F_CPU? Nie działają opóźnienia

    EDIT:

    Nie rozumiem totalnie co się tu dzieje... Poniższy program:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    działa dokładnie tak samo jak ten:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    mianowicie działa tak ze dioda podłączona do dowolnego pinu portu D miga z taką samą częstotliwością, ale z normalną jasnością, przy czym zmiana opóźnienia np z 5000 do 50 nic nie zmienia..

    0 3
  • Sklep HeluKabel
  • Sklep HeluKabel
  • #3 12 Wrz 2012 14:21
    tmf
    Moderator Mikrokontrolery Projektowanie

    Pierwszy pokazany kod z opóźnieniami robionymi na for przy -Os nie ma prawa generować jakichkolwiek opóźnień. Ten ostatni z delay powinien być poprawny. Po kompilacji nie masz żadnych ostrzeżeń? A probowałeś włączyć symulację i zobaczyć na symulatorze co się dzieje?

    0
  • #4 12 Wrz 2012 14:33
    adammruk
    Poziom 16  

    tmf napisał:
    Pierwszy pokazany kod z opóźnieniami robionymi na for przy -Os nie ma prawa generować jakichkolwiek opóźnień.


    Hmm tego nie wiedziałem. Potem używam tylko _delay_ms();
    AS6 nie generuje żadnych błędów ani ostrzeżeń. Oto output po kompilacji:

    Cytat:

    ------ Build started: Project: led-test, Configuration: Debug AVR ------
    Build started.
    Project "led-test.cproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "D:\mtechDropbox\Dropbox\elektronika\soft na at90usb162\led-test\led-test\led-test.cproj" (target "Build" depends on it):
    Task "RunCompilerTask"
    C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
    Building file: .././led-test.c
    Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -DF_CPU=8000000UL -Os -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "led-test.d" -MT"led-test.d" -MT"led-test.o" -mmcu=at90usb162 -o"led-test.o" ".././led-test.c"
    Finished building: .././led-test.c
    Building target: led-test.elf
    Invoking: AVR/GNU Linker : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -o led-test.elf led-test.o -Wl,-Map="led-test.map" -Wl,--start-group -Wl,--end-group -mmcu=at90usb162
    Finished building target: led-test.elf
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature "led-test.elf" "led-test.hex"
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "led-test.elf" "led-test.eep" || exit 0
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objdump.exe" -h -S "led-test.elf" > "led-test.lss"
    "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-size.exe" "led-test.elf"
    text data bss dec hex filename
    228 0 0 228 e4 led-test.elf
    Done executing task "RunCompilerTask".
    Task "RunOutputFileVerifyTask"
    Program Memory Usage : 228 bytes 1,4 % Full
    Data Memory Usage : 0 bytes 0,0 % Full
    Done executing task "RunOutputFileVerifyTask".




    Done building target "CoreBuild" in project "led-test.cproj".
    Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
    Target "Build" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Avr.common.targets" from project "D:\mtechDropbox\Dropbox\elektronika\soft na at90usb162\led-test\led-test\led-test.cproj" (entry point):
    Done building target "Build" in project "led-test.cproj".
    Done building project "led-test.cproj".

    Build succeeded.
    ========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========


    Napisałem teraz taką wersję:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Po wgraniu tego programu przez FLIP układ zachowuje się jak poprzednio - dioda miga z pełną jasnością z jakąś tam częstotliwością. Jednak zauważyłem że jak odłączę zasilanie na chwilę, (zasilanie jest przez przewód USB) i podłączę ponownie, program prawie działa. Prawie - tzn LED miga co 5000ms, podobnie, jeśli wpiszę opóźnienie 50ms, znowu odłączę i podłączę przewód, dioda miga co 500ms - wygląda że wszystko dzieje się 10x wolniej - pytanie dlaczego skoro F_CPU=8000000UL, kwarc przy procesorze tak samo, ponadto dlaczego program nie działa od razu poprawnie po zaprogramowaniu?
    Hmm czyżby fabrycznie układ był zaprogramowany na podział częstotliwości na 8?

    EDIT:
    Po części chyba zagadka rozwiązana.. Przy ustawieniu F_CPU=1000000UL, opóźnienia pracują poprawnie - jest takie jak wpiszę w programie. Pytanie dlaczego tak nie jest zaraz po zaprogramowaniu i zresetowaniu procesora, tylko trzeba odłączyć mu zasilanie?

    EDIT2:
    Już wszystko jasne i wszystko działa.. Otóż wystarczy w FLIP odznaczyć opcję "reset", ona coś tam miesza z watchdogiem.. Poza tym układ fabrycznie jest zaprogramowany na zewnętrzny oscylator oraz włączony podział /8, jednak można to zmienić programowo, wystarczy dołączyć plik avr/power.h i następnie wywołać na początku funkcję clock_prescale_set(0); i wszystko działa poprawnie.. Cały poprawny kod wygląda tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Problem rozwiązany. Pozdrawiam

    0