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...
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ść...
Wstawienie etykiety przed 1 istrukcją pętli DO i użycie w obsłudze przerwania skoku GOTO spowoduje pewnie po jakimś czasie przepełnienie stosu. No i tak ma być. Przyjęcie obsługi przerwania polega na odłożeniu na stosie adresu powrotu a następnie wykonanie skoku. Instrukcja reti pobiera ze stosu adres i dzięki niemu powraca w poprzednie miejsce. Jeśli...
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...
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...
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...
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 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...
Jest możliwy, trzeba tylko dbać o to aby nie przepełnić 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?...
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....
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:...
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...
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...
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 ?
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.
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...
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...
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...
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.
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...
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...
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 Chciał bym się dowiedzieć na temat skoków do podprogramów i wykonywania tam operacji z użyciem dodatkowych pętli. Przypuśćmy że mam główny program w pętli DO...LOOP, który wykonuję daną operację. Po pojawieniu się jakiegoś warunku program skacze poprzez GOSUB i zaczyna wykonywać podprogram który też znajduje się w pętli. Po spełnieniu warunku...
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...
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...
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)...
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...
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...
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....
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 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....
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ż)...
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 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...
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...
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.
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.
Poszukałem trochę dodatkowych materiałów do wchłonięcia przez moje szare komóreczki :) 13 Liczniki Słowo licznik to próba przetłumaczenia słowa timer. Ja używam tego słowa jako odpowiednika, ale nie wszyscy się z tym zgadzają i twierdzą, że należy używać słowa timer, gdyż nie można dokładnie przetłumaczyć znaczenia. Licznik to układ liczący o rozdzielczości...
(...) ' 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...
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 ?
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...
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...
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?
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 =...
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, 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...
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...
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...
przepełnienie stosu atmega przepełnienie stosu przepełnienie stosu stm32
usługi lutowania stroić detektor odświeżać laptop
webasto chińskie pralka samsung zawiesza
TCL 43P615 – reset fabryczny bez pilota, przyciski, pinhole, Android TV Matryca Fujitsu Amilo Pro V2030: Specyfikacja i Wymiana