Czy ma ktos moze gotowe procedury delay dla procesora at89s8252 ? Ew: jesli ktos moglby mi powiedziec jak to wyliczyc samemu, albo moze link jakis ? Ciekawe ale w sieci nie moge nic znalezc... Serio dorwalem jakies przyklady z 8051.de ale po niemiecku, w ktorych petla wyglada jakby zrobiono ja na oko... Niestety potrzebuje cos dokladniejszego... Kwarc 11.0592, interesuje mnie 1us oraz 1ms. I jak to wlasciwie jest ?
100us -> 1 ms
100ms -> 1 s ?
pozdr. LB
Didn't find your answer? Ask the community — no account required.
J
Jacek Bogusz
Je¶li dok³adnie, to tylko przez przerwanie timera. Pewnie ju¿ wiele razy by³o tr±bione, ¿e nie ma metody na dok³adny "delay" zrobiony bez udzia³u timera. Procesor - owszem - pracuje synchronicznie ale... Czasami np.tego rodzaju pêtla mo¿e byæ przerwana przez obs³ugê "czego¶ tam". Jedynie autonomiczny uk³ad (a takim jest timer) mo¿e zapewniæ ci dok³adne odmierzanie czasu. Przy pomocy pêtli - rozkazów, mo¿na zrobiæ delay tylko "na oko". A jak liczyæ? A no lista rozkazów do rêki, ten zajmuje 2 cykle, ten 3 - zsumowaæ, pomno¿yæ przez okres zegara (w wiêkszo¶ci 51-ek kwarc dzielony jest przez 12) i wszystko.
us - to 10^-6 sekundy, ms - to 10^-3. No có¿... Policz sobie gdzie zrobi³e¶ b³±d ;-)
Jacek
D
drozdu
az tak dokladnie nie potrzebuje ale to co znalazlem to bylo:
pisze ze delay okolo 5ms ;(( for (n = 0; n < count; n++) for (m = 0; m < 255; m++) ;
Dalej nie rozumiem... czemu przerz 12 ? a kwarc nie ma znaczenia ??? ok policze sobie ile kazda petla zjada cykli i co dalej ? ile na przyklad czasu zajmie 10 cykli przy kwarcu 11.0592 ?
hmm czyli:
1000us -> 1ms
1000ms -> 1s ? ;)
pozdr. LB
I
invalid unparseable
moze warto zakupic jakas ksiazke do '51 jest kilka pozycji w kazdej dobrej ksiegarni technicznej (nawet w czestochowie :)))
a czasy?
1000us -> 1 ms
1000ms -> 1 s
sa jeszcz setne sekundy, ale to w sporcie stosowane:)))
1 setna to 10ms:))))
pozdr
I
invalid unparseable
to jak w koncu? dokladnie czy niedokladnie??? niedokladnie masz juz zrobione, a dokladnie Jacek podal ci rozwiazanie... to co wkleiles za kod, to zalezy od tego w jakim kompilatorze to kompilujesz... w jednym petla moze zajmowac 5ms, w drugim 40ms, zas w trzecim 1ms...
nie myl cyklu z taktem przewaznie (te najpopularniejsze) '51 maja cykl rowny 12 taktom zegara... jesli masz kwarc 12Mhz to twoj procek moze zrobic max 1 milion instrukcji jednocyklowyc, np NOP... jesli chcesz wiedziec wiecej, to poczytaj lepiej, bo nie sadze, zeby komus sie chcialo omawiac cala architekture '51, zebys ty zrozumial czemu dzielimy zegar przez 12... a jesli masz procek TI, to dzielisz, albo przez 12, albo przez 4, zalezy jak sobie ustawisz... jesli masz DALLASa, to nawet sa takie co nie dzielisz:)))
widzisz tu gdzies niescislosc??? bo moim zdaniem jest wszystko oki
J
Jacek Bogusz
No widzisz... Rzecz pierwsza - nie piszesz jakim jêzykiem programowania siê pos³ugujesz. My¶la³em, ¿e asemblerem. A z listingu wynika, ¿e C. Niestety w takich przypadkach najlepsza jest metoda uczonego "Macajewa" ;-). Tzn piszesz funkcjê, najlepiej jaki¶ d³ugi czas, i mierzysz j± ze stoperem w rêku. Na przyk³ad funkcjê "delay_1ms" wywo³ujesz w postaci (tu tylko symbolicznie!) "5000 x delay_1ms". Potem tylko dobierasz sta³e w pêtli, aby by³o jak najlepiej (najdok³adniej). W przypadku jêzyków wysokiego poziomu bardzo czêsto postaæ pêtli zale¿y od rodzaju w³±czonej optymalizacji. Dlatego te¿ aby dok³adnie wyliczyæ czas trwania twojego "delay" musisz siêgn±æ do listingu w postaci tekstu asemblera. Czasami (wiêkszo¶æ) kompilatory produkuj± taki zbiór przej¶ciowy.
Oczywi¶cie, ¿e ma znaczenie. Czêstotliwo¶æ kwarcu przez 12 i to jest cykl maszynowy (dla wiêkszo¶ci 51-ek). Ka¿dy rozkaz zajmuje od 1 do ilu¶ tam cykli (ró¿nie w ró¿nych uK, trzeba sprawdzaæ w pdf).
(1/11059200) sekundy x 12 x 10 = ....
BTW - na mojej stronie
formatting link
znajdziesz przyk³ady programów w C (np obs³uga wy¶wietlacza LCD), gdzie jest tego rodzaju pêtla opó¼nienia zrobiona "na oko" ;)
Jacek
M
Marcin Stanisz
W artykule <cbon1a$flg$ snipped-for-privacy@news.dialog.net.pl> Jacek Bogusz napisal(a):
Kompilatory generują również kod w asemblerze - można też policzyć na palcach cykle. I pamiętać, żeby nie zmieniać opcji optymalizacji.
Pozdrawiam
Marcin Stanisz
I
Ireneusz Niemczyk
Mozna sobie _niechcacy_ RS-a uruchomic, czy tez inne irq i szlak trafia wszystkie mozolne przeliczenia ;-)
Milego dnia Marcinie. __ Pzd, Irek.N.
J
Jacek Bogusz
Hehe, no w³a¶nie to sugerujê ;-)
Jacek
I
Ireneusz Niemczyk
Ano wlasnie.
U mnie standard wyglada tak:
- zawsze mam jakies cykliczne przerwanie w procku, a to do klawiatury, a to do LCD-ka czy tez obslugi portow, staram sie to przerwanie miec co 1ms lub
10ms jak przerwanie dlugie wychodzi w obsludze.
- zmienna globalna z gatunku unsigned int jest w rzeczonym wyzej przerwaniu dekrementowana, chyba ze jest na _lopatkach_, czyli jej wartosc jest rowna zero.
- procedura DELAY(unsigned int) przepisuje argument do zmiennej globalnej, a nastepnie zapetla sie czekajac, az owa zmienna sie wyzeruje.
Jakos taki mi sie kiedys napisalo - i tak juz pozostalo. Mozna by jedynie pomyslec nad optymalizacja fragmentu argument->zmienna, jesli komus sie chce. ;-)
__ Pzd, Irek.N.
D
drozdu
Dziekuje wszystkim za odpowiedz
Potrzebuje tego poniewaz napisalem procedurki obslugi lcd z taka funkcja delay na oko, wyswietlacz jest aktualizowany co ok 1s i opoznienia sa tak duze ze zauwazam mruganie wyswietlacza. A dokladniej opoznienia (po wyslaniu komendy lub danych): 5ms czyszczenie 1ms goto 1ms pisanie wiec zapisanie calego wyswietlacza (2x16): 5+1+(16x1) = 22ms opoznienia do tego cala reszta obslugi lcd... w sumie to moze mrugac z innego powodu...
Eksperymentowalem z czasami i udalo mi sie dojsc do etapu gdzie mrugniecia sa prawie nie zauwazalne (wklejalem nop`y). Ale wolal bym sie tzymac scisle specyfikacji kontrolera lcd. Do tego celu potrzebne mi sa wlasnie dokladne procedurki (zedu 1us). Oczywiscie procedurki napisze sobie w asmie inaczej nie mialo by to sensu...
Co sie tyczy pomyslu zaimplementowania funkcji delay na przerywaniu tick w moim przypadku nie ma juz wiecej ramu na licznik ;) a poza tym moim zdaniem osiagniecie takiej dokladnosci w srodowisku przerywaniowym (nie tylko przerywanie tick) jest nie mozliwe.
Teraz prosze mnie nie zlinczowac z tego co rozumiem przy zegarze
11.0592Mhz w ciagu jednej sekundy procesor wykona 921600 cykli. Czyli nop/cykl zajmuje 1.08... us tak ?
btw: pisze w asmie i C uzywam keil`a
pozdr. LB
I
Ireneusz Niemczyk
A czy musisz czyscic? Zazwyczaj LCD-ki migaja, gdy pod jeden adres wpisywane sa rozne znaki, przykladowo spacja wypelnia liniewyswietlacza do konca, a nastepnie umieszczasz w tej linii jakies znaki - bankowo beda migac. Zakladam oczywiscie ze rozmawiamy o znakowym.
A nie lepiej czekac na flage gotowosci - jesli oczywiscie kontroler wyswietlacza ja wystawia (Hitachi wystawia na bicie 7-mym). Wtedy wszystko dzieje sie optymalnie szybko.Trzeba tylko przewidziec sytuacje, w ktorej kontroler wyswietlacza nie zechce wystawic potwierdzenia (zwis, cos zle odbierze). Warto wtedy _pchnac_ go w reset...na moment.
Mam wrazenie ze rozwiazujesz problem metoda silowa....
Zalezy jaki procek, ale zwyczajowo 51-ki i bliskie klony dziela zegar przez
12-cie. Wiec NOP (jako ze jest jednotaktowy) wykona sie dokladnie tak jak piszesz.
I bardzo dobrze robisz - moje ulubione srodowisko :-)))
Milego dnia.
__ Pzd, Irek.N. ps. Czy rozmawiamy o standardowym LCD-ku z kontrolerem Hitachi? ps2. Pamietaj, aby zawsze przy starcie procka resetowac LCD-a programowo.
D
drozdu
Oczywiscie rozmawiamy o znakowym. Nie rozumiem, czeszcze ekran, potem wpisuje cala linie, ustawiam adres drugiej lini i pisze druga linie. Lancuchy ktore wpisuje nie sa dopelniane spacjami do 16bajt, dlatego zawsze czyszcze.
Wyliczenie funkcji delay oraz zmniejszenie czasow oczekiwania zmniejszylo mruganie do poziomu ktory jest akceptowalny.
Sprawdzanie stanu flagi gotowosci z pewnoscia wyeliminuje problem w zupelnosci.
Procek jest w temacie, dzieki wszystkim za ten delay !
Moje to gcc i avrstudio ;) np: w keilu jest problematyczna kwestia obslugi wewnetrznego eepromu ale jeszcze tego nie przerobilem.
Wyswietlacz ma taka przypadlosc, ze jesli dostanie w adres powiedzmy 0x80 jakis znak, to bedzie chcial go wyswietlic, jesli dostanie w to samo miejsce chwile pozniej inny znak - to tez bedzie chcial go wyswietlic. W efekcie na tej pozycji pole bedzie migalo - raz bedzie jeden znak wyswietlany, raz drugi - to oczywiste, prawda? Traz pomysl, ze czesto na wyswietlaczu umieszcza sie jakas etykiete, a zaraz za niawartosc jej przynalezna.
Jesli wezmiemy pod uwage wyswietlacz z linijka 16-to znakowa i bedziemy chcieli wyswietlic w taki sposob jak nizej i etykiete i wartosc - bedzie miganie na ekranie...
W tym przypadku zachodza na siebie 2 pola - wiec oba beda migac (spacje z 1 i
2). Tak samo jest jesli zrobisz czyszczenie wyswietlacza - wtedy on po prostu wpisze spacje we wszystkie swoje pola...a wiec wszysko co pozniej na nim bedziesz umieszczal - bedzie migalo. Pomijam, ze czyszczenie zajmuje chyba wiecej czasu niz wypelnienie spacjami ;-))
Ale nie rozwiazalo problemu...
Mozesz po prostu zadbac o to, aby nie mieszac mu w zawartosci pamieci ekranu niepotrzebnie. Tez nie bedzie migalo i nie bedzie problemu z czasem dla niego.
O, a to dlaczego jest problem? Ja jakos nie przepadam za AVR-ami...jakos tak...
__ Pzd, Irek.N.
J
J.F.
I tak nalezy do tego podejsc. Z tym ze czasem raportowano problemy z ta flaga - procek gotowosc sygnalizuje, a naprawde wcale nie jest gotowy..
Po pierwsze jest to duplikat postu, ktory newsowy serwer Dialogu ignorowal - nie wiem dla czego, zlapalem juz 2-gi taki przypadek, cos sie nie staraja. Na szczescie google _zlapalo_ ;-) Pewnie dla niektorych bedzie to powtorka - sorki Panowie. ;-)
OK.
Wyswietlacz ma taka przypadlosc, ze jesli dostanie w adres powiedzmy 0x80 jakis znak, to bedzie chcial go wyswietlic, jesli dostanie w to samo miejsce chwile pozniej inny znak - to tez bedzie chcial go wyswietlic. W efekcie na tej pozycji
pole bedzie migalo - raz bedzie jeden znak wyswietlany, raz drugi - to oczywiste, prawda? Traz pomysl, ze czesto na wyswietlaczu umieszcza sie jakas etykiete, a zaraz za nia wartosc jej przynalezna.
Jesli wezmiemy pod uwage wyswietlacz z linijka 16-to znakowa i bedziemy chcieli wyswietlic w taki sposob jak nizej i etykiete i wartosc - bedzie miganie na ekranie...
123456789ABCDEF0 - linijka wyswietlacza "ETYKIETA = " - przykladowa etykieta, za dluga o 2 znaki "12345" - przykladowa wartosc
W tym przypadku zachodza na siebie 2 pola - wiec oba beda migac (spacje z 1 i
2). Tak samo jest jesli zrobisz czyszczenie wyswietlacza - wtedy on po prostu wpisze spacje we wszystkie swoje pola...a wiec wszysko co pozniej na nim bedziesz umieszczal - bedzie migalo. Pomijam, ze czyszczenie zajmuje chyba wiecej czasu niz wypelnienie spacjami ;-))
Ale nie rozwiazalo problemu...
Mozesz po prostu zadbac o to, aby nie mieszac mu w zawartosci pamieci ekranu niepotrzebnie. Tez nie bedzie migalo i nie bedzie problemu z czasem dla niego.
O, a dlaczego jest z tym problem? Ja jakos nie przepadam za AVR-ami...jakos tak...
__ Pzd, Irek.N. ps. Jarku - o co chodzilo z ta flaga, nie pamietam zadnych _powtarzalnych_ klopotow...
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.