Ja takie zadanie robiłem na atmedze8 i tam aby poczekać jakiś odcinek czasu robiłem pętlę w której były zapętlone inne pętle. Pętle te nic szczególnego nie robiły (zwiększały tylko coś o 1 ) ale proces ten trwał jakiś odcinek czasu. I takich pętli używałem jako timerów.
Witam. Próbuję napisać w asemblerze program, który wyświetla odpowiednią ilość razy dany znak, a potem wyświetlić tę ilość znaków znów ileś tam razy. Czyli pętla w pętli. efektem końcowym ma być ****** * ****** ****** * ****** ****** * ****** napisałem tyle: .model small .386 .data tekst db "petla znakow",0Ah,0Dh,"$" tekst2 db "...
Muszę przyspieszyć trochę Bascoma, więc zabrałem się za wstawki w asemblerze. Kod prawie działa, piszę "prawie" bo mi się ni jak na logikę nie zgadza ilość przebiegów pętli. Na początek fragment kodu z moimi komentarzami. [syntax=basic4gl] ser r16 'do rejestru R16 laduje wartosc 255 ldi r17, &H84 'do R17 laduje H84, czyli dziesietnie 132 ldi r18, &H03...
Ok, dzięki wielkie. Sporo mi rozjaśniłeś, ale mam jeszcze kilka pytań: 1. W którym miejscu pliku .c mam dołączyć plik .s? W pętli main czy poza nią? Po prostu gdzie i co dopisać (pewnie coś pokroju asm ("#include plik.s"), ale nie wiem). 2. Co to za składnia w pliku .s? Nie jest to avrasm2, w takim razie jaki to asembler i gdzie mogę poszukać opisu...
hmm faktycznie..... czyli przy drógim dzieleniu trzeba mianownik podzelić prze 256, usunąc młodszy bajt i w jego miejsce wpisac starszy a msb trzeba by wyzerowąć. tylko że wtedy powstaną przekłamania:/ nieduże i tylko po przecinku ale tego juz chyba nie przeskoczymy, gdyż brakuje dokładności Dodano po 12 chociaż jest sposub na to drógie dzielenie, zeby...
Najpierw odczytujesz zadaną wartość w stopniach z klawiatury potem tą wartość dzielisz przez 180 i wyprowadzasz wynik. Jeśli wynik ma być z przedziału 0-2 to w pętli odejmujesz 360 aż wartość w stopniach będzie mniejsza od 360. A ten program na jaki konkretnie jest mikrokontroler??
Nie mogę oczywiście napisać za Kolegę ale może coś podpowiem. Klawisz "enter" jest zdefiniowany w tablicy KEY_COD: w ostatniej pozycji "DB 0AEH ;Enter". Najprostszą metodą będzie utworzenie drugiej tablicy TEXT z odwrotnym zapisem i przesłanie jej do LCD. Na razie program działa w pętli i cały czas wysyła dane do LCD (o ile się nie mylę), co wcale nie...
Witam Dzisiaj znalazłem fajną stronkę gdzie był umieszczony super fajny ściemniacz sterowany pilotem i ręcznie na Tiny12 ( ). I tu mam pare pytań: 1. Potrzebuje 2 takich układów w jednej puszce więc żeby mi się to zmieściło wymyśliłem że uwspólnie odbiornik podczerwieni, zasilanie, tranzystor odp. za detekcje przejścia przez zero (Q1) i rezonator......
Nie chce mi sie przeliczac z dwojkowego na 16-kowy, ale generalnie aby otrzymac pomiar z DS1820 powinieneś: 1. zresetowac linie 1-wire 2. wyslac wartosc 55h 3. wyslac wartsc 10h + 48 bitowy Adres urzadzenia + 1 bajtowy kod błędu CRC 4. wysłać wartość 44h - inicjacja pomiaru 5. poczekać aż układ odpowie - wartość FFh 6. zresetować linie 1-wire 7. wyslac...
Witam. Program możesz napisać tak: 1.Potrzebujesz dodatkowej zmiennej w której będziesz przechowywal wyraz oraz zmiennej zliczającej długość wyrazu. 2. W pętli (ilość obrotów równa jest ilości znaków w zdaniu) wykonujesz: a) jesli aktualny znak jest równy spacji wyświetl wyraz i liczbę znaków oraz powróć do punktu 2 czyszcząc te dwie zmienne. b)dopisz...
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','$'...
Witam. Zająłem sie tworzeniem prostego generatora DDS na ATmega16. Przetwornik to drabinka R-2R. Rozdzielczość 8 bitów, kwarc 8MHz (oczywiście możliwa zamiana na 16MHz). W pamięci mikroprocesora przechowuje 256 próbek sygnałów (np. sinus, piła). Poprzez tryb CTC Timer1 (preskaler ustawiony na 1) obsługuje przerwanie. Niestety napotkałem na problem -...
Witam Wszystkich Mam taki oto problem. Piszę w asemblerze program obsługujący interfejs UART (mk:atmega32) oraz wysyłający odebrane dane na wyświetlacz złożony z 10 matryc (5x8) LED. Napisałem program który mi odbiera dane (w procedurze przerwania) i umieszcza odebrany znak w buforze UART. Następnie w innym przerwaniu pochodzącym od licznika2 wykonuję...
Witam, kiedyś bawiłem się mikrokontrolerkami AVR w Bascomie - ciekawa sprawa, ale po jakimś czasie zaczął mi się nudzić :). Postanowiłem więc spróbować sił w Asemblerze. Korzystam z kursu na stronie mikrokontrolery.net - ciekawy, ale trochę za mało jest wyjaśnień, dlatego bardzo proszę o pomoc :) Mam problem z układem czasowym, tzn. działa mi, ale ja...
niestety nie udało mi się rozwiązać tego problemu (czyt. sprawdzania 4 bitowego kodu). nigdzie nie umiałem znaleźć choćby powierzchownego wyjaśnienia działania tablic w asemblerze. (jeśli ktoś wie gdzie znajdę takie info - proszę o PW) zauważyłem że sporo osób czytało mój post, więc samolubnie uznając go za ciekawy, napiszę moje, proste rozwiązanie....
Panowie mam pytanie co robię nie tak że mi nie obsługuje klawiszy. przyciski mam dołaczone do PA0...PA4. Do PA5 i PA6 mam dołączone przekaźniki (wyraźnie słychać czy się przełaczają), zamiast sterowania przekaźnikiem dawałem komendę zerowania LCD i nic. Tak jakby się gdzieś zawiesił albo coś. Wiem że całe życie się człowiek uczy i pewnie jest tu jakiś...
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...
Witam, Mam problem z zapisywaniem zmiennych w tablicy we wstawce asemblerowej. Próbowałem już różnych sposobów, aby "przemycić" adres początku tablicy do wstawki, ale bezskutecznie:( Jakiego operandu mam użyć, a może jest inny sposób? W asm mam pętle, w której dane są zapisywane poleceniem st Y+, Rx. Czyli potrzebuję zapisać do rejestrów R28,R29 adres...
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].
Oglądam sobie AVR320 (SPI) i jest tam set_delay i inc_delay. Dlaczego nie mogę sobie ustalić pętli dla 10, dla 15 itp. Gdzie znaleźć "rozpiskę" tego, co procesor wyprawia? Oczywiście że możesz - wnioskuję, że piszesz w asemblerze. Ściągnij sobie dokument "AVR Instruction Set Manual" - tam masz podane czasy wykonania każdej instrukcji, więc możesz sobie...
Grube tysiące. Stosowanie środowiska wizualnego jest dla mnie utrudnianiem sobie pracy. Aha, a programy na µC piszesz w całości w asemblerze. Nie mam więcej pytań. Dodano po 20 Grube tysiące Jak patrzę na to to te programy pisałeś chyba jeszcze w DOS-ie, współczesne systemy są sterowane zdarzeniami i żadnych funkcji się w nich w kółko nie wywołuje,...
do wejścia INT0 lub INT1 podłączasz generator 1Hz (np: na kostce NE555) i w pamięci pod adresem 0003h umieszczasz kod, ewentualnie możesz zrobić pętlę opóźniającą, ale wtedy musisz obliczyć czas wykonywania jednego cyklu na podstawie posiadanego kwarcu i ilość cykli wykonania jednej pętli i wyliczyć ilość iteracji pętli. mniej więcej wygląda to tak...
W pętli programu głównego jest wywołanie funkcji asm_signal(); a sama funkcja wygłada tak: // ----------------------------------------... ldata segment code public asm_signal rseg ldata asm_signal: SETB P1.7 MOV R7,#255 LCALL wait MOV R7,#100 LCALL wait MOV A,#170 LCALL send MOV A,#170 LCALL send MOV A,#170...
[syntax=c]#include <avr/wdt.h> #include <avr/interrupt.h> #include <avr/io.h> #include <avr/sleep.h> register char interrupts_counter asm("r23"); register char saved_mcusr asm("r21"); ISR(WDT_vect)//obsługa przerwania od watchdoga { interrupts_counter++; } int main(void) { saved_mcusr = MCUSR; interrupts_counter = 0; sei();//zezwolenie...
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...
dlaczego pętla for(i=1000; i>0; i--){ ... ... suma ++; } nie powoduje zadnego opoznienia? W Symulatorze AVR po przejsciu przez ta petle widze, ze zagar "tyknął" tylko dwa razy. Natomiast jeli w petli umieszcze westawke asemblerowa nop. for(i=1000; i>0; i--){ ... ... __asm("nop"); } Wszystko...
Jest wiele powodów takiego zachowania, m.in.: 1. Obsługa w międzyczasie jakiegoś przerwania. 2. Instrukcje warunkowe skoków - w zależności czy warunek jest spełniony czy nie to może być różnica 1 taktu, która się akumuluje w przypadku wielokrotnych skoków warunkowych. 3. Warunkowe wykonywanie podprogramów. Najlepiej takie zachowania analizować patrząc...
Witam, Tworzę program na mikrokontroler. Mam niewielkie doświadczenie w C. Głównie programowałem w asemblerze. Teraz przepisuję jeden z moich starych programów na inny mikrokontroler. Program był oryginalnie napisany w asemblerze, teraz chcę go napisać w C. I natrafiłem na taki fragment, którego nie wiem, jak napisać nie wykorzystując nielubianej w...
Witam, cel pozostał ten sam, lecz zmienił się kod, tym razem bez Lcd, więc jako zadanie dostałem opisanie krok po kroku otrzymanego kodu oraz przeniesienie kodu z języka Bascom na kod Asemblera i C. Jako, że programowanie nie jest moją mocną stroną, prosiłbym o pomoc (rady, sugestie najlepiej w sposób tzw. łopatologiczny jak można osiągnąć postawiony...
1. Typ procesora- uznałem że pisząc w dziale '51 domyślnie chodzi rodzinę '51, czyli 8051, 8052 itp. Nie wyszczególniałem że chodzi mi o dokładnie posiadany at89s52, bo pytanie dotyczy się całej rodziny-architektury. Wpis dla 6502 miał pokazać ideę dla obeznanych z tym asemblerem. 2. Nie będę polemizował na temat tego jak kto tę technikę postrzega-...
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...
witam nic prostszego! zaczynasz od wyzerowania wyniku i zrobienia pętli dla wszystkich cyfr liczby wejściowej, począwszy od najbardziej znaczącej W pętli: 1. mnożysz wynik przez podstawę liczby wejściowej (czyli 8) 2. dodajesz do wyniku kolejną cyfrę liczby wej. na którą wskazuje stan pętli np zmieniasz liczbę 157 1. wynik=0 2a. wynik*=8 podstawa liczby...
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...
Chodzi mi o linijkę zaznaczoną gwiazdkami . Kompilator wyrzuca mi błąd takiej treści error: Undefined symbol: SPL i nie wiem co jest nie tak, w tej linijce .include "2313def.inc" .def acc = r16 ; nadanie rejestrowi r16 nazwy symbolicznej .cseg .org 0x00 ldi acc, 0b11111111 ; załaduj do acc liczbę 255 (0xff) out DDRB, acc ; wpisanie...
Widmo DSM-51 prześladuje mnie od czasów technikum, teraz kończę magisterkę i znów mi dali jakiś "projekt" na ten wynalazek... a już miałem nadzieję że więcej asemblera na oczy nie zobaczę. Temat projektu brzmi: napisać algorytm obliczający wartość wyrażenia fib(n)%m, gdzie m jest liczbą 8 bit, a n jest liczbą 16bit (to zadanie ze SPOJu). Jako, że asembler...
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.
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ć...
Witam. Mam mały problem z ustaleniem prędkości przezkakiwania czy też zliczalnia. A mianowicie mam 2 wyświetlacze 7 seg ( w zasadzie to 8 ale ja kropki nie wykorzystuję) no i programik jest strasznie prosty. Dopiero wchodzę w programowanie. Program jest oparty na książce p. P.Borkowskiego który raczej na tym forum też jest ;] [syntax=asm];;; l8 ;;;...
Dzieki za NIEpomoc. Program skończony. Wygląda troszke nie schludnie bo nie są porobione pętelki ale to kwestia przerobienia go. Ważne że działa jak chcialem. Pozdrawiam [syntax=asm] SEG_ON EQUP1.6;włączenie wyświetlacza 7-segm. LEDEQUP1.7;Dioda TEST podłączona do P1.7 ;Stałe używane w programie - kody włączonych diod D1EQU00000001B ;1 DIODA D2EQU00000011B...
Już wiem, co dokładnie zrobiłem źle. Błąd był bardzo subtelny :-) Zauważyłem, że w podprogramie(?) przelacz_diody nie ma instrukcji czekania po zmianie świecenia. Dlatego podczas wciskania przycisku nie była realizowana żadna procedura opóźniająca, mimo że ją zdefiniowałem. Wyglądało to tak: Początek pętli głównej -> Przycisk wciśnięty -> Zamień świecenie...
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...
ciekawi mnie to, że obojętnie co [/quote] Coz... njaprawdopodobnije kompilator mysli za Ciebie i pusta petle po prostu pomija. Rozwiazanie: Albo napisz petle w asemblerze, albo przed dekalracja zmiennych w funkcji: void delay(unsigned int us) wstaw magiczne slowo volatile np: volatile unsigned int delay_loops; Poza tym jak cos nie dzial to zajrzyj...
Witam Wszystkich Napisałem malutki programik, który ma za zadanie wyświetlić mi na jednym module matrycy LED jedną kolumnę w całości, jedna pusta a następnie ma wyświetlić górną polówkę kolumny. Tak jak to przedstawiono na rys. poniżej: Program wygląda następująco: .include "m32def.inc" .list .def acc = r16 .def acc2 = r17 .def param = r18 .def licznik...
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...
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...
Cześć. Chce napisać program, który pobiera znak z klawiatury (liczbe 0-9), i przekazuje ją do pętli, gdzie wyświetlany jest jakiś napis, w pętli o liczniku zadeklarowanym przez użytkownika. mam tyle: .model small .386 .data tekst db "petla znakow",0Ah,0Dh,"$" .stack 100h .code .startup mov dx, offset tekst mov ah, 09h int 21h mov...
kod w całości wygląda następująco: $crystal = 12000000 // ustawienie częstotliwości zegara taktującego procesor (liczba określająca częstotliwość w Hz kwarcu lub oscylatora taktującego procesora) $regfile = "89C2051.DAT" Config Timer0 = Timer , Gate = Internal , Mode = 1 Tmod.3 = 1 Tmod.7 = 0 Gate_alias P3.7 Booz_alias P3.0 Ledy Alias...
Witam Jestem na etapie dogadywania się z czujnikiem temperatury dallasa, i póki co nie ma widoków na żadną formę komunikacji. Poniżej dołączam listning kodu źródłowego z możliwie najczytelniejszymi komentarzami. Całość jest pisana z dokumentacją w ręku a mimo to po zapisie i odczycie scratchpada czujnik zwraca same 0xFF. Nie wiem czy wina leży w złej...
Ile się wykonuje zależy od typu procesora.. Nie każda instrukcja wykonuje się tyle samo razy Przykładowo: DJNZ jak wykonuje skok - wykonuje się dłużej (zabiera więcej cykli taktów CPU) - niż jak skoku nie wykonuje. Wszystko zależy od typu procka (i częstotliwości). Do tego zależy - czy czasem nie masz włączonych przerwań. Jak wiadomo - przerwanie przerywa...
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".
Witam, Na zajęciach z Architektury komputerów spłodziłem z pomocą wykładowcy program wyświetlający tekst na wyświetlaczu LCD. Teraz chciałbym napisać program wyświetlający teksty i liczniki. Napisałem w C algorytm na jakim chcę się oprzeć: Dodano po 31 Z tego co wiem powinno być: Dodano po 55 Ogólnie nie wiem jak zamodelować te dwie pętle w ASM: Dodano...
Witam, mam pytanko. Napisałem program który po wciśnięciu przycisku wyświetla na wyświetlaczu liczby kolejno od 0 do F. Jest to wywoływane przyciskiem na porcie p1.5 teraz druga sprawa. Chciałbym by przyciskiem p1.4 móc obniżać wartość liczby, przypuśćmy gdy będzie 7, a wcisne p1.4 pojawi mi się 6. Jakim sposobem to zrobić? Oto program: [syntax=asm];...
W Asemblerze mam napisać program, który będzie odczytywał znaki z klawiatury, ale tylko znaki alfabetu i jeśli pojawi się inny znak niż litera, to będzie słychać dźwięk("buczenie") i program będzie czekał tak długo, aż zostanie wprowadzony znak alfabetu. Dopiero zaczynam się uczyć asemblera i bardzo proszę o pomoc. Zastanawiałem się nad tym i może trzeba...
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...
Szanowny Panie (at)tadeko9 , przepraszam za mój poprzedni, faktycznie szorstki, ton. Co złego to nie ja :D W pierwszym poście dołączył Pan taki kod: Dlatego dołączam od razu ten dla powyższego kodu. [syntax=avrasm]2: $regfile = "attiny2313.dat" 3: $crystal = 4000000 4: $hwstack = 40 5: $swstack = 16 6: $framesize = 32 7: 8: Config Portd.2 = Input :...
Witam, jest to mój pierwszy post tutaj, więc gdybym źle trafił z kategorią, to z góry przepraszam. Potrzebuję pomocy z zadaniem na studia dotyczącym napisania programu dokonującego konwersji liczby heksadecymalnej na decymalną oraz binarną. Jak wspomniałem w temacie, chodzi o asembler i8086, a napisany program ma działać w DOSBox'ie. Rozwijając treść...
Witam, a nie prościej wcisnąć magiczny przycisk "Simulate program" w Bascomie. Na pasku na dole okienka jest podawany czas w [ ms ]. Jeśli program będziemy symulować "by step" , krok po kroku to można podpatrzeć o ile zmienia się czas. nic nie trzeba liczyć. ( oczywiście jest to metoda mało dokładna no ale lepsze to niż nic ). No oczywiście jeśli chcemy...
Witam. Pewnie tematów z podobnymi prośbami było tu już mnóstwo. Niestety nie znalazłem odpowiedzi na nurtujące mnie pytanie. Napisałem taki króciutki programik w asm. .include "m8def.inc" .CSEG .org 0x0000 rjmp RESET .org 0x001C rjmp timer0 RESET: ;inicjowanie stosu ldi r16, LOW(RAMEND) out SPL, r16 ldi r16, HIGH(RAMEND) out SPH, r16 ;poczatkowe ustawienia...
Witam! Od paru dni uczę się pisać programy w asemblerze na AVR (dokładnie AtMega16) i mam następujący problem na którego nie potrafię rozwiązać: próbuje stworzyć tablice danych w pamięci SRAM aby odwoływać się do nich instrukcją STS jednak wpisanie danych w następujący sposób nie działa: Bo i działać nie może :( Jedynym zarządcą RAM-u jest uC i tylko...
Buduję napęd silnika prądu stałego oparty na Atmedze8. I moim problemem jest implementacja algorytmu kaskadowego do sterowania silnikiem, a dokładniej regulatorów PI. (przepraszam za takie "mądre" określenie problemu, ale w ten sposób najłatwiej mi to opisać. Tak czy owak potrzebuje stworzyć program w asemblerze na Atmegę który wykona zadanie regulatora...
racja nie gryzą podobnie jak myślenie ale zobaczcie czy tak jest ok 0000: 44010003 ADDI R0, 0x0008, R1 0004: 44020005 loop SUBI R1, 0x0001, R1 0008: 1C220800 BRNZ R1, loop na pierwszy rzut oka wydaje mi sie ze taka pętelka będzie działać ,ale czy mam racje .
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ą...
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...
W asemblerze używanie etykiet jest nieuniknione, jak sobie wyobrażasz np. pętle albo skoki warunkowe (odpowiednik if w C)
Jest to dość klasyczny układ, nie jest ani odkrywczy, ani nie zawiera najnowocześniejszych elementów - termometr z 3-cyfrowym 7-segmentowym wyświetlaczem LED ze wspólną anodą. Zamieszczam pełny kod programu w asemblerze z komentarzami. Układ jest zbudowany na mikrokontrolerze AT89C2051. Jego zadaniem jest odczyt temperatury z czujnika DS18B20 (1-wire),...
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...
Witam. Robi się to dokładnie tak, jak napisał Patryk. DB w asemblerze to po prostu Definiuj Bajt, jest to miejsce w pamięci programowej zarezerwowane na definicje np. tekstu. A więc (nie zaczyna się od 'a więc')jeśli ustawisz etykietę np. Linia_1 dla pierwszej linii na LCD i wpiszesz tam 16 bajtów tekstu, to będzie to wyglądać następująco: gdzieś w...
Proponowałbym trzymać się zasady, że obsuga przerwania (jakiegokolwiek) powinna być możliwie jaknajkrótsza. U Ciebie część obsługi przerwania od T0 mogłaby być realizowana w pętli głównej porgramu (u Ciebie w pętli głównej nic się nie robi!).
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..."
A ja dla odmiany zawsze zaczynam pisać probramik w BASCOM. Pisze sobie szybciutko najważniejsze procedurki, pentelki, obliczenia, komunikacje i inne. Jak już wiem że to co chce zrobić działa zaczynam to upiększać. Dodaje interfejsy, odsługę klawiatury np. i najczęściej wtedy zaczyna mi brakować miejsca... I w tedy zaczynam przeglądać wyrywkowo program...
Masz napisać procedury mnożenia liczb: 1 bajtowej przez 1 bajtową (8x8) wynik będzie 16 bitowy (2 bajty) 2 bajtowej przez 1 bajtową (16x8) wynik będzie 24 bitowy 3 bajty 2 bajtowej przez 2 bajtową (16x16) wynik będzie 32 bitowy (4 bajty) Procedura przebiega tak w kodzie naturalnym binarnym: 1. Przygotowujesz rejestr wyniku o długości równej sumie ilości...
NIe wiem na ile w ASM potrafisz pisać ale z doświadczenia wiem że wystarczy spojrzeć na przebiegi 1Wire kilka pętli i już, oczywiście pod warunkiem że podpinasz tylko jedno urządzenie slave.
Pisałeś, że nie zastosowałeś MAX-a, więc o czym piszesz teraz ? W kodzie programu wyraźnie jest zaznaczone, że zaraz po resecie mikrokontrolera pojawi się sinusoida. Trochę może nie umiejętnie to opisałem .Rzeczywiście nie zastosowałem max-a602 ale Zastosowanie max-a w tym układzie miało właśnie na celu włączenie zasilania dla układu z chwilą uruchomienia...
A czy w 89C2051 jest jakiś timer liczący w dół (a może nie doczytałem datasheet-a :wink:)? Moja wypowiedź jest uniwersalna, nie wnikałem w cyferki i literki na obudowie, można ją zastosować do dowolnego mikrokontrolera. Wyrwałeś z kontekstu, bo dalej dodałem, co zrobić w wypadku, gdzy takiego licznika nie ma, lub jest zajęty. Czytaj ze zrozumieniem....
.org 0x0000 ; ustawia adres w pamięci programu rjmp reset ; skocz do etykiety ... ; wektor przerwania timer 1 .org 0x0005 rjmp led_off ; skocz do obsługi przerwania ; w tym przykładzie początek programu głównego reset: ; Jako pierwsze ustawienia stosu (w asemblerze jest to ; bardzo ważna operacja i programista nie może o tym zapomnieć)....
Najprościej będzie Ci to wyswietlać w postaci szesnastkowej. 1. Masz wartość w edx, 2. pobierasz ostatnie 4 bity (przesuwając je jednocześnie do początku), 3. konwertujesz tak otrzymaną liczbę na ASCII (0...15 -> '0'...'F'), 4 . wyswietlasz, 5. przesuwasz edx o 4 bity w lewo, 6 jesli nie zostały przesuniete wszystkie bity (8 obiegów pętli) to skocz...
Perler: w twoim kodzie jest dużo niedociągnięć.. funkcje Delay powinieneś wywołać przez 'rcall', tu zaś przychodzi brak stosu i brak 'ret' na końcu. w samym Delay widze odkładanie 4 rejestrów (gdzie?) ale niewidze ich zdejmowania ani pętli do opóźnienia.. po wystawieniu wartości 0x00 na porta odrazu dokonujesz skoku do początku pętli i odrazu zmieniasz...
dziekuje wszystkim za pomoc ostatni plik od Light-I działa poprawnie :) - dioda miga ale mam taki problem, kiedy użyłen kodu od od Zumek, uklad nie działał. Zauwazyłem jednak dziwną prawidłowość, kiedy miałem wsadzone wtyki do programatora LPT (Laptop) i dodatkowo laptop wszedl w stan wstrzymania systemu układ zaczynał działać. Sprawdziłem to jeszcze...
Witajcie :) Czy dobrze napisałem program przesuwający bity na porcie P1 co ok 1s ? Taktowanie 6MHz. ; poczatek programu ORG 0000h MOV ACC, #00000001b LJMP START ;tablica wektorow ORG 000Bh ; tu skacze w razie przerwania T0 RETI ;petl glowna START: SETB ET0 ;zalaczenie przerwanie z T0 SETB EA ;zalaczenie przerwan MOV TMOD, #0001b ;T0 jako 16bitowy...
Spróbuj w głównej pętli wrzucić opóźnienie (cały czas mam wrażenie, że to wszystko chodzi "za szybko" jak dla ludzkiego oka :) ). OPOZNIENIE1: mov R0,#0ffh mov R1,#0ffh mov R2,#05h petlas: djnz R0,petlas djnz R1,petlas1 djnz R2,petlas2 sjmp koniec_ops petlas1: mov R0,#0ffh sjmp petlas petlas2: mov R1,#0ffh sjmp petlas koniec_ops:...
po wyrzuceniu zbędnych rzeczy z tej procedury wyslij i przeanalizowaniu tego ;) wynika, że absolutnie obojętnie gdzie nie wstawisz ldi R20, 97 - czy przed pętlą czy w pętli to nie powinno mieć najmniejszego znaczenia dziwi mnie, że napisałeś: Gdy wrzuce ta procedure do petli a ldi r20, 97 zostawie za petla wtedy równiez działa dobrze co to ma oznaczać?...
Witam Proponuję zrobić to troszkę inaczej. Przerwanie zaprogramuj tak aby ustawiało jakiś bit co jedną sekundę. Program główny ma mieć taką konstrukcje. czy sekunda: jeżeli tak to mrugnąć 5x diodą wyzerować czy sekunda jeżeli nie skok na czy sekunda czy sekunda 2: jeżeli tak to buzer 4x wyzerować czy sekunda jeżeli nie to skok do czy sekunda...
Spróbowałem tak: CSEG .ORG 0 ; wektor przerwania inicjalizacji rjmp Reset ; skok do procedury inicjalizacji .ORG OC1Aaddr rjmp zwieksz ;----------SEGMENT PROGRAMU------------------------------ .ORG Coś tam Cośtam <- tu dopisałem. (tylko zamiast cos tam dałem .ORG 0x013 tak sobie) Main: jmp Main ;----------SEGMENT PRZERWAN------------------------------.....
Jeszcze kilka informacji. System zapewnia ci obsługę okna dialogowego: komunikaty - brak pętli, standardowy wygląd - prostsze programowanie ale są pewne ograniczenia np. nie potrafiłem dodać swojego kursora (w formie impulsu) w zwykłym oknie chodził poprawnie. Osobiście umieszczam elementy okna dialogowego w pliku zasobów rsrc, można w pliku asm ale...
chodzi o to że jeżeli podczas czekania w głównej pętli programu wystąpi przerwanie zaraz za rozkazem zmieniającym flagi to po powrocie mogą one być zmienione i niezależnie od wyniku porównania program może "pójść" gdzie indziej. Dlatego dobrze jest zadbać o to żeby takich sytuacji nie było, czyli na przykład: in r16,SREG pushr16 i na koniec pop r16...
Potrezbuje napisać program w asemblerze zapisujacy liczbe trzycyfrowa Mam zapisać liczbe 172 R0 - od 0 do 256 R1 - jednosci 2 R2 - dziesiatki 7 R3 - setki 1 Na tak sformułowane zadanie może być tylko taka odpowiedź :D (przemyśl jeszcze treść tego zadania) START: MOV SP,#6F ; Ustawienie wskaźnika stosu MOV R0,#172 ; załadowanie do R0 liczby do rozpisania...
To się nazywa optymalizacja kodu :) dzięki Przetestowałem procedurę w symulatorze i nie działała prawidłowo (ani z mov ani z xch), okazało się, że po ostatnim końcowym przesunięciu przed wyjściem z pętli w akumulatorze umieszczana była niepotrzebnie zawartość rejestru pomocniczego. Po drobnej zmianie działa ok. Dla ciekawych: trwa 55 cykli maszynowych....
Po zmianie radio buttona wywołujesz SetDlgItemText i od tej pory nie wiesz co system zrobi..... 1. cmp Len, 1 2.jae wychodzimy 3. invoke GetDlgItem, hWnd, 1060 4. invoke SendMessage, eax, BM_GETCHECK, 0, 0 5. .if eax==BST_CHECKED 6. invoke SetDlgItemText, hWnd, EDIT1_ID, addr Bufor1 7. invoke SetDlgItemText, hWnd, EDIT2_ID, addr Bufor2 8. inc Len 9....
:) Po wyjściu z pętli drugiej program leci w "kosmos" Brak pętli głownej programu. Sensu reszty nie analizowałem.
Witam Programowałem trochę w bascomie swego czasu i tam opóźnienie wprowadzało się bardzo prosto - wait x i już.. O co mi chodzi. Mam zrobić pragramik .include "m2561def.inc" rjmp START ;-------------------------------- START: .def rej1 = r16 .equ KeyPort = PORTD .equ KeyPins = KeyPort - 2 .equ LedPort = PORTB ldi rej1,low(RAMEND)...
Kolega KKobi nie chce w pustej pętli odliczać, a poza tym stan "0" na wyświetlaczu (tożsamy z R19=0) też się ma wyświetlić, a tego Twoja pętla nie zagwarantuje. Wcześnie BRNE się spełni i ten stan zostanie pominięty.
Mam dzisiaj chyba dzień dobroci... Tu masz procedurę dzielenia, przerobioną z noty AVR200. Wykona się +/- o 50% dłużej niż oryginalny kod 16/16 unsigned - jest 8 przebiegów pętli więcej i jedna instrukcja więcej w pętli, ale zoptymalizowałem jednego brancha więc cykli w przebiegu pętli wyjdzie tyle samo. Z tego wynika, że wszystko powinno zająć max...
Tak . Rozumiem ,że używasz portu P1 i P2 Można to skrócić. MOV P1, #00h MOV P2, #00h ... MOV P1, #00111111b ... nie musisz korzystać z akumulatora jako rejestru przejściowego. Pomiędzy poszczególnymi wysłaniami danej na port musisz dać jakiś warunek np. jnb P0.0, aby zatrzymać program w pętli i obejrzeć efekt na wyświetlaczu 100ms to krótki czas ;)...
Witam mam problem ze zrozumieniem poniższej pętli. Wiem, że na początku mnożymy x2, bo rozkaz djnz ma dwa cykle, ale nie mogę dojść do tego, czemu poźniej dodaję +1 i +2? Załączam screena programu (żeby się opis nie rozjechał). Gdzie mógłbym znaleźć rozwiązanie tej zagadki? movR2,#50 ; | PETLA2:movR1,#100 ; | | | PETLA1:movR0,#50 ;|| | | | djnzR0,$...
Niestety nie takie to proste. Owszem po wykonaniu pętli: invoke GetFocus and eax,eax jz quit ; HWND->id invoke GetWindowLong, eax, GWL_ID quit: Mogę zapamiętać uzyskany ID w jakiejś zmiennej. Tyle, że po naciśnięciu klawisza ta pętelka jest również wykonywana i do zmiennej trafia już ID tego klawisza. Nie o to mi chodziło, chodziło mi o żeby...
nie wiem jaki tam jest assembler. na Atmege16 mam coś takiego. procedura jest wywoływana z tajmera co 20 ms ;#######################################... skan_klawiszy: ldi acc,0x0F ;ustawienie wierszy jako WEJ, a kolumn jako WYJ out DDRB,acc ldi acc,0xF0 ; wlaczenie pull-up na WEJ out PORTB,acc out PINB,acc...
Poradziłem sobie już w inny sposób. Dodałem pętle w odpowiednim miejscu: Czekaj1s: ldi R27, 0 Czekaj250ms: ldi R28, 0 czekaj250ms_0: ldi R26, 0 czekaj250ms_1: inc R26 cpi R26, 250 brlo czekaj250ms_1 inc R28 cpi R28, 249 brlo czekaj250ms_0 inc R27 cpi R27, 4 brlo Czekaj250ms ret
Hej mam taki problem, pisze prosty program do swojej pracy inżynierskiej, który odczytuje dane z enkodera absolutnego w kodzie Graya , nastepnie poddaje je konwersji i wyświetla w postaci binarnej i dziesiętnej. Program działa ,ale muszę podać czas działania pętli programu. Nie wiem jak to mozna zmierzyć. Procek taktuje wewnętrznym oscylatorem 8 mhz....
Było by dobrze, ale źle postawiłem nawias, bo ldi nie wykonuje się w pętli, ale tylko raz. Po poprawce: delay1: ldi R16, 0 ;1 cykl del1: inc R16 ;1cykl brne del1 ;2 cykle (1 gdy nie ma skoku) ret ;4 cykle ;razem 1+(1+2)*256-1+4=772 cykli delay2: ldi R17, 0 ;1 cykl del2: rcall delay1 ;3+772 cykli inc R17 ;1 cykl brne del2...
Jak dla mnie Twoje pytanie jest mało szczegółowe. Do czego ma być użyty ten DPTR? Poza tym można go traktować jak 2 rejestry DPH i DPL, ale jest już używany więc użycie go do przechowywania wartości w0 - w4 mija się z celem bo jest używany do adresowania pośredniego czyli należało by go zapamiętać. Jedynie można go jeszcze użyć w pętli opóźniającej,...