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



Teraz jest 23 sty 2026, o 08:17


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 7 ] 
Autor Wiadomość
PostNapisane: 7 sty 2014, o 22:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

Witam

Nawet się mi zrymował ten tytuł, ale do rzeczy.

Mam przerwanie sprzętowe INT0 zsynchronizowane z siecią oraz przerwanie od timera sprzętowego co 0,05 ms.
Program działa tak, że gdy wystąpi przerwanie INT0 to jest zerowana zmienna "i" a w przerwaniu od timera jest ona inkrementowana i jeżeli osiągnie jakąś wartość to ma wystawić stan wysoki na pin uC.
Sprawdzam wartość "i" dwa razy pomiędzy wystąpieniem przerwania INT0 (bo zdążam ewentualnie zdanżam ;-) tzn. nie ja tylko mikrokontroler).
Wszystko jest OK z tym, że dzieje się to w nierównych odcinkach czasu (bardzo nierównych).
Tzn. pierwsze sprawdzenie jest w spodziewanym czasie a drugie się waha i to o całą 1ms. Załączam screeny z osc.

ObrazekObrazekObrazek

Dodam, że taktuje procesor wew. rezonatorem, ale takich odchyłek chyba nie ma?
Proszę jakiś trop. Lub Pana Mirka o kolejną część poradnika o przerwaniach dla średnio-zaawansowanych.

_________________
Trochę tu, trochę tam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2014, o 23:00 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

niemy napisał(a):
timera sprzętowego co 0,05 ms

Na pewno 0,05ms = 50us to zbyt często.
Jak taktujesz mikrokontroler? Jakiego przerwania używasz? Może podasz kod konfiguracji i obsługi przerwania od timera.
Te zrzuty nic mi niestety nie mówią. Nie lepiej w Eagle w edytorze schematów z włączoną siatką to narysować i podpisać.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2014, o 23:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 10 mar 2013
Posty: 739
Lokalizacja: Poznań
Pomógł: 84

Bez kodu ciężko cokolwiek powiedzieć ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 sty 2014, o 23:37 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

Sorry za screeny tam po prostu jest podziałka i widać jak druga szpilka "wędruje"

Ale nic to.
Procesor taktuje 8 MHz
Tak inicjalizuję przerwania:

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


Potem obsługa przerwań tak:

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


Sęk w tym, że kiedy i==k1 to jest w miarę OK problem jest kiedy i==k2. Tak jakby w miarę upływu czasu dana "i" przestaje być inkrementowana w równych odcinkach czasu.Pozostała część kodu to zaledwie dziesięć linijek w których właśnie ustalam wartości k1 i k2.

_________________
Trochę tu, trochę tam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2014, o 00:03 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

Super dokładnie to tak powinno być:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2014, o 10:04 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 lis 2012
Posty: 35
Lokalizacja: Jaworzno
Pomógł: 0

No właśnie o to też chciałem zapytać. Bo wszystkie te kalkulatory wyliczaja 49 a według tego wzoru wychodzi 50.
Dzieki za potwierdzenie.

A co z głównym problemem ?

_________________
Trochę tu, trochę tam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 sty 2014, o 19:36 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

No jakbyś miał taktowanie 1MHz to bym powiedział, że 50 rozkazów od przerwania do przerwania to mało, ale masz 8*50, więc nie widzę problemu. Piszesz, że zmienna i przestaje być inkrementowana w równych odcinkach czasu, ale to się dzieje w przerwaniu od porównania timera. Tylko inne długo wykonujące się przerwanie mogło by wpłynąć na ten czas (przykładowo wejście INT nie jest podciągnięte a sterowane jest przez tranzystor transoptora). A czy zmienna i jest odpowiednio duża i się nie przekręca czy ma modyfikator volatile? Co robisz ze zmienną i w pętli głównej, bo też należy do tego podchodzić w specjalny sposób. Skoro i ma co najmniej rozmiar 2 bajtów to w pętli głównej sprawdzanie jej wartości powinno być zawarte w bloku ATOMIC_BLOCK. Może pokaż cały kod.

_________________
Dragonus Cracovus: Biomagia



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: 7 ] 

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