BUFOR OPÓŹNIAJĄCY

Zadaj tu pytanie, jeśli nie wiesz w jaki sposób zrobić układ realizujący założone funkcje.
Cyrul
Raczkujący użytkownik 1
Raczkujący użytkownik 1
Posty: 2
Rejestracja: śr 14 gru 2005, 14:44
Kontaktowanie:

BUFOR OPÓŹNIAJĄCY

Postautor: Cyrul » śr 14 gru 2005, 14:44

Witam,

Jak w temacie potrzebuję zrobić coś w rodzaju buforu opóźniającego.
Mam mikrokotroler AVR i zamierzam programowo sterować podświetlaniem wyświetlacza LCD, nejlepiej na przerwaniu.

Przychodzi zew. przerwanie, mikrokontroler na odpowieni bit portu wystawia stan wysoki (zbocze narastające, wcześniej tam był stan niski, może być na odwrót) i podświetla mi wyświetlacz LCD. I tu pojawia się problem, nie moge w procedurze obsługi przerwania wstawić funkcji wyczekiwania ok 2s (tyle chciałbym mniej więcej podświetlić wyświetlacz) ponieważ mikrokontroler cały czas byłby zajęty. Więc powstał pomysł by w obsłudze przerwania uC wystawił na ten konkretny bit na chwilę stan wysoki i tyle. Dalej właśnie przydałby się układ który odczyta, że został podany impuls (może to być stan wysoki, niski, nie ma znaczenia, ważne by to był naprawdę szybki impuls) i następnie podtrzyma na wyjściu napięcie zasilania dla LCD przez ok. 2s.

Był bym wdzięczny za ew. pomysł rozwiązania tego problemu. Jeśli ktoś znalazł by coś prosił bym o podesłanie na cyrul(małpa)epf.pl bądź ew. odpowiedź na forum. Znajomy podpowiedział mi że można by to w oparciu o słynny timer 555 zrobić ale jak dotąd nie znalazłem żadnej aplikacji rozwiązującej mój problem.
W razie jakiś pytań gdyby problem był nie jasny można mnie złapać na
gg:: 2107813

POZDRAWIAM

jadzwin
Raczkujący użytkownik 4
Raczkujący użytkownik 4
Posty: 22
Rejestracja: pn 26 wrz 2005, 21:08

Postautor: jadzwin » śr 14 gru 2005, 19:20

A nie prosciej zroibc tak:
1) Na "zewnetrznym przerwaniu" lapiesz stan niski / wysoki i ustawiasz flage ze przerwanie nastapilo, ustawiasz sobie jakas zmienna od timera na zadany czas i podswietlasz wyswietlacz
2) Na przerwaniu zegara zmniejszasz zmienna od timera jezeli falga jest ustawiona ze wystapilo przerwanie
3) Jezeli osiagnie zero, gasisz podswietlanie lcd i ustawiasz flage na zero

Pozdr
jadzwin

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » śr 14 gru 2005, 19:31

ftp://ftp.pj.wroclaw.pl/555
Podaje sie stale czasowe a program dobiera odpowiednie elementy i jeszcze pokazuje jak polaczyc :)

Ale moim zdaniem prostszym rozwiazaniem jest uzycie timera w AVR... przeciez po to on jest zeby nie bawic sie zewnetrznymi elementami.
Swego czasu robilem sterownik ktory po otrzymaniu odpowiedniego rozkazu zalaczal jeden z 8 zewnetrznych przekaznikow (na 45 sekund :) po czym automatycznie wylaczal. Wszystkie przekazniki oczywiscie niezalezne.
Dzialalo to w ten sposob ze uklad timera generowal okresowo przerwanie ktore inkrementowalo odpowiednia komorke (licznik).
Przy zalaczaniu wyjscia nalezy odczytac licznik, dodac obliczona wartosc odpowiadajaca opoznieniu (n=f_irq[Hz]*t[s]) i ja zapisac.
Procedura przerwania oprocz inkrementacji licznika sprawdza rowniez czy ktoras z zapisanych wartosci jest rowna licznikowi. Jesli tak, wylacza odpowiednie wyjscie i zeruje wartosc.
Sprawdzone w praktyce, dziala bez zarzutu i nic sie nie blokuje. AVR duzo potrafi, trzeba tylko zaprogramowac :)
Pozdr.

PS. Jesli juz _bardzo_ nie bedziesz mogl sobie poradzic, moge podrzucic kawalki kodu. Ale niechetnie bo nie jest to tak skomplikowany problem zeby trzeba bylo korzystac ze sciag ;)

PS2: Wlasnie widze ze w miedzyczasie Jadzwin podrzucil prawie identyczne rozwiazanie :) Pozdrawiam :)

Cyrul
Raczkujący użytkownik 1
Raczkujący użytkownik 1
Posty: 2
Rejestracja: śr 14 gru 2005, 14:44
Kontaktowanie:

Postautor: Cyrul » śr 14 gru 2005, 23:43

Wszystko pięknie, tylko:

Nie moge obciążać timera bo będe go wykorzystywał do czegoś innego.

Druga sprawa nie moge dać samej flagi na przerwaniu zew i podświetlenia w głównym programie, bo będe znowóż tracił czas na wykonanie podświetlenia. W głównym programie miałem pomysł żeby coś innego umieścić. A tak jak sprawdze flate i wejde np w 3s podświetlenie LCDka w głownym programie to tam będe tracił ten czas ;/ ten bufor opóźniający był by jak znalazł...

P.S.

Ten programik co mi wysłałeś EXTRA. Dzięki wielkie mam nadzieje że opcja ta z tym jednym impulsem będzie działać ;)

jadzwin
Raczkujący użytkownik 4
Raczkujący użytkownik 4
Posty: 22
Rejestracja: pn 26 wrz 2005, 21:08

Postautor: jadzwin » czw 15 gru 2005, 0:30

Ciagle nie widze zadnego problemu..

Na timerze jaki tam masz i bez wzgledu do czego go uzywasz dodaj incrementacje dowolnej 32 bitowej zmiennej.

Jezeli pojawi ci sie przerwanie zewnetrzne zeruj ta zmienna i na poolingu, w glownej petli programu sprawdzaj kiedy jej wartosc przekroczy zadany czas do zgaszenia lcd.

Przepelnienie zmiennej raczej ci nie grozi, ale przed tym ez mozna sie prosto zabezpieczyc.

Prosciej juz chyba nie mozna :)
Bo zawsze mozna zaimplementowac kernel wielowatkowy z wywlaszczaniem :)

A dokaldanie dodatkowej elektroniki mija sie dla mnie z celem bo i po co jak kilkoma liniami kodu , mozna to rozwiazac


Pozdr
jadzwin

movzx
Aktywny użytkownik 3
Aktywny użytkownik 3
Posty: 642
Rejestracja: ndz 07 sie 2005, 23:38
Lokalizacja: Wrocław
Kontaktowanie:

Postautor: movzx » pt 16 gru 2005, 1:41

Zgadzam sie z Jadzwinem.
Myslalem ze napisanie ze stala czasowa mojego ukladu wyniosla 45s nie wymaga komentarza ze w tym czasie uklad normalnie dziala, odsyla status, wykonuje inne polecenia, wlacza inne przekazniki itp...
Nawet nie trzeba zadnego kodu w glownym programie - procedura przerwania zalatwia wszystko.
AVR ma zwykle 2 liczniki (albo wiecej) i jak sie dobrze program napisze to raczej nie brakuje. Powtarzam - najwazniejsze to dobrze zaprogramowac :)
Pozdr.

PS. Mialem okazje pobawic sie kernelem wielowatkowym na AVR (autorstwa kolegi)... coz, sam na razie czegos takiego nie napisze ale sama idea jest swietna :)


Wróć do „Podzespoły i układy”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika. i 36 gości