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



Teraz jest 19 kwi 2024, o 10:23


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 18 ] 
Autor Wiadomość
PostNapisane: 7 gru 2017, o 14:33 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Witam, chciałbym wygenerować przebieg z określoną częstotliwością (którą można by zmieniać) oraz zmiennym wypełnieniem. i Nie wiem w jaki sposób to ugryźć. O ile wygenerować przebieg o danej częstotliwości nie będzie problemu (np. Timer0 tryb CTC) to dołożyć mu konkretne wypełnienie to już dla Mnie bardzo duży problem.
Proszę o jakąś poradę w jaki sposób mogę się do tego zabrać.

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2017, o 15:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

cześć
Nie piszesz jaki procesor więc nie dostaniesz gotowca, ale poczytaj o pracy timera sprzętowego w trybie PWM i masz to co chcesz

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2017, o 17:28 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Mczarny mi nie chodzi o gotowca, wręcz przeciwnie chciałbym samemu jakoś to napisać. W takim razie pokaże co mam i może ktoś podpowie co dalej, wtedy będzie łatwiej.
Jak wygenerować impuls 20ms co określony czas nie używając delay.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2017, o 17:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 26 sty 2016
Posty: 1148
Lokalizacja: Kraków
Pomógł: 93

Jeżeli w tym przypadku chcesz zmienić wypełnienie, a "tyknięcie" masz co 20 ms, to możesz zrobić dowolny sygnał który będzie miała częstotliwość i wypełnienie jako wielokrotności 20 ms.
Jako okres możesz wziąć na przykład 200 wywołań przerwania - Ty inkrementujesz zmienną s, możesz dołożyć drugą zmienną i ją też inkrementować.
Natomiast wypełnienie określasz jako część z tych (przykładowo) 200 "tyknięć".
Jeżeli zmienna < wypełnienia -> ustawiasz 1
Jeżeli zmienna >= wypełnienie -> ustawiasz 0
Prościej nie potrafię tego wytłumaczyć



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 gru 2017, o 19:51 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

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


To jednak nie działa przez przypadek wgrywałem program który zrobiony był na delay

_________________
True Females



Ostatnio edytowano 9 gru 2017, o 15:57 przez Xmen, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2017, o 15:56 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2017, o 20:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Xmen napisał(a):
Witam, chciałbym wygenerować przebieg z określoną częstotliwością (którą można by zmieniać) oraz zmiennym wypełnieniem.

Jak pewnie zauważyłeś, nie ma chętnych do odpowiedzi. Najprawdopodobniej wynika to z tego, że podałeś za mało danych.

Xmen napisał(a):
Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.

Taki efekt można uzyskać na wiele różnych sposobów. Który sposób będzie najbardziej odpowiedni w danej sytuacji zależy od tego, jakie konkretnie są inne wymogi.
W Twoim przypadku istotne będzie:
  1. Jaka to jest "określona częstotliwość" (1Hz?) i w jakim zakresie ma być zmieniana?
  2. Jaka dokładność i rozdzielczość regulacji częstotliwości i wypełnienia jest wymagana?
  3. Jakiego mikrokontrolera dotyczy pytanie? (różne timery w różnych mikrokontrolerach mają różne zestawy trybów pracy i różne zestawy wartości preskalera)
  4. Czy możesz poświęcić do wykonania zadania timer 16-bitowy, czy jest Ci potrzebny do czegoś innego?
  5. Czy sygnał wyjściowy musi być na pinie PC0, czy może być na innym?
Częstotliwość taktowania widzę, że podana jest gdzieś w kodzie, ale na przyszłość nie zaszkodziłoby, gdybyś podawał taką informację także w opisie, szczególnie w przypadku, gdy problem dotyczy timerów.

Podejrzewam, że niepotrzebnie robisz takie kombinacje. Być może nawet zadanie można wykonać wykorzystując wyłącznie sprzętowe generowanie sygnału PWM, bez konieczności stosowania flag, dodatkowych zmiennych zliczających przerwania, może nawet bez obsługi przerwań, ale musisz konkretnie się określić co do wymagań.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 gru 2017, o 22:13 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Cytuj:
Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.


Procesor ATMega 644 PA
Co sekundę załączenie PC0 na 25ms:
Poradziłem sobie w ten sposób jakoś mi się to udało po wielu próbach błędów, choć chciałbym zobaczyć jak można zrobić to dużo prościej, przyjmując, że częstotliwość 1Hz i czas trwania impulsu załączonego portu PC0 to 25ms.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Jednego nie rozumie gdybym chciał załączać port co dwie sekundy - (utworzyłem taką zmienna w przerwaniu) i później przekazuję ją do funkcji pompka() gdzie w pierwszym warunku if(flaga==2) (sprawdzam czy zmienna jest równa 2 - minęły dwie sekundy), program dalej wysyła impuls co sekundę. Czemu tak się dzieje ?

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 11:39 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Nie bardzo rozumiem, bo najpierw piszesz, że chcesz zmieniać częstotliwość i wypełnienie. Później piszesz, że chcesz po prostu impuls 25ms co 1 sekundę, więc jak to właściwie jest?

Xmen napisał(a):
Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.

Jeśli tyko o to chodzi...
Generowanie programowego PWM wiąże się zwykle z pewnymi minimalnymi niedokładnościami w generowanym sygnale, jednak przy tej wartości preskalera i generowanej częstotliwości jest to praktycznie bez znaczenia, dlatego metoda której użyłeś jest odpowiednia. Myślę jednak, że niepotrzebnie to tak skomplikowałeś. Można na przykład tak:

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


Taki sam efekt można również uzyskać na przykład za pomocą 16-bitowego timera 1 generując sygnał całkowicie sprzętowo, bez konieczności zliczania przerwań i programowej zmiany stanu pinu wyjściowego, ale w komentarzach do Twojego kodu zauważyłem coś o programowym PWM, więc tego rozwiązania nie podaję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 12:38 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Z początku chciałem mieć możliwość załączenia PORTu co określony "CZAS" i różną długością tego impulsu lecz odpuściłem sobie to z tego względu gdyż dla stałych wartości miałem problem napisać program.
Ten sposób który podałeś jest faktycznie bardzo uproszczony, nie wpadłem na taki sposób - szkoda.
Jeszcze pytanie w twoim przykładzie jeśli chciałbym regulować czas trwania impulsu wystarczyło by w warunku else if (cnt==czas) gdzie zmienna "czas" byłaby zmienną typu volatile i czas trwania byłby wielokrotnością 5ms dobrze myślę ?
A co z czasem np. co 2s, 2.5s, itp ?

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 16:36 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Xmen napisał(a):
Jeszcze pytanie w twoim przykładzie jeśli chciałbym regulować czas trwania impulsu wystarczyło by w warunku else if (cnt==czas) gdzie zmienna "czas" byłaby zmienną typu volatile i czas trwania byłby wielokrotnością 5ms dobrze myślę ?

Dobrze. Oczywiście zmienna czas (trwania impulsu, czyli stanu wysokiego) musiałaby być zmienną globalną.

Cytuj:
A co z czasem np. co 2s, 2.5s, itp ?

W warunku if (++cnt==200), wartość 200 zamieniasz na zmienną globalną volatile (np. o nazwie okres).
W celu osiągnięcia dłuższych okresów trwania impulsu przy zachowaniu rozdzielczości 5ms musiałbyś użyć zmiennych o większym zakresie, czyli np. typu uint16_t. Dotyczy to zmiennych: globalnej okres i lokalnej statycznej cnt. Jeżli czas załączenia nie będzie przekraczał ok. 1,25s Twoja zmienna czas może pozostać bez zmian. Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Poza tym poza tym, aby zmieniać częstotliwość i wypełnienie "w locie" należałoby użyć buforowania, czyli aktualizować wartości zmiennych synchronicznie z osiągnięciem przez zmienną cnt wartości 0. Zapobiegnie to pewnym nieregularnościom przebiegu, które w tym przypadku będą dość wyraźnie widoczne ze względu długie czasy. Przy większych częstotliwościach np. przy sterowaniu jasnością LED może to być niezauważalne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 16:37 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Udało mi się uzyskać wystawianie sygnału dla różnego czasu powtarzania i czasu trwania impulsu.
Zmieniłem występowania przerwania co 1ms.
A czy w przyszłości mógłbym do tej funkcji pompka() zamiast tych zmiennych "czas" i t_impuls" przekazywać jakieś wskaźniki do jakiejś zmiennej ?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 3 minutach ]

Dodałem post chwile po twoim :)
Cytuj:
Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:
czy w BB była o tym mowa ? W jakim celu zapewnia się tą Atomowość operacji ?

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 17:27 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Widzę, że nadal brniesz w te flagi i funkcje.
W kodzie, który przedstawiłem nie chodziło tylko o prostotę. Twój sposób ma dość poważne wady.
Na przykład w procedurze obsługi przerwania sprawdzasz jakieś warunki, ustawiasz flagi i dopiero w pętli głównej programu uruchamiasz funkcję, która na podstawie tych flag ustawia odpowiednio wartości pinów.
Zastanowiłeś się, ile czasu minie pomiędzy wystąpieniem przerwania a zmianą stanu pinów?
Pomijając nawet to opóźnienie, na pewno nie będzie ono stałe więc czasy będą nieregularne. Poza tym co będzie, kiedy wewnątrz pętli głównej dodasz jakiś inny kod, dodatkowe funkcje (a zapewne dodasz, no bo gdzie będziesz zmieniał wartości zmiennych decydujących o czasach) i funkcja pompka() będzie musiała poczekać na swoją kolej?
A co będzie, jeśli będziesz musiał obsłużyć dodatkowo inne przerwania?
Dlatego zmiany stanu pinów powinny być zrealizowane wewnątrz procedury obsługi przerwania i to najlepiej zaraz na początku.

Xmen napisał(a):
andrews napisał(a):
Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:

czy w BB była o tym mowa ? W jakim celu zapewnia się tą Atomowość operacji ?

Nie mam ani BB ani GB, więc nie mam pewności, ale jak obserwuję tematy na forum dotyczące tych książek, to jestem przekonany, że na pewno gdzieś było i o programowym PWM, i o atomowym dostępie do zmiennych. Widzę za to, że Ty posiadasz i BB, i GB, więc może warto przeczytać?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 gru 2017, o 19:40 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Cytuj:
Widzę, że nadal brniesz w te flagi i funkcje.

No tak masz racje - ale nie potrafiłem inaczej tego rozwiązać.
Jestem bardzo początkującym i nie jestem w stanie sobie wyobrazić co by się działo z programem gdyby w głównej pętli było mnóstwo innych funkcji nie wspominając o dodatkowych przerwaniach.
Czyli wszystkie operacje na pinach należy przeważnie ZAWSZE wykonywać wewnątrz przerwania ?
Jeśli tak to nie wyobrażam sobie na chwilę obecną tak bardzo rozbudowanego projektu gdzie będzie w użyciu np. 20 pin wyjściowych i kilka wejściowych i trzeba na nich wszystko wykonywać wewnątrz procedury przerwania

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2017, o 10:33 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Xmen napisał(a):
Czyli wszystkie operacje na pinach należy przeważnie ZAWSZE wykonywać wewnątrz przerwania ?
Jeśli tak to nie wyobrażam sobie na chwilę obecną tak bardzo rozbudowanego projektu gdzie będzie w użyciu np. 20 pin wyjściowych i kilka wejściowych i trzeba na nich wszystko wykonywać wewnątrz procedury przerwania

A gdzie ja napisałem, że wszystkie piny?
Użyłem wprawdzie liczby mnogiej, ale to dlatego, że programowy PWM wykorzystuje się często w sytuacjach, kiedy musisz wygenerować PWM na większej ilości pinów, niż można to zrobić za pomocą wbudowanego sprzętowego generatora PWM, ponieważ ilość sprzętowych kanałów PWM jest ograniczona. Gdybyś poczytał o programowym PWM, to byś pewnie wiedział o co chodzi.

Jeżeli chcesz programowo wygenerować sygnał PWM na którymś pinie, używasz zwykle timera do odmierzania czasu. Kiedy ten czas minie i wystąpi przerwanie, musisz stan tego pinu zmienić akurat w tym momencie (czyli od razu w procedurze obsługi tego przerwania), a nie ustawiać jakieś flagi i zmieniać stan pinu dopiero w bliżej nieokreślonej przyszłości. Aby wiedzieć o co chodzi trzeba rozumieć co to jest przerwanie, do czego służy, jak działa system obsługi przerwań itd.

Xmen napisał(a):
No tak masz racje - ale nie potrafiłem inaczej tego rozwiązać.

Przecież podałem Ci przykładowy, gotowy kod programu. Wystarczy go skopiować do IDE jakiego używasz do pisania programów , skompilować, wgrać i już powinno działać. Później można ewentualnie próbować zmieniać coś, aby dostosować program do swoich potrzeb.

Xmen napisał(a):
Jestem bardzo początkującym i nie jestem w stanie sobie wyobrazić co by się działo z programem gdyby w głównej pętli było mnóstwo innych funkcji nie wspominając o dodatkowych przerwaniach.

Dlatego opanuj porządnie podstawy, a dopiero później realizuj trudniejsze zadania, bo mam wrażenie, że próbujesz przeskoczyć kilka poziomów, a tu tak się nie da. Informatyka to nauka ścisła, więc tak jak w matematyce nie da się rozwiązywać układów równań nie znając podstawowych operacji arytmetycznych, czy też zrozumieć rachunku całkowego bez wiedzy, co to jest wielomian, tak i tu należy zachować odpowiednią kolejność, żeby te klocki ułożyły się w jakąś logiczną całość.

Masz książki, więc czytaj, czytaj i czytaj. Jak kilka razy coś przeczytasz, a nie zrozumiesz to zadaj konkretne pytanie na forum, a na pewno ktoś wytłumaczy. Póki co, to odpowiedzi na Twoje pytania wymagają użycia pojęć, których nie rozumiesz, więc to rodzi następne pytania i tak w kółko. Nie sądzę, żeby komuś chciało się na forum książkę pisać, tym bardziej, że przecież masz książki, więc dlaczego nie używasz? Ja rozumiem, że to żmudna nauka i efekty przychodzą powoli, ale jeśli chcesz coś osiągnąć, to trzeba ten proces przejść.



Ostatnio edytowano 15 gru 2017, o 19:32 przez andrews, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2017, o 15:26 
Offline
Nowy

Dołączył(a): 27 sie 2015
Posty: 19
Lokalizacja: Usa
Pomógł: 0

Dzięki wielkie za pomoc i odpowiedzi. Lecz mam jeszcze jedno ostatni pytanie czy w tym przykładzie, które mi ty podałeś będę stanie zmieniać płynie czas powtarzania tego impulsu np. co 1s, 1,5s 2s itp. w zależności od jakiegoś warunku ? Bo z czasem trwania impulsu takiego problemu nie ma.

_________________
True Females



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2017, o 15:34 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Xmen napisał(a):
Dzięki wielkie za pomoc i odpowiedzi. Lecz mam jeszcze jedno ostatni pytanie czy w tym przykładzie, które mi ty podałeś będę stanie zmieniać płynie czas powtarzania tego impulsu np. co 1s, 1,5s 2s itp. w zależności od jakiegoś warunku ? Bo z czasem trwania impulsu takiego problemu nie ma.

Już raz odpowiadałem na to pytanie (link).
Zbyt dużo pisania, żeby opisać to wszystko szczegółowo.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 gru 2017, o 17:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Kolego Xmen

BB str.236 do 249 masz dokładny opis i zasadę działania PWM sprzętowego i programowego oraz gotowy kod programu dla sześciu kanałów programowych na str.248 i 249.
Masz książkę usiądź przeczytaj zrób tak jak autor pisze a jak czegoś nie zrozumiesz to zapytaj.
Gwarantuję Ci, że zajmie to mniej czasu niż robienie czegoś w ciemno...
pozdrawiam

_________________
Pomóżcie mi stanąć na nogi



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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