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

[Atmega32][C] - Program w języku c i asemblerze

kiabonov 13 Sie 2012 15:41 4092 46
  • #1 13 Sie 2012 15:41
    kiabonov
    Poziom 9  

    Napisałem prosty program w asemblerze na ustawianie stanów wyjść lini portów i mam problem w napisaniu tego samego w języku C:

    Kod: asembler
    Zaloguj się, aby zobaczyć kod

    Powyższy program działa, ale niestety wszystkie programy napisane w języku C (program Atmel Studio 6) po wgraniu do pamięci flash nie działają.
    Próbowałem na dwa sposoby żaden nie działa:
    Kod: C
    Zaloguj się, aby zobaczyć kod

    Wszystkie programy napisane w asemblerze z użyciem Atmel Studio 6 działają bez zarzutu. I nie jestem pewien czy programy pisane w języku C są źle napisane czy Atmega nie wykonuje poleceń. Program w C jest z powodzeniem tłumaczony do pliku .hex który wgrywa się do pamięci flash mikrokontrolera.

    0 29
  • #2 13 Sie 2012 16:02
    mickpr
    Poziom 39  

    Sprawdź co generuje ci twój kompilator C (opcja -S).
    Powinieneś dostać listing w assemblerze (plik *.s).

    0
  • #3 13 Sie 2012 16:11
    kiabonov
    Poziom 9  

    Dostaje pliki z rozszerzeniem .hex .d .eep .elf .lss .map .o .mk i plik makefile
    A co do opcji -s nie jestem pewien o co chodzi.

    0
  • #4 13 Sie 2012 17:20
    atom1477
    Poziom 43  

    kiabonov napisał:
    A co do opcji -s nie jestem pewien o co chodzi.

    To powiedz co myślisz, a rozwiejemy Twoje wątpliwości :D

    mickpr napisał:
    Powinieneś dostać listing w assemblerze (plik *.s).

    Kompilator nie wytwarza plików *.s. Pliki *.s to pliki źródłowe tworzone przez programistę.
    Kompilator wytwarza za to pliki *.lss. I to o te Ci chodzi tylko o tym nie wiesz :D

    kiabonov napisał:
    Dostaje pliki z rozszerzeniem .hex .d .eep .elf .lss .map .o .mk i plik makefile

    Tak więc chodzi o plik .lss.

    0
  • #5 13 Sie 2012 17:30
    kiabonov
    Poziom 9  

    Świetnie ale nie wiem jak mi to ma pomóc w programowaniu Atmegi w C. Może nie do końca wiem jak to zrobić. Wgrywam plik .hex wygenerowany przez kompilator do pamięci flash tak jak przy programie z asemblera ale niestety nie działa. Przy języku C wygrywa się program inaczej ?

    0
  • #6 13 Sie 2012 17:44
    mickpr
    Poziom 39  

    atom1477 napisał:
    Kompilator nie wytwarza plików *.s. Pliki *.s to pliki źródłowe tworzone przez programistę.

    Zgadza się, że pliki *.s są plikami źródłowymi assemblera. Zaś to, że kompilator je "wytwarza" też się zgadza. Proszę przetestować:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    kiabonov napisał:
    Świetnie ale nie wiem jak mi to ma pomóc w programowaniu Atmegi w C. Może nie do końca wiem jak to zrobić. Wgrywam plik .hex wygenerowany przez kompilator do pamięci flash tak jak przy programie z asemblera ale niestety nie działa. Przy języku C wygrywa się program inaczej ?

    Spokojnie. :)
    Podałem ten sposób, abyś sobie sprawdził - co powstaje z twojego programu w C. (Skoro napisałeś programik w assemblerze - to widać go znasz).
    Być może masz jakieś kosmiczne opcje - które powodują, że np. program ląduje w miejscu bootloadera, lub kompilacja przebiega w inny sposób - czyli "źle".
    Plik hex jest tekstową interpretacją pliku binarnego, choć najczęściej stosowanym przy programowaniu, to nie jedynym.

    0
  • #7 13 Sie 2012 18:20
    kiabonov
    Poziom 9  

    Sprawdziłem dokładniej, plik .hex stworzony przez kompilator z programu napisanego w C nie jest poprawnie wgrywany do pamięci flash. Przeprowadziłem weryfikacje i okazuje się że zawartość pamięci różni się od napisanego programu. Taka sytuacja nie występuje przy programach napisanych w asemblerze.

    0
  • #8 13 Sie 2012 18:21
    excray
    Poziom 39  

    Plik *.lss to właśnie kod wygenerowany w ASM. Wklej tutaj zawartość tego pliku.

    0
  • #9 13 Sie 2012 18:21
    mickpr
    Poziom 39  

    kiabonov napisał:
    Sprawdziłem dokładniej, plik .hex stworzony przez kompilator z programu napisanego w C nie jest poprawnie wgrywany do pamięci flash. Przeprowadziłem weryfikacje i okazuje się że zawartość pamięci różni się od napisanego programu.

    Czy aby na pewno kasujesz zawartość Flash przed zaprogramowaniem?
    Czy hex jest tworzony (skasuj go i sprawdź datę/czas pliku po jego utworzeniu).
    Czy wybrałeś prawidłowy mikrokontroler w środowisku?

    0
  • #10 13 Sie 2012 18:24
    Andrzej__S
    Poziom 28  

    Twój program w C nie odpowiada programowi w assemblerze.
    Instrukcja
    PORTB &= ~(_BV(0));
    to nie
    sbi PORTB,0
    tylko
    cbi PORTB,0.

    Aby ustawić bit portu jako 1 użyj takiej samej kontrukcji jak w przypadku DDRB:
    PORTB |= _BV(0);

    0
  • #11 13 Sie 2012 18:30
    mickpr
    Poziom 39  

    Oto przykładowy listing programu:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i wersja w assemblerze z pliku lss:

    Kod: asm
    Zaloguj się, aby zobaczyć kod


    Kompilowane ATMEL STUDIO 6
    Wygląda w porządku, a u ciebie?

    0
  • #12 13 Sie 2012 18:31
    kiabonov
    Poziom 9  

    Tworzenie pliku .hex przebiega z powodzeniem tak samo jak kasowanie pamięci, manualne( chip erase) czy automatyczne za każdym razem przy przeprogramowywaniu.

    Cały kod z pliku .lss

    Kod: ASM
    Zaloguj się, aby zobaczyć kod

    Mikrokontroler wybierałem przy tworzeniu projektu także musi być dobrze, sprawdziłem też instrukcje PORTB |= _BV(0); też nie działa. Zdaje mi się że program nie zostaje zapisany do pamięci flash, a przynajmniej tak pokazuje weryfikacja.

    0
  • #13 13 Sie 2012 18:37
    excray
    Poziom 39  

    Sam widzisz co Ci powstało:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #14 13 Sie 2012 18:39
    Andrzej__S
    Poziom 28  

    Napisałem Ci przecież, co masz źle. Zmień:
    PORTB &= ~(_BV(0)); na PORTB |= (_BV(0));
    oraz
    PORTB &= ~(1<<PB1); na PORTB |= (1<<PB1);
    i będzie dobrze - tak samo jak w assemblerze.

    EDIT: pod warunkiem, że go wgrasz prawidłowo do mikrokontrolera.

    0
  • #15 13 Sie 2012 18:45
    mickpr
    Poziom 39  

    Andrzej__S napisał:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Trzymajmy się już jednego sposobu
    Albo 1<< bit albo _BV(bit)

    0
  • #16 13 Sie 2012 18:45
    kiabonov
    Poziom 9  

    Zamieniłem to co trzeba ale niezależnie od sposobu gorszy problem występuje przy zapisywaniu do mikrokontrolera, po weryfikacji występuje błąd "Flash memory content (0xFF) differs from file content (0x0C) at address 0x0."A pojawia się to tylko przy programach napisanych w C.

    0
  • #17 13 Sie 2012 18:46
    mickpr
    Poziom 39  

    kiabonov napisał:
    "Flash memory content (0xFF) differs from file content (0x0C) at address 0x0."

    Ten komunikat świadczy o "nieprogramowaniu" się flash-a już od pierwszego (zerowego) adresu.

    0
  • #18 13 Sie 2012 18:50
    Andrzej__S
    Poziom 28  

    mikcpr napisał:

    Trzymajmy się już jednego sposobu
    Albo 1<< bit albo _BV(bit)

    Zgadzam się. Ja tylko poprawiłem to, co autor wątku stworzył, żeby zrozumiał o co chodzi.

    0
  • #19 13 Sie 2012 18:52
    mickpr
    Poziom 39  

    Andrzej__S napisał:
    Ja tylko poprawiłem to, co autor wątku stworzył, żeby zrozumiał o co chodzi.

    Przepraszam, zatem tą drobną uwagę kieruję do autora :)

    0
  • #20 13 Sie 2012 18:54
    kiabonov
    Poziom 9  

    Dobrze, dziękuje za poprawę samego programu ale niestety najwyraźniej błąd tkwi w czymś innym. Za każdym razem gdy wgrywam program napisany w asemblerze po weryfikacji dostaję komunikat Flash memory verification succeded. i wszystko działa bez problemu. Problem stanowią tylko programy napisane w C

    0
  • #21 13 Sie 2012 19:01
    mickpr
    Poziom 39  

    W jaki sposób wgrywasz program?
    Rozumiem, że spoza Atmel Studio (płytka ZL3AVR) programatorem z KAMAMi?

    A spróbuj jeszcze "ręcznie"

    Code:
    KamPROGAVRc -d -f plik.hex

    Zamiast "plik.hex" podaj swój plik.

    0
  • #22 13 Sie 2012 19:05
    kiabonov
    Poziom 9  

    Dokładnie, po skompilowaniu w Atmel Studio 6 wgrywam programatorem plik .hex w programie KamPROG for AVR.
    Dostałem komentarz Unrecognized command or option: KamPROGAVRc
    próbowałem też tak :

    Code:
    atprogram -t KamPROGAVRc -d atmega32 -f GccApplication2.hex

    i nie działa.

    0
  • #23 13 Sie 2012 19:29
    mickpr
    Poziom 39  

    Ustalmy:
    - kompilacja jest ok.
    - programowanie nie działa.
    Tak?

    0
  • #24 13 Sie 2012 19:33
    kiabonov
    Poziom 9  

    Tak, dokładnie

    0
  • #25 13 Sie 2012 19:36
    Andrzej__S
    Poziom 28  

    kiabonov napisał:

    Za każdym razem gdy wgrywam program napisany w asemblerze po weryfikacji dostaję komunikat Flash memory verification succeded. i wszystko działa bez problemu. Problem stanowią tylko programy napisane w C


    No to programowanie jest w porządku, czy nie?

    0
  • #26 13 Sie 2012 19:40
    kiabonov
    Poziom 9  

    Problem stanowią programy napisane w języku C, a te w asemblerze działają bez zarzutu.

    0
  • #27 13 Sie 2012 19:44
    Andrzej__S
    Poziom 28  

    Podaj może tekst z okienka "Output" po kompilacji programu w C (wybierz z menu Build->Rebuild Solution).
    Jakiej konfiguracji używasz: "Release" czy "Debug"?
    Z jakiego podfolderu projektu wgrywasz plik .hex: z "Release" czy "Debug"?

    0
  • #28 13 Sie 2012 20:01
    kiabonov
    Poziom 9  

    Code:
    ------ Build started: Project: GccApplication2, Configuration: Debug AVR ------
    
    Build started.
    Project "GccApplication2.cproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "C:\Users\Rafał\Documents\Atmel Studio\GccApplication2\GccApplication2\GccApplication2.cproj" (target "Build" depends on it):
       Task "RunCompilerTask"
          D:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
          Building file: .././GccApplication2.c
          Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
          "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "GccApplication2.d" -MT"GccApplication2.d" -MT"GccApplication2.o"  -mmcu=atmega32   -o"GccApplication2.o" ".././GccApplication2.c"
          Finished building: .././GccApplication2.c
          Building target: GccApplication2.elf
          Invoking: AVR/GNU Linker : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
          "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -o GccApplication2.elf  GccApplication2.o   -Wl,-Map="GccApplication2.map" -Wl,--start-group -Wl,-lm  -Wl,--end-group  -mmcu=atmega32 
          Finished building target: GccApplication2.elf
          "D:\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  "GccApplication2.elf" "GccApplication2.hex"
          "D:\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 "GccApplication2.elf" "GccApplication2.eep" || exit 0
          "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-objdump.exe" -h -S "GccApplication2.elf" > "GccApplication2.lss"




          "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-size.exe" "GccApplication2.elf"
             text      data       bss       dec       hex   filename
              160         0         0       160        a0   GccApplication2.elf
       Done executing task "RunCompilerTask".
       Task "RunOutputFileVerifyTask"
                Program Memory Usage    :   160 bytes   0.5 % Full
                Data Memory Usage       :   0 bytes   0.0 % Full
       Done executing task "RunOutputFileVerifyTask".
    Done building target "CoreBuild" in project "GccApplication2.cproj".
    Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
    Target "Build" in file "D:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Avr.common.targets" from project "C:\Users\Rafał\Documents\Atmel Studio\GccApplication2\GccApplication2\GccApplication2.cproj" (entry point):
    Done building target "Build" in project "GccApplication2.cproj".
    Done building project "GccApplication2.cproj".

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


    Konfiguracja i podfolder to Debug

    0
  • #29 13 Sie 2012 20:09
    mickpr
    Poziom 39  

    Szukacie problemu w kodzie, który jest sprawdzony (przynajmniej od strony assemblera).

    Kolega napisał:

    kiabonov napisał:
    Zamieniłem to co trzeba ale niezależnie od sposobu gorszy problem występuje przy zapisywaniu do mikrokontrolera, po weryfikacji występuje błąd "Flash memory content (0xFF) differs from file content (0x0C) at address 0x0."A pojawia się to tylko przy programach napisanych w C.

    Jest to ewidentny błąd programowania (objawia się dopiero przy weryfikacji).
    Wrzuć dla pewności jeszcze wygenerowany HEX.

    0
  • #30 13 Sie 2012 20:11
    kiabonov
    Poziom 9  

    Kod z pliku .hex

    Code:
    :100000000C942A000C9447000C9447000C94470071
    
    :100010000C9447000C9447000C9447000C94470044
    :100020000C9447000C9447000C9447000C94470034
    :100030000C9447000C9447000C9447000C94470024
    :100040000C9447000C9447000C9447000C94470014
    :100050000C94470011241FBECFE5D8E0DEBFCDBF12
    :1000600010E0A0E6B0E0E0EAF0E002C005900D92FA
    :10007000A036B107D9F710E0A0E6B0E001C01D92AC
    :10008000A036B107E1F70E9449000C944E000C9491
    :100090000000B89AC09AB99AC19AFFCFF894FFCFDE
    :00000001FF

    0