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

Sprawdzenie kodu. Czy to jest dobrze napisane?

Dawid237 05 Gru 2011 19:00 1432 12
REKLAMA
  • #1 10222132
    Dawid237
    Poziom 10  
    Witam, napisałem taki kod, działa, ale zastanawia mnie czy jest on z Waszego punktu widzenia dobrze napisany, są to dwa efekty led na przerwaniu sterowane jednym przyciskiem, za pomocą jednej zmiennej steruje efektami, a kolejna w przerwaniu wczytuje efekt.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 10222808
    Brutus_gsm
    Poziom 25  
    W pętli while, IF'y powinny być zagnieżdżone, żeby dobrze działał debouncing.
  • REKLAMA
  • #4 10223020
    Dawid237
    Poziom 10  
    Problem leżał w większy bądź równy od "t'' (t>=) w przerwaniu, teraz działa naprawdę ok, wcześniej miałem tylko równy (t==). Gdzieś "gubiła" się ta zmienna?, może ktoś wytłumaczyć? I jeszcze mam pytanie co do sprawdzania wszystkich danych w przerwaniach jak jest dużo takich "if(t==1...10)" to uC musi sprawdzać je po kolei i wykonac jakoas operacje/instrukcje, bywa tak ze zabraknie mu czasu na to? czasem przerwanie trwa bardzo krotko...

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #5 10223084
    Brutus_gsm
    Poziom 25  
    Zastanawiałeś się co będzie, gdy zmienna i będzie miała wartość np. 11 i w tym momencie zmienisz zmienną m na wartość 2?
  • #6 10223159
    Dawid237
    Poziom 10  
    Właśnie jeśli "t" będzie równe 11 i przejdzie do drugiego efektu będzie ja zmieniać za każdym zgłoszeniem przerwania o 1 czyli do wartości jaka możne pomieścić pamięć uC bo w drugim efekcie jest tylko do 10??
  • #7 10223570
    Brutus_gsm
    Poziom 25  
    To inaczej: jaka jest wartość g_ledpol[11]?, albo g_ledpol[13]?
  • REKLAMA
  • #8 10226144
    Dawid237
    Poziom 10  
    brutus_gsm wiem ze problem tkwi w jakimś szczególe ale nie mogę złapać, jaka wartość pytasz w g_ledpol gdy 11 i 13 ale tam zmienna zmienia się tylko do 10
    chyba ze masz na myśli g_redrid
  • #9 10226438
    Brutus_gsm
    Poziom 25  
    No właśnie zmienna t nie zmienia się do 10 i w tym problem ;)
  • REKLAMA
  • #10 10226531
    Dawid237
    Poziom 10  
    Brutus_gsm napisał:
    zmienna t nie zmienia się do 10


    jak nie? mam przecież (t>=10)? ma być 11?
  • #11 10226932
    Brutus_gsm
    Poziom 25  
    No masz, ale co jest przed tym warunkiem? Inkrementacja zmiennej i odczytanie bajtu z pamięci flash. Dopiero po tym sprawdzasz warunek i jeśli jest większa niż 10, to ją zerujesz. Przeanalizuj ten kod krok po kroku. Weź pod uwagę to, że gdy m=1, zmienna te może zmieniać się aż do 15. Gdy zmienisz m na 2, to może się zdarzyć sytuacja, że t będzie większe od 10. A taka sytuacja nie powinna mieć miejsca. Warunek masz nie w tym miejscu, co trzeba, albo o jeden za mało, można to różnie rozwiązać.
  • #12 10227106
    Dawid237
    Poziom 10  
    AAaa błędem będzie to ze "t" osiąga np te 11 i uC chce wgrać do Portu B ''nie wiadomo co'', powinienem najpierw sprawdzać zmienna "t" potem zaprzęgać _pgm_byte

    Dodano po 4 [minuty]:

    Myślę o wszystkich efektach w jednej tablicy i odpowiednio zerować i ustawiać zmienna "t'' tez będzie to jakieś rozwiązanie? (Odn. drugiej części wypowiedzi)
  • #13 10259713
    Dawid237
    Poziom 10  
    Rozwiązałem problem ze zmienna, podaje cały kod jeszcze raz, jeśli ktoś ma chwile zerknąć na obsługę przerwania czy tak może zostać, oczywiście zostanie mi poprawić kod na czytelniejszy i kilka innych małych zmian. Dołączyłem jeszcze kilka ledow, wiec doszła mi jeszcze jedna tablica oraz zmienna "d" która służy do opóźnienia wczytywania danych z tablic, jednego z efektów (przesuwania ledow), i właśnie nie wiem czy tyle zmiennych i tablic nie obciąży uC bo mam zamiar cały kod w przerw. rozbudować o kolejne zmienne, pgm_read_byte, ogolnie o większa ilość efektów zaprzęganych z tablic


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