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



Teraz jest 19 gru 2025, o 12:44


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 2 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