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



Teraz jest 22 sie 2019, o 11:01


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 2 ] 
Autor Wiadomość
PostNapisane: 5 sie 2019, o 20:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 mar 2014
Posty: 163
Lokalizacja: Kielce
Pomógł: 2

Cześć,

Mam mały problem Timerem sprzętowym. Coś robię źle, ale nie mam pomysłu co :roll:

Mianowicie chcę zrobić generatorek, który generuję sygnał prostokątny z określoną częstotliwością. Częstotliwość jest zmieniana poprzez zmianę wartośći rejestru OCR1A. Procek to Atmega 328PB taktowana kwarcem 16 Mhz.

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


Zmiana wartości rejestru jest realizowana poprzez podział Dzielnika który ma wartość 15 625. Wartość tą dzielę przez wartość zmiennej enkoder1, która wynosi kolejno 1,2,3 itd. w zależności jak kręcę enkoderem.

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


Wszystko jest ok, założenia spełnione. Lecz zaobserwowałem dziwne zachowanie. Mianowicie podczas zmiany wartości zmiennej enkoder1, procek jakby na chwilę przystaje i po chwili realizuję generowanie sygnału. Na wyjściu mam podłączoną diodę więc jak zmieniam częstotliwość to miga szybciej albo wolniej, ale zdarzają się momenty, że na chwilę jakby procek się zatrzymał i dioda nie świeci.

A może to przez to, że podczas dzielenia generuje się liczba po przecinku a jak mam typ int ?? Co myślicie ??

_________________
BlueBook



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 sie 2019, o 07:39 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 496
Pomógł: 123

Przedstawiłeś zbyt mało kodu. Istotne jest, w jakim momencie zmieniasz wartość OCR1A. Zapis do tego rejestru w trybie CTC jest natychmiastowy (nie ma podwójnego buforowania), więc jeśli wpisujesz do niego wartość mniejszą od aktualnej wartości TCNT1, to porównanie w tym cyklu zliczania zostanie pominięte. W efekcie tego licznik nie zostanie wyzerowany, tylko będzie musiał doliczyć do maksymalnej pojemności licznika i dopiero w następnym cyklu nastąpi porównanie (przy preskalerze 1024 to opóźnienie będzie szczególnie widoczne).

Widzę, że masz włączone zezwolenie na przerwanie od porównania. Jeśli tak do tej pory nie miałeś, to najlepiej wynik obliczeń Dzielnik/enkoder1; wpisywać do jakiejś zmiennej pośredniczącej, a dopiero w procedurze obsługi przerwania od przepełnienia kopiować go do rejestru OCR1A. Nadal może być problem przy niskich wartościach OCR1A i preskalera, ale przy preskalerze 1024 powinno działać OK. Ewentualnie zamiast trybu CTC użyj innego trybu, gdzie zapis do rejestru jest OCR1A jest synchronizowany sprzętowo (podwójnie buforowany), np. trybu 15 (Fast PWM).

_________________
Miksowanie kodu C i ASM przy użyciu GCC



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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