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..?
Moderatorzy:Jacek Bogusz, robertw, k.pawliczak, Moderatorzy
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!!!
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!!!
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.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
Piotrek
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)
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!
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
Jim
PS. Jeśli coś jest bez sensu napisane to sorry,ale wciąż się uczę tego języka,więc wybaczcie!
Dzięki!
Oto i on :
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..
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
.
.
.
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.
symulator "twierdzi" , że takie ...
... 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.
Piotrek
Kod: Zaznacz cały
$framesize = 32
$hwstack = 64
$swstack = 64
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
...
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
Zaokrąglać muszę , ponieważ lepiej się czyta wartość z LCD,a druga sprawa to nie potrzebuję aż 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
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ę aż 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
Praktycznie - coś w tym jest - jednak teoria mówi co innegoWydaje 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
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
No nie zupelnie. Przerwania sa wylaczane, a nie blokowane (zerowana jest flaga 'I' w SREG).Praktycznie - coś w tym jest - jednak teoria mówi co innego
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
A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
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.Czy go kijem , czy go pałką ....No nie zupelnie. Przerwania sa wylaczane, a nie blokowane (zerowana jest flaga 'I' w SREG).
Rozwiazania najprostsze, sa czesto najlepszeNajprostrze z możliwych rozwiązańA odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
Piotrek
Rozwiazania najprostsze, sa czesto najlepsze :roll:[/quote]Najprostrze z możliwych rozwiązań ;)A odnosnie problemu, nie latwiej bylo by do zliczania impulsow wykozystac timer bezposrednio, a nie w przerwaniu INT1 ?
Piotrek
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
Jesli o mnie chodzi, to zadnym bascomowcem nie jestem. W zyciu nie napisalem nic powaznego w tym kompilatorze (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 - 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.
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 - 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.
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
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
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 64 gości