Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Jak wrzucić coś na stos..?

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Jak wrzucić coś na stos..?

Postautor: Jimmi » 27 maja 2006, o 12:08

Pytanie do zaawansowanych (i nie tylko) Bascom'owców :
Czy da się w Bascomie zrobić tak,że coś podczas wykonywania się przerwania jest "wrzucane" na ściśle określone miejsce na stosie,a potem przy powrocie z przerwania jest ta wartość "ściagana" ? Jakie komendy/funkcje do tego służą?
Przeszukałem helpa i nie znalazłem nic, jedynie "PUSHALL" i "POPALL" ...
A i jeszcze jedno, nie proszę o to,żeby mi ktoś napisał program, tylko o podanie haseł lub wskazówek jak to można zrobić (jeśli się da zrobić to w Bascomie) :)
Dzięki za jakąkolwiek pomoc!!!

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 27 maja 2006, o 16:41

Należy użyć , instrukcji asemblera.
MUSISZ wiedzieć co robisz , bo inaczej "powiesisz" program.

Piotrek

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 27 maja 2006, o 17:58

Problem w tym,że wiem (tak mi się przynajmniej wydaje) co chcę zrobić ,tylko nie znam funkcji jakich mogę użyć do tego celu.. :(
Jim

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 27 maja 2006, o 21:20

Problem w tym,że wiem (tak mi się przynajmniej wydaje) co chcę zrobić ,tylko nie znam funkcji jakich mogę użyć do tego celu.. :(
Jim
W Basicu takich funkcji nie ma ! - pozostaje asembler.Jeśli nie znasz asemblera , to kicha :( Gdybyś dokładnie opisał swój problem , można by coś temu zaradzić , ale w tym momencie - tylko asembler.

Piotrek

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 27 maja 2006, o 21:42

No problem w tym,że nie znam..
Problem wygląda następująco: w momencie wystąpienia przerwania wykonywany jest podprogram,w którym wyliczana jest wartość częstotliwości na podstawie impulsów z generatora wzorcowego (kwarc) oraz na podstawie sygnału wejściowego (na INT1) ,do tego sprawdzam czy licznik się przepełnił ,odpowiednio przeliczam i mam częstotliwość,koniec podprogramu (RETURN) i wracam.. W pętli głównej mam tylko obsługę LCD i na LCD "wyrzucam" wynik. Problem w tym,że co pewien czas, nieokreślony, pojawia mi się na LCD zamiast wyniku (wiem jaki ma być ,używam generatora z PC po karcie dźwiękowej) dziwna wartość liczbowa,czasem jakieś "krzaki" . Wywnioskowałem,że to przyczyna tego,że BASCOM "bawi się" rejestrami i stosem, i nie zawsze to,co "ściąga" ze stosu po powrocie z przerwania jest tym co powinno być,a powinno być wyznaczoną częstotliwością..
Co do pomiaru samej częstotliwości.. dokonuję jej pomiaru metodą pośrednią (w skrócie: mierzę czas trwania jednego impulsu -wykrywam po zboczu, a w czasie od zbocza do zbocza zlicznae są impulsy z gen. wzorcowego, dzięki temu (m.in) mam czas trwania jednego pełnego okresu, następnie odwracam i mam częstotliwość)

Listing fragmentu kodu (tego co się wykonuje w przerwaniu ,gdy wystąpi zbocze-w moim przypadku RISING)

Kod: Zaznacz cały

Zbocze: Wynik_twy = 0 Imp = Timer1 : Timer1 = 0 : Wynik_twy = Przep Przep = 0 Wynik_twy = Wynik_twy * 65536 Wynik_twy = Wynik_twy + Imp Wynik_fwy = 10049085 / Wynik_twy Return
Program piszę na atmega32 ,w zasadzie tylko dlatego,żeby nie zamartwiać się o pamięć:) jak się okarze,że program wejdzie na mniejszego procka to zrobię na mniejszym. Wykorzystuję jeszcze UART'a do komunikacji z PC:)
Jim

PS. Jeśli coś jest bez sensu napisane to sorry,ale wciąż się uczę tego języka,więc wybaczcie!
Dzięki!

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 27 maja 2006, o 22:31

He he he ;)
Zwiększ HW Stack ,Soft Stack i Framesize do wartości np. 100 (stać Cię na to , z M32) i po krzyku :D

Piotr

PS
Wynik_twy - jakiego typu jest ta zmienna ??

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 28 maja 2006, o 00:02

He he he ;)
Zwiększ HW Stack ,Soft Stack i Framesize do wartości np. 100 (stać Cię na to , z M32)
- zwiększyłem ,ale nie pomogło... ,dałem nawet po 200

Pytanie mam: co daje zwiększenie tych parametrów?
PS
Wynik_twy - jakiego typu jest ta zmienna ??
Wynik_twy - Single

Jim

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 28 maja 2006, o 00:41

Wrzuć cały kod , to przyjrzymy się temu z bliska.

Piotrek

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 28 maja 2006, o 00:50

Oto i on :

Kod: Zaznacz cały

. . . Do Display On Fwy = Fusing(wynik_fwy , "#.##") Cls : Cursor Off Locate 1 , 2 Lcd "f_wy[Hz]" ; " t[s]" Locate 2 , 2 Lcd Fwy ; " " ; Napis Print Fwy Waitms Czek Loop End Zbocze: Wynik_twy = 0 Imp = Timer1 : Timer1 = 0 : Wynik_twy = Przep Przep = 0 Wynik_twy = Wynik_twy * 65536 Wynik_twy = Wynik_twy + Imp Wynik_fwy = 10049085 / Wynik_twy Return . . .
Krótki,prosty a spać po nocach nie mogę przez te "krzaki"
Co do $framesize = 1024
$hwstack = 2048
$swstack = 512

to już wiem co one oznaczają :) Tylko nie wiem czy wpisane przeze mnie wartości są odpowiednie..
Ostatnio zmieniony 28 maja 2006, o 15:13 przez Jimmi, łącznie zmieniany 1 raz.

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 28 maja 2006, o 08:58

symulator "twierdzi" , że takie ...

Kod: Zaznacz cały

$framesize = 32 $hwstack = 64 $swstack = 64
... wartości wystarczą.
Zastanawiam sie , czy w momencie działania funkcji Fusing() , zmiana wartości wynik_fwy przez INT1 , nie ma wpływu na proces jej przetwarzania do STRING-u.
Spróbuj np.

Kod: Zaznacz cały

... Display On:Cursor Off Do A=Wynik_fwy Fwy = Fusing(a , "#.##") Cls Locate 1 , 2 Lcd "f_wy[Hz]" ; " t[s]" Locate 2 , 2 Lcd Fwy ; " " ; Napis Print Fwy Waitms Czek Loop ...
Piotrek

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 28 maja 2006, o 10:15

Niestety nie pomogło wyłączenie funkcji FUSING. Juz wcześniej ją wyłączałem i ten sam efekt miałem. Poniżej jest kilka wierszy z tym co wysyła się do PC

Kod: Zaznacz cały

. . 158.29067993 158.323089598 158.298156737 2684385598.3081359859 158.305633543 158.670266526 158.313110351 158.295654296 158.303131102 158.343048094 158.300628667 157.181457518 157.174102782 922747347.290679938 158.305633543 158.270721434 158.31060791 . . .


Zaokrąglać muszę , ponieważ lepiej się czyta wartość z LCD,a druga sprawa to nie potrzebuję tak dokładnego wyniku...

Nie przejmowałbym się tymi blędami gdyby nie to,że chcę wynik odczytywać na PC przez program (jeszcze nie wiem jaki,może LabView),dlatego też musi on "czysty" lecieć do PC..

Jim

[ Dodano: 28-05-2006, 11:44 ]
Przeniosłem fragment kodu, gdzie wykonywane są obliczenia ,z przerwania do pętli głównej i wygląda na to ,że jest lepiej, na razie testuję. Mam wyświetlacz 40*2 ,więc podglądam wszystkie zmienne :)
Dzięki za pomoc!
Oczywiście jeśli kolega ma jakieś sugestie lub propozycje to bardzo chętnie wysłucham
Jim

sablik
-
-
Posty: 101
Rejestracja: 7 lip 2004, o 06:18
Lokalizacja: Czaniec
Kontaktowanie:

Postautor: sablik » 29 maja 2006, o 07:50

Wydaje się mi że masz rację z przeniesienim części kodu do obsługi wyświetlacza.
Może przerwanie przychodzi zbyt szybko i nie zawsze kończą się obliczenia a już masz następne zbocze.

pozdrawiam

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 29 maja 2006, o 10:45

Wydaje się mi że masz rację z przeniesienim części kodu do obsługi wyświetlacza.
Może przerwanie przychodzi zbyt szybko i nie zawsze kończą się obliczenia a już masz następne zbocze.

pozdrawiam
Praktycznie - coś w tym jest - jednak teoria mówi co innego :D
AVR-y na czas obsługi przerwania , blokują system przerwań i dopuki jedno sie nie skończy(RETI) , drugie nie może być obsłużone :(

Piotrek

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 29 maja 2006, o 13:19

Praktycznie - coś w tym jest - jednak teoria mówi co innego :D
AVR-y na czas obsługi przerwania , blokują system przerwań i dopuki jedno sie nie skończy(RETI) , drugie nie może być obsłużone :(
No nie zupelnie. Przerwania sa wylaczane, a nie blokowane (zerowana jest flaga 'I' w SREG).

A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?

sablik
-
-
Posty: 101
Rejestracja: 7 lip 2004, o 06:18
Lokalizacja: Czaniec
Kontaktowanie:

Postautor: sablik » 29 maja 2006, o 13:46

Czy koniecznie musi być podlaczony zewnętrzny zegar.
Ja to kiedyś próbowałem tak:
int0 podłaczony do zliczania impulsów
Timer1 załączał na sciśle określony czas zliczanie,po wyłaczniu przetwarzałem dane.

pozdrAS

szymel
-
-
Posty: 212
Rejestracja: 16 sty 2005, o 16:42
Lokalizacja: Włocławek

Postautor: szymel » 29 maja 2006, o 14:27

No nie zupelnie. Przerwania sa wylaczane, a nie blokowane (zerowana jest flaga 'I' w SREG).
Czy go kijem , czy go pałką .... :D
A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
Najprostrze z możliwych rozwiązań ;)

Piotrek

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 29 maja 2006, o 15:13

No nie zupelnie. Przerwania sa wylaczane, a nie blokowane (zerowana jest flaga 'I' w SREG).
Czy go kijem , czy go pałką .... :D
Blokowanie ma dla mnie wydzwiek bardziej permanentny, cos wylaczonego mozna wlaczyc (czyli nawet w trakcie obslugi przerwania mozna wlaczyc przyjmowanie innych, czy nawet kolejnego takiego samego - sic), ale trzeba to dobrze przemyslec by nie bylo problemow. Niby cos zablokowanego mozna odblokowac, ale... jak juz mowilem, dla mnie blokada to cos trwalszego i mniej naruszalnego.
A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
Najprostrze z możliwych rozwiązań ;)
Piotrek
Rozwiazania najprostsze, sa czesto najlepsze :roll:

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 29 maja 2006, o 21:49

A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
Najprostrze z możliwych rozwiązań ;)
Piotrek
Rozwiazania najprostsze, sa czesto najlepsze :roll:[/quote]

Tego jeszcze nie probowalem.Jak wcześniej pisałem,uczę się dopiero tego BASCOM'a :) Udało mi się natomiast w dużym stopniu poprawić program niewielkimi zmianami:). Wcześniej wspominałem,że część obliczeń przeniosłem do pętli głównej programu.Dodałem też na początku zerowanie wszystkich występujących zmiennych:) Generalnie jest wporządku tylko czasem zauważam jakby wynik się "gubił".. mianowicie zamiast np. 224,4 mam 022,4.. I gdzie teraz mam szukac dziury w cały drodzy koledzy BASCOM'owcy..? Już nie mam co przestawiać do głównego programu.. Może coś dopisać...tylko co?
Jim

Awatar użytkownika
pajaczek
Moderator
Moderator
Posty: 2650
Rejestracja: 24 sty 2005, o 00:39
Lokalizacja: Winny gród

Postautor: pajaczek » 29 maja 2006, o 22:49

Jesli o mnie chodzi, to zadnym bascomowcem nie jestem. W zyciu nie napisalem nic powaznego w tym kompilatorze :wink: (a da sie wogole?)

Ale jak powiesz na jaki procek piszesz, to Ci moze cos prostego w ASM napisze, ostatecznie zrobisz sobie wstawke, jesli nie w calosci...

[ Dodano: 30-05-2006, 11:04 ]
Z perspektywy dnia nastepnego (nie mylic z syndromem :mrgreen: - tego to dzis nie mam), i po mocnej kawie, dochodze do wniosku ze jednak lepiej jak sam napiszesz, bo przynajmniej sie czegos nauczysz.

Procek juz zauwazylem jaki. A wiec tak:
w sekcji konfiguracji (przed petla glowna)
- dla timera0 wlacz zliczanie z zewnetrznego zrodla taktowania -> [CS02..CS00] ustaw 0b111 (dla narastajacego zbocza), albo 0b110 (dla opadajacego)
- ustaw wartosc startowa tim0 na 254 - chodzi o to zeby za pierwszm razem uruchomic zliczanie
- wstepnie skonfiguruj timer1 jako licznik czasu
- wlacz przerwania od timera0 i timera1

- swoj mierzony sygnal podlacz do pinu 1 uC (zakladam ze masz DIP'owa wersje m32)

W przerwaniu od timera0 ustaw wartosc startowa na np. 255-100, czyli bedzie zglaszal przerwanie co 100 okresow zewnetrznego sygnalu. Odczytaj wartosc licznika1 (przy pierwszym uruchomieniu bedzie 0 ale pozniej juz jakies wartosci), wyzeruj licznik1, oblicz co tam chcesz.

I takim oto sposobem nie angazujesz dodatkowo przerwania zewnetrznego int, oraz przerwanie zliczajace impulsy odzywa sie tylko co 100 impulsow, a nie przy kazdym.

Cos niejasne to pisz, postaram sie sprecyzowac, oczywiscie jest to tylko zarys, pozatym pisze z punktu widzenia piszacego w asemblerze i byc moze cos jest niezroumiale.

Jimmi
-
-
Posty: 20
Rejestracja: 18 lip 2005, o 08:58
Lokalizacja: Polska

Postautor: Jimmi » 30 maja 2006, o 17:16

Co dowykorzystania timer1, aby odrazu zliczać na nim impulsy wejściowe : chodzi o to,że ja impulsy zliczam na timer1,ale z rezonatora kwarcowego (10MHz).Zliczam je od przerwania do przerwania,a to przerwanie występuje mi gdy mam zbocze narastające sygnału wejściowego-mierzonego. W zasadzie to mierzę czas trwania takiego jednego impulsu (prostokątnego),a potem to odwracam i mam częstotliwość ,której wielkość mnie interesuje.
Mógłbym mierzyć bezpośrednio (metoda bezpośrednia pomiaru częstotliwości) częstotliwość, podawać sygnał na timer1 i na drugim (timer2) odliczać odcinki np 1 sekundy i to na LCD i wynik,ale.. dla małych częstotliwości miałem (już sprawdzałem to podejście) duże błędy, rzędu nawet 100% wskazania ( dla 1Hz miałem błąd 1Hz) , co wykluczyło te metode. Idealnie sprawdza się tu druga, wspomniana metoda.
pozdr
Jim

Wróć do „Projektowanie PCB, programy EDA, CAD, narzędziowe”

Kto jest online

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