Jest możliwy, trzeba tylko dbać o to aby nie przepełnić stosu.
Jeśli Call to wywołanie funkcji z odkładaniem adresu powrotu na stos, to doprowadzasz do przepełnienia stosu.
1. W jakim celu konfigurujesz liczniki, wpisujesz im wartości początkowe, a potem wywołujesz ich zatrzymanie przez STOP TIMER0/TIMER2 skoro nigdzie indziej ich ponownie nie uruchamiasz? 2. Jakim cudem kompilator nie protestuje gdy w pętli głównej umieszczasz samo ON TIMER0/TIMER2 nie podając trzeciego słowa kluczowego GOTO/GOSUB i ostatniego ich parametru?...
ale z jakich powodów interesuje cie ten stos??
"Case" nie powoduje zajmowania stosu. Więc z tego powodu na pewno nie.
W C sprawa wygląda tak samo .... No tu kolega troszkę przesadził chyba? ;) .... w C sprawa nie wygląda tak samo chociażby z uwagi na to, że byle makro ISR() nie odkłada i zdejmuje ze stosu absolutnie wszystkich rejestrów procesora co standardowo robi Bascom. A takich kwiatków jest znacznie więcej niestety :( tylko że kompilator C nie sygnalizuje błędu....
Hmm... w końcu używasz WAITKEY, więc zmienna Czekanie nie ma sensu. Dodatkowo: Czekanie = Ischarwaiting() wykonujesz przed obsługą przycisku i jakąś procedurą MAIN. Teraz jeśli w trakcie obsługi przycisku i wykonywania procedury MAIN wyślesz dane to nie zostaną one zapisane w EEPROMie Ja jednak przerobiłbym program i użyłbym INKEY. Sama obsługa...
Brak RETURN'ów w podprogramach (na końcu) wywoływanych przez GOSUB. Procek skacze i nie zdejmuje danych ze stosu. Po przepełnieniu stosu idzie w maliny.
Ja bym tu stawial najpierw na ilosc zmiennych lokalnych poniewaz w prograramie napisanym przez EdW jest zmieniana wartosc zmiennej ktora jest wysyla od razu do tda. U mnie jest tak ze zmieniana jest wartosc zmiennej ktora jest pozniej podstawiana do zmiennej ktora jest wysylana do tda(troceh zakrecona). W nestepnej kolejnosci stawialbym na ilosc procedur...
Przypuszczam że przyczyną wieszania programu jest przepełnienie stosu. Chyba za bardzo pogubiłeś się w tych skokach :) Przyglądnij się podprogramowi Menu , który w rzeczywistości nie jest podprogramem, a wywołujesz go przez Gosub Menu w Podprogram_4 . [syntax=basic4gl]'----------------------... Menu:...
Dziękuję kolego za chęci, niestety faktycznie nie znasz Bascoma ;-), ponieważ odpowiedzi na Twoje postulaty są zawarte w programie. Tak, czekam odpowiedni czas na odczyt. Obstawiam na jakieś przepełnienie stosu itp. Jakieś pomysły ?
To jest typowy błąd programowy a prawdopodobnie dochodzi do przepełnienia stosu. Musisz to sprawdzić.
w programie miałem niepotrzebnie zadeklarowaną zmienną string po usunięciu jej wszystko działa tylko jedna rzecz mnie zastanawia np jeśli na samym początku programu zadeklaruje w/w zmienną to brakuje pamięci sram a jeśli zrobię już całą procedurę w sub'ie to wszystko się ładnie kompiluje i niczego nie brakuje nie będzie się to ze sobą gryzło w praktyce?...
Witaj, No save spokojnie możesz użyć.... pod warunkiem, że nie korzystasz w obsłudze przerwania z instrukcji Bascoma bo jeśli tak to nie odkładając rejestrów na stos, zgubisz ich wartości i w najlepszym przypadku będą się działy różne rzeczy. Ja bym napisał wstawkę w asemblerze odkładając wcześniej na stos używane rejestry w tym SREG. Możesz też użyc...
Przepełniasz stos .... zwiększ dla kompilera wielkość pamięci na stos ( oczywiście w opcjach kompilera). Z bascomem tak jest mówi o wszystkim tylko nie o błędzie przepełnienia stosu. ( np Pascal informuje ale nie ma go na AVR). I jak w pętlach wyświetlasz coś na lcd to za każdym wykonaniem funkcji LCD daj Waitms 10 bo niektóre wyświetlacze słabo sobie...
Głowy nie dam, ale GOSUB odkłada na stos wskaźnik do miejsca skoku oraz chyba rejestry. Robienie wielu zagnieżdżonych skoków spowoduje w końcu przepełnienie stosu. Robienie ich równolegle nie szkodzi. Jedynie, na czym utracisz co do pamięci, to instrukcja skoku i powrotu - kod wykonywalny zajmie po prostu więcej.
Tak jest problem z przepełnieniem stosu. Masz bardzo dużo Gosub'ów co to powoduje. Kod jest tak nieczytelny, że nie chce mi sie go analizować. Powiem jedno: jeśli uzywasz Gosub to dbaj o to by podprogram się kończył, a nie skakał z jednego do drugiego, bo w ten sposób właśnie zwiększasz odkładanie adresów powrotu na stosie i nieuchronnie doprowadzi...
Wojtek - wchodzisz tutaj: [url=http://www.frank-zhao.com/cache/avr... z kalkulatorem 16MHZ z preskalerem 1024 oznacza że: - 1 sekunda nastąpi po 15625 cyknięciach timera - przerwanie następuje przy przepełnieniu jeśli wybierzesz OVERFLOW, ale może tez nastąpić przy COMPARE, od tego zależy jaką wartość wpiszesz do timera (czy odejmiesz...
Mój ulubiony "kwiatek" :) Gosub Wybor Wybor: Potem mamy masę gosub'ów bez poprawnego wyjścia. Generalnie program źle napisany. Piszemy programy tak by subrtyny mogły się kończyć i nie zagnieżdżamy nadmiernie podprogramów. To nie watchdog tylko przepełnienie stosu. Chociaż i watchdog może w kilku przypadkach resetować, zwłaszcza tam gdzie jest WAIT...
Z tą dowlnością w używaniu rejestrów byłbym bardzo ostrożny. Nieodpowiednia zmiana - program się wysypie. Nie wolno używać w trybie zapisu bez wcześniejszego zapamiętania: Y ( soft stack pointer ), R4:R5 ( frame stack pointer ), R6 ( status register ), R8:R9 ( data pointer ), R23 ( translate register ), R12:R13:R14:R15 ( fp calculator ). W sumie można...
No dobra... nie chcesz to nie. W dodatku to nie jest cały kod więc nie wiadomo czy tam gdzie indziej się dzieje. Głównej porady czyli przepełnienia stosu nie bierzesz w ogóle pod uwagę ? Trudno powiedzieć coś więcej na tym fragmencie kodu.
Stosy to dla mnie czarna magia, wiem tylko, że każdy przeskok wymaga zapisania adresu zwrotnego, ale nic poza tym :oops: No przy takim podprogramie to 1 megabajtowy stos to za mało :D, to się chyba nazywa rekurencja: [syntax=basic4gl]Petlapomiarowa: If Impulsy < 15 Then 'Jesli nie ruszono, wyswietlaj dalej napiecie Gosub Pomiaradc If Konwersja >...
Widać nie do końca się "naprawiło" :lol: Czy podczas symulacji działa jak powinien (a może tylko Tobie się wydaje, że działa jak powinien :wink: ). Możliwe że masz problem z przepełnieniem stosu, przy skomplikowanych programach tego w symulacji nie sprawdzisz. Czy podczas programowania programator potwierdza prawidłową weryfikacje? Jeżeli tak to przeglądnij...
Brakło RAMu pewnie, stos zaczął pokrywać się z obszarem przeznaczonym na zmienne. Albo przepełnienie stosu, jeżeli wywaliło podczas działania programu (na przykład w momencie wywołania jakiejś procedury). Jak to pierwsze, to spróbuj zmniejszyć rozmiar stosu (gdzieś tam w opcjach kompilatora jest), jak pierwsze lub drugie to postaraj się zmniejszyć ilość...
Jeżeli to jest cały kod programu to wszystko jasne :) : po uruchomieniu program sobie działa, dochodzi do kodu procedurki i na końcu napotyka END SUB - czyli RET w asm - więc procesorek myśli (prawidłowo :-) ), że musi powrócić z podprogramu - czyli odczytać zapisany adres powrotu na stosie, ale ponieważ nie było wywołania podprogramu, to na stosie...
Wiem ze czesto uzywanie goto powoduje przepelnienie stosu, dlatego tez unika sie uzywania goto. GOTO nie używa stosu. GOSUB używa, ale częste używanie nie oznacza, że stos przepełni się. Zagnieżdżanie dużej ilości może spowodować przepełnienie. Jak dobrze to rozumiem to na stosie laduja adresy gdzie program zrobil skok, zeby mogl do nich wrocic jak...
W obsłudze przerwania umieścić należy kilka warunków, które będą sprawdzały wartość zmiennej i za pomocą polecenia Goto XXX przeskakiwały do kolejnych pętli. Tak NIE WOLNO ROBIĆ, powoduje to przepełnienie stosu (bo nigdy nie wychodzi z przerwania). Poprawnie można to zrobić tak: Odpowiednie pętle sprawdzają flagi (zmienne) w przypadku udpowiedniego...
Witam. Mam program, który działa w pętli DO..LOOP typu: DO ... IF warunek THEN procedura ... LOOP przerwanie: ... return sub procedura ... end sub Procedura wywołana w pętli głównej ma opóźnienia na WAITMS. Chciałbym przy pomocy przerwania (przycisk) zrezygnować w dowolnym momencie z wykonywania 'procedury' i wyjść z jej obsługi do pierwszej instrukcji...
A masz znaczniki końca procedury? ekran powitalny sub xx ... ... call yy End Sub sub yy .. .. call xx End Sub Jeżeli będzie tak jak wyżej to program powinien działać w nieskończoność. Jeśli jednak masz te znaczniki "End Sub" i dalej to samo to prawdopodobnie twój program powoduje chwilowe przepełnienie stosu. Można to sprawdzić na symulatorze Bascoma...
Auto napisał: satanistik napisał: Program w przerwaniu od timera mierzy wartość z ADC Rozwiązanie dość kiepskie. Wchodzi w przerwanie, wyzwala pomiar, czeka na wynik W PRZERWANIU!, Nie twierdze że to jest rewelacja, ale samo w sobie nie powinno prowadzić do błędu w stylu "brak kolejnych pomiarów ADC". "Oczywista oczywistość". Tyle, że bez kodów źródłowych...
Trochę inaczej. Gdy w programie wywołujesz sub to program zanim przejdzie do sub wykonuje kilka-kilkadziesiąt niewidocznych dla Ciebie operacji. Mianowicie zapamiętuje stan potrzebnych rejestrów i zmiennych w komórkach pamięci. W miejscu które nazywa się stos. Gdy z tego sub wywołujesz następny sub to znowu zapamiętuje kilka- kilkadziesiąt danych. A...
No to przeanalizuj sobie program krok po kroku: 1) W sub A po wciśnięciu przycisku następuje skok do podprogramu(!) Prog_1, któru w Ciebie zadeklarowany jest jako zwykła etykieta, a nie podprogram. Jakbyś pisał w asm, to takie coś jest jak najbardziej poprawne, ale w innych językach może, ale nie musi działać, tu raczej działa tak jak w asm. 2) z Prog_1...
Sprawdziłem i miałeś rację :) źle przeliczyłem wartoś (faktycznie jest kwarc/64) a co do rejestrów to okazuje się, że potrzeba wrzucić na stos rejesrtry: r0, r4, r17, r20, r24, r25, r26, r28 i r30. Niektóre np: r27 nie są używane (wg symulatora). Przy okazji odkryłem że jeśli ostatnim rejestrem odłożonym na stos jest np. r5 a zdejmowanie ze stosu zacznie...
Stos znajduje sie w pamięci RAM i problem polega na tym że wywołanie podprogramu powoduje odłożenie na stos adresu powrotu a jeśli z podprogramu wywołasz następny podprogram ten też odłoży na stosie swój adres powrotu i tak dzieje się do momentu aż stos sie przepełni co oznacza że nadpisze zmienne programowe. Aby uchronić sie od takiej sytuacji musisz...
robilem sterownik bramy w bascom i przy programie ok 2000 linii to program byl bardziej niestabilny ......... tzn chodzil ladnie a nagle jakeis krzaki na wyswietlaczu (nawet jak ja nic nie robilem) krzaki znikaly i znowu chodzil ladnie az się zrestartowal i wszystko zaczynalo się od nowa Przyczyna - na 99,9% niekontrolowane przepełnienie stosu.
Mam jeszcze 2 pytanie związane z Bascomem. Zrobiłem program przykładowy przedstawiony poniżej. Dim Nr As Byte Dim Nr2 As Byte Dim Koniec As Bit Skocz: Koniec = 0 Do Input "Podaj nr" , Nr If Nr > 0 Then If Nr < 20 Then Koniec = 1 End If End If Loop Until Koniec = 1 Do Print "pętla 2" Input "Podaj nr 2" , Nr2 If...
Rozwiązałem program i problemy Tylko do czasu przepełnienia stosu, a później maliny! Nie wychodzi się z podprogramu poprzez Gosub Wyl do pętli głównej. Podprogram musi się zakończyć przez Return! Wyjdź z pętli Do: Loop przynajmniej za pomocą Exit Do i wstaw na końcu podprogramu Return. Etykieta Wyl nie będzie potrzebna. End przestaw pod Loop pętli...
Myślę że błąd się czai jakiś prosty. Masz na pewno wszedzie Return w tych Sub`ach? Chodzi mi o to że jak nie ma Return to program skacze pod Label ale potem nie wraca tylko czyta kolejny sub i dopiero kiedy w nim napotka Return to wraca. Jest to błąd o którym kompilator Cię nie poinformuje bo to jakby zamierzone działanie programisty. Inaczej trudno...
5. Pamiętaj że sub`y powinny być tak wykorzystywane aby w nich program się nie zapętlał i aby po każdym wywołaniu podprogramu wrócił on do miejsca wywołania. Każdy skok do podprogramów zapisywany jest na stosie i jeżeli tych skoków będzie za dużo procek się zawiesi. Od tego jest SoftStack (SWStack) by jendnak go dostroić do potrzeb programu i przy...
To o co pytasz nie zależy od Bascoma, tylko od architektury procesora. AVRy po przyjęciu przerwania blokują wszystkie przerwania (z wyjątkiem XMEGA, które mają przerwania wielopoziomowe i NMI). Tak więc sam nigdy nie musisz w handlerze przerwania ich blokować. Pytanie, kiedy je odblokowywać przed zakończeniem obsługi. W kilku sytuacjach, np.: 1. Kiedy...
Wydaje mi się, że powinna tu być użyta instrukcja GOTO zamiast GOSUB. ;) GOSUB bez RETURN może przepełnić stos. (Jeżeli coś pokręciłem to proszę mnie uświadomić). Dodano po 2 Ale nie prościej zrobić tak: do ... loop until przycisk=0 (?)
witam. buduje systemy na rs485. niestety zadna z komend bascomowych nie była mi przydatna. używam przerwania do odbioru i sam obsługuje własny bufor z ustawieniem flagi informujacej iz właśnie w buforze jest odebrany "ważny" pakunek danych '------------------------ Rx_serwer: Rxdata = Udr1 Rem zabezpieczenie przed przepełnieniem bufora If Rx_count...
Witam. Piszesz, że jest to twój pierwszy. Niestety widać to na każdym kroku. Masz kilka błędów rzucających się w oczy. Pierwszy błąd notorycznie popełniany przez początkujących to mylenie rejestru PIN z rejestrem PORT. Zamiast: Gosub i etykiet do podprogramów. Pamiętaj, jeśli z jakiegoś miejsca w programie robisz skok do jakiegoś podprogramu to bezwzględnie...
jeśli tak to chyba będzie lepiej zrobić z pcf'em :) można wtedy ywkorzystać te 240B RAM'u które są wolne w zegarku a podtrzyamanie bateryjne też będzie łatwiejsze do zrealizowania. Pisałem kiedyś program który miał około 30B w RAM'ie przeznaczone na zmienne. Obsługiwał LCD, PCF8583, pare tranzystorów, klawiaturkę i rc5. Dawał sobie nawet rady. Ale dokłądanie...
Takie pytanie mam: projektuję właśnie dość złożone urządzenie w oparciu o AVR, do celów czysto uruchomieniowych wyposażam je w złącze do wyświetlacza LCD. Docelowo tego wyświetlacza ma tam jednak nie być, nie ma na niego zresztą nawet miejsca w docelowej obudowie. Moje pytanie: czy pozostawione w programie instrukcje obsługi wyświetlania, w sytuacji...
pisałem w CodeVisonAVR i bascomie i w zasadzie nie widzę różnicy jeżeli chodzi o zajetość programu i szybkość. Wszystko zależy od programisty jak pokieruje swój program i podejdzie do sprawy. Oba języki działają na podobnej zasadzie, czesto różniąc się tylko samym sposobem zapisu instrukcji, bo w zasadzie kod się pisze na podobnym poziomie abstrakcji....
Ch.M , programowałeś wcześniej w BASCOMIE? Bo z tego co zauważyłem, to przeważnie takie są efekty przesiadki z BASCOMA na ASM. Dr_DEAD ma rację, kod musi być przejrzysty. Co innego jak robisz w ASM miganie diodami, a co innego jak taki, dosyć już niemały program. Gdybyś zastosował się do wskazówek mojego przedprzedmówcy, to nie dość, że Tobie łatwiej...
Czy nie lepiej wykonać obsługę sekwencji w procedurze obsługi przerwania timer'a ? Co należałoby zrobić ?: - zdefiniować przerwanie np co 50 ms - dodać programowy dzielnik /100 w przerwaniu (5s) - wykonać tablicę sekwencji w pamięci programu - każde przepełnienie dzielnika powoduje odczyt danej z tablicy (w zależności od numeru sekwencji i numeru kroku)...
Witam Wiem, że temat przycisku jest mocno nadwyrężony, ale ... Program ma jednym przyciskiem przy dłuższym przytrzymaniu zwiększać i zmniejszać wartość wyjścia PWM ( na zmianę ) lub przy krótszym włączyć/wyłączyć, czyli pwm1a = 0 lub pwm1a = 255. Praktycznie, potrzebujesz uskutecznić cztery a nie dwie funkcje: -włączyć/wyłączyć - to są dwie; -zwiększać...
Na przerwaniach świat nie zawsze stoi - DOS miał przerwaniowy system i zrezygnowano z niego głównie dlatego że nie dało się opracować na tym mechanizmie wielowątkowości (dzielenia czasu procesora). Nie znam sie na PC, ale to zdanie brzmi conajmniej podejżanie. A który system operacyjny nie obsługuje przerwań od sprzętu? Zapamiętywanie wszystkiego na...
Właśnie chcę to dokładnie zrozumieć by nawet bez kalkulatora móc to wyliczyć :) choć on bardzo ułatwia i nie trzeba za bardzo wysilać szarych komórek :) Kalkulatory jak najbardziej się przydadzą i za nie wielkie BÓG ZAPŁAĆ :) Z pierwszego kalkulatora zauważyłem, że Timer0 i Timer2 są 8 bitowe natomiast Timer1 i Timer3 16 bitowe Attiny13 ma tylko jeden...
Witam Program kod1. Wysypuje się po przesłaniu kilkuset ekranów domyślam się że chodzi o przepełnienie stosu ilość przesłanych ekranów uzależnione jest od zadeklarowanej ilości pamięci. Jeżeli zamiast wywoływania podprogramu Czytaj_port wpiszę go z ręki kod2 wszystko działa perfekcyjnie mam zatem pytanie co robię nie tak czy BASCOM nie może samodzielnie...
Witam, A gdyby timer (odpowiedzialny za regulację częstotliwości) po przepełnieniu wyzwalał swoim przerwaniem podprogram z poleceniem PULSEOUT ? Można w nim zadeklarować czas trwania impulsu a przez to regulować jego wypełnienie. Pozdrawiam, Owszem 'zmontujesz' w ten sposób jakąś kombinowaną PWM falę, której czas stanu niskiego jest liczony timerem,...
Co do bascoma...jako ze generuje wolny kod to nie możesz wepchnąć rozbudowanej obsługi licznika w przerwanie, bo pogubisz takty albo wykopyrtniesz procesor bo sie stos przepełni(w przypadku gdybys w obsłudze przerwań nie wyłączał przerwań, a w trakcie trwania jego obsługi wystąpiło następne przerwanie i tak w kółko) Musisz wziąć pod uwagę czas reakcji...
. Deklarując zmienną "dowpisania" jako bajt nic się nie zmienia. W czasie jednej pełnej pętli głównej licznik zwiększa się o 3, więc dla najwyższej możliwej częstotliwości pętla wykona się 16 razy zanim dojdzie do przerwania, nawet zostawiając w głównej pętli wysyłanie ocr2 przez uart, gdyby wywalić tę linijkę, pewnie trwałoby to jeszcze krócej. Nie...
Witam. Mam problem z przerwaniami. Chcę przerwaniem INT0 uruchomić timer0 a przerwaniem INT1 go zatrzymać. Czy jest taka możliwość? 2 czujniki podpięte pod INT0/1, za pomocą których chcę zmierzyć czas przejazdu. Jeden czujnik ma wystartować zegar (bardzo dokładny przepełnienie timer0 co 1us) a drugi ma zatrzymać pomiar. Z góry dziękuję za pomoc i pozdrawiam....
Doprowadziłem program do takiej postaci: ............ Wydaje mi się, że to wina tego, że jak przyjdzie przerwanie w czasie obsługi wyświetlacza to się coś kiełbasi. Przerwanie od przepełnienia stosuje po to, by móc mierzyć też dłuższe odcinki czasu, np w przekaźnikach czasowych. Jeszcze jedno pytanie. Dlaczego program z pierwszego postu nie działa?...
Witam Z ciekawości uruchomiłem czujnik MPU6050, kod wykorzystałem z jednej z niemieckich stron - poniżej. Nie jestem pewien, czy kod jest poprawny, bo wyniki są bardzo "ruchliwe". Tzn. gdy płytka czujnika leży nieruchomo na stole to wyniki się zmieniają i o to sporo. Przykładowo: Accx zmienia się od np 10 do 270 Accy cały czas jest duże - nawet ponad...
Witam W oparciu o kod znaleziony na forum Elektroda mam programik wyświetlający adresy układów w magistrali I2C ( TWI ). Kod jest taki: $regfile = "m8def.dat" 'definicja procesora $crystal = 4000000 'taktowanie procesora $hwstack = 32 ' rozmiar stosu sprzętowego $swstack = 10 ' rozmiar stosu $framesize = 40 ' rozmiar ramki Config Debounce...
(...) ' 5 Data 250 ' 6 Data 131 ' 7 Data 251 ' 8 Data 219 ' 9 Wstępna ocena dostępnych informacji W kodzie widzimy dwa liczniki (Liczba_ok i Liczba_nok) zadeklarowane jako zmienne typu Word, a także tablice na cyfry (Cyfra_ok i Cyfra_nok) jako typ Byte. Z punktu widzenia zakresu wartości samych liczników (od 0 do 999) nie powinno to powodować błędów...
Witam. 1. w zapodanym przez Ciebie kodzie baskomowym na atmega8 jest lina If Pind.2 = 0 Then Lcd "Rcvr" Else Lcd " " - napis Rcvr na się wyświetlac tylko w stanie niskim portu >>> To wskazywanie odbioru zegara zrobione jest "na chybcika" i nie działa zbyt dobrze. Może być tak , że zapalone jest Rcvr a odbiornik nie odbiera. Jak regularnie miga to odbiór...
Kiedyś na tym forum na pytanie dla czego spóźnia mi się sekundnik z timera otrzymałem odpowiedź że w bascomie każdorazowe użycie "wait" używa jednego timera, a co za tym idzie blokuje inne.Ktoś mi wtedy polecił zmianę instrukcji "wait" na pętlę zakańczaną przepełnieniem zmiennej z przerwania timera którego używam.Tak więc z własnego doświadczenia znam...
A ja mam oto takie przerwanie: ;=======================================... ; Timer 0 interrupt ;=======================================... .org0x000B t0intv: MOV timer_xxx,TL0 ;2 execution time measurement (start) PUSHACC ;2 PUSHPSW ;2 DJNZclock_clk, noclock ;2 MOV clock_clk,#iclock_clk;2 ; hundreds of seconds INC clk_x MOV...
Tłumaczą Ci ludzie już drugi dzień. Zwłaszcza kolega Logan . Czy tak trudno przeczytać w Helpie: Instrukcja ON INTERRUPT Przeznaczenie: Wykonuje skok do podprogramu gdy wystąpiło określone przerwanie. Składnia: ON źródło_przerwania nazwa_podprogramu Jeśli trudno to porzuć programowanie - są łatwiejsze profesje.
Przeanalizuj swoje odwołania poprzez GOSUB. Masz na 100% zapętlone i stos ci się przepełnia. Najpierw piszesz Gosub Standby a potem w tej procedurze Gosub Glowne , a tam znów Gosub Standby w jednym z warunków. I tak w kółko program sobie skacze i po dwa bajty na stos.
Możliwe, że któryś skok do funkcji niepoprawnie powraca i przepełnia się stos, czego następstwem jest reset mikro kontrolera, prześledź miejsca gdzie wykonywane są skoki i zobacz czy są takie gdzie np wykonujesz skok i zamiast wrócić return to wykonujesz 2 skok.
Witam . Napisałem ( prawie) sobie na ww procesor program w asm i bascomie który ma robić za zamek otwierany kartą . W bascomie wszystko działa w 100 % według założenia jednak w asm mam taki problem że układ sam zmienia swoje taktowanie (ponad 2x) przez co wszystkie funkcje czasowe nie pracują jak powinny . Nie było by w tym nic niezwykłego ( ustawiony...
nie dość, że w przerwaniu dajesz opóźnienia waitms o czym wspomniał kolega powyżej - to jeszcze wyświetlasz coś w przerwaniu na LCD a to już msakra. do tego wszystkiego daj nie tylko dyrektywę informującą jaki zegar ale co najważniejsze dyrektywy ustawiające stos sprzętowy i programowy - dodatkowo zmień wtedy ich wartości na większe niż domyślne bo...
Witam Odświeżę wątek. Dodałem układ UDN2981A pomiędzy Atmege a wyświetlacze, wyrzuciłem tranzystory które sterowały anodami oraz ich rezystory z baz. Działa całkiem nieźle. Jest jedno ale... jasność. Steruje to takim kodem: [syntax=basic4gl] '************ Zegar 6 wyswietlaczy LED + PCF8563 $regfile = "m32def.dat" $crystal = 8000000 $hwstack = 64 ' rozmiar...
Hmm, to znaczy że bym musiał uruchomić drugi timer (8 bitowy). Z tego co pamiętam, to przy maksymalnym dzielniku wychodzi 1 albo 2 sekundy. I w momencie przepełnienia sprawdzać prędkość? Co do pokazywania zer to ogarnąłem wykrywając przepełnienie timera 3 i w tym momencie wyświetlanie zer. cóż wiem , że program pewnie wg Ciebie (z resztą wg mnie też)...
Poniżej wklejam działający kod obsługi czujnika ciśnienia MPL115A2 - może komuś się przyda. Komentarzami nie należy się przejmować, część udało mi się przetłumaczyć w oparciu o inne znalezione przykłady. Teraz ( 23:55 19/04/2013 ) w południowej części Krakowa pokazuje 995 hPa Byte . Jak najlepiej podzielić zmienna typu Long ?
Witam Mam układ, który mierzy dwie temperatury ( DS18B20 ), dwa napięcia ( PCF8591 ( pobiera czas ( PCF8563 ), a z powodu niedużego wyświetlacza ( 12 x 4 ) wskazania są zmieniane do 10 sekund po przepełnieniu Timer1. Układy PCF8563 i PCF8591 są podpięte z "zewnątrz" przewodami około 10 cm. Magistrala I2C ma obniżoną prędkość przez Config I2cdelay =...
Witam. Proszę Was o sprawdzenie poniższego kodu: Problem polega na tym że na LCD pokazuje się error=3 , a w symulacji error=0. Dalsze zwiększanie ramki to jakaś paranoja. Wyłuskałem ten kod z programu który ma kilkaset linii . Tam mam dopiero skutki przepełnienia stosu :-( . $regfile = "m32def.dat" ' specify the used micro $crystal = 8000000...
Witam, proszę o pomoc: buduje sterownik na zasadzie włącz/wyłącz, to akurat nie jest w tym momencie ważne :), ale przejdźmy do szczegółów - ma pobierać dane z 4 czujników DS18B20, sam odczyt działa poprawnie, problem zaczyna się w menu, do kroku "2.2" czasem "2.3" wszystko działa poprawnie, lecz z "2.2" i naciśnięciu 'dalej' (lub "2.3") przeskakuje...
Nie wnikałem w kod, bo Bascomowcem jestem, ale sprawdź go pod kątem poprawności wychodzenia z podprogramów i procedur. Może masz gdzieś nawarstwianie się stosu i następuje jego przepełnienie po pewnym czasie?
W instrukcji CONFIG SERVOS jest taki parametr jak RELOAD = xxx. Liczba xxx określa jaki czas w us będzie pomiędzy kolejnymi przerwaniami licznika taktującego generator PWM dla układów serwa. I będzie to rozdzielczość tego układu. Zatem jeśli wpiszesz 10 to SERVOS(1) = 100 da nam 100x10us = 1ms impuls powtarzający się co 20ms na wyjściu podłączonym do...
Witam serdecznie. Ostatni kod przepisałem żywcem z książki "Programowanie mikrokontrolerów w języku BASCOM" autorstwa Marcina Wiązania. Dioda miga ciut za wolno. Tu mi ręce opadają, dlatego zwracam się do Was o pomoc. Kod: Nie wierzę w to co napisałeś!!! Autor ksiązki nie zrobiłby takiego błędu... Podajesz błędne instrukcje, i oczekujesz poprawnej...
Bo kontaktrony w licznikach rowerowych są jakieś szybsze. Robiłem kiedyś eksperymenty z rowerem i faktycznie zwykłe kontaktrony "rurkowe" nie nadążały się przełączać. Pierwszy z brzegu kontaktron KA-02 ze sklepu na literę T przy napięciu 5V i i prądzie 100mA ma częstotliwość przełączania 125Hz. Czas załączania do oporu 1Ohma wynosi ok 2,5 ms Czas odpuszczenia...
Jak w temacie jak mogę zwiększyć wielkość stosu w bascomie 8051 programowo chodzi program dobrze ale czas od czasu się wiesza i podejrzewam ,że przepełnia się stos na symulacji jest prawie cały wykorzystany czy można temu zaradzić ? zapomniałem dodać że chodzi mi o procek AT 89C4051
może przepełnia Ci się stos ?? sprrawdź podczas symulacji
Nie znam się na bascomie ale moim zdaniem przepełnia Ci się stos. Możesz zmienić rozmiar stosu na mniejszy o połowę i zobaczyć czy szybciej Ci się zawiesi.
Nie wiem masz strasznie zamieszany ten kod:/ I skakasz po całym, spróbuj zwiększyć stos, może Ci się coś gdzieś przepełnia?
Witam, Mam taki przypadek. Układ zmontowany na ATmega644pa i pracujący na zegarze 12MHz. Problem polega na tym, że jak w dyrektywach BASCOMa ustawię $crystal=12000000 to układ zachowuje się dziwnie (jakby mu się stos przepełniał) natomiast jak ustawię coś innego np (10 lub 16MHz) a wlutowany jest dalej zegar 12MHz to układ działa poprawnie.... (fusy...
Nie radzę sobie z przypadkowymi resetami bo zegarek chodzi w zaciszu sypialni i jedynymi przypadkowymi resetami są wyłaczenia prądu gdyż nie dorobiłem się jeszcze zasilania awaryjnego. Na początku miałem trochę problemów z podczerwienią w przerwaniu bo odbiornik łapał przypadkowe impulsy i stos się przepełniał. Wymiana odbiornika IRED i dołożenie filtra...
Ja bym stawiał na brak debounce. Skoro sprawdzany jest stan przycisku to pewnie on do czegoś służy. Może do wyświetlenia informacji na wyświetlaczu. Jeżeli brak debounce to przerwanie to wywoła się pewnie z kilkanaście razy. Może być tez tak ze przepełnia się stos, kilkanaście razy 32 bajty.... i koniec RAM, procek sie resetuje. Ale to tylko zgadywanie...
Podejrzewam że skoro to Atmega32 to tworzysz coś pamięciożernego i stos się przepełnia, szczególnie że wstawka asm robi pushall i popall. Na początku programu daj większy stos, np: $hwstack = 64 I teraz zrób test czy jest dobrze. Jeśli nie to: - używasz przerwań w swoim programie na Atmega32 z opcją NOSAVE? Jeśli tak to wyrzuć NOSAVE - czy próbowałeś...
bez konieczności zliczania przepełnień. Podobnie, odmierzanie czasu 1 sec. stosując Timer1 również nie wymagałoby zliczania przepełnień. Gdybym chciał jednak mierzyć załóżmy do 1kHz to wymaga aby zliczać przepełnienia? Dodano po 30 w złym obliczeniu 1 sek wartość wynosiła 61630, przy prawidłowym obliczeniu wynosi 34 286 uwzględniając czas 1sek, częstotliwość...
dzieki. no dokladnie stos sie przepelnia, Nie wiem jak dokladnie go dopasowac do moich wymagan, ale to kiedys tam. Narazie walcze z tym. wiec testowalem na adresie &H60 i error 90 w "baskupie" (w wakacje poucze sie c, narazie ni mam czasu sesja). error 90 to jest za duzy adres (addess alredy ocupied) zamienilem na 68 dziala. zaraz obadam datasheet do...
Dlaczego się wiesza? to proste i widać to od razu gołym okiem bez "lupy" CALL CZAS kieruje program do "SUB CZAS" SKĄD MA WRÓCIĆ W TO SAMO MIEJSCE!!!!!!!!!!!!!!!! TZN LINIJKĘ POD "CALL CZAS" u ciebie czasami leci do "poczekaj" potem do "główny" Stos się przepełnia i jest kicha.... ot cała tajemnica Musisz inaczej napisać program, pamiętając że rozkaz...
Przysiada zasilanie telefonu lub twojego uP - albo co gorsza zasilasz je z wspólnie z LM7805 a telefony modemy GSM pobierają ok 1000mA przy 12-10V No i oczywiście stos pamiętaj że funkcja inkey też zajmuje stos i może go przepełniać jeśli jeszcze masz jakiś timer i przerwania a wszystko obsługujesz przez LCD to można go zapchać w bascomie - spróbuj...
Witam. Nie istotne jest co wpiszę w: Load Timer1 , 250 czy też Load Timer1 , 65000 liczy tak samo. Dodatkowo stosując prescaler nawet 8 uzyskam częstotliwość blisko 20Hz czyli chyba nie bardzo jak pracę diody. P.s proponuje zerknąć do helpa:) Opis: Instrukcja powoduje wpisanie do licznika określonej liczby zliczanych impulsów. Przed załadowaniem wartości...
Jak procek ma 32KB ROM to licznik przy programie o rozmiarze 19KB nie może dojść do końca. Chyba że w jakiś sposób zmusisz go do tego programowo. Na Asemblerze AVRów się specjalnie nie znam. Ale RESET może nastąpić chyba programowo, masz gdzieć błąd w programie który resetuje system. Może przepełniasz stos lub pamięć RAM. Albo masz gdzieś skok po wektor...
Witam. Nie piszę w Bascomie już kawałek czasu. Ale może dobrym rozwiązaniem jest : 1) otwierać plik i trzymać go otwartym aż do chwili kiedy chcemy kartę wyjąć (jakaś opcja w menu typu "wyjęcie karty") ? 2) może kolejność CLOSE i FLUSH powinna być na odwrót (to tylko moje gdybanie bo nie wiem czy da się tak) bo może przepełnia się jakiś stos ... 3)...
Odkopię temat bo mam problem też z Attiny13. Problem jest następujący: po skonfigurowaniu timera0 jaki licznik zaczyna on zliczać kolejne takty procesora z określonym preskalerem. Jeżeli skonfigurujesz którykolwiek Timer (w dowolnym AVR) jako licznik (COUNTER) to przestaje on zliczać takty processora, a oczekuje na taktowanie zewnętrzne na odpowiedni...
Czy ten kod nadał by się do zliczania impulsów z INT0, ewentualnie co trzeba by zmienić ? Nie. Po pierwsze: Nie możesz liczyć na dokładny pomiar czasu stosując Start/Stop Timer przy użyciu prescalera o wartości różnej od jeden. Wartość timera może zostać incrementowana już po jednym ticku zegara albo nawet po 100; 150; 193 itd. tickach zegara taktującego...
Tak się dzieje jak stosujesz instrukcje Gosub, program idzie do procedury a tam znowu stosujesz Gosub i w tej na koncu nieszczęsne Retrurn. Program idzie w "krzaki" bo przepełniasz stosy i nadpisujesz w pamięci Ram zmienne. Poczytaj o procedurach i funkcjach w pomocy Bascoma, użyj Declare Sub a potem Sub: i END SUB. Stosuj też deklaracje ramki i stosu...
Super dzieki, faktycznie teraz troszke lepiej :-) Dobrze rozumiem? I teraz stosując taka wersję: Poprawiłeś tylko 'syntax' , czyli sposób wpisywania wartośc początkowej do rejestu timera. Rachunek zliczania czasu masz jednak błędny !!!! Prz tym taktowaniu (4 MHz) nie masz żadnej możliwości odmierzenia 100ms przez Timer2; nawet przy zastosowaniu maxymalnego...
Load Timer0 = 144 ............... Jeśli tak napiszę kod w Bascom przy zastosowaniu kwarcu 7.3728 MHz to przerwanie odmierz_1s będzie faktycznie co 1 jedną sekundę? Tak jak to miało miejsce w przypadku kwarcu 8000000 MHz (patrz mój pierwszy post w temacie) Minął ponad rok od założenia tego tematu, ale teraz muszę to już zastosować w praktyce i w końcu...
Tak w ogóle to właśnie zauważyłem że masz błąd w podprogramie Odtwarzacz: [syntax=basic4gl]Odtwarzacz: ... ... ... Gosub Odtwarzacz Return[/syntax] Chodzi o to że ta procedura ciągle wywołuje samą siebie (rekurencja). I przepełnia stos. Tam na dole trzeba po prostu wywalić: [syntax=basic4gl]Gosub Odtwarzacz[/syntax] EDIT. No i drugi ogromny błąd: W...
Nie składam winy na bascom tylko proszę o pomoc kolegów. Problemu z zliczaniem impulsów już nie mam. Napisałem program lecz jest on napisany fatalnie dlatego że nie mam pomysłu w jaki inny sposób go napisać. Może koledzy wskażą mi jak to napisać lepiej dlatego że stos mi się przepełnia i program "wariuje". [syntax=basic4gl]$crystal = 8000000 'Deklaracja...
przepełnienie stosu atmega przepełnienie stosu deklaracja stosu
automapa windows podłączyć przewód punto philips ustawić godzina
telewizor elektron telewizor elektron
Kierownica do Renault Master II - kompatybilne modele Wyciek wody z presostatu w kotle Ariston Clas Evo 24FF