To jest prosta pętla wykonuje się tyle razy jaki długi jest rejestr żeby ją przedłużyć można zrobić na dwa sposoby dobudować jeszcze jedną pętlę ,która wykona obecną n razy lub rozszerzyć rejestr do długości 3 bajtów wykonując to samo odejmowanie przeniesienia na tym najwyższym i będzie to samo . Dla bezpieczeństwa między sbi portx i cbi portx warto...
Dopisanie pętli nadrzędnej musi poskutkować. Oczywiście jej licznik musi być niezależny od liczników pętli zagnieżdżonych. Jest kilka możliwych rozwiązań, a najprostszym chyba będzie użycie stosu, czyli: .startup mov cx, 10 petla_glowna: push cx ... pop cx loop petla_glowna .exit
Jak jest dużo flash-a, to można jeszcze przejsć przez tablicę. Jak się ją wyrówna do granicy 256 bajtów, to chyba będzie ciut szybciej, niż ta rozwinięta pętla.
Aby wykonywać zagnieżdżone pętle musisz skorzystać ze stosu, czyli z funkcji pop i push , bo pętla korzysta z cx więc każda zmiana tego rejestru wewnątrz pętli może popsuć pętlę. Rozwiązaniem jest wrzucenie cx na stos i użycie jej w drugiej pętli a później odczytanie cx. Przykład taki "mniej więcej", bo już dawno nie pisałem w asemblerze (może nie działać...
Zależy z jaką dokładnością chcesz odmierzać te sekundy... Napisz lepiej co ten program ma robić. Przy okazji - rozumiem, że w sekwencji tych danych jest jakaś prawidłowość - nie lepiej opisać tego jakąś strukturą danych? Pozdrawiam, Dr.Vee
Nie zawsze ilość przekłada się na jakość. A może chodziło o to: IF(SDA==0); vs IF(!SDA); generują inny kod mimo iż działanie jest to samo. Zresztą nie ma chyba co się oszukiwać, nawet proste konstrukcje z pętlami będą na PICu inaczej wyglądać niż na AVR czy 51, jeszcze inaczej na ARMie czy motoroli. To co w jednym mikrokontrolerze jest 1 instrukcją...
Pętla nieskończona w asemblerze SJMP $ Pętla nieskończona w C while(1); A w ogóle to może weź ten procesor na jakiś Rollercoster i zrób razem z nim pętle :-)
Z opisu funkcji wynika, że pętla używa 8-bitowego licznika. Gdzie w tej funkcji jest odniesienie do licznika.? W tej linii: dec %0 Po prostu jeden z rejestrów jest używany do odliczania opóźnienia i dlatego został "przezwany" licznikiem. Nie ma to nic wspólnego z fizycznymi licznikami/timerami. O wstawkach assemblerowych możesz przeczytać w manualu...
Witam! Mniej więcej tak: ORG 0BH LJMP PRZERWANIE_OD_T0 ORG 100H WARUNKI_POCZATKOWE: MOV IE,#82H MOV TCON,#10H MOV TMOD,#01H MOV TH0,#03CH MOV TL0,#0B0H MOV R2,#2 PETLA_GLOWNA: NOP SJMP PETLA_GLOWNA PRZERWANIE_OD_T0: DJNZ R2,EXIT ;----------------------- TU PISZESZ CO MA SIE WYKONYWAC PO 100ms MOV R2,#2 EXIT: MOV TH0,#03CH MOV TL0,#0B0H RETI END Program...
1. Zapiszę wysokim poziomem: [syntax=Delphi]b = b or ((b shr 2) and 1)[/syntax] 2. A gdzie zapisać wynik? Generalnie pętla i odwołania typu BX[SI].
instrukcje petli dla 8086 to np. loop albo dajesz do CX wartosc ile razy chcesz pwotorzyc petle, potem w petli dekrementujesz cx i dajesz skok na poczatek petli, jak CX sie wyzeruje to program idzie dalej btw google nie gryza
W sumie to biblioteki można dołączyć na końcu lub umieścić za tablicą "przerwań": CSEG ;segment kodu ORG0 JMPINIT $INCLUDE(procedura.ASM) INIT: ;tu jest główna pętla programu SJMP $ $INCLUDE(procedura2.ASM) Używam prostego, "jednoprzebiegowego" asemblera z funkcją optymalizacji kodu i zawsze to działa. A i zawsze umieszczam wszystkie...
Witam Mam napisać w Aseblerze pętle opóźniającą (400us) dla 8051. f(xtal)=12MHz Tt=1us Napisałem coś takiego: ------------------------ START: MOV R0,#100 2takty DEL: NOP 1takt DJNZ R0,DEL 3takty ------------------------ N=2+(1+3)*100=402 Ta pętla opóźnia 400us ??? Jeśli nie to jak to trzeba liczyć?
Wg mnie powinno być tak: mov R2, #x ; +1 P3: mov R1, #y ; +1 | P2: mov R0, #z ; +1 | | P1: djnz R0, P1 ; 2 | *z | *y | *x djnz R1, P2 ; +2 | | djnz R2, P3 ; +2 | Czyli: djnz R0 zajmuje 2 cykle, wykonuje się #z razy = Z. P2 to +1 mov, +Z, +2 na djnz R1, to wszystko razy #y, czyli Y = (1 + Z + 2) * y I tak dalej i tak dalej :) Pozdrawiam,...
Z tego co mi wiadomo, "cpi" porównuje zawartość rejestru R19 i zero. Jeżeli będą sobie równe pominie polecenie "brlo petla2" a jeżeli są różne to pętla się wykona... O co chodzi z tą pożyczką ?
Spójrz na swój kod rozbity na poszczególne kroki. Jeśli w programie występują powtarzające się fragmenty - należy użyć pętli. Na początek zrób rysowanie pojedynczej linii w pętli, np: 1. Załaduj do rejestru bajt jako wzorzec 1 linii figury z wyrównaniem do lewej, np 00110000B 2. Pętla 6 kroków - przesuń rejestr z bajtem wzorca o 1 bit w lewo z przeniesieniem...
Gdyby się nie dało zrobić takiej pętli w asemblerze, to nie dałoby się jej zrobić w żadnym innym języku. Więc odpowiedź brzmi - tak, da się. Jak? Dodaj kolejne dwa rejestry, czyli ADIW R24,R16 następnie ADC R26,R18, ADC R27, R19, przy czym R16-R19 zawierają 32-bitowy krok. Stosownie należy też zmienić operację porównania. Poza tym użycie BRNE nie jest...
Kto ci powiedzial ze w asemblerze opoznienia są w pętlach? U mnie akurat wszsytko jest zrobione na bazie przerwan tak zeby program głowny nie odczuwal zadnycg opoznienień. Na oscyloskopie? tez mazna ale lepiej to pomierzyc programowo.
W asemblerze używanie etykiet jest nieuniknione, jak sobie wyobrażasz np. pętle albo skoki warunkowe (odpowiednik if w C)
tj pętla w asemblerze nie oddaje znaku.
Pętla w BASIC'u przepisywała dane z linii DATA a potem następował skok do początku programu napisanego w asemblerze. BASIC na początek jest dobry tylko ale tylko asembler pozwala wydobyć całą moc z Commodore :)
rejestr indeksowy zwiększasz o 2 w pętli. Do tablicy odwołujesz się poprzez ten rejestr indeksowy. Przenosisz znak do właściwego rejestru i wyświetlasz. Licznik pętli najlepiej ustawić na liczbę wprowadzonych znaków div 2 lub licznik również zwiększać o dodatkowy 1 przy każdym przebiegu pętli.
Ogółem wygląda na to że metoda którą przedstawiłem w pierwszym poście jest najprostsza w zaimplementowaniu gdyż wymaga jednego pinu na jeden sensor (i bez ADC). Obydwie metody które są w linku nie wymagają użycia ADC. Poza tym są proste. Poza tym metoda QTOCH wymaga n+1 portów na n czujników. Na ten przykład implementaja metody QTOUCH w asm z inicjacją...
Nie wiem po co męczysz ten asembler, ale tak dla edukacji to twoja pętla nie jest za dobra. Po pierwsze nigdzie nie inicjujesz R17, więc to, że wykona się 20 razy to tylko twoje życzenie :) Po drugie, zazwyczaj robi się w pętlach dekrementację, a nie inkrementację - w ten sposób odpada CPI, bo po DEC flagi rejestru stanu procesora są ustawiane automatycznie....
Generalnie port jest zatrzaskiem więc nie ma sensu się martwić czy dana informacja się zmieni czy nie do czasu kolejnego zapisu do portu :) To daje ci sytuację taką korzystną sytuację że nie musisz się martwić o to co rozbi procek w tym czasie. Pytanie jak bardzo zależy ci na dokładności odmierzenia czasu w przypadku zapalania diody na około 1s lub...
Sprawdź jeszcze sprzęt (najlepiej przy pomocy lupy). Na tym forum było wiele tego typu dyskusji w związku z dziwnym zachowaniem się uC, a później okazywało się, że nóżka podwinęła się pod uC zamiast wejść w podstawkę. Na to żaden asembler nie pomoże. Piszę w Bascomie dużo większe programy i działają bez problemów.
A nikt nie zauważył że te dwie pętle opóźniające nie są zagnieżdżone? Opóźnienie to będzie 2*256*2 a nie 256*256*2. Powinno być: ODLICZAJ1 ODLICZAJ2: DJNZ R1,ODLICZAJ2 DJNZ R0,ODLICZAJ1 Czyli 1024ms według w/w wzoru tak ? Co nie zmienia faktu że dalej tkwię w martwym punkcie zacytuje sam siebie. "A to ma wyglądać tak ustawia CLR czeka te 3sek ustawia...
Tak jak radził asembler - zrób w pętli głównej procedurę przemiatania tak, aby każdy z segmentów przełączał się co sekundę. Wtedy "na oko" stwierdzisz co jest nie tak.
kombinowalem nawet tak $asm mov b,#50 djnz b,$ $end Asm i nic nie pomoglo. Instrukcja Djnz istnieje w helpie. "skoki z wykorzystaniem offsetu Można określić o ile bajtów do przodu lub tyłu ma skoczyć program, bez używania etykiet. Jb P1.0 , *+12 ;skok do przodu Jb P1.0 , *-12 ;skok do tyłu Jnb P1.0 , *+0 ;pętla powtarzana dopóki P1.0 pozostanie ;w stanie...
Dokładnie, program ustawia port B na wyjście i ustawia logiczną jedynkę na wyprowadzeniach 1, 3 i 6. Na zajęciach nigdy nie pisaliśmy żadnej pętli w asemblerze, jedynie pisząc w C potrzebna była pętla. Poza tym można każdy inny program wgrać i to samo się dzieje. Dodam, że program megaload przy próbie zamknięcia zawiesza się i wyskakuje okienko "Wystąpił...
(at)JarekC To niekoniecznie musi być problemem, bo: - w większości AVR stos ustawiany jest podczas resetu na koniec SRAM, więc nie trzeba go inicjalizować (ale warto sprawdzić, czy w użytym w symulatorze modelu tak jest), - funkcja się wywoła, bo asembler umieści ją począwszy od adresu 0, czyli wektora resetu, - skoro to symulacja i na końcu jest breakpoint...
(at)Xamrex - kompilator przetłumaczy ljmp start jako skok pod adres etykiety start (którego jeszcze nie zna). W kolejnej linii ustawi odpowiednio pamięć, następnie od tego miejsca przypisze etykiecie start adres... jak przeleci cały program pierwszy raz to w drugim przejściu uzupełni adresy. Nie ma to związku z aktualnym WYKONYWANIEM kodu na mikrokontrolerze...
Dzień dobry, mam problem z zadeklarowaniem klawiatury do następującego programu: [syntax=x86asm] start: org 0h mov R2,#34h ; zapis zawartości komórki 34h do rejestru R2 mov SCON,#01010000b ; struktura portu szeregowego mov TMOD,#00100000b; tryb 1, uaktywniony odbiornik mov TH1,#0FAH ; tryb 2 licznika T1 setb TR1 ; wartość początkowa dla licznika T1...
Witam. Potrzebuję program napisany w asemblerze na dsm51. Program ma działać w ten sposób, że dioda ma mrugnąć 3 razy następnie, na wyświetlaczu LCD przez 3 sekundy ma być napis STRAŻ i po tym wszystkim buzer ma 3 razy zapiszczeć w odstępach sekundowych. Na końcu trzeba to zapętlić, żeby działało w nieskończoność. Z góry dziękuje za każdą odpowiedź.
ad. 2. W asmemblerze MC68k :], a co? jak dowolny, to dowolny :] (asm x86 nie znam za bardzo) Założenia: argument funkcji podawany jest przez stos (wskaźnik stosu - rejestr A7, stos rośnie w dół) Wartość (wskaźnik) zwracana jest w rejestrze D0. Reszta rejestrów pozostaje niezmieniona. Za obsługę stosu odpowiada funkcja wywołująca, więc po powrocie z...
start->zapal na 1s -> zgas na 1s -> zapal na 1s -> .... (i tak analogicznie) A może tak: start -> zmień stan diody na przeciwny -> pusta pętla trwająca sekunde -> skocz przed "zmień stan..."
kamyczek , Masz rację. Jest to część podprogramu do dekompresji czcionki zakodowanej wcześniej RLE. Po trzecie Twój program działa źle, bo w przypadku zmiennej o wartości 0b10000000 wykona tylko jedną pętlę i wszystkie warunki Flaga_z_0 dla pozostałych bitów zostaną pominięte. Nie prawda , w tym przypadku wykona się zawsze 8 razy dla LSR : LSL również...
Witam, //--------------------------------------... char s_write_byte(unsigned char value) //--------------------------------------... // writes a byte on the Sensibus and checks the acknowledge { unsigned char i,error=0; for (i=0x80;i>0;i/=2) //shift...
Procedura obsługi przerwania musi zapamiętać wszystkie rejestry, których używa, a następnie odtworzyć je przed powrotem - to zasada podstawowa. Jeśli całość kodu piszesz w asemblerze, to możesz zostawić parę rejestrów tylko do użytku przerwań, i wtedy nie ma obowiązku ich zapamiętywania w przerwaniach, bo nikt inny ich nie używa. Jeśli "pętla główna"...
Witam czemu dla idiotów.Poczatki są zwsze trudne nie ma lwa co wszystko zna. Proponowałbym byś zaczął od asemblera nie wszystko zrobisz z programu wysokiego poziomu. Zobacz tutaj. http://mikrokontrolery.net pozd. i pow.
Teraz już sprawy idą w lepszym kierunku. Problematyczny jest jeszcze sposób deklaracji zmiennych w programie. Proponuję pobrać z internetu dowolny assembler na 8051 (np. ASEM-51), wtedy wszystkie błędy składniowe można na bieżąco sprawdzać. Struktura programu (dowolnego) może wyglądać np. tak: - deklaracja zmiennych i stałych, - instrukcja skoku do...
Nie wiem co Ci "asembler" przeszkadza w usypianiu przy multipleksowych wyświetlaczach LED?! Przecież są sterowane przerwaniowo. Nie czytałem wszystkich postów, ale SLEEP powinno być wywoływane ciągle w pętli głównej jeżeli z niej nie korzystasz... Przerwanie wybudzi, wykona się, a po wyjściu z niego pętla główna znów go uśpi ... mniejszy pobór energii...
A mógłbyś mi wytłumaczyć znaczenie IN s0, leds , bo nie rozumiem tego i dalej nie mogę tego poskładać żeby działało. PBlazeIDE to program, na którym mam to wykonać, taki sobie wybrał wykładowca i jeżeli nie warto zagłębiać się w ten mikrokontroler to już nie będę ściągał innych programów. Dodano po 6 NIE!!, przepraszam, już mam [syntax=asm]leds dsout...
Na stos są odkładane dane tylko podczas wywoływania funkcji lub przy przerwaniach - wiadomo, adres powrotu, odkładanie rejestrów roboczych etc.. w takiej pętli nie ma operacji na stosie (nie powinno być). Jakkolwiek "goto na_zewnatrz" robi z kodu troche spaghetti - skoki goto są bardzo nie czytelne... tutaj lepiej użyć "break;" który kończy wykonywanie...
Prosty przykład - kompilowana pętla odliczana zmienną integer to na klasycznym procesorze co najmniej kilkanaście rozkazów kodu wewnętrznego, natomiast ta sama pętla na specjalizowanym interpreterze sprzętowym może się zamknąć w 2-3 rozkazach interpretowanych z tą samą prędkością. Prosta pętla iteracyjna na procesorze klasy x86 ma postać rozkazów:...
Wszystko zalezy od tego jak inteligentny jest kompilator, jeśli jest bardzo dobry to ta pętla zostanie usunięta. Jedyne co możesz spróbować to zrobić wstawke w asemblerze albo spróbować ustawić zmienną licznika pętli jako volatile (być może optymalizacje wtedy jej nie ruszy).
I częstotliwość nadawania == częstotliwość taktowania Nie, skompiluj i obejrzyj asembler to sie przekonasz ile trwa pętla, poczytaj ile trwa instrukcja ustawiania portu, ile skok. 20Mhz nie osiągniesz z przełączania portu Atmegi, a nawet gdyby, to jest to długość fali będzie 15m antena też nie będzie mała. Teoretycznie jest sposób żeby wygenerować...
Ok. Dzięki, bo sposób jest interesujący i warto się takowego nauczyć, jednak jak wygląda sprawa z prędkością podmiany danych, ewentualnie dodanie danych do listy. Pytam bo u mnie jest trochę więcej danych i chce wycisnąć jak najmniejszy czas, trochę skrócona wersja type cPointMax = 2000000; TTbPoint = array[0..cPointMax] of TPoint; PTbPoint...
Bo tyle wpisałeś do rejestru: "mov R2,#0xff". 0xFF to jest właśnie 255. W poprzednich tez tyle wpisałeś ale taka wartość tam wykona się tylko raz a następne pętle będą trwać 256 cykli. Dokładniej Twoja pętla wykona się 2*255*255 + 2*256*256*254 cykli plus cykle "mov...", "ret", i "call".
O, to coś nowego. A czym się różni? Choćby kosztem. W 32 bitowcach musisz użyć dodatkowych operacji aby zagwarantować zgodność z długością typu: np uxth czy uxtb (a raczej kompilator musi). Czyli dostajesz "penalty" za użycie typów krótszych niż 32bit. Szczególnie ważne przy zmiennych sterujacych w pętlach np. Jezeli zmienne w funkcji będą w rejestrach...
Myślę że można by użyć przerwania do tego. Np. Sygnał o zmiennym wypełnieniu podać ma na wejscie przerwania INT0 (skonfigurowanego na wywołanie przerwania przy rosnącym zboczu). W obsłudze przerwania należałoby: Włączyć licznik T0 w trybie licznika 16-to bitowego wykonywac pętlę trwającą dopóki INT0 jest wysokie gdy pętla się skończy zatrzymać TIMER0...
Witam, mam mały problem z następującym programem. Muszę wyszukać maksymalną wartość w tablicy. Program działa w DOSBox'ie, ale muszę robić coś źle bo nic nie wyświetla (jest jakiś krzak). Jestem totalnym początkującym jeżeli chodzi o asemblera :(. Poniżej zamieszczam napisany kod przeze mnie: dane SEGMENT ;segment danych tekst_1 db ": To jest...
Cze ! Opisowo wygląda to następująco: - w pętli, której warunkiem działania jest liczba16bit>0 przeprowadzasz dzielenie 16-to bitowe (mam taką procedurę) liczby16bit przez 10 - do reszty z dzielenia dodajesz 48 i masz kod ASCII cyfry (od końca) - pętla zakończy działanie gdy liczba16bit będzie równa 0 przykład: 65535/10=6553 (reszta=5) -> 5 6553/10=655...
Sorki, wkradły się błędy. [syntax=asm] ;.TITLE 'Linika świetlna' ;============================ SEG_ON EQU P1.6 LJMP START ORG 100H START: MOV R0,#CSDB ;R0 - adres bufora wyświetlaczy MOV R1,#CSDS ;R1 - adres wyboru wskaźnika MOV R2,#1 ;segment pierwszy MOV A,R2 MOVX (at)R0,A CLR SEG_ON ;załączenie wyświetlacza LOOP: MOV R4,#100 ;licznik świecenia jednego...
... poza tym w MOV R0, #0 dales do R0 wartosc ZERO, wiec ta petla DJNZ R0, loop2 od razu z niej wyjdzie, wiec chyba MOV R0, #ff powienien dac zeby bylo 256, jak myslisz?? DJNZ = Decrement and Jump if Not Zero - czyli zmniejsz o jeden i skocz, jeśli niezerowe - najpierw liczba w Ro jest zmniejszana o 1 a po zmniejszeniu następuje porównanie i ewentualny...
Klocek to AT91SAM7X128. Jako kompilatora uzywam WinARMa, a debugger to OCDCommander. Ten debugger chyba nie ma raczej za duzych mozliwosci, a nie mam pojecia jak w WinArmie wstawic jakiegos breakpoint'a zeby bylo mozna to dokladniej sprawdzic. Wykonywanie programu krok po kroku raczej odpada bo rozbiegowka jest raczej dosyc rozbudowana (z projektu przykladowego...
Siemanko! Uczę się programowania mikrokontrolerów AVR z książki Pawła Borkowskiego pt. "AVR & ARM7. Programowanie mikrokontrolerów dla każdego.". Lekcja pierwsza polegała na nauce programowania styków tak, aby zaświecić diodę LED. Na końcu lekcji znajdują się ćwiczenia utrwalające, które wzbudziły moje wątpliwości. Zadanie polegało na zaprogramowaniu...
Wykorzystanie rejestrów opisane jest w dokumentacji AVR-GCC. R1 to rejestr zerowy który wg standardu zawsze ma mieć wartość 0. GCC zmienną zawsze umieszcza w RAM. Rejestry służą do innych celów. Te ostatnie 2 rozkazy to nieskończona pętla. Zabezpieczenie przed pójściem softu tam gdzie nie powinien ;p.
W praktyce wychodzi, że znajomość asemblera + języka wyższego poziomu się opłaca. Ja w tej chwili dziobię głównie w C, ale do asemblera też sięgam. Najczęściej w dwóch przypadkach: 1. trzeba sprawdzić jaki kod generuje kompilator. AVR GCC na przykład lubi mi namieszać w pętlach opóźniających. W takich przypadkach bardzo przydaje się umiejętność czytania...
Ale chyba jest coś takiego jak best practices prawda? Obawiam się, że nie. Można zalecać określone rozwiązanie programowe konkretnego problemu, ale i to często jest uwarunkowane wymaganiami innych zadań, dostępnym sprzętem, itp. Przypuszczam, że jakąś połowę swoich programów robiłem według schematu: Przerwania - timer tworzący "podstawę czasu" (multipleksowanie...
... delayadc nie jest po to aby czekać na koniec konwersji, po za tym co to ma wspólnego z moim pytaniem? ... Timer uruchomiłbym chyba dla ozdoby;) Ano może mieć. Jaką masz gwarancję, że tak napisane delayadc w ogóle zajmuje jakiś czas procesora? Zwłaszcza, że zmienna k nie jest volatile, a to oznacza, że takie cudo: [syntax=c] { k++; k--; } [/syntax]...
Zadanie nie jest trudne do rozwiązania. Otrzymałem od autora niniejszego tematu treść. Chodzi właściwie o obsługę multipleksowanego wyświetlacza 7-segmentowego i klawiatury matrycowej. Moja oferta jest nadal aktualna. Proponuję nawet mały rabat. Aktualna cena zostaje obniżona o 1 zł, czyli wynosi 1499 zł. Sprawa jest prosta: uczysz się, albo płacisz....
Witam! LJMP START ORG 100H START: CLR P1.0 SETB P1.1 LOO: LJMP LOO No fajny program szkoda tylko, że to asembler 51 a attiny26 to avr, to zupelnie inne asemblery. w tiny26 nie ma portu 1 jest portb i porta Dodano po 1 Dodatkowo w avr musisz ustawic dla kazdego portu 2 rejestry ddr i port, a jesli chcesz uzywac jako wejscia to czytasz z rejestru pin...
Kiedyś miałem podobny problem ale nie zachowałem listingiu tego programu, pamiętam tylko żeby nie wykonywać dzielenia, rozwiązałem to w następujący sposób: od zadanej liczby, w pętlach odejmowałem odejmowałem 100, następnie 10, zliczając za każdym razem ilośc przebiegów pętli i zapisując w trzech bajtach. W ten sposób miałem ilość setek, ilość dziesiątek...
Zajrzyj sobie do util/delay.h, to będziesz widział jak to jest liczone. Pętla wykonuje się w jakiejś z góry znanej ilości cykli (jest napisana w asemblerze), trzeba tylko przeliczyć ile obiegów tej pętli przypada na zadane opóźnienie, do tego trzeba doliczyć overhead , czyli instrukcje związane z inicjalizacją pętli itp. Do dokładnego odmierzania czasu...
Błądzisz. 0. Dlaczego wybrałeś muzealny mikrokontroler, dla którego informacji trzeba szukać w skanowanych artykułach z gazet wydawanych w latach 80-tych i 90-tych zeszłego wieku? 1. Dlaczego nie chcesz korzystać z timera? To jest najlepszy i najpewniejszy sposób odmierzania czasu. 2. Czy program w którym potrzebujesz opóźnienie 5ms nie robi nic innego...
Już rozumiem pomysł skynet_2-a. Przy okazji zwracam honor. Chodzi o to że w pętli byś tylko "odtwarzał" zawartość bufora. Bez żadnego porównywania. A sam bufor aktualizował byś tylko przy okazji konieczności zmiany wypełnienia na którymś kanale PWM. Czyli pętla główna to tylko takie coś: PWM_Loop: LDS XL, {Tab_index_LSB} LDS XH, {Tab_index_MSB}...
Nie jestem w stanie rozpracować dokumentacji technicznej stm8l152c6 i wymyślić w jaki sposób programuje się ten wyświetlacz (jest to wyświetlacz LCD 28-pin DIP - 24 segments, 4 commons), o co chodzi z 4 liniami znaczonymi COM[0..3] i jakie stany, na jakich rejestrach mam ustawić, by coś się na nim wyświetliło (chodzi o to, by wyświetlał się cały czas...
START: MOV SP,#6F ; Ustawienie wskaźnika stosu MOV R0,#172 ; załadowanie do R0 liczby do rozpisania CALL Konwersja ; wywołanie procedury Konwersja koniec: sjmp koniec ; pusta pętla by prcesor stanął w tym miejscu Konwersja: PUSH A ; zapisanie rejestru ACC na stosie PUSH B ; zapisanie rejestru B na stosie MOV A,R0 MOV B,#100 DIV AB MOV R3,A MOV A,B MOV...
Siema Nie będę się rozpisywał jak ostatnio ;p Muszę zrobić swojego CrackMe001 w konsoli za pomocą DevC++. Również gdy wprowadzę "a" alfabet to pętla krzyczy co chwile tym samym tekstem w kółko: "Podaj haslo ktore odblokuje program = " Jednak gdy wprowadzę prawidłowe hasło to nadał pyta się o to / krzyczy up ;p Oto kod: [syntax=cpp]#include <cstdlib>...
Nie mam zielonego pojęcia o tym PWM, gdzie co ustawić i gdzie podłączyć ewentualnie dlatego tego nie ruszałem. Wiem że pętle opóżniające są mało praktyczne i profesjonalne bo procesor nie może w tym czasie nic innego wykonać ale w tym przypadku to akurat nie problem bo przecież mam tylko sterować serwem w lewo i prawo, ewentualnie punkt neutralny. Myślałem...
Tak tylko że w tym programie w asemblerze była na końcu nieskończona pętla i wtedy Watchdog mógł działać, a w tym napisanym w C już tej pętli nie widzę, tzn. program raz się wykonuje - ustawia port i koniec. W tym programie napisanym w C dodaj na końcu nieskończoną pętlę np. while(1){}, i zobacz wtedy co będzie.
Zastanawiam się czy ktoś kiedyś popełnił już coś takiego. Wymyśłiłem sobie sterować czterokrotnym, siedmiosegmentowym wyświetlaczem. Nie interesują mnie gotowce (chcę po prostu sprawdzić czy dobrze kombinuję), zatem procedurę piszę od zera mając w zasadzie tylko pomysł w głowie. Uwidziałem sobie, że przeznaczę cztery komórki pamięci na każdą cyfrę(...
Hej, Dzięki za odpowiedź, jednak nie do końca rozumiem ten listing. - "R21 SUMACRC", jest to wielomian-generator? - "R20" nie wiem o co chodzi - "R16" myślę że jest to "strumień" bajtów wchodzących, ale nie jestem pewien - "R17" wiem że w procedurach używa się zmiennej pomocniczej, lub rejestru pomocniczego tylko że nie wiem po co. Co do rysunku to...
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...
Problemem jest to jakieś. Jesli timer ma np. okres 550us, a twoja pętla np. 551us to się robi problem - synchronizacja będzie się co raz bardziej rozjeżdżać, a kolejnej impulsy PWM będą co raz bardziej zniekształcone. Zamiast delay zrób tak jak pisałem - w funkcji obsługi przepełnienia timera uaktualniaj OCR. W dodatku musisz tak ustawić preskaler,...
Miałem wrzucić wczoraj moje bazgroły ale na symulatorze zatrzymywał się na pętli 1s dlatego wrzuciłem program w procek aby sprawdzić jak naprawdę to działa. Gdzieś coś namieszałem z komparatorem bo nie reaguje na zmianę oświetlenia. Teraz nie wiem czy to wina programu czy też elektroniki chociaż jak sprawdzałem napięcia to reakcja jest prawidłowa. Zmieniłem...
mam ADCMODE = 0x23. W tej chwili rejestry mam skonfigurowane tak: ADCMODE = 0x23 ADC0CON1 = 0x27 ADC0CON2 = 0x0 SP = 0x1F IE = 0xC4 Przerwanie od ADC się generuje, w obsłudze przerwania robię tak: MOV IE, #0x0 ;wylaczenie przerwan MOV R7, #0 MOV R7, ADC0M CPL p2.0 ;miganie dioda LED ACALL cls ;czyszczenie LCD MOV A, R7 ACALL wr_reg_dec ;wyswietlenie...
Ta pętla powtarzająca przed END istnieje w moim programie, na forum zapomniałem ja dopisać, a tych 8 cykli bez odczytu zastosowałem po to aby pierwszy odczyt nie był pusty i to działa ale dalej jest ta sama sytuacja dane z konwersji odczytać mogę tylko raz, aby odczytać kolejną konwersję muszę zresetować mikroprocesor i znowu wcisnąć przycisk odczytu...
Witam Najprostrzy program ( zakładając że silnik sterowany jest 1 logiczną ) mógłby wyglądać tak : START: MOV P1,#128 ; STAN WYSOKI NA P1.7 (dla P1.7=0 #127) LCALL OPU MOV P1,#64 ; STAN WYSOKI NA P1.6 (dla P1.6=0 #191) LCALL OPU MOV P1,#32 ; STAN WYSOKI NA P1.5 (dla P1.5=0 #223) LCALL OPU MOV P1,#16 ; STAN WYSOKI NA P1.4 (dla P1.4=0 #239) LCALL OPU...
Dla PIC pełna wersja kompilatora C jest płatna. Wersja bezpłatna specjalnie "psuje kod". Dla AVR środowisko i kompilator są bezpłatne. Możesz coś więcej rozwinąć ? Wersja free nie umożliwia włączenia optymalizacji kodu. Nie chodzi tylko o optymalizację lub jej brak. Wersja free wrzuca do asemblera puste pętle tylko po to, by kod zajmował więcej miejsca...
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...
Wskaźnik masz na dword, więc zmienna jest 32 bitowa i shr operuje tylko w obrębie tej zmiennej... masz operację przesunięcia z przeniesieniem (nie pamiętam rozkazu), przesuwaj po jednym bicie w pętli i przepisuj przeniesienie.
Jestem na tej grupie pierwszy raz, wiec Wszystkich goraco witam!!! Witamy na FORUM... ;) FAQ Działu Mikrokontrolery przeczytane ? ;) Chciałbym zaznaczyc, ze przejrzalem wszystkie archiwalne posty na tej grupie zwiazane z tym i podobnymi problemami i niestety nie znalazlem rozwiazania. Teraz do rzeczy: Jest to mój pierwszy projekt i mam problem z jego...
Jak wyliczyć (Wykonać) dokładnie opóźnienie np. 500ms Nie chcę tego robić na timerze ! Chodzi mi o to jak wyznaczyć taką liczbę cykli procesora które zajmie pętla for tak aby wykonała się dokładnie w 500ms Do dokładnego odmierzania czasu służą timery. Jeżeli nie chcesz, to masz złe podejście. Nie chodzi mi o czysty assembler tylko o wykonywanie pętli...
Witam, chcę za pomocą at90s2313 w celach edukacyjnych zaprojektować prosty liczniki. To znaczy klikam jeden przycisk to na wyświetlaczu 7-segmentowym wyświetla się cyfra o 1 większa od poprzedniej. Wczoraj trochę próbowałem zrobić taki licznik, ale jest pewien problem. Chodzi o to, że jak wciśnie się przycisk i go się trzyma to pętla dodaj cały czas...
https://obrazki.elektroda.pl/6848039300_... Ogranicznik czasu pracy to dość banalne urządzenie włączane pomiędzy mechanicznym włącznikiem ciśnieniowym a pompą, mające ochronić ją przed przegrzaniem (skutkiem suchobiegu). Zasada działania: 1. Po włączeniu zasilania przekaźnik jest włączony i zaczyna się odliczanie 100 sekund (w normalnej...
Na pewno, to to jest jakiś program ;)) Z tego co widzę, to usiłuje on wczytać dwie liczby w zakresie 0-65535 i ... nic więcej :))) Żadnego 372 tu nie ma, a za to jest martwa pętla :)) model tiny .stack 2H .data napis1 db 'Pokaz','$' napis2 db 10,13,'Podaj pierwsza liczbe: ','$' napis3 db 10,13,'Podaj druga liczbe: ','$' napis4 db 10,13,'koniec','$'...
Korzystam z CooCox IDE Toolchain: GNU Tools ARM Embedded Specjalnie stworzyłem ten banalny kod do machania nóżką. Pętla główna: [syntax=c]int main(void) { RCC->AHBENR |= (RCC_AHBENR_GPIOAEN | RCC_AHBENR_GPIOCEN); GPIOC->MODER |= (GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0) ; GPIOC->OTYPER &= ~(GPIO_OTYPER_OT_8 | GPIO_OTYPER_OT_9) ; GPIOC->OSPEEDR...
Przeszukałem jeszcze to, co miałem na Amidze. Znalazłem generator tabeli pierwiastków tylko instrukcje przeniesienia, dodawania i skoki warunkowe. Skrócony kurs asemblera procesorów rodziny 680x0: :D instrukcja * ****************************************... * * **** Tiny square-root-table generator ****** (c) gREY in 1997...
Witaj !!! Tak jak napisał kolega LightHouser, nop to rozkaz, który nie robi na prawdę nic ale zajmuje cykl rozkazowy. W standardowym procesorze '51, zastosowano preskaler przez 12. Znaczy to, że częstotliwość taktująca (kwarca) wstępnie jest dzielona przez 12. Jeżeli zastosujesz kwarc np:12MHz to naprawde rdzeń procesora będzie taktowany częstotliwością...
Procesor będzie się resetował jeśli ustawisz błędną nazwę dla obsługi przerwania lub o niej zapomnisz. Małe wyjaśnienie tylko dodam - to nie będzie reset równy pinowi RESET, czy włączeniu zasilania, watchdog, itp., a jedynie skok do początku programu. Dlatego rejestry zostaną tak ustawione jak były. Warto to prześledzić na prostym programie: [syntax=c]#include...
witam rzeczywiście jeśli chcesz policzyć dokładnie ile czasu zjamie wykonanie tej pętli to musisz podać kwarc jaki będzi oraz na jakim to bedzie procku no i w końcu najlepiej takie czasowe sprawy śledzić w asemblerze mając kod w aseblerze policzysz dokładnie ile czasu w najgorszym razie pętla się będzie wykonywała wygeneruj kod i podaj to policzymy...
Hmm, coś jest nie tak. Zegar cały czas operuje tylko na parzystych liczbach. Nawet jak zapiszę do niego godzine 11 to i tak przy odczycie pokazuje 22. Aby ominąć mój algorytm dekodowania z BCD postanowiłem najpierw zapisać do RTC godzinę 11 i następnie odczytać i w formie BCD wysłać na portD a następnie miernikiem sprawdzić co zwraca układ rtc. Oto...
Witajcie, Mam taki problem, probuje wysłać 2 bajty przez SPI Odpalajac ponizszy program w debuggerze AVR Studio zapętla sie on, gdyz flaga SPIF(sygnalizujaca zakonczenie transmisji) nie ustawia sie. A dokladniej: po wystawieniu 1 bajtu - ustawia sie(od razu) i jako ze jest ustawiona, to przeskakuje do 2 bajtu a tam SPIF zeru sie i dlatego pętla sprawdzajaca...
Po raz kolejny zwracam się z prośbą do kolegów forumowiczów. Od pewnego czasu pracuję nad regulatorem fazowym zwykłe sterowanie triaka, wykrywanie 0 sieci nastawiane opóźnienie załączenia nic odkrywczego. Postanowiłem napisać taki program aby rozpocząć przygodę z uC. Pierwsza wersja powstała w C dodałem do tego coś a'la soft start i nawet to pracowało...
Nie wiem czy to poprawili, ale zmienne przesunięcia nie są za dobrze generowane dla avr. Kompilator robi takie przesunięcie w jakichś magicznych pętlach (zamiast np 1 << 6 robi 6 pętli po 1 << 1). Fajnie jakby ktoś kto się nie boi asemblera to sprawdził bo ja nie mam takiej możliwości chwilowo.
Nie. Możesz prosić tylko o przedstawienie zasady. Otóż zmienna tablicowa to nic innego jak ciąg kolejnych bajtów (słów, podwójnych słów - w zależności od przyjętego rozmiaru danych). Do takiej zmiennej w ASM można odwoływać się tak samo, jak do tablic w językach wysokiego poziomu. Jedynym aspektem jest konieczność użycia rejestru indeksowego. [syntax=asm]zmienna...
Witam. Mogę się pochwalić - dziś ukończyłem SAM ten program :) Jak działa? Przedstawię na filmie. Otóż po konsultacjach z nauczycielem po prostu miałem zrealizować w tym programie użycie licznika, przerwania oraz obsługę klawisza - i właśnie to udało mi się zrobić. Program początkowo zaczyna od zapalenia segmentu 4 diod- inicjacje początkowe, aby w...
W pierwszym przypadku w celu jak największej dokładności czasu opóźnienia jest wyliczana liczba przebiegów wewnętrznej pętli (która wykonuje się w 3 lub 4 cyklach, zależnie od tego, czy licznik może mieć 1 bajt, czy musi mieć 2 bajty) - te obliczenia są wykonywane na liczbach zmiennoprzecinkowych. Co do drugiego kodu, nie jest on funkcjonalnie taki...
asembler pętla zamknięta pętla otwarta pętla
joystick kalibracja odpowietrzyć renault megane mostek prostowniczy isuzu
amplituner yamaha lenovo monitor legion
Ustawienia rozdzielczości w Edytorze Rejestru Windows Porównanie głośników z Infinity Kappa 8.2