Witam Stos, jest to obszar pamięci do którego zapisuje się kolejkę przerwań i stan rejestrów po zgłoszeniu przerwania. Procesor coś robi, zgłasza się przerwanie, odkłada sobie na stos to co robił, wykonuje przerwanie, zdejmuje ze stosu to co robił przed zgłoszeniem przerwania i dalej to wykonuje. To tak na prędce. Polecam tą stronkę http://www.edw.com.pl/ea/asm_avr.html...
RET - powrót z podprogramu wywołanego przez CALL. RET zdejmuje ze stosu adres umieszczony tam przez CALL, RETI - powrót z podprogramu obsługi przerwania maskowalnego (zainicjowanego przez rozkaz INT n gdzie n= 1..8), RETN [ powrót z podprogramu obsługi przerwania niemaskowalnego (zainicjowanego przez rozkaz NMI). Pozdrawiam wszystkich jjanek
Witam Proponuję jednak zapoznać się z kursem asemblera z EdW. Wyjdzie to na zdrowie. Instrukcja RET jest do powrotu z podprogramu do którego skaczemy LCALL, ACALL. NAtomiast z przerwania zawsze wychodzimy przez RETI. W obsługę przerwania wchodzimy zupełnie inaczej. Jak wystąpi warunek przerwania to procek automatycznie odkłada na stos adres powrotu...
Po wywołaniu WAIT_KEY kod klawisza masz w akumulatorze i zpisujesz wszystkie "próby" na stosie do czasu aż zakończysz 0x0A. Potem zdejmujesz tylko te dwa ostatnie znaki (0x0A) i ten kod. A wszystkie pozostałe nie są ze stosu zdejmowane. Masz wtedy niezrównoważony stos. Musisz mieć tyle samo rozkazów POP ile PUSH, bo inaczej Ci się stos przepełni dość...
Zawsze jak wchodzisz w przerwanie np.On Timer lub w podprogram sub procesor odkłada zawartość pewnych rejestrów na stos (co zajmuje mu ileś us) a po przerwaniu (lub sub-ie) zdejmuje ze stosu (co znowu zajmuje czas). Rachunkowo wygląda wszystko dobrze w programie-ale tylko gdy procesor chodzi z nieskończoną prędkością. A chodzi ze skończoną. A-w tych...
Podprogram musi być zakończony instrukcją RETURN zgodnie ze schematem ........................... Gosub Podprogram ........................... End Podprogram: ........................... Return Return powoduje powrót do następnej instrukcji po Gosub i najważniejsze zdejmuje dane ze stosu (zapamiętane przed skokiem do podprogramu). W ten sposób stos...
Wychodzisz z przerwania za pomocą GoTo. To jest problem. Ostatecznie nawet by to działało, ale przed GoTo musiał byś ręcznie zdejmować trochę rzeczy ze stosu. Ale grzebanie w stosie to raczej nie najlepszy pomysł. Musisz kompletnie zmienić koncepcję programu.
Wszystkie Sub`y powinny być poza pętla Do Loop a tymczasem u Ciebie etykieta Silnik jest w pętli. Gosub czyli "go sub" oznacza odłożenie na stos aktualnego adresu gdzie program jest wykonywany, skok pod adres procedury Sub i powrót w to samo miejsce (a dokładniej do następnego po odłożonym adresie miejsca) poprzez Return Return zdejmuje ze stosu odłożony...
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....
Zamiast goto L1, powinno być call L1 : call odkłada na stos adres powrotu, return go pobiera i wpisuje do pc , goto nic nie odkłada ale return i tak coś, czyli zero, pobiera ze stosu i wpisuje do pc - i program idzie od początku, zdejmowanie ze stosy bez uprzedniego odkładania musi wyprowadzić program na manowce. Przy etykiecie L1 musi być addwf PCL,...
Pamiętaj, że program nie zaczyna się od main. Wcześniej jest jeszcze odpowiedni kod biblioteczny - zwykle nazywa się crt/crt0 itp. Zarówno w mikrokontrolerach jak i w PC, a nawet w większych maszynach plik binarny rozpoczyna swoje wykonanie od ustalonego adresu. Linker umieszcza tam właśnie moduł crt, i dopiero z tego modułu wołany jest main - po przygotowaniu...
Moze problem ze stosem? Ztego co pamiętam o C (nie jestem pewien czy tutaj to działa) to adres powrotu wrzucany jest na stos, a RET zdejmuje go ze stosu i wrzuca do licznika instrukcji.
Ato jest proste czytaj co pisze kompilator : Source string could be too big to fit into target string in line 375 (....) Masz zbyt długie stringi ;) fajnie brzmi to pierwsze a możliwe ze program mimo kompilacji będzie ci nadpisywał stosem zmienne , Ramu jest tyle ile jest i trzeba nim dobrze dysponować jeśli przy każdym przerwaniu odkladasz na stos...
Nie upieram się- można całość umieścić w przerwaniu. Bo jak program krótki to odkładanie/ zdejmowanie ze stosu może być dłuższe niż wykonanie obsługi. Całość nie jest krytyczna czasowo jeśli ma robić tylko dekodowanie.
Takie wychodzenie z przerwania to gwarantowane przewalenie stosu i program w lesie każde wywołanie przerwania odkłada coś na stos czego potem nikt nie zdejmuje efekt przepełnienie stosu i ....
RCALL MAIN dodaje to gdyż kiedyś jedna instrukcja RET wróciła mi aż do RESETu. Jak się nie dba o poprawne odkładanie i zdejmowanie ze stosu to tak właśnie bywa.
Prosze pomóżcie: mam do napisania prace na temat stosu w językach wysokopoziomowych. Zupełna sierota ze mnie w dziedzinie programowania więc zwracam się do forumowiczów o małą pomoc. Czy ten kawałek kodu poprawnie opisałem? Czy moje kilkuzdaniowe wypociny maja w ogóle jakikolwiek sens :-)? http://obrazki.elektroda.net/59_12422309... Jest to bardzo...
Z takich sztuczek to jeszcze - po wywołaniu przerwania zdejmujemy ze stosu oryginalny adres powrotu i zapisujemy swój i procek po zakończeniu przerwania wraca tam gdzie chcemy, ale to raczej tylko w asemblerze.Podobny trik można zastosować do podprogramów ( call ret ).
Bo obsługa przerwania też zajmuje trochę czasu- ileś taktów zegara. Bascom jest "bezpieczny" dla użytkownika i odkłada na stos wszystko- a nie tylko to co potrzebne. A potem zdejmuje ze stosu. Ale za to działa wolno. Spróbuj : on timer0 etykieta przerwania nosave. Ale to będzie szybsze i mniej bezpieczne. Albo ASM.
Strona 214 dokumentacji. Jak wpisałeś bity 1 do tego co wytłuściłem- to zgodziłeś się na przerwanie w dowolnym momencie z ADC. Co z tym robi kompilator- jak napisałem- nie wiem. Nie znam się na C- może robi z tym coś sensownego- ale masz dwa przerwania. Każde zajmuje jakiś czas. Odkładanie na stos->obsługa-> zdejmowanie ze stosu. Poza tym: "Używasz...
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...
dzięki za pomysł ze spacjami, zrobiłem tak i działa. Z 7-segmentowym sobie jakoś poradziłem, natomiast pojawił się kolejny problem a mianowicie co robi pop 00H, wiem ze pop zdejmuje ze stosu a 00H to pewnie jakis adres, jednak nie wiem jaki?
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.
No więc, jest opłacalne i jest stosowane, jeśli by zdejmować elementy ze stosu do pewnego poziomu żeby wygrzebać zmienną to trzeba gdzieś te dane zapisać. Robi się to stosując bezpośredni dostęp pamięci używając tzw rejestru BasePointer, który wskazuje na wierzchołek stosu "na początku" procedury, np procesor x86 ma specjalne rozkazy w których argumentem...
A nie łaska w przerwaniu odkładać i zdejmować rejestry na stos/ze stosu? Push i Pop mogą Ci w programie głównym "nie działać" jak nie wiesz jak z nich skorzystać ale w przerwaniu na pewno zadziałają. Mówisz że wykorzystujesz wszystkie rejestry. Na to nie ma rady. Jest za to inna rada: Nie wykorzystuj ich ;) Po prostu przerzuć parametry do RAMu jak na...
EXC_RETURN jest w tym przypadku "znacznikiem" końca procedury przerwania. Właściwy adres powrotu jest pobierany ze stosu (PC). Ze stosu jest zdejmowana również (między innymi) poprzednia wartość rejestru LR.
Tu nie chodzi o sam potok Cortexa, a o to, że sterownik przerwań jest wolniejszy od samego procesora, więc skasowanie przerwania zajmuje zapewne nawet kilka cykli zegara procesora. Cortex nie zdejmuje ze stosu rejestrów na końcu przerwania, jeśli ma zgłoszone przerwanie, więc ten powrót z przerwania na końcu procedury w praktyce nawet się nie wykona,...
Można zrobić tak aby oba mikroprocesory miały wspólny zegar- to po pierwsze. To że instrukcje wykonywane w przerwaniach zabierają jakiś czas- to po drugie. To że przy wywoływaniu przerwania coś jest odkładane na stos a po powrocie coś jest zdejmowane ze stosu- a to też zajmuje czas- to po trzecie. To co proponuje tadzik85 to jest taki "wytrych". Jak...
Własnie obliczeń nie mam. Powiedzmy że mam liczbę np. 9475. W zapisie bin to jest: 00100101 00000011 jeżeli będę dzielić tylko pierwszy bajt to i potem drugi przez 16 to połączenie wyników nic mi nie da. Dlatego proszę aby ktoś mnie naprowadził na rozwiązanie. W programie wprowadzam z klawiatury 4 cyfry (w górnym rzędzie LCD) każdą wrzucam na stos (zaczynając...
Mam pytanie do kolegi który zamieścił powyższą procedurkę? Dlaczego w podprogramie iobajt połozona na stos jest liczba 2 i 3 a później zdjęta? PUSH 2 to jest zapamietanie na stosie R2 PUSH 3 to jest zapamietanie na stosie R3 ponieważ w tym podprogramię uzywam R2 i R3 a mogą tam się znajdowac informacje które ten podprogram nie powinien niszczyć, dlatego...
Zapis przedstawiony przez Ciebie jest niepoprawny (zgubiłeś po drodze operator dzielenia, być może z nawału operacji...) A poza tym bardzo dobrze! AB*CDEF*-G^/- Ogólna zasada tłumaczenia z notacji wrostkowej na ONP: Każdy argument jest wkładany na stos. Gdy pojawia sie operator, wówczas zdejmuje się ze stosu odpowiednią liczbę argumentów (dwa dla operatorów...
Stos "czyści" się w pewnym sensie automatycznie, po wykonaniu funkcji ze stosu zdejmowane są adres powrotny i wartości kluczowych rejestrów (co uwalnia zajętą przez funkcję przestrzeń na stosie). Nie wiem na jak procesor piszesz program, ale zwykle do stosu jest dostęp, tzn. można przesunąć ręcznie wskaźnik góry stosu, ale obawiam się, że może to się...
Można jeszcze inaczej, jeżeli zależy Ci na przerwaniach, to przy deklaracji, na końcu parametr NOSAVE On Timer1 Gen NOSAVE Durny BASCOM wrzuca na stos prawie wszystkie rejestry po wejściu do przerwania (w sumie 29 sztuk w AVR), a przed wyjściem z przerwania zdejmuje rejestry ze stosu. Stąd niesamowite opóźnienie. Oczywiście po zastosowania NOSAVE rejestrami...
Dziekuje Wam za pomoc. jednak to o czym piszecie juz robilem. czyli zapisywalem sreg zarowno na stos jak i w zmiennej w pamieci bez widocznej poprawy. Zapisywalem rowniez wszystkie rejestry uzywane (pozniej nawet wszystkie rejestry procesora) bez rezultatu. Moze problem jest w tym ze nie wiem dokladnie co robi bascom jak reaguje na przerwanie? moze...
sprawdzalem w wynikowym kodzie w asm, no i z tego co widac kompilator przed procedura obslugi przerwania wzuca na stos ACC, pozniej go zdejmuje. moze wlasnie w tym tkwi problem, ze powinienem jeszcze jakies rejestry na stos wyslac ? jakies pomysly ? pozdrawiam
Witam Przerwanie tak obrazowo tłumacząc: Czytasz książkę, nagle dzwoni telefon. Odbierasz telefon, rozmawiasz. Po zakończeniu rozmowy wracasz do lektury. Procesor wykonuje jakiś kod, dzwonek tel. to jest zgłoszenie przerwania - więc wykonuje kawałek innego kodu - rozmowa tel. Po wykonaniu przerwania wraca do wykonywania kodu. Przy czym wznawia wykonywanie...
Witam Odnośnie pierwszego zadania to jasne jest że procek nie wie gdzie ma wrócić. Jak zdejmujesz adresy ze stosu to wypadało by je poprawnie zachować do odtworzenia. Nie pamiętam teraz czy można zdejmować ze stosu w ten sposób POP 40H ale jak zdejmujesz drugi bajt do akumulatora to trzeba go zachować bo za chwilkę z niego korzystasz i tracisz jego...
To teraz dalej. Polecenie waitms 750 daje konieczne opóźnienie dla przetwarzania wyniku z DS. Ale nie wyłącza przerwań. W czasie tego waitms przerwanie jest wywoływane ok. 2900 razy- przy tych ustawieniach timera. Za każdym razem jest wykonywana dość długa procedura obsługi przerwania - a odkładanie i zdejmowanie ze stosu też jakiś czas zajmuje. Tak...
Nie mam żadnego pomysłu na to aby zmusić kompilator AVR GCC(+AVRstudio) aby procedurę obsługi przerwania calkowicie zrealiować jako procedurę napisaną w assemblerze reszta jest w C. Chodzi o to że niezależnie od poziomu optymalizacji kodu, kompilator dodaje prolog i epilog który mi kompletnie nie pasuje, chodzi o odkładanie rejestrów na stos. Nawet...
Nie wiem czemu się przyczepiłeś do tego ASM, ale śmiem wątpić byś miał gdzieś rzeczywiste porównanie implementacji cpp vs ASM a jedynie bardzo nietechniczne przepychanie się słowne. Jak chcesz udowodnić to technicznie podaj wartości liczbowe a nie słowne. Tak czytam ten wątek i też nie rozumiem dlaczego on to robi, C++/C ma nad ASM rzeczywistą przewagę...
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...
pop R16 pop R17 'zdjęcie adresu powrotu ldi R16, xx ldi R17, yy push R16 push R17 'załadowanie nowego adresu powrotu. reti Wiem że nie w C, ale w C chyba jednak po przezwyciężeniu wszelkich niedogodności da się wstawić taki kod. Do R16 i R17 trzeba załadować adres powrotu. Jak? Nie wiem. W BASCOMie bym wiedział. Ten fragment trzeba odpalić po zdjęciu...
Podejrzewam że ten kalkulator ma wykorzystywać ONP. Poczytaj sobie najpierw co to jest stos i jak sie go używa. Napisz stos i funkcje do jego obsługi (m.in. push i pop), przetestuj czy dobrze działa, a potem zdefiniuj funkcje kalkulatora (dodawanie, mnożenie itp). Funkcje obliczające będą zdejmowały (dodawały) elementy(liczby) ze stosu i wykonywały...
Wie może ktoś co zrobić w Keilu, żeby można było korzystać z więcei niż jednego przerwania? Chodzi o to, że jak jest ich już 2 to nakładają się na siebie. Pisze program w C i nie wiem co z tym fantem zrobić?? W asm to nie ma sprawy bo odrazu robi się skok do właściwej procedury i dopiero tam odkłada się co potrzebna na stos a w C to juz gorzej bo nie...
No właśnie- przerwanie od Timera co 16.384 ms a w przerwaniu tylko inkrementacja jakiejś zmiennej. No ale to Bascom- odkładanie na stos i zdejmowanie zajmie jeszcze kilkadziesiąt instrukcji po 0.0625us przy zegarze 16MHz. Ale nawet wtedy to będzie poniżej 6us. Wystarczy aby obsługa przerwania INT0 była krótsza od 16ms. Zwłaszcza że przerwanie zewnętrzne...
s7-300 stoi na stole,pierwsze male operacje na wejsciach / wyjsciach dzialaja bez problemu,teraz jeszcze detale i bedzie dobze!!!! jezeli sys i ta przeleci wrzystko to dlaczego pisze sie funkcje czy bloki( tylko po to zeby bylo ladnie i czysto czy ma to cos wspulnego z funkcjonalnoscia wielokrotnego wywolania bloku danych pozdrowienia Raczej jest to...
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...
Uwagi praktyczne już po próbach z programem :D Dopiero jak pozmieniałem właściwy program, jak zobaczyłem to w symulatorze doszedłem do jeszcze prostszego rozwiązania. Można podmieniać adresy powrotu w obszarze adresowym stosu, można sobie zdejmować ileś tam danych ze stosu - tylko po co... Wystarczy ustawić wskaźnik stosu SPL na adres początkowy stosu...
Może jaśniej za pomocą komend bascoma ? ja używam w programie instrukcji CALL i rozumiem to tak jeśli wykonuję skok do jakiejś etykiety to program odkłada na stos adres powrotny stos rośnie coś wykonuje w tej etykiecie i wraca z niej z powrotem do poprzedniej , zdejmuje adres powrotny z stosu czyli stos znów maleje i tak w kółko jeśli wpiszę wartość...
Ten program jest dziwnie napisany i być może po czasie brakuje mu stosu. Już wyjaśniam. 1. Po pierwsze powinno się deklarować wielkość stosu #hwstack bo inaczej to masz tam tyle ile masz wpisane w IDE a tam możesz mieć dalej jakieś Tiny2313. 2. Po drugie użycie instrukcji GoTo by przeskoczyć z jednego Sub do drugiego lub wyjście z Sub do pętli głównej...
Mam napisać "prosty" programik jako pracę zaliczniową (1 z 3). Problem polega na tym, że niwząb nie pamiętam już Pascala. Może ktoś pisał kiedyś coś podobnego i mógły sie podzielić... Treści: 1) Napisz program realizujący następujące zadania: -Zdefiniuj rekord, na który składają się dane o samochodach: marka, kolor, rok produkcji, uwagi - Wczytuje dane...
Po pierwsze to zależy na jakim procku to masz napisać, komendy trzeba sobie przejrzeć jakie są dostępne i na tej podstawie coś próbować zrobić. Nie wiadomo, jakie instrukcje są wykonywane więc ciężko ułożyć jakiś scenariusz. Wywołanie podprogramu zapisuje się na stosie, a to ile dokładnie zajmuje ten narzut (przynajmniej adres powrotu z podporgramu...
Niestety Bascom AVR jest nieoptymalny pod względem przerwań, bo obligatoryjnie zrzuca większość rejestrów na stos i je zdejmuje przed wykonaniem treści przerwania. Poza tym, zastanów się czy masz prawidłowo obliczone timingi, bo LOAD 1 nie powoduje, że do licznika wpisywane jest 1, tylko wynik operacji 65536-1, a zatem przy obecnym preskalerze co 8...
Jedyne co mi przychodzi do głowy to to, że zrzuciłeś w procedurze przerwania coś na stos i nie zdjąłeś wszystkiego (lub zdjąłeś za dużo) i przy powrocie zdejmowany jest i przepisywany do PC adres znikąd wzięty (to, co pozostało na stosie). Podobnie sprawa ma się wówczas z PSW. Bo przy skoku do przerwania PC i PSW wędrują na stos :] Pozdrawiam
Dzięki. Chodził mi po głowie ten stos, kombinowałem nawet tym umieszczaniem i zdejmowaniem ze stosu ale wszelkie próby kończyły się porażką. Już widzę gdzie popełniałem błąd. Jeszcze raz dzięki.
Pisałem takie cuś. Wklejam kod i nawet z komentarzami =] LED_BUF_BASE equ 030h LED_BUF_SIZE equ 06h org 00h ljmp Start org 30h Start: mov SP,#040h clr P1.6 mov R0,#LED_BUF_SIZE mov A,#00h Led_buffer_clear: dec R0 lcall Write_to_LED_buffer inc R0 djnz R0,Led_buffer_clear mov R0,#02h mov A,#040h lcall Write_to_LED_buffer Loop: mov A,#01h mov...
ale czy bufor to kwestja języka? wydaje mi się, że tu idzie o zasadę. Ja sobie zrobiłem bufor do rs232 w formie tabli, przerwanie dokłada na stosik znaki a procedurka zdejmuje , wystarczyła 8 bajtowa tabelka żeby nawet pisanie na 4 ręce nie powodowało przepełnienia. Zrób tak samo. Niech przerwanie odkłada ci na stos komendy a procedura niech zdejmuje...
No nie właśnie. W zasadzie to w ogóle nie :D A już na pewno nie tymi programowymi. hwstack to stos sprzętowy. Ale jego wierzchołek musi ustawić programista. uP jedynie sprzętowo umieszcza i zdejmuje tam dane, ale gdzie to robić to musi określić programista. swstack to stos programowy. W sumie nie wiem co to :D frame to ramka i też nie wiem co to :D
Pisanie parsera bbcode zahacza już o pisanie własnego parsera, z definicji chociażby nawet :p. Problemy 1. i 2. nie stanowią większego problemu w moim rozwiązaniu. Proponuję, abyś napisał coś w ten deseń: funkcja, która po prostu wyodrębnia otwarte&zamknięte tagi bbcode z fragmentu tekstu i na nich operuje. Z tym, że jeśli napotyka na otwarcie znacznika,...
Tesz mi przyszedł taki pomysł... na Avr: zrobić w pamięci tablice 8x16.. 8 procesów, na każdy po 16 bajtów... w tych bajtah by były przechowywane: wskaźnik następnej instrukcji (PC), rejestry r16-r21, r26-31,r0 i r1... do całości wykorzystać jeden licznik... do bajtów danych następnej instrukcji (PC) wpisać adres w którym znajduje sie program.. (jeśli...
Ok, mam 3 procedury, licznik włączam w kodzie głównym. R16 przy włączeniu przerwania odkładam na stos (push r16) a przed powrotem zdejmuję (pop r16). W poleceniu mam żeby program zaczynał się od ustawienia int0, jak to przeskoczyć aby nie wchodzić z main do obsługi int0?
Witam Próbuję właśnie "zmusić" zestaw AVT-2250 do współpracy z językiem C. Używam kompilatora SDCC oraz środowiska Code::Blocks. Przygotowałem sobie plik nagłówkowy bios.h oraz plik bios.c (wszystko w załączniku, łącznie z projektem), aby było łatwiej wywoływać procedury zaimplementowane z BIOSie komputerka. O ile z napisaniem obsługi przerwania w asemblerze...
Ok. Ja nie wiem, poddaje się, przeanalizowałem cały kod, ni chu chu nie wiem czemu nagle coś się wykrzacza i dlaczego:/ Wygląda jakby gdzieś przez przypadek zdejmował jeden adres za dużo ze stosu *no albo cokolwiek* i robiąc reta wraca nie skąd przyszedł tylko skąd był call do maina, a za tym callem jest nic innego jak... rjmp do cli a potem rjmp do...
Nie używaj GOTO do "przesiadek" między podprogramami, funkcjami. Skąd program wyszedł tam musi wrócić. Inaczej przy skoku bez drogi powrotnej uC odkłada dane na stosie i ich z niego nie zdejmuje. Jak chcesz by ktoś zanalizował twój program to po pierwsze daj go w całości, żeby można go sprawdzić w kompilatorze i po drugie porób wcięcia, bo ta miazga...
To jeszcze spróbuj doprowadzić do uc jeden wspólny sygnał taktujący ... np. z zewnętrznego generatora. No i pozostaje kwestia programu tu hipotetyzuje bo pewien nie jestem nie zagłębiałem się w to i niewiem jak to dokładnie przebiega : ... zakładam że piszesz w C i jeden i drugi uc coś robią i mogą być w różnych podprogramach to przy wejściu w przerwanie...
Już to znalazłem. Ale jest nieaktywne tak jak przypuszczałeś. Jak wrzucisz screenshota, to może przypomnę sobie jak to uaktywnić (; Zmiana Eclipsa miała jedynie uaktywnić tą opcję (przenieść ją do Preprocesor include paths jak rozumiem). W nowych wersjach ta konfiguracja wygląda zupełnie inaczej - tak jak w linku który wrzuciłem w drugim poście. Dlatego...
a no to źle zrozumiałem sorki, ale w takim razie miałeś chyba słuszną koncepcję że w przerwaniu INT zerujesz sobie Timer a w przerwaniu od ICP odczytujesz ICR tyle, że..... .... po pierwsze ty chcesz mierzyć czasu rzędu ? kliku mikro-sekund??? tzn jakie bywają te różnice po wyzwoleniu ??? jakie masz założenie bo jeśli kilka us albo i mniej - to musisz...
Chcę zdefiniować stos, w tym celu napisałem poniższy kod. Problem jest taki, że funkcja push nie wkłada elementu na stos. Może mi ktoś pomóc? [syntax=cpp] #ifndef STACK #define STACK #include <iostream> #include <new> using namespace std; class stack{ public: int* line; int element; int max ; stack (); ~stack(); int top();//liczba na górze...
Ściślej mowiąc, na 8051 nie da się zrobić operacji push R2 (na przykład). Na stos można odkładać (i zdejmować z niego) tylko akumulator i rejestr B. Trzeba wtedy zrobić tak: :) Witam no muszę powiedzieć że troche kolegę poniosło bo niestety intrukcja PUSH i POP pozwala zapisywać do całego obszaru adresowanego w 51 bezpośrednio - czyli 128 bajtów pamięci...
Rozumiem, że za pomocą tej swojej pierwszej metody chciałbyś uzyskać bardzo wysoką częstotliwość, ale nie bierzesz w tym przypadku pod uwagę, że takie programowe generowanie nośnej dosyć istotnie różni się od sprzętowego, o kótrym wspominał Konrad co sam już zauważyłeś. Tam czuwa sprzęt nad tym a w twoim programowym przypadku musisz wziąć pod uwagę,...
Lysoleq -> ... poczekaj, ale ty po wejściu w przerwanie INT1 inicjujesz Timer0 prawda? czyli ma się wykonać za jakiś tam czas przerwanie no i wykonuje się. Czyli po rozkazie reti skacze do obsługi przerwania timera0. Przecież w pętli głównej masz tylko nop - więc co ten cały program ma robić? jak rozumiem czeka na zbocze opadające na INT1, w tym przerwaniu...
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...
Wiem co robi przerwanie, problem w tym że nie potrafię określić jednoznacznie gdzie ono się rozpoczyna, gdzie zostaje zainicjowane. Czy przerwanie rozpoczyna się zaraz po zezwoleniu sei(); ? Mechanizm inicjowania przerwań jest z jednej strony relatywnie prosty, lecz dostatecznie zabezpieczony przed przypadkowym jego uruchomieniem. Aby uruchomic jakikolwiek...
Dokłądnie, a z kolei przeniesienie stosu na AVR w obszar ExRAM jest marnym pomysłem - dostęp do tej pamięci jest wolniejszy i cały program będzie się wolniej wykonywał ze względu na wolniejsze działanie PUSH/POP i odkładanie/zdejmowanie adresów powrotów. Dodatkowo coś mi się kołacze (trzeba to sprawdzić), że ATMega128 ma jakiś problem kiedy stos leży...
Brawo olekewaagata. Tak to jest i być powinno. Jak dotychczas chyba żaden z procesorów nie ma zawsze stałej ilości bajtów w rozkazie, stąd i przy przerwaniu nie wiadomo czy powrót z niego to do następnego bajtu, a może do następnego itd. A po co stos - krótko po to bo jest wygodny, i samo sie robi. W różnych procesorach jest co prawda co innego nań...
Cześć, czy ktoś mógłby mi sprawdzić, gdzie mam błąd? Siedzę nad tym już trochę i nic nie znalazłem. Dzięki. Kod: [syntax=c]#include <stdio.h> #include <iostream> typedef long danetyp ; class stos{ // towrze klase stos struct wezel // tworze strukture wezel { danetyp dane; wezel *poprzedni; wezel(danetyp x, wezel*p) { dane = x; poprzedni...
Incr Paczka także korzysta z jakiegoś rejestru, którego Ty nie odkładasz przed wejściem do procedury ISR i zdejmujesz po wyjściu - ot cała "głupota" ;-). Przy No save nie używamy instrukcji Bascoma, chyba, że odłożymy odpowiednie rejestry na stos...robiw PS. Skasuj End po Loop, potrafi trochę nabroić ;-)
Czyli na końcu obsługi przerwania można wpisać: Set GIFR.intfx - gdzie x- numer przerwania. Bo to jest tak że rejestr w którym wpisujemy zezwolenie na obsługę przerwania to nie jest ten sam rejestr do którego jest zgłaszana flaga wystąpienia przerwania. Ten pierwszy Bascom obsługuje sam- przez enable. A do drugiego trzeba się "dogrzebać" ręcznie. Pacaneum...
Witam Otóż mam mały problem. Pisze sobie szybkie przerwanie dla timera na Atmega644, to co mi kompilator z C przetłumaczył na assembler wrzuciłem do wstawki assemblerowej a przerwanie zadeklarowałem z argumentem ISR_NAKED, rejestry używane w przerwaniu zarezerwowałem przez: register uint16_t licznik asm("r30"); register uint16_t temp...
Dalsza zabawa ze stosem i rejestrami ;) Zapamiętywanie rejestrów na stosie , oraz ich odtwarzanie. ;składnia pushr A,B i popr A,B ;odkładane i zdejmowane w kolejności od A do B .macro pushr ;max 16 .if (at)0==(at)1 .dw (0x920F & 0xFE0F | ((at)0<<4)) .elif (at)0>(at)1 .dw (0x920F & 0xFE0F | ((at)0<<4))...
Zrobiłem tak jak mówiłeś: wroc:mov A,0 mov A,#Linia1 call LCDRozkaz mov A,r5 ;w R5 starsza polowka timera dziel: mov B,#0Ah;wpisuje 10 div AB PUSH Acc mov A,B ADD A,#30h;od tego kodu zaczynają się cyfry call LCDZnak ;pisze to co jest w Acc POP Acc JZ dalej1 ;jeśli już nie ma co dzielić JMP dziel;jeśli jest to dzieli dalej przez 10 dalej1:mov...
"pod koniec obsługi przerwania wyzerowć jego flagę". Po czym następuje proces zdejmowania ze stosu. Ileś cykli trwa. W tym czasie teoretycznie może nastąpić jeszcze jedno ustawienie flagi. Teoretycznie- bo czekanie na wygaszenie drgań 2x80ms to jest wieczność. Dlatego sądzę że używanie przerwań zewnętrznych do sprawdzania stanu przycisku tylko komplikuje...
To tak zmieniłem: Do Gosub Zrob_cos Gosub Przygotowanie_odczytu Loop '*************************************** Przerwanie_0: 'co 2ms Set Portd.0 If Liczniczek_przygotowanie_odczytu > 0 Then Decr Liczniczek_przygotowanie_odczytu End If Flaga_dodatkowa = 1 'do wykorzystania w innym sub Reset Portd.0 Return '***************************************...
Chcę napisać funkcję w assemblerze, bo potrzebuję użyć kilku instrukcji niedostepny6ch zbyt łatwo wprost z C. I natrafiłem na problem z parametrami na stosie. Pierwsze 4 powinny trafić do rejestrów r0...r3, a kolejne na stos. Ja mam 6 parametrów (wszystkie 32-bitowe) więc ostatnie 2 powinny być na stosie. Testy robię na optymalizacji -O0. Definicja...
Stos w '51 jest analogią stosu talerzy (np. po zmywaniu a przed wycieraniem, przy założeniu że nie masz suszarki :-)) Najpierw myjesz i kładziesz jeden na drugim a następnie zdejmujesz od góry (czyli nie możesz wyciągnąć nic ze środka). Ostatni talerz umyty jest jednocześnie pierwszym wytartym. Konkret. PUSH ACC kładzie na stosie akumulator, PUSH B...
Baardzo mnie przeceniasz. Pisać programów to ja jeszcze nie umiem. Ale napisać co zrobić-spróbuję. Jest taki sposób żeby nie zezwalać na przerwanie-ale odczytać w programie głównym że pojawiło się żądanie przerwania-flaga. W rejestrze odpowiednim. Jak jest-to ją zerujemy (wstawiając 1-a nie 0 -mimo że jest 1-nie rozumiem dlaczego-ale w większości rejestrów...
Nigdy tak jak zaproponował wicy ! ZAWSZE, gdy wejdziemy w procedurę lub podprogram MUSIMY wyjść tak jak należy zdejmując ze stosu to co odłożyliśmy! Zamiast: if koniec=x then goto petla_glowna end if Wstaw: if koniec=x then return end if ----- Jeśli zamiast: petla_glowna: gosub Wykonaj goto petla_glowna wpisalibyśmy: petla_glowna: goto Wykonaj...
To zrob test i przed wywolaniem drugi raz procedury znak ponownie zaladuj DPTR tym samym adresem przed wywolaniem instrukcji movx A,(at)DPTR. Da to pewnosc ze w trakcie Twoich czarow z wypisywaniem na wyswietlacz nie gubisz wskaznika DPTR. UPDATE: Moze wiem o co chodzi. W procedurze znak odkladasz na stos akumulator. Potem zdejmujesz od razu wpisujac...
ok ujmuj jak chcesz ale nie dziw się, że później czegoś nie zauważysz ... a kolejne moje spostrzeżenie - gdzież to kolega zgubił rozkaz RETI na zakończenie przerwania???? w ogóle program obsługi przerwania to jakiś sorrki - ale koszmar. Tak się nie robi. Podstawowa zasada to krótka jasna i przejrzysta obsługa przerwań. A u ciebie dzieje się masakra...
Nie ma problemu z alokacją i ogólnie z działaniem programów. Kolejny przykład: #include <iostream.h> void funkcja(int ile) { char tab[ile]; cout << "Rozmiar tablicy: " << sizeof(tab) << endl; } int main(void) { funkcja(12); funkcja(122); funkcja(9);...
Dlaczego w WinAVR nie działa kod: char *wskaznik; wskaznik=new char[20]; /* ... dzialania na wskazniku ... */ delete []wskaznik; wskaznik=NULL; Kompilator wyrzuca serie komunikatów zaczynając od `new' undeclared (first use in this function) Pisze programik w którym używam dużych tablic po 120-140 znaków. W pewnym momencie (po dodaniu kolejnej tablicy)...
To teraz tak: Przerwanie od OCR1A jest co 10ms. Czyli w czasie delay(255) w pierwszej pętli będzie wywołane przecietnie 8 razy a w drugiej 14 razy. A ile czasu trwa obsługa przerwania? Łącznie z odkładaniem na stos i zdejmowaniem? O tyle x8 lub x14 wydłuży się czas tego delay(). Czy to będą znaczące efekty czy do pominięcia- to musisz obliczyć.
Z obsługi przerwania wyrzuciłem zbędny kod. Wpisałem TCNT0=250; i zlicza bardzo szybko. Zlicza bardzo szybko, ale obawiam się, że niedokładnie. 6 taktów to za mało nawet na tak krótką procedurę obsługi przerwania. Pisząc w C nie widzimy tego, ale samo wejście w procedurę to 4 takty + wyjście (RETI) 4 takty. Do tego zwykle w procedurze obsługi przerwania...
... Program chodzi, ale nie obyło się bez niespodzianek. W funkcji exit_delay przy zdjęciu ze stosu r17 rejestr ten zeruje się i program dziwnie się zachowuje. Zdejmując ze stosu tą wartość do jakiegoś innego rejestru np r25 wszystko chodzi poprawnie. Czy wie ktoś czemu tak się dzieje? Cóż , Twój przypadek , można by porównać do takiej opowieści: "Wkładam...
siemka, mam taki kodzik: [syntax=cpp]#include <iostream> #include <stack> #include <conio.h> using namespace std; int main() { stack <int> stos; int tab1[3] = {1,2,3}; stos.push(tab1); //tu pojawia sie blad getch(); return 0; }[/syntax] no i tu pojawia się problem, bo takie coś nie działa i nie da się tak po prostu położyć tablicy...
Wówczas takie programowanie przestaje się znacząco różnić od zwykłego C. Tia... a tworzenie zmiennych, zmienianie ich rozmiarów i dynamiczna alokacja pamięci są nawet prostsze (; Do niektórych zastosowań assembler ma sens, ale tych zastosowań jest coraz mniej - niestety lub stety - zależy co kto lubi. Ja początkowo uważałem, że assembler jest najlepszy...
Chyba nie do końca, ponieważ adres powrotu jest jednak w LR ponieważ instrukcją wyjścia z tej procedury jest: bx r14. Ale coś w tym jest że poprzez instrukcję: orr r14, #0xd modyfikuje się dodatkowo tryb pracy. Ale nadal nie rozumiem jak w tym r14 pojawia się właściwy adres - adres nowego tasku - do którego został procesor przełączony. Rozumiałbym gdyby...
Widać nie chce kolega przyjąć do wiadomości, że prolog i epilog przerwania w BASCOM-AVR jest bardziej rozbudowany. Dlatego przekładanie "żywcem" przerwań i ustwaień czasowych z języka C na nic się nie zda. Ten sposób sterowania w BASCOMie jest niestety wadliwy, a pisanie przerwania jako $ASM...$END ASM z klauzulą NO SAVE jest już wyższą szkołą jazdy....
Jeżeli projekt ma być abstrakcyjny i zupełnie poglądowy, to może być np. coś takiego: - popychacz (pneumatyczny np.) wypycha kolorowy klocek z pionowego podajnika na taśmociąg poruszający się z określoną prędkością. - klocek przesuwa się pod czujnikiem koloru, jeżeli jest czarny to jedzie dalej, jeżeli ma inny kolor to ramię robota zdejmuje go z taśmy...
mikmas: a jednak wrzuciłeś esencje naszej rozmowy na forum... pic'e pracują nieco wolniej.. w większości piców 4 cykle zegara składają sie na 1 cykl maszynowy. poszczególne stany rdzenia są jednoznacznie identyfikowane. avr działają z szybkością 1:1 - 1 cykl zegara to 1 cykl maszynowy (w przypadku większości instrukcji prostych), ale poszczególne stany...
deklaracja stosu analiza stosu pamięć stosu
megane światła dzienne master tempomat opinia gorenje
Wymiana filtra w klimatyzatorze Hyundai HCD-M18IU/2 Jak odblokować tablet Android z logo powitalnym?