Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 17 maja 2025, o 12:45


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
    Autor Wiadomość
    PostNapisane: 20 kwi 2014, o 12:37 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Po raz kolejny patrzę na kod, a błędu doszukać się nie mogę...

    Sytuacja wygląda następująco:
    Buduję prosty licznik Geigera do monitoringu promieniowania tła (dodatkowo będzie też posiadał elektroniczny barometr i termometr). Wyniki mają być raportowane za pośrednictwem sieci LAN. Druga strona otrzymuje żądaną wartość po wysłaniu komendy AT a pakiecie UDP. W przyszłości dodam też obsługę protokołu HTTP.
    ATmega jest taktowana sygnałem zegarowym o częstotliwości 12,5 MHz, pochodzącym z ENC28J60.

    Od strony sprzętowej wszystko działa. Przetwornica wytwarza właściwe napięcie, tuba reaguje na przelatujące cząstki, wzmacniacz wysyła impulsy na wejście T1 ATmegi328. Rejestr TCNT1 inkrementuje się po każdym impulsie. Działa też komunikacja po Ethernecie. Zabrałem się więc za pisanie właściwych procedur obsługujących pomiar promieniowania. Na początek poszło zliczanie wartości CPM (zliczenia na minutę).

    Kod zaprezentowany poniżej.

    Konfiguracja Timera0, tryb CTC, przerwanie mniej-więcej co 1 milisekundę.
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Samo przerwanie wygląda następująco:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Zmienne millis i seconds są zdefiniowane jako volatile w pliku main.c, natomiast sześćdziesięcioelementowa tablica geiger_pulses w osobnym pliku geiger.c. Oczywiście w geiger.h znajduje się jej deklaracja jako extern. Oczywiście sama tablica również jest volatile.

    Do pobierania aktualnej wartości CPM służy następująca funkcja z pliku geiger.c:
    Składnia: [ Pobierz ] [ Ukryj ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Globalna obsługa przerwań jest włączona za pomocą sei()

    Wszystko wydaje się być w porządku, a jednak nie działa. Wszystko wskazuje na to, że nie wykonuje się albo samo przerwanie, albo zawarty w nim warunek. Funkcja cpm() za każdym razem zwraca 0, natomiast rejestr TCNT1 inkrementuje się cały czas, zliczając kolejne impulsy, tymczasem powinien być zerowany co sekundę.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 kwi 2014, o 12:51 
    Offline
    Użytkownik

    Dołączył(a): 19 gru 2012
    Posty: 712
    Lokalizacja: Opole
    Pomógł: 23

    Skoro kolega zastanawia sie czy nie działa mu przerwanie czy warunek w środku to może należało by spróbować najprostszej formy sprawdzania kodu: http://mirekk36.blogspot.com/2014/04/puapki-programowe-debuger-na-jednej.html



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 20 kwi 2014, o 12:58 
    Offline
    Użytkownik

    Dołączył(a): 05 gru 2013
    Posty: 246
    Pomógł: 0

    Za chwilę sprawdzę z diodą. Na chwilę obecną i tak nie ma to wielkiego znaczenia, bo bez względu na to czy ustalę jedną czy drugą sytuację, nie mam zielonego pojęcia gdzie szukać przyczyny.

    Na razie jednak zauważyłem inną rzecz.
    Mianowicie z ciekawości zajrzałem do datasheeta ATmegi 328P, a dokładnie do tabelki z rozpiską wektorów przerwań.
    Widzę tam, że "TIMER0 COMPA" odpowiada wektor nr. 15.
    Atmel Studio wyświetla mi natomiast następującą definicję:
    #define TIMER0_COMPA_vect _VECTOR(14)

    Zgodnie z dokumentacją układu, wektor 14 odpowiada przepełnieniu Timera1.

    Błąd jest w dokumentacji? Autorzy Atmel Studio aż tak bardzo by namieszali? A może po prostu numerki są inne niż w datasheecie, ale odnoszą się do tych samych zdarzeń?

    UPDATE:
    Już prawdopodobnie widzę przyczynę. Pomieszała mi się lokalizacja bitów w rejestrach konfiguracyjnych. Wgrywam nowy wsad i zobaczę, czy to jedyny bug. ;)
    Przepraszam za zamieszanie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 15 gości


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO