gdyby to było takie proste to nie pisałbym o tym na forum, ja potrzebuję czytać pozycje przy pełnej prędkości i to bezbłędnie bez żadnych przekłamań... Maksymalnie schrzaniłeś hardware, teraz to już Cię nic nie uratuje. Do zliczania trzeba było wykorzystać ten większy Timer, a do wykrywania zmiany kierunku przerwanie. Pięknie by to chodziło a procek...
Z tymi sterownikami nie maiłem do czynienia ale początek opisu wskazuje, że służą do obsługi code page - czyli zestawu znaków (np polskie litery) Co do programowania kontrolera przerwań to znalazłem taki papier: http://sirius.cs.put.poznan.pl/~inf94333... Trzeba pamiętać, że dostęp do rejestrów HW jest przez rozkazy assemblera in/out i nie jest...
Nie mam żadnego pomysłu na to aby zmusić kompilator AVR GCC(+AVRstudio) aby procedurę obsługi przerwania całkowicie zrealizować jako procedurę napisaną w assemblerze reszta jest w C... Utwórz sobie plik z rozszerzeniem "S", umieść w nim np. coś takiego i dołącz go do projektu :) #include <avr/io.h> #ifdef __SFR_OFFSET #undef __SFR_OFFSET #endif...
funkcje w assemblerze nazwac __vector_XX gdzie XX to jedna lub dwie cyfry. numerek ten jest numerem wektora przerwan, przy czym reset ma numer 0 pozatym odpowiedni zestaw parametrow przy owym ISR pozwoli usunac wszelkie opcje dodawane przez kompilator (atrybut 'naked'). do tego mozna sobie wtedy przerwanie napisac jako wstawke asm. 4\/3!!
Bascom nie da sobie z tym rady, C też nie da rady bez wstawki assemblerowej, W wartym 5zl ARM klasy STM32F030F4P6 masz 5 kanałów DMA którymi ogarnąłbyś problem tak po prostu. A z czego Ty chcesz te DMA wyzwalać? W przerwaniu bez wstawki assemblerowej też sobie z tym nie poradzi. Coś nie chce mi działać, wgrałem z kompilowany hex do procka i restartuje...
Jesli rozumiem chodzi o przerwanie INT aktywowane oadajacym zboczem a nie poziomem. W INT0 ustawiasz bit IT0 w rejestrze TCON na 1 jesli ma byc od zbocza a 0 jesli od niskiego poziomu. w INT1 bit IT1
Bo jak ma działać? Widać kolega nie do końca rozumie mechanizm przerwań, skoro czeka na przerwanie INT0, a włącza przerwanie przepełnienia Timera0. Adresem przerwania przepełnienia Timera0 jest OVF0addr, a nie INT0addr. Przerwanie od INT0 wyzwalane jest ZEWNĘTRZNIE zboczem lub stanem na fizycznym wejściu INT0 mikrokontrolera, a nie Timerem. Skąd ten...
Działa ;-) Ustaw Breakpoint na linijce (prawy myszy Toggle Breakpoint) [syntax=avrasm]com LED[/syntax] naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 itd. Zamiast 15625 ładuj do OCR1A 15624. Wieczorem wrzucę inny sposób migania tym...
Przerwania, w odróżnieniu od starych ARMów są w całości zarządzane przez ARM'a czyli CortexMx. W dokumentacji ARM znajdziesz opisy rejestrów i jako to działa. Każdy producent, taki jak ST zmienia znaczenie linii przerwań, definiując je po swojemu za wyjątkiem kilku pierwszych zarezerwowanych przez ARM. Ponadto, Cortex'y mają możliwość nadania przerwaniom...
cjne A,02h,etykieta - co znaczy porównaj i skocz gdy nie są równe. W tym przypadku 02h to R2 w banku 0. Zakładam że wartość z klawiatury jest w A oraz, że jest to wartość 0-9. Jeśli kod klawisza jest inny należy do programu dorzucić tablicę z kodami klawiszy.
Tak ponad rok temu zacząłem się bawić Nucleo, zasięgając rad u kolegi, który próbował jeszcze wcześniej. Ogólnie na STMy masz kilka możliwości pisania / środowisk. Ja standardowo zacząłem od migania ledem z assemblera, ogarnięcie środowiska do tego było przykre (pracuje na Linuxie) jest i było gcc, ale jakieś pliki trzeba było brać skądś tam itd itp....
tak, musisz kasować ją ręcznie - tak samo jak VICVectAddress. Inaczej nie da się tego zrobić - jedno przerwanie może zostać wywołane przez wiele źródeł (przepełnienie, porównanie, złapanie nowej wartości, ...), więc nie ma innego uniwersalnego sposoby niż ręczne kasowanie odpowiednich flag Dodam może, że przy debuggowaniu wewnątrz przerwania, czasem...
Szybkie może i są, jednak CC Studio raczej nie pozwala na wykorzystanie możliwości C67XX. Dosyć spory kod tworzy ten kompilator. Dlatego przeważnie programy na TMS'y pisze się w assemblerze, masz wtedy pełną kontrolę nad procesorem. Z racji, iż program jest malutki proponuję napisać go w assemblerze (poleceń jest mało). Nie znalazłem błędu jeżeli chodzi...
1. Nie da się lecieć linia-po-linii w assemblerze. 2. Czy przerwanie nie powinno przypadkiem mieć atrybutu informującego kompilator, że jest to przerwanie? void ADC_IRQHandler(void) __attribute__ ((interrupt("IRQ"&... void ADC_IRQHandler(void) { ... } ? 4\/3!!
Chyba to właśnie co znalazłem w źródłach. Deklaracja funkcji przerwania nie może mieć atrybutu Interrupt("FIQ") skoro mamy już wrapper w assemblerze. Tak jak pisałem, spróbuj z __attrybut__((naked)) albo wcale. Jeśli zadeklarujemy to jako FIQ to kompilator dodaje kod odejmujący 4 od adresu powrotu, co my już robimy we wrapperku.
Mozę powtórzę, bo nie lubię patrzyć jak ktoś traci czas - wszystkie porady sugerujące że problemem jest 8-/16-/32-bitowy dostęp do rejestru DR lub jakieś nieistniejące w tym układzie FIFO są po prostu błędne. Jeśli bez optymalizacji ruszyło, to powód jest dokładnie taki jak w słynnym przypadku timerów - to co kasuje flagę (zapis do DR) jest zbyt blisko...
Witam, ... Czy to dzielenie będzie wykonane jako 1 operacja, czy zostanie rozbite na ileś tam poleceń asm. I czy przerwanie nie nastąpi w trakcie wykonywania się tej funkcji i czy przez to nie mogą pojawić się błedy? W AVR na wszelki wypadek wyłaczałem przerwania na czas wykonywania tego typu działań. ... 1) Nie do konca rozumiem pierwsze pytanie, tak...
:arrow: dscreator Przede wszystkim koniecznie skomentuj każdą linię i wklejaj za pomocą znaczników Code , ponieważ (jak widzisz) Twój program jest zupełnie nieczytelny (forum usuwa spacje na początku linii). Program powinien zaczynać się zaraz za obszarem wektorów przerwań. Jeśli jakiegoś przerwania nie wykorzystujesz to zamiast mnemonika rjmp wstawiasz...
$katalog_WinAVR$/doc/avr-libc/avr-libc-u... Tworzysz osobny plik w asemblerze (.S, nie .s) zawierający procedurę obsługi przerwania, kompilujesz do pliku .o i linkujesz z pozostałymi plikami. W dołączanym wo WinAVR szablonie Makefile jest przewidziane miejsce na wypisanie źródeł w asemblerze (ASRC = $tu wpisz nazwy plików$). Przykład,...
Port szeregowy działa na całkiem innej zasadzie. Podaje się mu liczbe iluś-bitową (to można skonfigurować) a on przekształci ją w ciąg binarny rozpoczynający się bitem startu a zakończony bitem stopu. Układ sterownika zbudowany jest z rejestru przesuwnego do którego wpisuje się wartość do wysłania a w czasie wysyłania kolejne bity są przesuwane tak...
Niedawno zbudowałem timerek w którym stan przycisków sprawdzam tak : callsprawdz ;sprawdzaj stan przyciskow -------------- ------------- ------------- sprawdzcallspr_s1 callspr_s2 return ;---------------------- spr_s1btfscPORTB,4 ; wcisniety ? return ; nie btfscPORTB,4 ; puszczony goto$-1 ; nie -------------- ; tak, puszczony ------------- -------------...
Napisalem na wszelki wypadek z akumulatorem bo nie pamietam czy port 2 da sie bezposrednio sprawdzac bitowo. Musialbym zajrzec do ksiazki. Dodano po 4 Ja kompresuje program gdy zalezy mi na upchnieciu sporego programu do malej pamieci lub gdy zalezy mi na czasie procesora - przy tak prostym programie to mija sie z celem bo: 1 pamieci jak na taki programik...
Za bardzo nie mogę zrozumieć dlaczego po stronie odbiornika wszystkie dane mają postać zanegowaną w stosunku do nadajnika. Nie musi tak być - po prostu większość (wszystkie?) dostępne demodulatory podczerwieni w przypadku braku sygnału mają na wyjściu stan wysoki. Pojawienie się paczki impulsów generuje stan niski na wyjściu takiego odbiornika. Tu...
Znalazłem jeden wieczor i udało mi się wymusić generowanie "muzyczki". Jest program, tablica częstotliwości tonów (od adr. 0200) i tablica nut (od 0300) ale można je poprzestawiać. Do P3.4 wrzuciłem 0 alby zworką P3.4-P3.5 móc zatrzymać generowanie melodyjki. Timer0 generuje zadaną częstotliwość a Tiimer1 nadaje tempo. T1 ma częstotliwość 256Hz. Format...
Do kolegów co podpowiadają mi użycie makr, tak jak pisałem wczesniej, uzywam Codevision a w nim nie ma czegoś takiego - chyba. Jak już wcześniej napisałem, moim zdaniem przy takich procedurach obsługi przerwań program powinien się wyrobić bez konieczności zagnieżdżania przerwań, a przyczyna złego zliczania może leżeć gdzie indziej. Możesz oczywiście...
W asemblerze ci nie napiszę, bo to niewygodne, ale musisz: skonfigurować rejestr kontrolny portu, tak aby następowało zdarzenie przy zboczu opadającym, odblokować przerwania portu IO poprzez określenie ich poziomu, odblokować dany poziom przerwań w rejestrze kontrolera przerwań i odblokować globalne zezwolenie na przerwania (sei). No i oczywiście napisać...
Witam, wlacze od jakiejs chwili z assemblerem dla 51, stanalem na odczytaniu stanu licznika T1, sytuacja jest taka ze T1 pracuje w trybie counter liczac impulsy z zewnatrz w tym czasie T0 pracuje w trybie timer, w momencie gdy T0 wygeneruje 15 przerwan przy kwarcu 12Mhz tyle mniej wiecej przypada na sekunde ma nastapic odczyt licznika T1. O tyle co...
tyle ze uzycie tej flagi (czy jakiegokolwiek innego sposobu) to nie kwestia jezyka C, tylko kazdego jaki istnieje, z assemblerem wlacznie. inna sprawa jest to, ze koniecznosc rownoczesnego wspoldzielenia zmiennych przez przerwanie i funkcje zachodzi raczej nieczesto, a jak juz zajdzie, to i tak mozna jej czesto uniknac na conajmniej kilka sposobow....
Po wykryciu jakiegość przerwania procek wrzuca na stos licznik rozkazu, i nic więcej. Ale co się dzieje w bascomie to inna sprawa, możliwe że bez parametru NOSAVE procek działa standardowo w momencie gdy brak tego parametru bascom pewnia zapisuje dodatkowo pare standardowych rejestrów np. ACC, B czy PSW, ale to tylko spekulacja. Dzięki takiej konstrukcji...
hehe nie męcz sie dalej, jest błąd w AVRstudio. Ja miałem ten sam problem. Program w symulatorze nie działał ale gdy go wgrałem do qP to działał jak należy. W AVRstudio jest jeszcze jeden błąd a mianowicie nie działa tryb wieloprocesorowy USART. Pozdrawiam
Witam. Czy mógłby mi ktoś pomóc wykonać program w assemblerze, który wykonuje trzy obroty w prawo i dwa w lewo za pomocą metody przerwania. Potrzebny mi kod abym mógł to wrzucić w symulator (EdSim) i pokazać doktorowi na zaliczenie. ;/
Witam Otóż mam mały problem. Pisze sobie szybkie przerwanie dla timera na Atmega644, to co mi kompilator z C przetłumaczył na assembler wrzuciłem do wstawki assemblerowej a przerwanie zadeklarowałem z argumentem ISR_NAKED, rejestry używane w przerwaniu zarezerwowałem przez: register uint16_t licznik asm("r30"); register uint16_t temp...
Odwrotnie - funkcje przerwań mogą być zwykłymi funkcjami, bez żadnych dziwactw, bez atrybutów, bez assemblera. Czyli to nie chodzi o to że one mogą być wywołane tak ot sobie jak zwykła funkcja jak nam jest potrzebna, tylko o to że deklaruje się ją jak zwykłą a jej użycie to zupełnie inna sprawa?
Przerwanie nie modyfikuje SP (z punktu widzenia przerwanego kodu). Wartość SP po powrocie z przerwania jest taka sama, jak przed wywołaniem. I tu właśnie problem, bo też tak myślałem, dlatego pisałem wcześniej że błędu w logice nie ma. Mój kod nie jest błędem. Dodałem brakujące CLI i kod od godziny chodzi bez zarzutów. Spójrz na to: zapamiętaj SREG...
1. Ogólnie liczysz dobrze, ale procesor nie wyrobi się w 160-ciu cyklach (a dokłądniej mówiąc to liczysz trochę źle bo własnie nie uwzględniasz czasu potrzebnego na obsługę przerwania). Nie uzyskasz czasu 10us, nawet dla kwarca 16MHz. Musiał byś to napisać w assemblerze i użyć dyrektywy Nosave. 2. Nie. Jeżeli coś zadeklarujesz w programie to ta rzecz...
Postanowiłem coś napisać by sprowokować wypowiedzi innych :wink: Przyznaję się: w języku C pisałem dawno temu pod DOS-em (Turbo C 2.0) a UART programowałem tylko na 2313. Dobrze, że zamieściłeś cały program, ponieważ posłużył mi za pierwszą lekcję programowania w C na AVR-y. Atmega8 ma bardziej skomplikowany USART niż 2313 ale po przeczytaniu fragmentu...
https://obrazki.elektroda.pl/2568884200_... Witajcie moi drodzy Zapraszam na kolejną część mojego tutoriala PIC18F2550 i kompilatora SDCC . W tej części zademonstruję jak używać wyświetlacza 7-segmentowego z PIC18F2550 . Kod obsługi wyświetlacza będzie oczywiście napisany w oparciu o przerwania i timery . Cały proces powstawania układu...
Teoretycznie jest możliwe na etapie kompilacji stwierdzenie które przerwania będą odblokowane, ale tylko teoretycznie, kompilator musiał by przeprowadzić symulację działania programu, można by w zasadzie zrezygnować z wstawiania takiego „bezpiecznika” (instrukcji RETI) dla każdego możliwego poza jawnie wskazanymi, idę o zakład że w wielu...
Jak już zostało wspomniane, brak instrukcji atomowo ustawiającej lub kasującej bity w pamięci. W związku z tym może warto napisać dodatkowy moduł (kilka linijek na krzyż w assemblerze), który blokował by przerwania na dosłownie cztery cykle, pomiędzy którymi następował by odczyt, modyfikacja i zapis. Oczywiście kod nie będzie tak optymalny jak być powinien...
Zacznij od przerwania timera.
Witam. wcześniej w mikrokontrolerach avr korzystałem z assemblera (co pomogło mi dobrze poznać ukłądy "od środka"). Jednak nadszedł czas aby skorzystać z dobrodziejstw języka C (w tym języku pisałem wcześniej programy komputerowe). schody zaczęły się już na początku. po napisaniu kolejnych fragmentów kodu uruchamiałem symulator żeby zobaczyć czy poprawnie...
kurcze, trudne zadanie. Mógłbyś podrzucić cały katalog projektu, tzn. bez rzeczy które chciałbyś zachować tylko dla Siebie. Chodzi mi o tą często zwaną 'rozbiegówkę'( nawiasem... świetna polska nazwa) w assemblerze i o 'startup' w 'C'. sam'a tylko na płaskich przerwaniach znam( bez priorytetów przerwań). Czy procesor wchodzi w to przerwanie? tu inicjalizacja...
Witam, Programuje w CooCoox, toolchain arm-none-eabi. Na STM32F4discovery udało mi się odpalić freeRTOSa (z ripo CooCox) oraz odzielnie projekt urządzenia USB klasy HID. Oba moduły oddzielnie działają dobrze. W obydwu tematach jestem początkujący. Problem pojawia się,kiedy chce połączyć obydwie części. Nie działa;/ Prawdopodobnie winne są ramy czasy...
<ciach> V-USB wymaga aby przerwania były blokowane nie dłużej niż ~25 cykli. Czyli w tym przypadku występuje problem ze zbyt długim przerwaniem timera w bibliotece "IR". Najprościej byłoby odblokować przerwania w ten sposób: Zbędne wyciąłem, bo logicznie kłóci się z kolegi postem. :)
; uC = 89s2313 Wiem że to pomyłka, ale niektórzy mogą tego nie wiedzieć i będą uparcie szukać takiego procesora :)
ok, wycofuje sie z tej 1s <: pomylilo mi sie z msp430, gdzie xxPR znaczylo PeRiod, a tutaj znaczy PRescaler. poza zezwoleniem w kodzie, tryb w ktorym pracujesz musi miec zezwolenie na przerwania zawarte w CPSR - to jest ustawiane w startupie assemblerowym. tutaj przerwania sa wylaczone (bity I i F ustawione) msr CPSR_c,#SVC_MODE|I_BIT|F_BIT // ......
Tak jak pisałem - Twój startup załatwia manipulacje stosem, więc w takiej sytuacji atrybut dla funkcji jest zbędny, a wręcz błędny. Jeśli masz debugger, to przecież możesz sobie sprawdzić czy w ogóle wchodzi do przerwania oraz czy wchodzi do tego assemblerowego wrappera który jest pod etykietą "VIC". Profilaktycznie włącz sobie też ręcznie przerwania...
Prowadzącemu być może chodziło o sterownaie wyświetlaczy w przerwaniach, Ty zrobiłeś to na pętlach opóżniających. Akurat te dwa klawisze możesz sprawdzać właśnie w tych przerwaniach obsługujących wyświetlacz albo całkiem śmiało po za przerwaniami. Bez sensu jest używać aż dwóch przerwań. Jeśli już, to podepnij klawisze pod jedno wejscie INT. DELAY:...
Może odpal jakiś Timer żeby generował przerwanie bardzo często. Powiedzmy co 10us. I w przerwaniu sprawdzaj czy pin ma stan 0 czy 1. Jak 1 to inkrementujesz jakaś zmienną. Jak zmieni się na 0 to zwracasz wynik i zerujesz tą zmienną. Oczywiście w tym samym przerwaniu sprawdzaj tak samo drugi pin. Niestety wymaga to kodu obsługi przerwania w assemblerze...
Po długich bojach udało się znaleźć winą były jakieś śmieci w rejestrze UCSR1A które sprawiły że jednocześnie oprócz int0 pd2 pracowała jako xck1 co chyba uniemożliwiało wywoływanie przerwania int0. Pisze bo może się komuś to przyda. Warto też zwrócić uwagę na fusebit M161C przy takich problemach
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ć...
Witam, Pierwszy błąd, który wychwyciłem to brak zachowania i odtworzenia rejestru stanu procesora SREG we wszystkich obsługach przerwań. Należy również zadbać o zachowanie używanych rejestrów (R0-R31). Zobacz ci się stanie np. w takim przypadku: CPI R16,10 ; tutaj przychodi przerwanie które zmienia stan SREG (znaczniki Z,C ...) BRNE xxx LDI...
Witam wszyskich, zaczynam programować uC (ATMega8) i mam pytanie co do assemblera. Jestem w trakcie pisania programu w którym generowana jest jakaś przerwa czasowa i moje pytanie czy instukcja mov trwa 1 cykl i dla czego instrukcja brne trwa 2 cykle? Pozdrawiam Łukasz
Witam, mam problem z ustawieniem przerwania od timera0 na atmega8, jestem początkujący jeśli chodzi o assembler... Problem leży w tym że, uP jest taktowany z wewnętrznego zegara 1MHz, i jeśli mam ustawiony prescaler na 8 czyli rejestr TCCR0 na 2 to powinienem otrzymać obsługę przerwania co 8us a na oscyloskopie otrzymałem igiełkę co 2ms;/ nie wiem co...
Wszystko OK. Przykłady z pakietu korzystają z plików assemblerowych: crt0.S, exception.S, trampoline.S które należy dołączyć do projektu. Poza tym, jeśli korzysta się z tych plików, inaczej deklaruje się przerwania. Aby projekty z przykładów działały należy utworzyć projekt "Standard Make C AVR32 Project" i dołączyć oryginalny plik makefile. Natomiast...
Generujesz sobie na timerze przerwanie co sekundę i w obsłudze przerwania zwiększasz zmienną sekunda o i i sprawdzasz czy nie osiągnięto 60. Jeśli tak to zerujesz i wysyłasz do wyświetlacza.
A powiesz mi coś o przerwaniach? Np czy mogę użyć przerwanie aby zwiększyć rejestr o 1? Jak to zrobić
Pytanie moze nie do konca dotyczy tego forum ale wiekszosc programujacych uP w assemblerze ma podstawy assemblera z komputerow PC... mam nadzieje ze zagladaja tu jacys specjalisci z tej dziedziny. Do rzeczy! Pisze TSRa czyli program rezydentny i mam problem z obsloga przerwania int 21h. Chodzi o to, ze moj TSR musi utworzyc plik i zapisywac do niego...
Ja proponuję po prostu pobierać czas bezposrednio z przerwania 21h. Albo użyć timera ;) (LUBIMY '51:D ) Nie pamietam akurat numeru funkcji, ale chwilka kopania w dokumentacji i sie znajdzie. A tak ostatecznie, to mozna uzyc instrukcji pobierania cykli zegara od startu kompa. Trzeba tylko pobrac "próbkę" i później tym mierzyć czas.
działają obydwa kody, sprawdzone podczas pisania tego posta. filmiku nie wrzucę, ponieważ ani Avila, ani Cookie nie radzi sobie z nagraniem świecących LED'ów. więc masz albo uwalony procek, albo zwarcia na płytce. dorzucam plik hex który daje efekt "biegnącego światła" w jednej chwili jest zaświecona tylko jedna dioda LED. przy zegarze 16MHz czas przerwy...
Wszystko juz chodzi. Przyczyną problemów były błędy jakie zawiera sam BASCOM, które zgłoszę do autora. Cały program robi sie po prostu za skomplikowany dla BASCOM i tylko w Assemblerze będzie pełna kontrolą nad tym co sie dzieje w programie i nie zostaje mi nic innego jak po wielu latach przerwy przypomnieć sobie ASM na AVR-y. Już kilka wstawek zrobilem...
Definiujesz sobie w timerze licznik czasu zwiększany po każdym przerwaniu jeżeli jest ustawiony znacznik MIERZ. Czynności w programie: 1. Zgaś lampkę 2. MIERZ=0 3. CZAS=0 4. Czy start ? 5. Jeżeli nie to idź do punktu 4 6. Odmierz przypadkowy czas od 2 do 6 sekund 7. Zapal lampkę 8. MIERZ=1 9. Czy wciśnięto STOP ? 10. Jeżeli nie to idź do pkt 9 11. MIERZ=0...
Na podstawie kodu, którego mamy się domyślić mamy się domyślić co zaobserwowałeś i Ci pomóc. Bo dalej nie wiemy, co zaobserwowałeś gdy w kodzie są 2 procedury obsługi Dalej nie wiemy, czy to procesor czy symulator, jaki procesor, nie znamy efektu pracy kompilatora - listingu assemblerowego, dalej nie wiemy, czy OpenTimer4 kompiluje się a nie działa,...
Jeżeli masz czasochłonne przerwania mogą one znacznie zakłócić transmisje nawet przy 300baud. Jeżeli możesz na ten czas wyłączyć przerwania, zrób to - możesz wtedy próbować podnieść prędkość transmisji nawet do 115kbaud. Taki zabieg bez użycia assemblera może się nie udać.
Czy mógłbyś wytłumaczyć działanie następujących linijek kodu: #pragma vector=TIMERA0_VECTOR __interrupt void Timer_A (void) w "wolnym tłumaczeniu" Linijka jeden: Adres kolejnej obsługi przerwania zapisany będzie we Flashu pod vectorem przerwania od Timera A0. Linijka dwa: Ta funkcja jest obsługą przerwania a więc powinna kończyć się na RETI a nie na...
W poprzedniej wypowiedzi dokonałem poprawek w przykładowym kodzie. Tak, to już jest kiedy Elektrodę traktuje się jako przerywnik przy pracy. Kwestią otwartą jest nadal testowanie wybranego bitu, lub bitów. 1. Jak to wykonywać poprawnie testowanie jednego bitu ? Zależy to od danej sytuacji. W trakcie testowania pojedynczego bitu w PINx z pominięciem...
Witaj, Sprawa ma się następująco odnośnie volatile. W standardzie języka C słowo kluczowe volatile określa / charakteryzuje zmienną która może zmieniać się w nieokreślonym czasie np. w procedurze przerwania jaki i w funkcji nie związanej z procedurą przerwania. Cała rzecz polega na tym iż to co Ty napiszesz w C jest przekładane na assemblera który nie...
Witam Juz sobie z tym dzisiaj poradzilem, ale dzieki ;-) Swoja droga dziala mi to troche za wolno (wiadomo, pierwsza ramka rc5 tracona jest na przerwanie). Zastanawiam sie, czy moze ktos kiedys popelnil wstawke assemblerowa obslugujaca rc5 z przerwania? Zastanawim sie jeszcze nad kodem standardu sony, jakies doswiadczenia?
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...
Dosinski napisał: ;------------------------------------- STOP: MOV IE,#00000000B MOV P1,#11111111B ACALL DELAY AJMP reset; zatrzymuje silnik, wraca na poczatek programu i czeka na wcisn START RETI ;----------------------------------- Też programu nie analizowałem (przeglądnąłem szybko) bo wddf napisał że nie zna tego języka więc ciekawe jak chce mieć...
Odczyt równoległy w CF jest dużym atutem, potrzeba uzyskać ponad 200kB/s czyli 1,6Mb/s dla kart szeregowych. SPI będzie do wysyłania danych na wyświetlacz z szybkością 4,6Mb/s co powinno wystarczyć nawet na uzyskanie modulacji jasności koloru o 50%. Sam procesor ma dużą wydajność prądową aby wysłać po SPI taką częstotliwość na większą odległość, jeśli...
witam, np. tak: program2: setb p0.1 // jakies opoznienie ? clr p0.1 gen: clr p0.0 acall opoznienie3 acall opoznienie4 setb p0.0 acall opoznienie5 acall opoznienie6 sjmp gen ale to nie zmienia faktu ze program jest *źle napisany* - dlaczego nie zainteresowales sie Timerami i przerwaniami ? Czy program naprawde ma być tak 'sztuczny' i po sprawdzeniu...
1. Prostsze dodajesz zmienną, a raczej kilka bo jedna zbyt szybko się przepełni. Dekrementujesz ją, jak osiągnie wartość 0 nie skaczesz już LOOP_DISP. 2. Używasz timera i przerwań. Za każdym wywołaniem przerwania od timera np. zmniejszasz wartość zmiennej, a w pętli głównej porównujesz jej wartość z pewną wartością która odpowiada za określony czas....
Sa to po prostu dwie petle. Najpierw 255 razy wykonywana jest petla DLOOP2 az do BRNE DLOOP2 (BRanch if Not Equal). Skok bedzie wykonywany dopoki nie wyzeruje sie rejestr R18. Potem o 1 zmniejszamy R17 i tak w kółko aż R17=0. A czas bedzie cos koło (2_cykle *255_obejsc petli_DL2)*255_obejsc_petli_DL1 + ~3_cykle * 255_obejsc_petli_DL1 czyli cos kolo...
Do asemblera się nie dotykałem od 4 lat, ale sprawdziłem w mądrych książkach, że tryb VGA 640x480 256 kolorów inicjujemy przerwaniem 10h z wartością 13h w ax. Więc nie wiem jak to jest, bo poniżej koledzy piszą co innego, a pamiętam, że z tej książki korzystaem i mi grafika elegancko działała (i to jak szybko). TWK
Mało prawdopodobne, choć można to łatwo wywnioskować na listingu assemblera (; Wiem, z tym że są dwa problemy - nie wiem jeszcze jak włączyć generowanie listingu w SW4STM32, bo szukałem wtedy i w plikach wyjściowych go nie było oraz po znalezieniu problemu wszystko pozmieniałem do klasycznej postaci, bez BB. Ale gdybym wiedział jak włączyć listing,...
Cześć, Ostatnio zastanawiam się nad takim problemem, otóż: 1.Mam funkcje która wykonuje np. analizę jakichś odebranych danych 2.W czasie jej działania przychodzi przerwanie (na wyższym priorytecie) i załóżmy że to co się wydarzyło w tym przerwaniu, daje nam do zrozumienia, że funkcje z pkt.1 już nie musi nic analizować bo te dane są i tak zbędne 3.Przerwanie...
Witam, próbuję od wczoraj przerobić wprost w Bascomie, dokładnie w przerwaniu pewne polecenie na asembler: PORTA = Lookup(cyfry(nr_wysw) , Tabela) gdzie: cyfry to --> Dim Cyfry(4) as Byte nr_wysw --> Dim nr_wysw as Byte Tabela - to tabela zdefiniowanych cyfr dla wyświetlacza LED mam zrobione wyświetlanie multipleksowane i wszystko działa...
To znowu ja. Czy mi się tylko wydaje czy obsługa przerwań w PIC'ach to totalna porażka. Trzeba przy wystąpieniu przerwania odczytywać flagi w celu sprawdzenia skąd pochodzi przerwanie. Przed tym jeszcze zapisać stan rejestrów i po przerwaniu je odtworzyć. No pod tym względem AVR jest o niebo lepszy. No chyba że tak nie trzeba robić ale w dokumentacji...
Udało się. Nie wiem jak to zrobiłem. Jestem w tej chwili w takim szoku pozałamaniowym, że ciężko mi się skupić na pisaniu. Ale zostawię tutaj rozwiązanie dla potomnych, krok po kroku. Otóż. Najpierw inicjuję w main'ie przerwanie dla przycisku, który ma włączać diodę. void prvSetupLedInterrupt() { vSemaphoreCreateBinary( xSemaphore );...
Ja rozumiem to tak, choć zaznaczam z góry że nie mam pojęcia o St7Lite i na oczy go nie widziałem,że: .spi, .lt2, .srt .... - to są raczej dyrektywy assemblera. DC.W - to jest "Data Constatnt, Word" czyli deklaracja stałej we flashu która ma dwa bajty a jej wartość to etykieta np. it_ret (bo etykieta to poprostu symboliczna liczba - adres w pamięci)....
Właśnie czytam o tym voilatile z Twojego linka, a to cli i sli raczej spowodowane przyzwyczajeniami z pisania pod '51 w Assemblerze. Usunę i sprawdzę jak to wtedy działa :) Dodano po 8 Super, działa :) Dziękuje niezmiernie za pomoc. A w woli wyjaśnienia potrzebowałem tego do projektu inżynierskiego. Będzie to sterownik pompy ciepłej wody i akurat te...
Dzięki za podpowiedzi. Nigdy nie dołączałem modułów w assemblerze do moich projekcików i nie wiem czy dobrze zrobiłem. Nie mam w tej chwili platformy sprzętowej ale sprawdzałem zaproponowane rozwiązanie w symulatorze AVRStudio. Dodany plik przerwania.s: #include <avr/io.h> .section .text .global TIMER0_OVF_vect .global TIMER0_COMPA_vect ;kod TIMER0_OVF_vect:...
W moim przypadku to wygląda tak, że mam wypracowaną własną warstwę abstrakcji sprzętu. Przykładowo do SPI jest maszyna stanów co mieli strumień bajtów danych + nagłówek z kolejek (typu FIFO jako bufor cykliczny). Pod to callbacki do sprzętu (open, write, read, close, ioctl), i rybka czy w środku jest if (queue) wyslij czy na przerwaniach. Nagłówek zawiera...
Witaj, Za co jest odpowiedzialny Timer0? Za określenie częstotliwości granicznej? Czy masz wolny Timer 1? Jeżeli tak, to moim zdaniem strasznie sobie to komplikujesz. W końcu Twoim zadaniem jest zmierzenie okresu przebiegu o częstotliwości, którą podajesz z generatora, a od tego jest tryb Capture, czyli pomiar długości impulsu. strona 83: Input Capture...
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...
Jacu$ a gdzie inicjacja stosu, inicjacja przerwania ? Pomijając, że nie zawsze taki sposób programowania jest do przyjęcia, np procesor obsługuje kilka elementów na raz i właśnie jest coś włączone, to jeżeli stos jest inicjowany po resecie, to można sobie te "pop smietnik" darować, jeśli i tak skaczemy do procedury resetu. Tak to jest jak się zmienia...
W funkcji obsługującej przerwanie, korzystasz z funkcji sprintf do konwersji zmiennej sstatus na tablicę typu char o etykiecie buffer . Zmienna ta jest modyfikowana w przerwaniu, a nie zadeklarowałeś jej z kwalifikatorem volatile . Sprawdzałeś ten trop? A po co buffer miałby być volatile, skoro jest traktowany de facto jako zmienna lokalna w przerwaniu...
Problem rozwiąże, odmierzanie czasu przez timer, a nie przez wait czy delay (nie znam BASCOMa). Jak już ktoś wspomniał odczyt i zapis bitu na 1-wire jest dość krytyczny czasowo. Miałem z tym problem w assemblerze i ADuC841. Przerwanie od multipleksowania wyświetlaczy skutecznie zakłócało transmisję. Polecam też sprawdzanie CRC, żeby ustrzec się przed...
Konfiguracja wewnętrznego kontrolera przerwań (to co robisz funkcją), a odpowiedni prolog/epilog assemblerowy (to co robisz deklaracją z "__irq") to dwie odmienne sprawy. Jeśli tablica wektorów w startupie ładuje adres funkcji bezpośrednio (nie ma jakiejś funkcji wrappera), to obydwie te operacje są konieczne. U ciebie właśnie tak jest. 4\/3!!
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,...
Witam. Nie znam C wcale bo programuję w assemblerze ale muszę do istniejącego programu w C (nie mojego) wstawić program obsługi przerwania UART_TX_COMPLETE w którym będzie tylko jedna linia ustawiająca 0 na pinie PB2 PORTU B. projekt w AVR GCC procesor atmega8 i teraz proszę o pomoc: 1. jak i w którym miejscu włączyć obsługę tego przerwania 2. jak i...
W assemblerze mógłbym przyspieszyć czas wykonywania tych funkcji, czas wejścia/wyjścia przerwania? W asemblerze mógłbyś zoptymalizować czas do minimum (co do 1 cykla. ) I jeśli coś jest możliwe do zrobienia to uda się w asemblerze, jeśli czegoś w ASM się nie da to nie uda się to w żadnym innym języku.
Spoko - jak zaczynałem to twierdziłem że "tylko assembler" Temat na elektrodzie przerabiany tysiące razy. Każdy orze jak morze - wielu osobom ne chce się włożyć tego wysiłku w poznanie czegoś nowego i dopiero po poznaniu wyrażenie swojego zdania. Nawet dziś jest post z opinią że napisana obsługa USB w C jest z założenia zła bo nie jest wymęczona w...
Tak. Optymalizacja kodu źródłowego. Powiem Ci że ja robiłem kiedyś odbiornik do takiego samego pilota i kod źródłowy zawarł się w kilkunastu linijkach a to był na dodatek assembler. Więc musisz przemyśleć i zmodyfikować pod kątem szybkości swój kod.
Czy wiesz co to jest prolog i epilog w assemblerze? Czy wiesz co to jest stos? Z tego co wiem w obsłudze przerwania powinno stosować się krótki i prosty kod, natomiast w moim przypadku potrzebuję po wystąpieniu przerwania przejść do wykonywania programu w pętli. Od takich spraw są flagi (czyli np. zmienne globalne), którym w przerwaniu ustawiasz jakąś...
Dzień dobry. We wstępie odrazu zaznaczę, że używam zestawu ZL3AVR z mikrokontrolerem ATmega32. Chciałem napisać program w assemblerze, który będzie zliczał wciśnięcia określonego przycisku w dowolnym rejestrze i będzie wyświetlał liczbę wciśnięć binarnie na diodach (czyli przykładowo jeśli wcisnąłem przycisk 7 razy to mają świecić się trzy diody z prawej...
Pamiętam, że kiedyś miałem spory problem w Keil'u z zasymulowaniem przerwnia od timera dla AT89C2051. Skończyło się na testach w układzie. Program był pisany w Assemblerze, ale dla symulatora nie powinno mieć to znaczenia. Nie twierdzę jednoznacznie, że symulator posiada błąd (mogło to być jakieś moje niedopatrzenie), ale de facto problem taki u mnie...
Ponieważ w całym poście jedyną wartą uwagi informacją jest to: nie chce przyjmować klas to obstawiam że używasz C++. W takim razie gotów jestem się założyć, że nie masz nigdzie przy przerwaniach: extern "C" void nazwa_IRQHandler() {...} Bez owego >extern "C"< przerwania definiowane w plikach C++ nie zadziałają (jeśli...
Witam, mam chyba proste pytanko .. jak zrobić coś takiego: Mem Zamykam. - arnoldziq
assembler darmowy assembler stm32 przerwa przerwa assembler tablicy
bosch pralka rozbieralne zbiorniki ocieplenie sufitu monitor orion
a2mobile modem rozdzielenie akumulatorów
Przekaźnik bistabilny Set-Reset – Zamel PBM, Finder, Omron, układ SR, zastosowania, schematy Termet G17-20 – brak zapłonu nagrzewnicy, diagnostyka membrany, iskrownika, termopary