logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Zmienne globalne (*.C). Problem. Podstawy programowania.

5657jz 14 Sty 2016 11:36 1734 20
REKLAMA
  • #1 15332711
    5657jz
    Poziom 14  
    Po dłuższej przerwie, wziąłem się za pisanie kodu. I mam problem z widocznością zmiennej "volatile" w plikach.
    Nie wiem, czy czytelnie to opisałem w poniższym wyrywkowym kodzie.
    Może Ktoś zerknie i udzieli jakiejś rady
    Generalnie chodzi o zmienną - bool przerw_KL
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 15333000
    ololukiXP
    Poziom 19  
    Zastosowanie volatile wygląda OK, problemu szukałbym w innym miejscu. Może gdzie zadeklarowałeś zmienna lokalną o takiej samej nazwie "przerw_KL" i ci przesłania zmienną globalną? Rozumiem, że jest to program jakiegoś menu wielopoziomowego. Nie wiem jak u ciebie wygląda przepływ sterowania, ale problem może leżeć w tym, że po naciśnięciu przycisku w pierwszym poziomie menu program wchodzi do podmenu i od razu w czasie gdy przycisk jest naciśnięty realizuje kolejny poziom menu. Może się tak dziać, jeśli reagujesz wyłącznie na opadające zbocze przycisku i nie masz żadnych opóźnień (nie wstrzymujesz programu) po naciśnięciu przycisku. Rozwiązaniem może być wykrywanie dodatkowo puszczenia przycisku bądź wprowadzenie jakiejś funkcji "marnującej czas" typu _delay_ms().
    Ten program ma być zastosowany w jakimś pilocie czy innym urządzeniu mobilnym, gdzie liczy się energooszczędność i dlatego korzystasz z przerwania od klawiatury, które wybudza mikrokontroler z uśpienia? W przeciwnym wypadku prościej zrobić odczyt klawiatury w przerwaniu timera.
  • #4 15333089
    szczywronek
    Poziom 28  
    To nie do końca odpowiedź na tytułowy problem, ale:
    - obsługa przycisku w przerwaniu jest bez sensu - w żaden sposób nie eliminujesz drgań styków. Wpisz w wyszukiwarce hasło keyhist - znajdziesz post kolegi BlueDraco z przykładowym kodem obsługującym przyciski w przerwaniu timera.
    - procedura obsługi przerwania, w której jedynie ustawiasz flagę też jest bez sensu - z każdym przerwaniem związana jest flaga sprzętowa (z przerwaniami zewnętrznymi INTFx w rejestrze GIFR), można ją sprawdzać bezpośrednio bez zbędnego przepisywania do zmiennej.
  • REKLAMA
  • #5 15333194
    Konto nie istnieje
    Konto nie istnieje  
  • #6 15333216
    5657jz
    Poziom 14  
    Woli wyjaśnienia:
    Klawiatura to - to klawiatura membranowe 4x4.
    Obsługiwana przez MCP23008

    Odnośnie przytrzymania klawisza zbyt długo. - nie występuje ponieważ:
    1. do zmiennej "klawisz_akywny" przypisywany jest klawisz wciśnięty, po jego zwolnieniu
    2. jeśli odczytany został by (??) następny klawisz, program powinien był wykonać następny krok - to nie występuje.

    Po prostu czeka w pętli na przerwanie INT0.
    Poczym: "przerw_KL=true" i sprawdza który klawisz jest wciśnięty.

    - Co do pętli w main() - oczywiście że jest.
  • #7 15333249
    Konto nie istnieje
    Konto nie istnieje  
  • #8 15334403
    Konto nie istnieje
    Konto nie istnieje  
  • #9 15337377
    5657jz
    Poziom 14  
    Temat skasowany
  • #10 15337876
    ololukiXP
    Poziom 19  
    Warning powstaje ponieważ pierwszy argument pętli for nie robi nic. Po prostu usuń zmienna kolumna z tego miejsca. Zwykle w tym miejscu zeruje się zmienną iteracyjną bądź przypisuje jej jakąś wartość początkową.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Myślę, że jak trochę uporządkujesz chaos związany z formatowaniem kodu i będziesz pisał krótsze funkcje bez takich głębokich zagnieżdżeń to będzie łatwiej znaleźć błędy.
    Korzystasz może z jakiegoś debugera? Albo czy próbowałeś spowolnić wykonywanie programu wprowadzając opóźnienia typu _delay_ms(1000) po każdym odczycie klawiatury, żeby wyeliminować moją teorię na temat tego, ze przy jednym wciśnięciu wykonuje się kilka funkcji obsługujących przycisk?
  • #11 15338107
    5657jz
    Poziom 14  
    U mnie w edytorze wygląda ten kod bardziej czytelnie.

    Odnośnie przyciśnięcia klawisza, rozwiązane jest to w ten sposób. Że program nie pójdzie dalej, puki klawisza nie zwolnię. Po zwolnieniu, dany klawisz przypisywany jest zmiennej "klawisz_akywny".

    Newralgiczne miejsce : while(!przerw_KL); rozpisalem na
    do{
    //Wyświetl przerw_KL i klawisz_akywny
    }while(!przerw_KL)

    W odpowiedzi: przerw_KL - nic się nie wyświetliło (nie wiem czy dobrze to zrobiłem)
    klawisz_akywny ='D'
    Wyszło na to że, program wyszedł z pętli, i poszedł dalej . Ale gdzie ? - nie wiem.
    Na pewno, nie tam gdzie powinien. Praktycznie reaguje tylko na RESET.
  • REKLAMA
  • #12 15338902
    ololukiXP
    Poziom 19  
    5657jz napisał:

    Wyszło na to że, program wyszedł z pętli, i poszedł dalej . Ale gdzie ? - nie wiem.

    Użyj LCD do debugowania - wyświetlaj jakieś napisy, a najlepiej kolejne liczby co linijkę programu w newralgicznych punktach i będziesz wiedział.
  • #13 15340773
    5657jz
    Poziom 14  
    Na razie zawieszam ten temat.

    Ps. Poprawiłem pętle for(kolumna, ........)
    Funkcja ruszyła.
    Ale funkcja setup() przestała działać. chociaż nic tam nie zmieniałem.

    Nie mniej, ciekaw jestem gdzie jest błąd.

    Coś jest totalnie skopane. Jeszcze raz napiszę kod. Pewnie będzie szybciej.
    Do usłyszenie.

    Dodano po 3 [godziny] 59 [minuty]:

    Już głupieje.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Po linkowaniu:
    Warning "DEBUG" redefined Transceiver_RFM6HW_v1_0....

    Nigdzie więcej tego "define" nie urzyłem.

    Czy AtmelStudio 7 są jakieś przełaczniki ? Zaczyna mnie to ...............
  • #14 15351096
    5657jz
    Poziom 14  
    Niestety. Nic z tego nie rozumiem.
    Czy znalazł by się Ktoś dysponujący czasem i chęcią aby przejrzeć ten kod całościowo. I wskazał błąd.
    Chętnie prześlę na podany priv cały kod.
  • #15 15351320
    Konto nie istnieje
    Konto nie istnieje  
  • #16 15351595
    5657jz
    Poziom 14  
    Temat skasowany
  • REKLAMA
  • #18 15351956
    5657jz
    Poziom 14  
    Oto i kod
    W stanie po ostatniej kompilacji.
    main() w TRANCEIVER_RFM69HW_v1_0.c
  • #19 15354359
    5657jz
    Poziom 14  
    Dziękuje -ololukiXP za chęć pomocy. Nie były trafne. Ale wielkie dzięki.

    Ponieważ nie widzę zainteresowania pomocą.

    Proszę Moderatora, o wykasowanie tego tematu.

    PS: Program działa już prawidłowo.
    Z uwagi że, Nikt nie chciał dyskutować o problemie, więc szczegóły błędu zachowam dla siebie.
  • #21 15354442
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA