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

[ATmega8515][avr-gcc] - Warunek IF działa niezgodnie z oczekiwaniem

20 Kwi 2014 19:11 1803 19
  • #1 13528460
    Konto nie istnieje
    Konto nie istnieje  
  • #2 13528501
    el2010tmp
    Poziom 25  
    Armageddon22 napisał:
    Nie potrafię zrozumieć dlaczego wg mnie poprawnie napisany kod nie działa jak należy.

    Ciekawa koncepcja poprawności kodu, szczególnie jak się patrzy na deklarację zmiennych :)
    W języku C jest coś takiego jak tablica...

    Jeżeli sprawdzasz przyciski stanem niskim to zainicjuj zmienne oldjoyxx wartością 0xff [same jedynki].
  • #3 13528530
    Konto nie istnieje
    Konto nie istnieje  
  • #4 13534517
    LordBlick
    VIP Zasłużony dla elektroda
    A próbowałeś to uruchomić bez „czuwającego pieska” ? (WDT) ;)
    Do czego potrzebujesz watchdoga ?
  • #5 13534715
    Konto nie istnieje
    Konto nie istnieje  
  • #6 13534756
    Eagle
    Poziom 24  
    Teoretycznie powinien się wykonać, nawet pomijając jakość kodu. Jednak jeśli nie działa tak jak chcesz, to po prostu popełniłeś błąd, a nie jak w tytule uC coś źle robi. Możliwości jest kilka, na szczęście nowoczesne środowisko dostarcza coś takiego jak debuger aby pozbyć się takich problemów. W tym przypadku VUSB, jeśli nie możesz wszystkiego za symulować, to pomiń tego if'a i prześlij te wartości, które masz w if'ie i sprawdź czy warunek jest spełniony. Ogranicz do sprawdzenia tylko jednego warunku w if'e z czterech. Sprawdź czy coś nie nadpisuje zmiennych itd. Masz układ przed sobą i nieograniczone możliwości debugowania, my szalenie ograniczone. W/g mnie warunek nie jest spełniony i dlatego uC posłusznie nie wykonuje if'a. Wystarczy, że odczytywana wartość z PINA będzie równa zero i if się nie wykona.
  • #7 13535008
    BlueDraco
    Specjalista - Mikrokontrolery
    Ja stawiam raczej na błąd w metodzie testowania. Jeśli najpierw naciskasz przycisk, to program rejestruje nowy stan jako "stary". Następnie każesz raportować zmianę stanu - ok, ale "zmiana" wymaga zmiany (naciśnięcia/zwolnienia). Kod testujący przyciski nie wie (zapewne) od kiedy chcesz raportować zmiany.
  • #8 13535162
    LordBlick
    VIP Zasłużony dla elektroda
    Spróbuj tak:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    Oddzielną kwestią jest to, co jest w funkcji „wyslijdane” i na ile jest to zgodne z HID…
  • #9 13535286
    Eagle
    Poziom 24  
    @LordBlick:
    Jaka jest różnica logiczna pomiędzy testowaniem osobno a testowaniem w jednym if'ie z logicznym OR ?

    W/g mnie brak takiej różnicy bo:

    Jeśli jeśli "złożony" if się wykona to co najmniej mamy jedną różnicę - odpowiada ustawieniu flagi "bChange". Analogicznie brak różnic, nie ustawia flagi.

    Gdy jest różnica pomiędzy starą wartością a nową nowa, dane zostają wysłane a stare wartości zaktualizowane. To samo dzieje się dla obu przykładów.

    Nie znajduję takich wartości, nowych i poprzednich, aby zachowanie if'a i kilku if'ów się różniło.


    @BlueDraco:
    zdefiniuj "metoda testowania", jeśli jest to ten złożony "if" to wydaje się być poprawny.
  • #10 13535639
    BlueDraco
    Specjalista - Mikrokontrolery
    Moim zdaniem if() jest poprawny, ale Ty błędnie interpretujesz zachowanie programu. Jak dokładnie określasz, że to działa dobrze/źle?
  • #11 13535748
    Eagle
    Poziom 24  
    Cytat:
    Jak dokładnie określasz, że to działa dobrze/źle?


    Autor postu między słowami opisuje, że chce wysyłać dane, gdy są zmiany w stosunku do poprzedniego stanu. Realizuje to przez zapamiętanie poprzedniego stanu i bada czy nastąpiła zmiana. W przypadku wykrycia zmiany następuje wysłanie danych i aktualizacja danych z którymi będą w kolejnym "obiegu" będą porównywane aktualne. To wnioskuję na podstawie nazwy zmiennych i fragmentu programu. Jeśli chciałbym osiągnąć powyższy efekt, zrealizował bym to podobnie na poziomie logiki, bo sam zapis aż prosi się o wykorzystanie tablicy.

    Problemem wydaje się pierwszy "obieg", podczas którego program nie wykonuje if. Jeśli później wykonuje prawidłowo to sam if działa.

    Cytat:
    (...)ale Ty błędnie interpretujesz zachowanie programu.

    Być może coś źle interpretuje, więc jaka jest dobra interpretacja ?
  • #12 13535930
    Konto nie istnieje
    Konto nie istnieje  
  • #13 13536017
    LordBlick
    VIP Zasłużony dla elektroda
    Moja propozycja: Odczyt przerzuć do osobnej procedury, która wywołasz również przed wejściem do pętli głównej, tyle, ze odczytując do zmiennych oldjoy.
  • #14 13536525
    BlueDraco
    Specjalista - Mikrokontrolery
    Powtórzę pytanie: w jaki sposób stwierdzasz, że "za pierwszym razem" nie działa tak, jak powinno? Opisz to dokładnie.

    Mam wrażenie, że wchodzisz po if(), ale "za pierwszym razem" nie następuje przesłanie raportu po USB.
  • #15 13536590
    Eagle
    Poziom 24  
    Chyba wędka nie zadziałała, to czas na rybę.

    1) usuń na chwilę if, a w wyślij dane umieść zmienną o znanej wartości, ustal czy odebrany pakiet zawiera oznaczoną zmienną np: 0x55
    Kod: text
    Zaloguj się, aby zobaczyć kod


    2) zredukuj if do sprawdzania jednego warunku i prześlij dane w przypadku powodzenia i niepowodzenia wraz z specjalną wartością i wartościami z warunku.
    W przypadku gdy dla joy11 if nie zostanie spełniony powtórz test dla kolejnych joy.


    Kod: text
    Zaloguj się, aby zobaczyć kod


    Przedstaw wynik. Całość tajemniczego if'a da się rozwiązać w 5 min.
  • #16 13536951
    Konto nie istnieje
    Konto nie istnieje  
  • #17 13537735
    Eagle
    Poziom 24  
    Zrobiłeś testy, że wyciągasz wnioski o nieprawidłowości softu po stronie Windows ?
    I jeszcze jedno po stronie Windows masz możliwości debugowania czy to jakaś zamknięta aplikacja ? Nawet jeśli zamknięta to zainstaluj sobie jakiś soft do debugowania USB i wówczas będziesz wiedział jakie pakiety wysyłasz i co jest powodem.
  • #18 13545242
    Konto nie istnieje
    Konto nie istnieje  
  • #19 13549801
    Eagle
    Poziom 24  
    Pytasz czy stwierdzasz i co to ma wspólnego z tezą, że if z pierwszego postu nie działa poprawnie ?
  • #20 13585384
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA