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.

[C][AVR Studio] zmienne - problem

cys_ek 19 Cze 2008 20:32 3057 12
  • #1 19 Cze 2008 20:32
    cys_ek
    Poziom 10  

    C zawsze pod każdą postacią powodował drgawki, ale to czego przed chwilą nie udało mi się zrobić, przerosło mnie i muszę spytać się Was o co w tym chodzi: ...

    Code:
    unsigned char i;
    

    int main(void){
       while(1){
          i++;
          if(i == 129){
             i = 0;
          }
       }
    }


    ten program cały czas 'stoi' w miejscu int main(void){ a zmienna i nie chce się zwiększać a licznik rozkazów leci do przodu. Debuguję z AVR Simulator ATmega16. Nie mam pojęcia co mogłem źle napsiać, bo ten sam program w innych językach programowania działa bez problemu

    0 12
  • #2 19 Cze 2008 20:40
    Balu
    Poziom 38  

    A patrzyłeś w zdeasmowany kod?:)
    Twoja pętla nic nie robiła więc ją pominął:P
    ;]
    dodaj volatile przed deklaracją zmiennej / wyłącz optymalizację:>

    0
  • #3 19 Cze 2008 20:49
    cys_ek
    Poziom 10  

    Jak to pętla niczego nie robi, zwiększa zmienną i i sprawdza jaką ma wartość.


    no volatile pomogło i wyłączenie optymalizacji też (jedna z tych rzeczy musi być żeby program działał dobrze). a co daje te volatile i o co chodzi z Tą optymalizacją, bo to co napisze to mikroprocesor musi zrozumieć, to raz lepiej to zrozumie(bez) a przy optymalizacji tylko wybiórczo zrozumie?

    a i dzięki :)

    0
  • Pomocny post
    #4 19 Cze 2008 20:51
    Balu
    Poziom 38  

    CHodzi o to, że Twoja pętla nic nie robi treściwego poza stratą czasu :)
    Więc optymalizacją ją wywaliła :P

    0
  • #5 21 Cze 2008 15:37
    vcd_a
    Poziom 18  

    Witam, a możecie powiedzieć jak wyłączyć tą optymalizację w AVR Studio?, bo mam taki sam problem chyba z funkcją do wytracania czasu,

    Code:
    unsigned long pczekaj=60;
    

    void czekaj(unsigned long pt)
    {
       unsigned char tp1;
       for(;pt>0;pt--)
       {
          for(tp1=255;tp1!=0;tp1--);
        }
    }


    Pozdrawiam Krzysiek

    0
  • #6 21 Cze 2008 15:49
    Balu
    Poziom 38  

    volatile zmienna.
    lub użyj gotowych opóźnień:]

    0
  • #7 21 Cze 2008 16:03
    vcd_a
    Poziom 18  

    Właśnie jak te gotowe opóźnienia np. z biblioteki util/delay.h, rozpoznają jaki ma się podłączony aktualnie kwarc?, ta biblioteka do opóźnień otrzymują tą informację od AVR Studio?, pozdrawiam Krzysiek

    0
  • #8 21 Cze 2008 16:14
    Balu
    Poziom 38  

    ROTFL:)

    A RTFM widziałeś?:)
    A warningów nie widzisz? (jak dołączysz util/delay.h)?

    0
  • #9 21 Cze 2008 16:19
    vcd_a
    Poziom 18  

    Żadnych warningów mi nie wywala... o0, pozd

    0
  • #10 21 Cze 2008 16:24
    Balu
    Poziom 38  

    To dziwne...u mnie się pojawia taki:)

    Cytat:
    c:/winavr-20080512/lib/gcc/../../avr/include/util\delay.h:85:3: warning: #warning "F_CPU not defined for <util/delay.h>"


    Dodano po 1 [minuty]:

    A to wszystko i tak jest w manualu...ale po co do niego zajrzeć, lepiej zapytać, prawda?:)

    0
  • #11 21 Cze 2008 16:34
    vcd_a
    Poziom 18  

    Sądzę, że AVR Studio sam dopisuje tą informację

    Code:
    #define F_CPU xxxxx
    , ponieważ gdy ręcznie dopisuję to na początku programu kompilator wywala warning:
    Code:
    ../Cwiczenie1.c:6:1: warning: "F_CPU" redefined
    
    , pozdrawiam Krzysiek

    Co do manuala, właśnie do niego zajrzałem i przyznam, że dopiero teraz zorientowałem się o jego istnieniu :), pozdrawiam

    0
  • #12 22 Cze 2008 21:27
    marek-c
    Poziom 18  

    vcd_a napisał:
    Sądzę, że AVR Studio sam dopisuje tą informację
    Code:
    #define F_CPU xxxxx
    , ponieważ gdy ręcznie dopisuję to na początku programu kompilator wywala warning:
    Code:
    ../Cwiczenie1.c:6:1: warning: "F_CPU" redefined
    
    , pozdrawiam Krzysiek

    Co do manuala, właśnie do niego zajrzałem i przyznam, że dopiero teraz zorientowałem się o jego istnieniu :), pozdrawiam


    bo raz masz w opcjach projektu (project-config. options), a drugi raz definiujesz w programie (# define F_CPU...)! do tego wpisujesz 2 różne wartości.
    Albo wywal z projec-opt. i wpisz w program (czytelniej, przynajmniej dla mnie) albo wpisz te same wartości.

    Marek

    0
  • #13 22 Cze 2008 21:54
    vcd_a
    Poziom 18  

    Dzięki wielkie za podpowiedź, też sądzę, że w kodzie lepiej to wygląda, pozdrawiam Krzysiek

    0