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



Teraz jest 18 paź 2019, o 07:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 22 ] 
Autor Wiadomość
PostNapisane: 5 paź 2019, o 18:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Witam bardzo proszę o podpowiedz w temacie w jaki sposób mogę wygenerować zmianę (np wartości zmiennej) w odpowiedzi na na opadające zbocze impulsu z 1 na 0 na określony czas,
konkretnie 11,92 us .
Dla zobrazowania o co mi dokładniej chodzi - działanie podobne do przerzutnika monostabilnego .
Czyli tak zmienna np. flaga_clk=1 przychodzi zmiana stanu i flaga_clk=0 na czas 11,92 us.
Problem tylko jest taki że przerwanie INT0 i INT1 mam już zajęte a działam na procesorze ATMEGA 32.
Proszę o jakieś podpowiedzi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2019, o 18:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

Jest jeszcze taki jeden mechanizm w procku który można wykorzystać do wygenerowania zewnętrznego przerwania. Zainteresuj się timerem1, pinem ICP1 i modułem Input Capture Unit tego timera. Co prawda mechanizm ten służy do innego celu ale kto zabroni użyć go do wywołania przerwania od zmiany stanu pinu...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2019, o 18:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Stosowałem takie przerwanie ale do określania czasu impulsów ISR(TIMER1_CAPT_vect), a podałbyś jaki przykład którym mógłbym się za wzorować?



Ostatnio edytowano 5 paź 2019, o 19:09 przez AKSELINEK, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2019, o 19:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

Skoro oba inty masz już zajęte to wspomniany mechanizm jest chyba jedynym dodatkowym źródłem umożliwiającym wywołanie przerwania w reakcji na zmianę stanu pinu dla tego procka. Możesz w obsłudze przerwania od ICP zmienić stan zmiennej oraz aktywować inny (bądź ten sam timer) na przerwanie od porównania, i jego porównanie ustawić na czas dokładnie taki jak potrzebujesz długość impulsu czyli te 11,92us, w przerwaniu od porównania z kolei zmienną wyzerować, wyzerować też i zatrzymać timer w przygotowaniu na wygenerowanie następnego impulsu.

------------------------ [ Dodano po: 24 minutach ]

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


Wszystko powyższe pod warunkiem że uC jest pędzone odpowiednio szybkim zegarem by wyrobił w procedurach przerwania bo ~12us to dosyć krótki czas...

------------------------ [ Dodano po: 40 minutach ]

możesz też na żywca zrobić opóźnienie w przerwaniu od ICP, ~12us to krótki czas więc zapewne pozostałym procesom nie zaszkodzi.
Do opóźnienia będzie trzeba użyć albo _delay_loop albo wstawki asemblerowej i policzyć właściwe opóźnienie względem F_CPU.

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  
PostNapisane: 5 paź 2019, o 19:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Bardzo Ci dziękuję za podpowiedz , ale czy przed pętlą główną muszę oczywiście jeszcze ustawić

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


wyjaśnij mi jeszcze ten drugi sposób _delay_loop1() - co to dokładnie znaczy ? w nawiasie wpisać jakąś cyfrę ? czy tak rozumem że to jest sposób na bardzo krótkie opóżnienie czy tak?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2019, o 20:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

Przed pętlą główną musisz jeszcze wstępnie skonfigurować timer1 czyli ustawić go do pracy w porównanie, policzyć i ustawić wartość dla porównania, włączyć przerwanie od porównanie i wreszcie włączyć globalne przerwania.

_delay_loop1() jak również _delay_loop2() to dwie funkcje opóźniające z wbudowanej biblioteki delay_basic.h i są to ubrane w funkcje wstawki asemblerowe. Do pierwszej funkcji podaje się wartości od 0 - 255, do drugiej 0 - 65535. Opóźnienie jest zależne od F_CPU, i wynosi dla pierwszej funkcji (value+1)*3 takty zegara, gdzie value to wartość jaką przekazujemy do funkcji zgodnie z powyższymi zakresami. Wartość 0 to opóźnienie 3 taktów zegara. Dla drugiej krok opóźnienia wynosi 4 takty zegara zapewne ze względu na dwubajtowy argument funkcji.
W bluebooku Mirek użył tych funkcji np w soft_I2C.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 paź 2019, o 20:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Bardzo Ci dziękuję trochę mi rozjaśniłeś dzięki. W tygodniu wgram do procka i opowiem o wynikach.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 14:53 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 506
Pomógł: 125

Pozwolę sobie zwrócić uwagę na pewne kwestie.

Pomysł kolegi xentis na wykorzystanie pinu ICP jako substytutu pinu INT jest jak najbardziej słuszny. Niezależnie jednak od tego, który pin będzie wykorzystany, należy pamiętać o zwłoce pomiędzy zboczem narastającym na pinie, a momentem zmiany wartości zmiennej. Gdybyś korzystał tylko z tego jednego przerwania, ten czas byłby po pierwsze bardziej powtarzalny, po drugie zapewne pomijalny. Jako że jednak planujesz korzystać z innych przerwań, a zbocze na pinie może pojawić się np. w trakcie obsługi innego przerwania, czas reakcji może się zmieniać i być dość długi, w zależności od tego, ile będzie trwała obsługa innych przerwań. Jeśli to nie jest problemem, to OK.

Jeśli reakcją na zbocze ma być zmiana wartości zmiennej, a nie np. stanu na jakimś innym pinie, to niestety rozwiązanie z opóźnieniem typu "time-wasting" (delay) w przerwaniu raczej nie zda egzaminu, i to nie ze względu na czas. Taka zmiana wartości zmiennej przecież nie miałaby sensu, gdyby program w jakiś sposób na ten fakt nie zareagował. W takim przypadku:
xentis napisał(a):
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
mikrokontroler nie będzie miał możliwości w jakikolwiek sposób zareagować na zmianę stanu zmiennej, chyba że zastosujemy zagnieżdżanie przerwań (czego raczej bym nie polecał początkującemu, tym bardziej w przypadku korzystania z delay). Ewentualnie reakcję na zmianę wartości zmiennej trzeba by też umieścić w procedurze obsługi przerwania, ale wtedy zastosowanie zmiennej flaga_clk raczej nie miałaby większego sensu.

Poniższy sposób jest może nieco bardziej skomplikowany, ale (imho) to zdecydowanie lepsze rozwiązanie, jeśli mikrokontroler ma mieć szansę "zauważyć" zmianę wartości zmiennej flaga_clk:
xentis napisał(a):
Możesz w obsłudze przerwania od ICP zmienić stan zmiennej oraz aktywować inny (bądź ten sam timer) na przerwanie od porównania, i jego porównanie ustawić na czas dokładnie taki jak potrzebujesz długość impulsu czyli te 11,92us, w przerwaniu od porównania z kolei zmienną wyzerować, wyzerować też i zatrzymać timer w przygotowaniu na wygenerowanie następnego impulsu


Ogólnie nie bardzo rozumiem całą koncepcję. 11,92us to dość krótki czas. Nawet przy zegarze 16MHz to tylko 190 taktów zegara. Aby zmiana wartości zmiennej nie pozostała niezauważona, musiałbyś zmienną flaga_clk testować co najmniej raz na 190 taktów, co może być trudne do osiągnięcia, szczególnie biorąc pod uwagę, że oprócz pętli głównej programu będziesz tam miał też obsługę innych przerwań. Flag używa się raczej w ten sposób, że w reakcji na zdarzenie (czyli np. na zbocze na jakimś pinie) taką flagę się ustawia, a zeruje dopiero po obsłużeniu takiej flagi.

_________________
Miksowanie kodu C i ASM przy użyciu GCC



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 16:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

andrews napisał(a):
mikrokontroler nie będzie miał możliwości w jakikolwiek sposób zareagować na zmianę stanu zmiennej
Słuszna uwaga. trochę nie przemyślałem tego drugiego pomysłu - miałby sens gdyby było sterowanie pinem a nie ustawianie flagi.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 17:19 
Offline
Nowy

Dołączył(a): 29 wrz 2019
Posty: 12
Pomógł: 0

AKSELINEK napisał(a):
INT0 i INT1 mam już zajęte a działam na procesorze ATMEGA 32

Zamień na Mega324.

PS
Co Cie skusiło do używania przestarzałego Mega32? Praktycznie każdy stary AVR ma nowszą, lepszą i najczęściej tańszą wersję.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 19:29 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 157
Pomógł: 17

AKSELINEK napisał(a):
Problem tylko jest taki że przerwanie INT0 i INT1 mam już zajęte a działam na procesorze ATMEGA 32.
Proszę o jakieś podpowiedzi.

Tak sobie popatrzyłem na dokumentacje ATMEGA32 i tam na nodze PB2 jest sygnał INT2 .
Może to uprości sprawę?

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 19:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

JarekB napisał(a):
Tak sobie popatrzyłem na dokumentacje ATMEGA32 i tam na nodze PB2 jest sygnał INT2 .
Kolega to ma sokoli wzrok, też patrzyłem w notę i tego nie zauważyłem :lol:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 20:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Bardzo dziękuję za zainteresowanie tematem. Chciałbym wspomnieć że nie upieram się na ustawianie zmiennej flaga_clk taka była jedynie moja myśl ale mogę również zmienić stan pinu mikrokontrolera.
Wprowadziłem w tym celu funkcję petla();
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Tworze pomału obsługę przerwania i mam taki zapis:

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

Kurcze wywala mi taki komunikat :(

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


a zwykły _delay wchodzi?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2019, o 22:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2014
Posty: 846
Lokalizacja: Trójmiasto
Pomógł: 156

aby funkcje _delay_loop działały jest potrzebny inklud biblioteki delay_basic.h tak jak pisałem wcześniej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 00:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 03:41 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 675
Pomógł: 30

A w katalogu util?

Wysłane ze srajfona

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 06:27 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 157
Pomógł: 17

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


Przy takich komunikatach jak opisałeś, czasem warto się rozejrzeć po komputerze.
Poszukałem katalogu util no bo skoro delay.h jest w katalogu to i pewnie delay_basic.h też tam siedzi.
No i siedział. :)
C:\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\util


Autor postu otrzymał pochwałę

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 20:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Wprowadziłem do przerwania funkcję _delay_loop1() ustawiłem na początek wartoś 100

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


funkcja petla() ma tylko pokazać czy zadziałała zmiana na pinie i wygląda tak:

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


obserwuję opóżnienie na oscyloskopie i nie opóżnia nic :(
tzn. impuls widzę że się pojawia ale zmieniając wartość w funkcji _delay_loop1(100) nie ma reakcji?
Przed pętlą mam takie ustawienia:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Czy coś jeszcze mam ustawić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 20:49 
Offline
Użytkownik

Dołączył(a): 29 paź 2017
Posty: 157
Pomógł: 17

Qurcze. Nie rozumiem tej pętli
A czemu nie tak na próbę?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

W przerwaniu ustawiasz 1 czekasz pętle ustawiasz 0 masz impuls.

_________________
Jestem na GG 31324
Nowy soft, nowa nadzieja.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2019, o 21:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

Zrobiłem Jarek jak kazałeś i:
Qurcze nie wiem dlaczego wywala mi taki komunikat? :(

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  
PostNapisane: 8 paź 2019, o 01:58 
Offline
Użytkownik

Dołączył(a): 14 sie 2016
Posty: 675
Pomógł: 30

Przecież pisze jak byk, że znowu nie masz zainkludowanego pliku z "_delay_loop1", bo funkcja nazywa się "_delay_loop_1" a nie jak wpisałeś "_delay_loop1" - brakuje ci podkreślenia.
Czasami warto zajrzeć do pliku i samodzielnie rozwiązać problem, to tylko 3 sekundy szukania ;)


Autor postu otrzymał pochwałę

_________________
Moje porady są błędne,nie czytać,zbanować od razu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2019, o 07:47 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 paź 2017
Posty: 263
Pomógł: 0

QURCZE racja ale jestem zakręcony zrobiłem zwykłą literówe, muszę walnąć sobie RESETA :lol:



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

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