Witam,
zmagam się z tym problemem już dobrze ponad tydzień, miałem nadzieję, że uda mi się samemu go rozwiązać, jednak nie obejdzie się bez pomocy bardziej doświadczonych w temacie
Otóż problem jest jak w temacie, dosyć rozbudowany wsad (ponad 96% pamięci) działa poprawnie, nie zauważyłem żadnych anomalii, błędów logicznych czy obliczeniowych. No wszystkie funkcje działają poprawnie, z tym, że program się wiesza w dość losowych momentach. Mam juz praktycznie gotowy wsad i zacząłem go testować przez dłuższy czas i dopiero teraz to wyszło na jaw.
Czasami wiesza się po 3 godzinach, a czasami po 10.
Trochę o samym układzie: całość składa się z dwóch procesorów, m16 jako nadrzędnego oraz m8 jako podrzędnego podpiętego po I2C. Do tego jest jeszcze PCF8583. Procesory poubierane w kondziory 100n. Stabilizacja zasilania typowa dla LM7805 (100n na we i wy, 100uF na we, 470uF na wy).
Do m16 jest podpiętych 6 przycisków, wyświetlacz lcd, buzzer oraz sterowanie podświetleniem lcd. Jest także czujnik indukcyjny NPN NO podpięty pod wejście przerwaniowe oraz sygnał z PCFa pod drugie wejście przerwaniowe.
Do czego doszedłem sam:
-najprawdopodobniej można odrzucić zakłócenia z sieci, od tego zacząłem, bo wszystko było zasilane z mojego prymitywnego zasilacza +12V. Podłączyłem układ do zasilacza z laptopa (wydaje mi się, że powinien mieć zdecydowanie lepsze filtry) i problem nadal występuje.
-początkowo nie miałem zmiennych używanych "wielowątkowo" jako volatile - co jednak nie powodowało żadnych problemów w działaniu. Poczytałem o konieczności używania tego słowa kluczowego oraz kwiatków jakie niektórzy przez jego brak mieli i podopisywałem gdzie trzeba - bez zmian w działaniu, nadal się wiesza.
-wydaje mi się, że problemu nie stwarza I2C - PCF raczej chyba się nie wiesza, druga atmega również. Wykluczyłem to w prosty sposób - odłączałem m8, wtedy m16 zamierałą (while...) w oczekiwaniu na jej odpowiedź. Po podłączeniu m8 program ruszał dalej. W momencie zwisu podawałem ręcznie masę na reset m8, co wg mnie powinno spowodowac zachowanie jak wyżej jeśli powodem byłaby zwiecha m8 i oczekiwanie m16.
-prawdopodobnie wieszanie ma związek z czujką indukcyjną (w założeniu ma pracować ona sobie przy kole pojazdu jako sensor prędkości i drogi), ponieważ gdy jej nie używałem (koło symulowałem wiatraczkiem z komputera z doczepionymi elementami metalowymi) program działał nieprzerwanie przez ponad dobę, gdy tylko "koło" zacznie pracować następuje zwis po jakimś, bliżej nieokreśłonym czasie ("koło" testowe zawsze obraca się mniej więcej z tą samą prędkością). W związku z tą losowością nie wiem do czego sie przyczepić, ponieważ czy program sobie coś zlicza (przejechana droga) czy nie zwis następuje (czyli zapewne samo działanie czujki czyli obliczanie prędkości powoduje problem).
Przejżałem kod kilkukrotnie, pierwonie prędkość była obliczana w przerwaniu (wiem wiem, mnożenie i dzielenie floatów jest zbyt długie na obcowanie z przerwaniem, jednak podczas testów w trakcie programowania wszystko działało), przeniosłem więc tą najbardziej czasochłonną część do pętli głównej programu - też nic to nie dało.
Jednym słowem skończyły mi się pomysły...program jest obszerny, całości nie będę wrzucał (1500 linii kodu w samym pliku głównym), proszę o wskazówki to umieszczę fragmenty odpowiedzialne za wybrane części.
Pozdrawiam
zmagam się z tym problemem już dobrze ponad tydzień, miałem nadzieję, że uda mi się samemu go rozwiązać, jednak nie obejdzie się bez pomocy bardziej doświadczonych w temacie
Otóż problem jest jak w temacie, dosyć rozbudowany wsad (ponad 96% pamięci) działa poprawnie, nie zauważyłem żadnych anomalii, błędów logicznych czy obliczeniowych. No wszystkie funkcje działają poprawnie, z tym, że program się wiesza w dość losowych momentach. Mam juz praktycznie gotowy wsad i zacząłem go testować przez dłuższy czas i dopiero teraz to wyszło na jaw.
Czasami wiesza się po 3 godzinach, a czasami po 10.
Trochę o samym układzie: całość składa się z dwóch procesorów, m16 jako nadrzędnego oraz m8 jako podrzędnego podpiętego po I2C. Do tego jest jeszcze PCF8583. Procesory poubierane w kondziory 100n. Stabilizacja zasilania typowa dla LM7805 (100n na we i wy, 100uF na we, 470uF na wy).
Do m16 jest podpiętych 6 przycisków, wyświetlacz lcd, buzzer oraz sterowanie podświetleniem lcd. Jest także czujnik indukcyjny NPN NO podpięty pod wejście przerwaniowe oraz sygnał z PCFa pod drugie wejście przerwaniowe.
Do czego doszedłem sam:
-najprawdopodobniej można odrzucić zakłócenia z sieci, od tego zacząłem, bo wszystko było zasilane z mojego prymitywnego zasilacza +12V. Podłączyłem układ do zasilacza z laptopa (wydaje mi się, że powinien mieć zdecydowanie lepsze filtry) i problem nadal występuje.
-początkowo nie miałem zmiennych używanych "wielowątkowo" jako volatile - co jednak nie powodowało żadnych problemów w działaniu. Poczytałem o konieczności używania tego słowa kluczowego oraz kwiatków jakie niektórzy przez jego brak mieli i podopisywałem gdzie trzeba - bez zmian w działaniu, nadal się wiesza.
-wydaje mi się, że problemu nie stwarza I2C - PCF raczej chyba się nie wiesza, druga atmega również. Wykluczyłem to w prosty sposób - odłączałem m8, wtedy m16 zamierałą (while...) w oczekiwaniu na jej odpowiedź. Po podłączeniu m8 program ruszał dalej. W momencie zwisu podawałem ręcznie masę na reset m8, co wg mnie powinno spowodowac zachowanie jak wyżej jeśli powodem byłaby zwiecha m8 i oczekiwanie m16.
-prawdopodobnie wieszanie ma związek z czujką indukcyjną (w założeniu ma pracować ona sobie przy kole pojazdu jako sensor prędkości i drogi), ponieważ gdy jej nie używałem (koło symulowałem wiatraczkiem z komputera z doczepionymi elementami metalowymi) program działał nieprzerwanie przez ponad dobę, gdy tylko "koło" zacznie pracować następuje zwis po jakimś, bliżej nieokreśłonym czasie ("koło" testowe zawsze obraca się mniej więcej z tą samą prędkością). W związku z tą losowością nie wiem do czego sie przyczepić, ponieważ czy program sobie coś zlicza (przejechana droga) czy nie zwis następuje (czyli zapewne samo działanie czujki czyli obliczanie prędkości powoduje problem).
Przejżałem kod kilkukrotnie, pierwonie prędkość była obliczana w przerwaniu (wiem wiem, mnożenie i dzielenie floatów jest zbyt długie na obcowanie z przerwaniem, jednak podczas testów w trakcie programowania wszystko działało), przeniosłem więc tą najbardziej czasochłonną część do pętli głównej programu - też nic to nie dało.
Jednym słowem skończyły mi się pomysły...program jest obszerny, całości nie będę wrzucał (1500 linii kodu w samym pliku głównym), proszę o wskazówki to umieszczę fragmenty odpowiedzialne za wybrane części.
Pozdrawiam
