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.

AtMega16 język C - zmienna Volatile nie przekazuje wartości z przerwania do main

kamiloo123 20 Sty 2015 22:40 1170 14
  • #1 20 Sty 2015 22:40
    kamiloo123
    Poziom 9  

    Witam forumowicze. Robię właśnie pracę inżynierską i mam problem z przekazywaniem zmiennej z przerwania timera do głównej pętli programu. Męczę się z tym od dłuższego czasu i moja inżynierka stoi w miejscu. ;/ Proszę o pomoc w tej sprawie.
    Oto część kodu z przekazywaniem zmiennej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Proszę o pomoc, bo mi już siły się kończą. ;/

    0 14
  • #2 20 Sty 2015 22:49
    piotrva
    Moderator na urlopie...

    A nie lepiej sprawdzać warunek tak:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    ;)

    Poza tym, gdybym był Twoim promotorem to za takie zapisy:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Dostałbyś porządną reprymendę.
    Podobnie jak za formatowanie kodu z czytelnymi wcięciami :D

    Ponadto ten warunek sprawdzi się tylko jeden raz - potem program wejdzie w nieskończoną pustą pętlę :)

    0
  • #3 20 Sty 2015 22:52
    kamiloo123
    Poziom 9  

    Może i tak ale nie dało to efektu w działaniu programu. gdy wstawię zmianę portów do przerwania to wszystko działa a w main niestety nie

    0
  • #5 20 Sty 2015 22:58
    kamiloo123
    Poziom 9  

    a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć

    0
  • Pomocny post
    #6 20 Sty 2015 23:06
    tmf
    Moderator Mikrokontrolery Projektowanie

    kamiloo123 napisał:
    a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć

    To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.

    0
  • #7 20 Sty 2015 23:15
    kamiloo123
    Poziom 9  

    tak miało być if(flaga==1) :)

    dziękuję za radę już wszystko śmiga :) takie proste błędy a takie problemy;/ Wychodzą braki w nauce. Dziękuję i pozdrawiam

    0
  • #8 20 Sty 2015 23:57
    kisielos12
    Poziom 26  

    Co do porównywania jakiejś stałej do zmiennej proponuje wyuczyć się pewnej metodyki, to znaczy stała zawsze z lewej strony, nawet jeżeli zrobimy błąd taki jak powyżej (= zamiast ==) kompilator wywali nam to jako błąd i już, a szukanie takiego błędu w kodzie samemu jest strasznie praco i czasochłonne.

    Pozdrawiam

    0
  • #9 21 Sty 2015 00:10
    piotrva
    Moderator na urlopie...

    piotrva napisał:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Dlatego też tak to zapisałem.

    Zwykle dla zapisu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Kompilator powinien wyrzucić ostrzeżenie.

    Jeśli jednak z jakichś powodów świadomie stosujemy zapis typu:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    to wtedy po pierwsze zadziała to tak, że do zmiennej a zostanie wpisana wartość zapisana w tablica[i], a następnie wartość zmiennej a zostanie przekazana do if'a, czyli będzie to równoznaczne z zapisem:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ponadto jeśli świadomie stosujemy taką operację powinniśmy ją objąć dodatkowym nawiasem, jak to zrobiłem wcześniej.
    Podobnie możemy pisać nawet tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    Co jest tożsame z:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #11 21 Sty 2015 00:18
    kisielos12
    Poziom 26  

    szczywronek napisał:
    chyba właśnie odwrotnie ;P


    Istotnie, dziękuje za uwagę ;)

    Pozdrawiam

    0
  • #12 21 Sty 2015 14:23
    el2010tmp
    Poziom 25  

    if(flaga==1)
    if(1==flaga)
    a nie lepiej po prostu:
    if(flaga)

    0
  • #14 22 Sty 2015 17:56
    grko
    Poziom 33  

    Tzw "Yoda Conditions" (if(1==flaga)) nie są już w dzisiejszych czasach potrzebne (tak jak notacja węgierska). Pogarszają jedynie czytelnośc kodu. Każdy kompilator generuje warning przy: if(flaga =100).

    Use it you should not ;)

    1
  Szukaj w 5mln produktów