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



Teraz jest 3 kwi 2026, o 06:28


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 11 ] 
Autor Wiadomość
PostNapisane: 4 gru 2013, o 15:29 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Witajcie.
Dalej z prostą sprawą nie mogę sobie poradzić i dlatego proszę o pomoc.
Co tutaj nie działa.
Program miał działać w taki sposób, że zlicza czas impulsu i proporcjonalnie do tego czasu ustawia PWM przeskalowując go przez stałą wsp
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


nie bardzo łapię dlaczego przy funkcji for jest błąd
jak zamienię to na taką postać
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

to nie pokazuje błędu, ale nie działa - albo coś źle sprawdzam, bo to musi działać.
Ale patrząc na ten przykład to jeśli jest stan wysoki (PWM_in==1) to wejdź w pętle for i rozpocznij zliczanie Timera2 od 1 i zliczaj dopóki PWM_in będzie PRAWDĄ, a jeśli jest to zwiększ Timer2 o jeden i tak w kółko aż warunek if nie zostanie spełniony więc wtedy wykona się przypisanie wielkości pomierzonej od Timera2 (pomnożone przez jakiś współczynnik) do OCR2.
Gdzieś tutaj musi być jeszcze coś co przeoczyłem tylko nie wiem co.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 15:56 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

Błąd wyskakuje bo nie zamykasz linii z for'em, powinno być tak:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 16:04 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

OK. Masz rację z tym, że dalej nie działa.
Znalazłem jeszcze że linia PB0 nie jest nigdzie określona czy jest wejściem czy wyjściem
czyli
Kod:
DDRB |= PWM_in;



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 16:12 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

Może problemem jest to że OCR się szybko przepełnia, procek w sumie nic nie robi prawie to te 255 to zliczy migiem, trzeba by sprawdzać to co jakiś czas - np timerem programowym.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 16:17 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

To z i wstawiłem przykładowo - ale może masz rację. Timer2 jest 16bit więc trochę więcej ma do zapętlenia. Na razie odłączyłem układ testowy bo potrzebowałem inną rzecz sprawdzic, ale teraz powinno być OK.

Ale pytanie z innej beczki początkującego.

Pętla while(1) wykonywana jest z częstotliwością 8MHz. Program wchodzi do pętli for i czy teraz w czasie kiedy są wykonywane instrukcje z for (a to będzie czas dopóki na PWM_in jest stan wysoki wykonuje jakies inne operacje które są poza funkcją for?
Pytam się bo teraz ta funkcja for będzie mi zatrzymywala program glowny w nierownych odstepach tzn jesli na PB0 są krotkie impulsy to zatrzymanie bedzie krotkie, ale jak beda dlugie to bedzie dlugo zatrzymywana .
Czy dobrze mysle?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 16:38 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

iwi napisał(a):
Timer2 jest 16bit więc trochę więcej ma do zapętlenia.
ale w kodzie w komentach masz tryb fast pwm 8b, poza tym mega 8 ma timer 2 własnie 8 bitowy:)

iwi napisał(a):
Pętla while(1) wykonywana jest z częstotliwością 8MHz.
Nic podobnego, 1/8 us to czas jednego cyklu zegarowego, Twoja pętla będzie miała kilkadziesiąt cyknięć przy jednym obrocie.
Zresztą jak zauważyłeś program bedzie zatrzymywany w pętli for w zależności od długości impulsu.
iwi napisał(a):
wykonuje jakies inne operacje które są poza funkcją for?
nie.
Dlatego ja proponuje przyjąć timer programowy i sprawdzać co np. 10 us czy aby we nie jest wysokie i jeśli się utrzymuje to inkrementować zmienną, a po zaniku impulsu mnożyć razy współczynnik i do OCR.
Można też wykorzystać wejście przerwaniowe lub tryb ICR Timera1.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 17:26 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Tryb PWM jest 8 bitowy, natomiast tylko zliczanie zmiennej Timer2 (zbieżność nazwy) jest w 16 bitach bo obawiałem się, że łatwo może przekroczyć 255 i co wtedy :)
w każdym razie zrobię próby i zobaczę na jakiej wartości się zatrzymuje Timer2 przy 99% wypełnieniu impulsu po to jest wsk żeby potem przeskalować.

Ale jeszcze jedna kwestia.
Jeżel ten impuls zwiększy wypełnienie do 99% to będzie OK, ale jeżeli pojawi się ciągły sygnał na wejściu to wtedy pętla for się zatrzyma i będzie czekała na stan niski na wejściu PB0. Więc jeszcze do przeróbki ta funkcja - tylko kiedy przyrównać OCR2 do 255?.
Cytuj:
Dlatego ja proponuje przyjąć timer programowy i sprawdzać co np. 10 us czy aby we nie jest wysokie i jeśli się utrzymuje to inkrementować zmienną, a po zaniku impulsu mnożyć razy współczynnik i do OCR.
Można też wykorzystać wejście przerwaniowe lub tryb ICR Timera1.

a możesz dać jakiś przykład bo nie za bardzo wiem o co w tym chodzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 17:45 
Offline
Użytkownik

Dołączył(a): 12 paź 2012
Posty: 207
Lokalizacja: Rzeszów
Pomógł: 16

iwi napisał(a):
Tryb PWM jest 8 bitowy, natomiast tylko zliczanie zmiennej Timer2 (zbieżność nazwy) jest w 16 bitach bo obawiałem się, że łatwo może przekroczyć 255 i co wtedy :)

ale finalnie wpisujesz do rejestru OCR2- który jest 8 bitowy i jeśli obserwujesz wyjście PWM np. z dołączoną diodką to obawiam się że rejestr OCR2 będzie miał ciągle duzą wartość ~255.

iwi napisał(a):
Jeżel ten impuls zwiększy wypełnienie do 99% to będzie OK, ale jeżeli pojawi się ciągły sygnał na wejściu to wtedy pętla for się zatrzyma i będzie czekała na stan niski na wejściu PB0. Więc jeszcze do przeróbki ta funkcja - tylko kiedy przyrównać OCR2 do 255?.
musisz przyjąć jakąś skale / współczynnik do przeliczania i określić zakres długości impulsów na wejściu np. od 1ms (OCR2=1) do 1s (OCR2=255).
Napisz jakie czasy będą miały te impulsy. A co do przykładu to moze zaraz coś skrobnę.

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 gru 2013, o 17:58 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Impulsy będą z stałą częstotliwością 2kHz
Więc na wejściu częstotliwość się nie będzie zmianiała, ale możnaby zrobić funkcję uniwesralną, która by zliczała zarówno czas wysokiego stanu jak i niskiego i potem dzieląc stan wysoki przez sumę wyszedłby współczynnk do OCR2.

Ale nie robiłem tego ze wzgledu na tą for - zajęłaby mi cały procesor bo wykonywałaby się albo jedna for (PWM_in) albo druga for (!PWM_in)
ale z Tym Twoim przykładem nie byłoby to takie głupie :) czyli mierzyłoby się co 10 obrotów zegara czas jeden i czas drugi więc to za bardzo już nie obciąży.

Na razie to jest na Atmedze8, ale nie ukrywam, że na Tiny13 chcę to zmieścić - albo Tiny26 i wtedy dodatkowo wyświetlacz i ADC. Więc ogólnie procesor będzie miał co robić.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2013, o 12:11 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Zainspirowałeś mnie przerwaniami i poszukałem i poczytałem i coś takiego stworzyłem. Jeszcze nie sprawdzałem, bo mam dużo niewiadomych a pierwszy raz chcę użyć przerwań do tego celu.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po pierwsze czy w funkcji obsługi przerwań ISR dobrze jest zapisany warunek z maskowaniem bitów? Chodzi mi o to, że przerwanie nie rozpoznaje kiedy zmienia się stan z 0 na 1 a kiedy z 1 na 0 więc takim zapisem powinno to się wyrównać
ewnetualnie ten warunek dodatkowy z maskowaniem (PIND == (0x02 & 0xFF)) trzeba przenieść do funkcji while(1)
Czy trzeba ustawić wyzerować bit INTF0 w rejestrze GIFR?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 gru 2013, o 12:46 
Offline
Użytkownik

Dołączył(a): 05 lis 2013
Posty: 353
Lokalizacja: Kraków
Pomógł: 6

Chciałem sprawdzać dokładnie kiedy na PD2 będzie stan 1 albo 0 więc dlatego maskowanie całego portu D
Ale jeszcze takie coś wymyśliłem
W rejestrach ustawiamy dodatkowo
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i teraz wyzwalamy przerwanie stanem narastającym.
teraz startujemy z i=0 i czekamy na narastający impuls na wejściu PD2
a w funkcji przerwań dodajemy takie coś
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.



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

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