ecx jest rejestrem, nie zmienna lokalna. Jesli wolana funkcja korzysta z tego rejestru (a moge sie zalozyc, ze tak jest), to Twoja petla sie rozsypie.
witam ! potrzebuje pomocy z tematem ktory mam do opracowania ale nie mam najbledszego pojecia jak sobie z tym poradzic. pomyslalem ze tutaj znajde napewno kogos kto znalby odpowiedzi na ponizsze pytnia. oto one: 1) Napisz w asemblerze pętlę, w której będzie zmieniany bit 0 portu P1 (P1.0) na przeciwny dokładnie co 4 cykle zegarowe. Ten fragment programu...
Witam, czy znacie może jakieś ciekawe materiały które w sposób wyczerpujący omawiają pętle w Assemblerze dla mikrokontrolera 8051. Napisałem już kilka prostych programów realizujących poszczególne rodzaje pętli,ale na pewno jest coś czego nie potrafiłbym zrobić. Z góry dziękuję za pomoc
Witam. Nie mogę zrozumieć co oznacza symbol $ stosowany w programach np: DELAY:PUSH AR0 PUSH AR1 PUSH AR2 MOV R0,#01H QWE2:MOV R1,#0FFH QWE1:MOV R2,#0FFH DJNZ R2,$ DJNZ R1,QWE1 POP AR2 POP AR1 POP AR0 RET Pomóżcie proszę. Grzegorz. Przeniesiono z Programowanie Ogólne. - arnoldziq
lepiej: [syntax=asm] START: setb p1.7 mov r7,#X djzn r7,$ clr p1.7 mov r7,#X djnz r7,$ sjmp START [/syntax] Opóźnienie 1+1+2*x Swoją drogę C jest bardzo dobrym językiem ale nie na 51 niestety. Architektura nie jest zoptymalizowana pod kątem programowania w C.[/code]
Nie wiem jak to działa gdy kasujesz TI w przerwaniu. To już poziom assemblera czy wcześniej sprawdzasz warunek pętli while(TI==0) {}; czy też w obsłudze przerwania jest kasowana flaga TI. Włącz debugger w keilu ustaw breakpoint w przerwaniu i zobacz jak program działa. Sądze że skasowanie linii "if (TI) { TI=0; }" rozwiąże problem :) Korzystanie z funkcji...
temat do zamknięcia
Bez wątpienia na wyjściu uzyskasz stan wysoki. Jeśli chcesz ustawić pin jako wejście z podciąganiem, to kasujesz odpowiedni bit DDRB (cbi) ale w PORTB ustawiasz odpowiedni bit (sbi). ps. brakuje pętli nieskończonej na końcu.
Witam potrzebuje pomocy z zadanie. Program ma dzielić 2 liczby z a i b. Nie mam pomysłu jak to zrocić by nie podawać wartości c [syntax=assembler] POB a pętla: SOM koniec POB c ŁAD b ODE c POB a DOD Jeden ŁAD a SOZ pętla koniec: POB c STP a: RST 12 b: RST 24 c: RST 2 Jeden: RST 1[/syntax][/code]
No właśnie może Wam się to wydać głupie, ale kumam assemblera nawet trochę ale pętle to moja zgroza :( Nie mówie że jestem specem ale swoje wiem. A w jaki sposób można wydłużać i skracać ten czas? I czemu zeruję rejestr np. R2?
v5 wygląda na wskaźnik na tablicę bajtowych elementów, które są indeksami dla tablicy dword_40F458 po wykonaniu operacji xor z bajtową zmienną i. Po każdym obrocie pętli wskaźnik ten jest przesuwany na następny element tablicy (v5++).
http://www.avrbeginners.net/ a dalej: AVR Assembler --> Conditional Branches / Loops
To wiem. Nie chodzi mi o czysty assembler tylko o wykonywanie pętli for w C (gcc). jak zmierzyć ile czasu będzie wykonywać się np. for (int i = 0; i < 255; i++); Przecież takie for to kilka instrukcji procesora (jakich) ? I tu tkwi sedno. Tylko nie pisz proszę abym zerknął w żródła kompilatora/libc :>
Witam, Programy typu zapal diodę w pętli już przerobiłem, od paru dni męczę sie z Real Time Timer . Napisałem sobie program który co 2 sekundy zapala kolejną diodę, aż do 8 diody. W symulatorze program działa w porządku , ale jak testuje na płytce, to zapalają mi sie po 2 sekundach wszystkie diody i nie wiem co jest. Program jest napisany w Keilu. Oto...
W załączniku - przykład z dokumentacji DSM'a (Gałka). Wystarczy wyslac na wyswietlacz tekst, a potem wysylac zadanie przewiniecia w pętli.
WDT w programie jest włączony i działa bardzo dobrze, ale do znalezienia usterki trzeba było go wyłączyć. Program jest napisany w Bascomie. Pętla, o której mowa, jest w bibliotece obsługującej wyświetlacz. Nie ja pisałem tę bibliotekę, ja nie znam assemblera. Mi wystarczy dołożenie licznika obrotów tej pętli i wyjście po jego przekroczeniu. Transmisja...
Najprymitywniej, to sobie policz liczbę X, żeby taka pętelka: for (j=0;j<X;j++) trwała 1ms. Pewnie wyjdzie X=1500, ale znając życie, to powinno być gdzieś około 1300. (Oczywiście dla Twojego kwarca 18MHz) Potem zadeklaruj funkcję: [syntax=c]void delay_ms(unsigned int ile_ms) { unsigned int i,j; for (i=0;i<ile_ms;i++); for (j=0;j<X;j++); //tu...
Standardowa pętla zlliczająca X razy w assemblerze AVR to: ldi R16, X !Loop: nop nop nop nop dec R16 brne Loop Tylko że w Twoim przypadku trzeba zliczać o jeden raz więcej.
Ogólnie programik miał przetworzyć otwierany plik, nagarć go jako inny i odpalić. Assembler'em można by było w pętli... no i bym nad tym siedział niewiadomo ile :). "Czas to pieniądz." Qbasic fakt darmowy i mam go w jednym paluszku..Oj dawne czasy... Sprawa załatwiona, wszystko działa, tematu jeszcze nie zamykam, żeby nie za wcześnie popadać w zachwyt...
Wielkie dzięki, A w MIDE-51 można pisać program w C i skompilować na hex zeby działał na tym atmelu? Bardzo ułatwiłaby mi napisanie programu pętla 'if' której nie ma w assemblerze i ciężko mi bez niej.
Możesz mi przybliżyć skrót PWN ? Czy dobrze rozumuję ? Zakładam,że chcąc kontrolwać częstotliwość generowango dźwieku muszę znać czas trwania cyklu maszynowego i brać pod uwagę ilość cykli, które tzajmuje wykonanie karzdej instrukcji zawartej wewnątrz pętli. Dopiero zaczynam dłubać w assemblerze i jakoś nie mogę wskoczyć. Wcześniej programowałem w językach...
Napisać to nie ... ale mogę ci podpowiedzieć: Ja bym użył instrukcji test <adres>,1 i jak wynik jest zero to parzysta. Oczywiście wszystko to trzeba umieścić w jakiejś sensownej sprytnej pętli i podliczyć. (zakładam że chodzi o assembler x86)
Witam kolegów. Chciałbym, żeby ktoś pomógł mi zrozumieć skąd się bierze i ile jest cykli podczas wysyłania/odbierania jednego bajtu przez SPI? Z tego co zrozumiałem to przy podzielniku SPI / 2, dla 8MHz, powinienem móc wysłać trochę poniżej 500kB/s. Zegar SPI ustawiłem na Fcpu / 2. Robię: [syntax=c]SPDR = 0; while(!SPSR & (1<<SPIF)); [/syntax]...
Mój nauczyciel od ukladów mikroprocesorowych zadał nam dwa zadania, w których to należy napisać program w assemblerze pod 8051. Oto ich treść: 1. Napisz prosty program sumujący dwie liczby binarne w assemblerze dla 8051. 2. Napisz program przenoszący wartość 10H pomiedzy rejestrem R0 a zewnętrzną pamięcią danych w nieskończonej pętli (assembler dla...
http://obrazki.elektroda.pl/6793166500_1... Mini DDS (Direct Digital Synthesis) Często potrzebny jest prosty generator funkcyjny dla wygenerowania określonej częstotliwości. Generatory komercyjne są drogie, więc najtaniej jest zbudować generator samemu. Niniejszy projekt przedstawia bardzo prosty generator typu DDS składający się z układu...
a) A=1 movA,#1b Do akumulatora A wpisujesz wartość 1 (wartość binarna 00000001b), pozostałe instrukcje nie wpływają na wartość akumulatora. b) A=0 movA,P2 Do akumulatora A wpisujesz wartość z portu P2 (port P2 do masy – co daje wartość 00000000b) c) A=2 movA, #2h Ostatnią wartością wpisaną do akumulatora A jest 2 (wartość szesnastkowa 02h) d)...
double func( double A Hmm.. A jak 64-bitowa liczba double została zmieszczona w czterech 8-bitowych rejestrach? Magia się dzieje :) A co do pisania w ASM, moje zdanie jest takie, że dzisiejsze kompilatory są na tyle dobre, że przy włączonej optymalizacji naprawdę trudno jest samemu napisać lepszy kod. Oczywiście, tam gdzie jest potrzebna większa kontrola...
ok sorry może się trochę rozszalałem ale denerwują mnie strasznie kolesie szukający tu zaliczeń. Tak więc w asemblerze dobrze jeste przede wszystkim porządnie przygotować sobie strukturę programu: początek: .cseg ; .org 0 ; rjmp RESET ; .org INT0addr ; reti ; .org INT1addr ; reti .org OVF2addr reti .org OVF1addr reti .org OVF0addr ; reti .org URXCaddr...
Daj mi kod dla komputera Commodore C64 na cykliczną zmianę koloru ramki obrazu, osobno w języku basic i osobno w assemblerze Oczywiście! Oto prosty kod w języku BASIC i assemblerze dla komputera Commodore C64, który cyklicznie zmienia kolor ramki obrazu. **BASIC:** ``` 10 FOR I = 0 TO 15 20 POKE 53280, I 30 FOR J = 1 TO 1000 : NEXT J 40 NEXT I 50 GOTO...
Kod jest bardzo nieoptymalny, zauważył kolega powtarzające się fragmenty? Od takich rzeczy są procedury. A całość powinna się wykonywać w pętli z inkrementacją (i wyjściem po uzyskaniu zadanej wartości czyli 9999)
Może nie stricte z tematem, ale miałem podobną sytuację na początku swojej zabawy z mikrokontrolerami. Pisałem programy w bascomie na 51 i na Avr i dla przyśpieszenia działania robiłem wstawki w asm. Po pewnym czasie moje programy wyglądały tak [syntax=c] $ASM Kod programu $ENDASM [/syntax] Wtedy doszedłem do wniosku że używanie bascoma nie ma sensu...
Ad4.Wykorzystałbym to że można w pętli przekręcać akumulator na siebie i kopiować jego wartość na port P3.Wcześniej ustawić P3 w stan wysoki i wpisać odpowiednią wartość do A.
Możesz zbudować zewnętrzny zegar 4MHZ na bramce cmos i podać go do Attiny13 lub zamienić pętle opóźniające , jeśli się da oczywiście . Przy zegarze 4.8 będziesz miał do zliczenia o "kilka impulsów" więcej aby uzyskać ten sam czas. Przykładowo w programie autora jest : ldilicz1,0x32; początkowa wartość p1:ldilicz2,0x3B; odliczenie 2.25 msek p2:declicz2...
Witam Kiedyś podczas poszukiwania materiałów i gotowych przykładów na PICe znalazłem stronę na której jest skrypt generujący takie właśnie pętle. Wpisujesz kilka podstawowych parametrów i otrzymujesz gotowy kod do wklejenia. http://www.piclist.com/techref/piclist/c...
Witam! Napisałem w C taką funkcję opóźniającą void wait100ms(unsigned char x) { unsigned char a,b; for (;x > 0; --x) for(b=50; b>0; --b) for(a=100; a>20; --a) __asm("nop"); } Niestety nie wiem jakie wartości mają mieć dokładnie a i b by pętla trwała 100ms. Zaglądałem do listingu ale nie znam dobrze assemblera do AVR i nie mogę sobie z tym poradzić,...
a to nie lepiej zrobivc wstawke assemblerowa i zrobic taka petle w assemblerze? bedziesz mial wtedy o wiele lepsza dookladnosc, no chyba ze takiej niepotrzebujesz
Zacznij od robienia opóźnień pętlami i w ogóle od obycia się trochę z assemblerem, pomigaj na początek LEDami, a jak już nabierzesz trochę wprawy, to wtedy zabierz się za obsługę liczników / timerów i pozostałych peryferiow. Najlepsi programiści kiedyś od tego zaczynali... Porywanie się na początku za coś bardziej skomplikowanego tylko Cię zniechęci....
Kwestia czy to się opłaca czasowo... Wszystko zależy od tego, co chcemy osiągnąć. Nie próbuję tutaj forsować używania na siłę przerwań, ich zagnieżdżania i maskowania. Niemniej uważam, że to cenna umiejętność. ... ja wyznaję zasadę: im krócej w przerwaniach tym lepiej Myślę, że to dobra zasada, jednak nie zawsze się da tak krótko, jak by to było pożądane,...
Da się. Napisz program, który w pętli kolejno: wyświetla liczbę, czeka 10 sekund, gasi liczbę, czeka 10 sekund.
Skorzystanie z rozwinięcia w szereg Taylora jest jednym ze sposobów. Chociaż wydawało mi się, że przybliża się rozwinięciem jakieś bardziej skomplikowane wyrażenia, gdzie stosunek dokładność/czas wykonania będzie korzystny. Assemblera znam z programowania na PC. W AVR używam C, na razie asm nie jest mi potrzebny. Z ciekawości zajrzałem do datasheeta...
Więc tak, program ma wyświetlić na wyświetlaczu LED moje imię i nazwisko oraz klasę, to właśnie podałem w kodzie i to działa, druga część programu ma się składać na to że jeżeli wcisnę np. enter wyświetli mi datę na segmentowym ( 7 segmentów ) To ma działać jako jedna całość nie dwa programy. Jak doczytasz kod zauważysz że próbowałem wstawić key tylko...
Język to ASM, Jeśli chodzi o samą składnię assemblera to raczej nie mam problemów, i też wiem co to pętla ;) Bardziej chodzi mi o zagadnienia bardziej teoretyczne w stylu metod rozbicia danego problemu w taki sposób aby pętla nie obracała się zbyt wolno żeby nie powodować zbytnich opóźnień w dalszych częściach programu które mogły by np powodować błędnych...
Trochę metodą prób i błądów udało mi się zrobić działający kod. [syntax=c] // Sotware SPI assmbler 1 ver 2 well working void Spi_8_bittransfer(unsigned char data) { asm volatile( \ "ldi r24, 8 \n\t"\ "LOOP%=: \n\t"\ "cbi 0x18, 2\n\t"\ "cbi 0x18, 1\n\t"\ "rol %0 \n\t"\ "brcc ZERO%=\n\t"\ "sbi 0x18, 1\n\t"\ "ZERO%=: \n\t"\ "sbi 0x18, 2\n\t"\ "dec r24...
Widziałem gdzieś tam (chyba w bibliotece peryferyjnej STM32 albo w CMSIS dla STM32), no ale co z nimi? Mój startup robi z grubsza to samo, dodatkowo korzysta z dwóch stosów i jest krótszy (tego typu pętle, nie wiedzieć czemu, zawsze kompilują się do wieeeeeeeelu rozkazów assemblera, choć wystarczy te kilka które jest u mnie). 4\/3!!
Nie sądzę, że w asemblerze wygenerujesz coś znacząco lepszego niż kompilator, za to powinieneś ułatwić życie kompilatorowi. Zacznij od zadeklarowania wszystkich zmiennych roboczych jako 32-bitowych - to już coś powinno przyspieszyć. Potem popraw nagłówek pętli: int32_t i; for (i = 31; i >= 0; i --) Zamień kolejność & i >>: red = SWAP(*pixels) >> 10...
Tu: http://alds.stts.edu/APPNOTE/MCS51/AB-40... jest procedura dzielenia liczby 4 bajtowej przez 2 bajtową, trzeba tylko zwiększyć dzielną do 6 bajtów i liczbę obiegów pętli z 32 to 48. PS zakładam że jeśli bawisz się assemblerem to wiesz o co chodzi
Czyli jedynym wyjściem jest programowanie w C++. Tylko czy języki programowania inne niż Assembler są bardzo związane z procesorem, zajmują mało miejsca i są szybkie, co umożliwia chyba pisanie wirusów. Dopiero co w C++ uczę się pętli i nawet w miarę je umiem i wiem, że przede mną jeszcze długa droga dlatego chciałbym wiedzieć czy C++ to dobry wybór,...
z tego co ostatnio liczyłem to taka pętla: Dodano po 1 A no i bez nop'a kompilator przy pewnych ustawieniach wytnie Tobie całą pętlę.
poczytać o podstawowych funkcjach (mov,add itp) poczytac o skokach (jmp,je,jle itp) scignac kompilator np ASM32 czy jakostak napisać programy typu: Sortowanie 3 liczb, jakieś pętle itd a gdzie infomacje : www.google.pl
:oops: przyznaje sie bez bicia - pic'ow nie programowalem 6502, 68k, x86, '51, od biedy z80 i avr no i pierwsza prawda programisty niskiego poziomu - assembler przenoszalny nie jest :) ale.. to tylko pomysl ze starych dobrych czasow
dokładnie. do assemblera, a potem to już tylko żmudne podstawiania i analiza kodu.. przyda się też znajomość tego, jak pętle (np. z C) są realizowane na poziomie assembera. przy krótkich programach - idzie to rozkminić. powodzenia! -- migod
Na schemacie który przedstawiłeś nadal nie mam pojęcia co jest w jakiej kolejności wykonywane. Dlatego że tego nie opisałem. Jednak jest możliwość sprawdzenia z poziomu symulatora PC, albo bezpośrednio po komunikacji z US... Oczywiście jest możliwość zadeklarowania kolejności, bo niejednokrotnie jest to kluczowym elementem poprawności działania programu....
Witam! Tak, to jest gotowiec na uPC. Ściągnij sobie wszystko z tego linku, który zapodał "avatar". Jest tam źródło do programu w assemblerze, a więc nie musisz pisać wszystkiego od nowa, wystarczy wprowadzić stosowne dla Twojego projektu poprawki. Pozdrawiam
Ciekawostką jest to, że ARM jest jedną z niewielu, jeśli nie wręcz jedyną architekturą, w której moduł startowy może być napisany całkowicie w C, bez jednej linii kodu asemblerowego. Drugą ciekawostką jest to, że jedynym znanym mi producentem, który z tego skorzystał, był NXP (zdaje się, że jednak obecnie start dloa NXP jest częściej pisany w asemblerze)...
Przerwania podstawowe muszą być z częstotliwością 4*minimalna częstotliwość wyświetlania pojedyńczej cyfry. Spróbuj np. przerwania o częstotliwości 100 Hz. Co przerwanie wyświetlasz kolejną cyfrę. Co 100 przerwań zwiększasz stan zegara o 1 sekundę. Modyfikację czasu robisz po pełnym cyklu wyświetlania (4 cyfry). To co ci podałem to zasada działania...
org 0h start: ;wlasciwy poczatek programu ; mov a,#1 ; mov b,#0ffh acall polskie acall lcd_clear main_loop: acall lcd_init ;inicjacja wyswietlacza acall powitanie ajmp main_loop ;skacz do poczatku polskie: Coś mi tu nie gra! Najpierw robisz lcd_init, potem powitanie, a potem znów init ... i tak w kółko! Inicjalizację lcd zrób tylko raz - najlepiej...
ORG 100H to jest dyrektywa, że kod po niej ma się zaczynać się od tego nowego adresu, a nie rozkaz procesora... Myślę, że jak o pogooglasz pod hasłem "assembler directives", to się trochę rozjaśni... EDIT: Pogłębiłem i rozjaśniłem wypowiedź...
Taki program mógłby wyglądać tak: Mnożna: rejestr E Mnożnik: rejestr A Wynik: rejestr HL LD HL,0000 ;inicjacja wyniku LD B,08 ;licznik pętli LD D,00 ;zerowanie bardziej znaczącego bajtu DE NXBIT ADD HL,HL ;przesunięcie wyniku w lewo RLA ;sprawdzenie cyfry monożnika JR NC, FIN ;opuszczenie zera ADD HL,DE ;dodanie mnoznej FIN DJNZ NXBIT ;powrót do początku...
Wystarczy jak to zrobisz w pętli i będziesz je wyświetlał po kolei. Tylko musisz pamiętać o zwłoce czasowej pomiędzy znakami aby je można było zobaczyć na wyświetlaczu.
Wg mnie przydałaby się jakaś pętla opóźniająca bo efektów pracy tego programu na procesorze chyba nie zauważysz. Chyba że analizator stanów logicznych podłączysz.
Wykorzystując chwilową przerwę w dyskusji na temat hardwaru pozwolę sobie zaprezentować prosty programik użytkowy (?) ZEGAR. Napisany w assemblerze zajmuje RAM od adresu 5000hex do 5878hex (2128 bajtów). Adres startowy to G:5000hex Program korzysta z pętli czasowej 1 sekundy i można skorygować szybkość chodu zegara dopasowując do częstotliwości pracy...
Witam! Po udanym skompliowaniu programu MASMem, wywolujac program wyskakuje mi w lini komend : Przekroczenie dzielenia. Czy ktos wie dlaczego tak sie dzieje ? Co to oznacza ? I jak mozna temu zaradzic? Dodam, ze mam w programie kilka petel przesuwajacych bity w lewo i w prawo oraz kilka dzielen. Z gory bardzo dziekuje ! Pozdrawiam.
Dość dawno już nie pisałem w assemblerze ale z tego co widzę, to program nie może pozostawać w pętli start_i2c, bo nie ma tam żadnej pętli. Proponuję zajrzeć tutaj - powinno w rozwiązać problem: http://www.elektroda.pl/rtvforum/topic53... W podprogramie start_i2c, po zapisaniu rejestru TWCR powinienes poczekac na ustawienie flagi TWINT (oznaczajacej...
Po pierwsze musisz ten kod przetlumaczyc sobie na assembler. Nastepnie sprawdzic ile kazda instrukcja zajmuje cykli zegarowych, a to powoduje ze musisz wiedziec dla jakiego uC przeznaczony jest ten kod.
Witam Hmmm jak dla mnie to nie napiszesz dokładnie tego samego w C co w assemblerze chyba ze zrobisz wstawkę assemblerowską, pozatym wyłącz sobie optymalizacje w AVR studio to wykonanie 1 obiegu pętli z 11 cykli wzrośnie Ci do około 29 ;) Jak dokładniej chcesz zobaczyć jak kompilator tłumaczy Twój kod na assemblera to kliknij sobie view i dissasembler,...
W opisie do VDSP++ (dla procków BlackFin) jest napisane jak należy programować w C, aby kompilator wykorzystywał sprzęt DSP. Są tam przykłady jak organizowac pętle, mnożenia itp, a jak tego nie robić. Chociaż moim zdaniem i tak pełną kontrolę daje dopiero assembler.
Jedyny problem - to długość dzielnika. z tego powodu praktycznie nie możesz użyć dzielenia stałopozycyjnego i musisz zrobić je na piechotę, czyli przez przesuwanie i odejmowanie - pętla iterowana max. 53 razy. Przed dzieleniem do manytsy musisz dopisać bit części całkowitej. Na końcu czeka Cię jeszcze korekcja wykładnika.
Hmm, tak trochę pomyślałem i dochodzę do wniosku, że jednak tu nie ma mnożenia przez int'a, więc raczej problemów z tym nie ma :P. Rzeczywiście pokombinuję z tą stałą zmienną i zobaczymy, co się będzie działo. Z tym przeglądaniem assemblera, to na razie odpada, więc mam pytanie, czy jest jeszcze jakiś inny, lepszy (i darmowy) kompilator C dla '51?
Dzięki wielkie za pomoc, oczywiście po wprowadzonych poprawkach program działa :) 1. Tak masz racje SIGNAL wyłącza automatycznie wykonywanie przerwań 2. Co do goto to takie przyzwyczajenie z assemblera zostało. W każdym razie dzięki za wskazówki i za pomoc, która sie przydała :] Pozdrawiam Marcin
LED-MASK EQU 10000000B LJMP START ORG 100H START: LOOP: ; początek pętli LOOP XRL P1 ,#LED-MASK ; funkcja exor na porcie P1 MOV A ,#10 ; tu przepisanie do A liczby 10 nic nie wnosi w pętli LCALL OPOZ LJMP LOOP ; koniec pętli LOOP OPOZ: ;poczatek petli opoznienia MOV R0 ,#0 MOV R1 ,#0 MOV R2 ,#0 X: DJNZ R0 ,X ; odejmuje od R0 liczbę 1 i sprawdza czy...
Nie wiem dlaczego, ale gdy przesuwam sekcje .text na obszar bootloadera i jednocześnie początkowy obszar pamięci FLASH jest nieużywany to procek się wiesza (procek startuje od adresu bootloadera). Natomiast gdy wrzuci się na początek funkcje, w której jest nieskończona pętla to całość działa prawidłowo. Pisząć program w assemblerze jest ten sam efekt...
Ja w sumie jestem ciekawy czy ktoś miał możliwość debugowania kodu gdzie został wykorzystany super scalar. Analizowałem jedynie assembler wyjściowy po optymalizacji pod super skalar (TI ma bardzo fajne narzędzia do swoich procków do analizowania i eliminacji bottle necków w kodzie dla pętli for), ale nie było mi dane debugować (i niestety nie będzie)...
Odpowiedź jest bardzo prosta: instrukcja if ( zresztą każda instrukcja wrunkowa czy pętli ) napisana w języku wysokiego poziomu, przed załadowaniem do procka, musi zostać przetłumaczona na kod maszynowy ( assembler ). W języku takim jak Basic ( czy dowolny inny ), widzisz tylko jedną linijkę, ale w kodzie maszynowym zajmuje ona dużo więcej ( wręcz tworzona...
Wystarczy zwykły attiny2313 (chyba że musi być to atmega), przecież ma wbudowany układ UART. Odczytujesz w pętli (albo w przerwaniu timera) stan PinB, dalej, wysyłasz to poprzez UART do komputera.. Do napisania w pół godziny w assemblerze dla kogoś kto dopiero się uczy :) (Mogę Ci pomóc z tym kodem, daj tylko znać na priv...)
Kolego, najwyraźniej nie wiesz ani o co pytasz, ani jak daleko jesteś od celu :) Ale to do wybaczenia, skoro się dopiero uczysz. Zacznijmy od tego że nie ma tak jednoznacznego pojęcia jak "programowanie robotów". Co w ogóle masz na myśli mówiąc "robot"? Zabawka z Lego Mindstorm? Piesek Aibo? Spawarka przemysłowa? Bezzałogowy Predator? To wszystko są...
Po co stosować tu przerwanie? Kardynalny błąd to stosowanie polceceń opóźnień w przerwaniach. W tym programie problem tkwi w: If Przycisk = 0 Then Waitms 100 If Przycisk = 0 Then Incr Sekwencja If Sekwencja = 0 Then Incr Sekwencja If Sekwencja = 4 Then Sekwencja = 1 End If End If End If End If Popraw na: If Przycisk = 0 Then Waitms 100 If Przycisk =...
memcpy nie ma prawa blokować jakiegokolwiek timera. To jest zwykła funkcja biblioteczna, i na pewno nie sprawdza ktory akurat timer masz włączony i również nie ma kodu aby go wyłączyć. Memcpy jest najpewniej napisany w assemblerze i został odpowiednio zoptymalizowany. Kopiowanie duzej tablicy bajtów w pętli spowoduje kopiowanie się bajtu po bajcie,...
Witam, problem nie tkwi w programie... Po "t2++;" nie masz żadnej instrukcji więc debugger wraca na początek pętli. Strzałka podczas debugowania pokazuje kolejną instrukcję do wykonania. ...i właśnie dlatego uważam, że naukę powinno się zaczynać od assemblera - żeby zrozumieć istotę działania(choćby przeskoków w tym przykładzie). Możesz włączyć disassember'a...
(at)Freddie - czy pycrc też generuje taki kod dla sumy kontrolnej w takiej postaci jaka jest tu (Modular sum) czy tylko na podstawie jakichś wielomianów CRC, bo to jest chyba różnica. Hmm, no może faktycznie - pycrc służy oczywiście do generowania kodu liczącego CRC, trochę się pospieszyłem bo tutaj widzę jest liczenie zwyczajnych sum a nie CRC - zmyliło...
Wiem że temat już nieświeży i że odejdę od ostatniego wątku, ale jak zobaczyłem to: dla bankow nie dosc ze pisze sie w C++ to jeszcze w kompilatorze M$ to po salwie śmiechu i wiążącej się z tym upadkiem z krzesła, naszła mnie pewna konsternacja i głęboka nadzieja że autorka postu tylko żartowała. Dziękuję za uwagę. EDIT: Jako że trochę późno zauważyłem...
Nawet gdyby same porty GPIO się wyrobiły, to nie wyrobi się cała reszta. Skoro chcesz wykonywać odczyt z częstotliwością 40MHz, to masz mniej więcej 4 takty zegara na wykonanie wszystkiego. W super-extremalnym przypadku pętla która by to realizowała ma 4 rozkazy assemblera: 1. odczyt GPIO do rejestru 2. zapis z rejestru do RAM z postinkrementacją wskaźnika...
Co dokładnie sekundę? Mniej więcej co sekundę? Tą pierwszą opcję trudno bez przerwań zrealizować. Drugą to robisz sobie pętlę która realizuje się w mniej więcej sekundę. Przecież w tytule wyraźnie jest napisane z timerami , po co więc pętla "mniej więcej". Trzeba w głównej pętli sprawdzać stan znacznika timera i podejmować odpowiednie działanie. Szczegóły...
Witam, Nic nie przychodzi mi do głowy, choć rozwiązanie jest z pewnościa banalne. Chodzi o to, że jeżeli nastąpi przerwanie z INTn, po jego wykonaniu uP ma wrócić do głównej pętli, czyli zakończyć wykonywany podprogram niezależnie w którym miejscu został przerwany. Nie wiem jakiej instrukcji użyć być może z assemblera, którego już w ogóle nie pamiętam...
(at)nsvinc Falowniki to nie tylko wielkie kombajny z algorytmem FOC (Field Oriented Control), możliwością pracy jako napęd pozycjonujący i pracujące w zamkniętej pętli sprzężenia zwrotnego. Prosy falownik pracujący w otwartej pętli sprzężenia i stosujący regulację U/f=const. da się zaimplementować na AVR kożystając z czystego assemblera albo z wstawek...
unsigned char xdata T[3] _at_ 0x7000; void main() { T[0] = 0x12; T[1] = 0x34; T[2] = 0x56; // tutaj dalszy program } To działa i jest dokładnie tym, co potrzeba, ale przy dużej tablicy kod się rozrośnie do ogromnych rozmiarów. Nie chodzi tu o kod, tylko o wielkość skompilowanego programu. ... A jak...
juz nieaktualne, poradzilem sobie :) 1. W takim razie wypada podać rozwiązanie. 2. Wypada dokładnie przepisać podany przez wykładowcę program "odluz" "w cx wsp.X, w dx wsp.Y" To jest nieprawda. Współrzędne są w rejestrze dx. dl - wpółrzędna y dh - współrzędna x cx to w tym programie tylko licznik pętli. Gdyby nie te błędy, może wcześniej by Ci ktoś...
Uruchomiłem (z diodami :]) ale problem podstawowy to drgania styków po prostu jak wcisne raz np. 5 to mam cały wyświetlacz w piątkach. Czytałem że można zrobić opóźnienie i jeszcze raz sprawdzić. Faktycznie asembler obługuje rozkaz CALL i mogę go używać w RIDE-7 tam zanalazłem że jest MA51 assembler chociaż M to może oznacza że to makroasembler. ale...
A może jednak spróbuj assemblera - przerwania są bardzo łatwe w używaniu. A co do sterowania diodami to : Napisz sobie dwie (lub więcej jak potrzebujesz) pętli w których masz zapisane sekwencje sterowania diodą i użyj przerwania timera do sprawdzania stanu na wejściach(przyciskach)- w zależności od tego który przycisk jest wciśnięty skacz do wybranej...
Mikrokontroler do obsługi PADA od pegasusa da się zrobić (sam zrobiłem zestaw naprawczy do pada w oparciu o atmegę 8). Problemem jest to, że po narastającym zboczu CLK należy maksymalnie w ciągu 250 ns wystawić kolejny bit danych na linię data. Jeśli linię CLK masz podpiętą do przerwania, to weź pod uwagę, że odstęp pomiędzy zboczem, a wejściem do procedury...
Jeśli program musi używać delay w tej postaci, to jest źle zaprojektowany. Skoro chodzi o zwykłe miganie diodą, to o wiele lepszy pomysł jest taki : http://msys-mv.blogspot.com/2010/11/conf... Przy zastosowaniu timer'a mikrokontroler: - jest w stanie zapewnić o wiele dokładniejsze odmierzanie czasu. - może wykonywać...
Nie wiem po co każdą instrukcję ldr Twój program wykonuje warunkowo. To akurat jest oczywiste. Procesor bierze to, co jest. Taki ma program, to taki wykonuje ;p Powinieneś raczej zapytać dlaczego napisałem taki program ;p Otóż nie wiedziałem co robi instrukcja ldrlo. W opisie instrukcji ldr nie było nic o zwiększaniu rejestru wskaźnikowego. Myślałem...
może np tak: MOV TMOD,#00100001B MOV TH1,#0FDH MOV SCON,#01010000B SETB TR1 SETB REN TO JEST PRZYKŁADOWA KONFIGURACJA PARAMETRÓW TRANSMISJI 9600 b/s - powinna być umieszczona na samym początku obydwu programów. narazie zmontuj układzik i napisz prosty programik (bez przerwań) tak: i teraz tak (wysyłanie jednego bajtu): MOV SBUF,A ; WYSYŁA BAJT Z AKUMULATORA...
Witam, nasunął mi się taki problem związany z programowaniem ;) Używam od jakiegoś czasu gotowca Arduino Nano, bo wychodzi najtaniej ;) Próbuję tworzyć w wolnej chwili różne różności ;) ogólnie fascynacja AVR zamiast z czasem zanikać to rośnie. Ostatnio powstał w mojej głowie i w realu projekcick obsługujący 4 dwustanowe przełączniki. Fajnie by było...
Witam ... Mam taki problem jak w temacie ... a mianowicie chodzi o to żeby przepisać dowolny Bajt liczby Double (liczba 8-mio bajtowa) do liczby typu Byte. Jak to zrobić najprościej ... w rozumieniu najszybciej ??? Aktualnie mam zrobione przepisanie na pętli FOR która wykonuje się 8 razy i przepisuje po jednym bicie - strasznie wolno działa program...
{...} - Ty dalej w zaparte idziesz, że ten test ma jakikolwiek sens. Hmmm. To wróćmy się trochę. Wcześniej pisałem że jedna inkrementacja pożera 100ns. Zacytujmy Twój kod: 80001d4: 9a01 ldr r2, bo mniej więcej gdzieś tutaj jest te i++. Teraz należy powiedzieć sobie ile to może kosztować cykli zegara. Sam stwierdziłeś wcześniej że, jak to ładnie ująłeś:...
Chciałem Wam bardzo podziękować za zainteresowanie i profesjonalne odpowiedzi. Dziękuję! Co do Assemblera - patrzyłem na jego kod. W pewnym momencie następuje pętla w której następuje 'przes'-krotne przesunięcie bitowe w lewo (za każdym razem o jeden - rozkaz LSL), następnie w pamięci umieszczana jest dziwna wartość rejestru R24 (nie wiem czy dobrze...
Pętla ma tą drobną wadę, że jeśli w nią wrzucisz jakieś funkcje warunkowe to nigdy nie wiesz, co jaki czas się dokładnie obróci :) takie tam. Przy jednym warunku to jeszcze nic, ale już przy n rozgałęzieniach, policzenie najgorszego możliwego czasu obrócenia pętli staje się utrudnione. Bo jak warunek nie spełniony to sprawa krótka skok, a jak spełniony...
1. inicjalizacja zmiennej polega na nadaniu jej konkretnej wartości. np I=1 to jest inicjalizacja ponieważ wiesz, że po tym napewno w I będzie liczba 1, jeśli w pętli stosujesz zmienną I do odliczania to samo zdefiniowanie pętli jest inicjalizacją gdyż nadaje jej pierwszą wartść oraz kolejne według pewnej reguły. 2. poto podaje sie adres komórki żeby...
Taka zmiana sterowania w "C" jest obsługiwana przez moduł <setjmp.h>. Pozwala na ustanowienie punktu w programie( funkcja setjmp() ) do którego można "skoczyć" z dowolnego miejsca w programie (funkcja longjmp() ). ( "goto" jest jedynie lokalne wewnątrz funkcji). Ale ta funkcjonalność jest projektowana dla "normalnego" programu. Nie potrafię powiedzieć...
Po prostu zabrałeś się za coś co przerasta znacząco poziom Twojej wiedzy. Nie ma RE bez głębokiej znajomości programowania. Tego po prostu nie przeskoczysz. Skup się na razie na nauce C i asemblera, dopiero później czytaj o czymś co wymaga tej wiedzy. Niestety odwrotnie się nie da. Myślę że masz rację, jednakże nie jestem do końca pewien na czym dokładnie...
assembler darmowy assembler pętel pętel efekt pętel prądowy pętel prądowy
oznaczenie silnik briggs cooler podłączyć laguna zaprogramować
mikrokomputer cobra1 mikrokomputer cobra1
Mercedes Sprinter: Gaśnięcie zegarów po odpaleniu Konfiguracja Windows 10: Akceptacja Pendrive'ów z Określonym Numerem Seryjnym