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ę:
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:
Zaloguj się, aby zobaczyć kod
Problem rozwiązany. Pozdrawiam