Ej, nie przesadzajcie - to było 2 lata temu... Pozatym asm które pokazałeś w zasadniczej części jest identyczne i POPRAWNE: 270: e24ee004 sub lr, lr, #4 274: e92d580f push {r0, r1, r2, r3, fp, ip, lr} [...] 2d0: e8fd980f ldm sp!, {r0, r1, r2, r3, fp, ip, pc}^ 1fc: e24ee004 sub lr, lr, #4 200: e92d500f...
No cóż, wyszedłem z założenia, że jeśli się dostaje tego typu temat do realizacji to należy posiadać pewien zasób wiedzy i umiejętności. W tym wypadku wskazana byłaby wiedza : o konstrukcji i działaniu komputera o językach programowania i pisaniu programów o sygnale akustycznym ze szczególnym uwzględnieniem mowy o metodach przetwarzania cyfrowego sygnału...
Build started 6.4.2014 at 00:25:04 avr-gcc -mmcu=atmega16 -Wall -gdwarf-2 -std=gnu99 -Os -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -MD -MP -MT Proba_10.o -MF dep/Proba_10.o.d -c ../Proba_10.c avr-gcc -mmcu=atmega16 -Wl,-Map=Proba_10.map Proba_10.o -o Proba_10.elf avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature...
Nie jest odporne.
Dodaje się wyłącznie pliki .c i ew. ustawia ścieżkę dostępu do plików .h.
W twoim main brak jest na koncu petli i procesor sie resetuje. Po drugie jeli korzystasz z przerwan to musisz zdeklarowac ile bajtow jest do wyslania np. w sposob w jaki pokazalem w swoim kodzie. NAQ tym to polega wskazujesz skad wyslac dane(bufor), w jakiej ilosci i procesor zajmuje sie czyms innym np. kolejnymi obliczeniami nie martwiac sie o obsluge...
Raczej 255 = 0xFF (8bit). Przerwanie wykonuje się przy zrównaniu licznika z wartością 255, licznik liczy w górę a preskaler to 256, zakładając częstotliwość CPU na 1MHz przerwania wychodzą co: 256/1MHz*255 = 65ms . (dla 8MHz to około 8ms) Tego co nie jestem pewien, to to czy licznik (mam na myśli rejestr TCNT1 ) jest zerowany przy wartości maksymalnej...
Witam, Uruchomiłem podany przykład u mnie na AVR STUDIO 4.19 build 730. Zachowuje się również niepoprawnie ale inaczej: Zmiana PB6 powoduje skok pod adres 0x0002 (word) 0x0004 (byte) Zmiana PA3 powoduje skok pod Adres 0x0004 (word) 0x0008 (byte) Jeżeli zerkniemy w symulatorze do okienka dissasembly do zobaczymy że przerwania zostały podpięte poprawnie...
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!!
Zacznij od sprawdzenia stosu.
Po wygenerowaniu projektu w Cube nie ma definicji tych funkcji w main.c No to chyba dość oczywiste. Zobacz jak się nazywają tam gdzie jest tablica wektorów. Np w projektach z cube to bedzie .S plik w katalogowy startup albo coś w tym guście
No przecież Atmel nie kłamie w manualu... 4\/3!!
nie wiem czemu przeskakuje do 8 od dołu "reti" po czym dochodzi do pętli głównej i co drugi krok wraca do tego nieszczęsnego "reti" Tam nie powinno być reti, a poza tym jako wektrów przerwań dla ATmega16 musisz używać instrukcji 'jmp', a nie 'rjmp'. Spróbuj zrobić tak: ..... .org 0x00 jmp reset jmp ext_int0 jmp def_vect jmp def_vect jmp def_vect jmp...
Nie napisałeś nic o metodzie konwersji zatem założyłem, że stworzyłeś nowe szablony w CubeIDE, przekopiowałeś pliki źródłowe oraz zmodyfikowałeś ustawienia projektu. Sam bym tak zrobił. Jeśli taka byłaby metodyka to jeszcze należy sprawdzić w ustawieniach projektu: C/C++ General->Path and symbols, gdzie należy zmodyfikować sekcję SYMBOLS, wpisy muszą...
Daj nowy region pamięci tylko na przerwania, Flash zaczniesz wyżej. Ja dałbym nawet nowy region na ów eeprom. mógłby być programowany wartościami domyślnymi, albo po prostu przesuń operator . za przerwaniami, choć to mało eleganckie.
To są zwykłe stałe zapisane w jakimś pliku, Przy instalacji AVRstudio jest to plik m32def.inc. Pod tymi stałymi są adresy które znajdziesz w datenblacie. A skąd wiadomo jakiej nazwy użyć? Zaglądasz do pliku z definicjami stałych już wiesz:)
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Kolego, nawet nie chce Ci się przepisać programu... Już Ci pisałem - poczytaj o PRZERWANIACH. Przerwanie nie polega na ciągłym testowaniu jednej czy dwóch flag, tylko na pozostawieniu tego procesorowi. Przykład kodu z użyciem przerwania: org 0 ; adres wektora resetu sjmp start org 0bh ; adres wektora T0 sjmp t0_isr t0_isr: inc A anl A, #7 jnz t0_skip_blink...
Jak widzisz na załaczonym obrazku nie masz ustawionych wektorów. Ale akurat mam coś takiego gotowego i Ci podeślę :) Zainstaluj Cube. Plik z wektorami weź stamtąd. Możesz też zaimportować projekt i wyrzucić HAL - będziesz miał przy okazji najświeższy CMSIS
Możesz powiedzieć jakie masz błedy i dokładnie co chcesz wiedzieć na temat tej funkcji. Na tym co przedstawiłeś widzę 1 błąd a mianowicie masz plot w pętli i tam może być problem z wyrysowaniem tego. Przenieś plot za tego end-a powinno działać. Najogólniej opisze Ci jak działa mój kod a później twój Sprawdzamy wielkość wektora wejściowego Iterujemy...
Przerwania procesora działają w procesorach AVR na takiej zasadzie, że (pomijając inne operacje) po wystąpieniu danego przerwania ( podczas obsługi przez procesor ) następuje zapamiętanie rozkazu następnego, który byłby wykonany, gdyby procesor nie przyjął przerwania (jego adresu w pamięci flash) i skok pod jeden z adresów z samego początku pamięci...
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
Czy moglby ktos tak w miare przystepny sposob opisac zasade wykorzystywania takich wektorow w przerwaniach?? czy jest jakas zasada przydzielania adresu wektora, kanalu? jak rejestr VICIntEnable rozroznia przerwanie IRQ od FIQ? i czy mozna dla jednego timera zrealizowac dwa(lub wiecej) przewrwania MR0 i MR1 jako dwa wektory przerwan VICVectAddr0 i VICVectAddr1?...
Dopóki symbole związane z funkcjami są globalne (co zapewniają odpowiednie atrybuty lub umieszczenie ich w nagłówkach) nie ma znaczenia, gdzie znajduje się ciało funkcji. Zresztą tak naprawdę dla kompilatora nie ma znaczenia nawet to czy symbol jest globalny, czy nie, to dopiero linker będzie się rzucał o to, że czegoś nie może znaleźć. AVR-libc zapewnia...
Też nie bardzo wiem jaka jest nazwa (wektor) funkcji tego przerwania, więc mam tak: Przecież wystarczy zajrzeć do tablicy wektorów i wszystko stanie się jasne... Można też zajrzeć do manuala, aby dowiedzieć się, że system CSS jest zmapowany na przerwanie NMI. Nie wiem czy czekanie na odpowiedź na forum jest naprawdę szybsze... 4\/3!!
Z załączonego przez Ciebie programu wynika, że cała procedura zawiera się w obsłudze przerwania od T0. Nie wiem natomiast jakie są rzeczywiste adresy tej procedury. Czy jest ona umieszczona pod adresem 000BH (wektor przerw. od T0) - jeżeli tak, to zachodzi na adres procedury obsługi RS'a - 0023H. To może być powodem dziwnego zachowania. Poza tym fizycznie...
W tym wątku liczyłem na konkretną wskazówkę na temat wektorów i C w xpresso Wszystko co potrzeba do uruchomienia przerwań dla Timera16B1 z częstotliwościa 1Hz [syntax=c]LPC_SYSCON->SYSAHBCLKCTRL |= AHBCLKCTRL_CT16B1; LPC_TMR16B1->PR = 50000; LPC_TMR16B1->MR3 += 1000; LPC_TMR16B1->MCR |= ( 1 << 9 ); LPC_TMR16B1->TCR = 1; NVIC_SetPriority(TIMER_16_1_IRQn,...
Problem dla mnie pojawił się ze zrozumieniem wektorów przerwań które obsługują timer1. W dokumentacji jest tabela na stronie 46 W czym problem? Jak korzystasz z przerwania np. Timer/Counter1 Compare Match A czyli przerwanie w momencie gdy zawartość licznika (TCNT1) zgadza się z tym co wpisałeś do OCR1A to jeśli wcześniej w TIMSK ustawisz odpowiedzialny...
W pracy mam jakiegoś AVR64 lub AVR128 , już nie pamiętam co kupiłem. Ale będę miał dostęp dopiero pod koniec tygodnia. Teraz możemy zrobić mały eksperyment i sprawdzić jaki jest rzeczywisty rozmiar wektora przerwań. W załączeniu projekt w ASM który powoduje wywołanie przerwania NMI czyli następny wektor po RESET. Przy czym dzięki temu że mamy projekt...
SysTimer jest wykorzystywany w FreeRTOS jako zegar systemowy. Ale jeżeli potrzebujesz timera(dla zliczania czasu będącego wielokrotnością zegara systemowego) dla jakiejs innej biblioteki możesz wykorzystać vApplicationTickHook(), gdy tylko masz symbol configUSE_TICK_HOOK zdefiniowany na 1 (plik FreeRTOSConfig.h). Funkcja ta jest wywoływana w przerwaniu...
Próbuję pożenić template Freddiego (stm32_blink_led) z StdPeriph Ale to widziałeś? http://www.freddiechopin.info/pl/artykul... Ma ktoś pomysł co może być nie tak ? W skrypcie linkera należy ustawić rozmiar stosu dla przerwań - domyślnie jest zero, co zwykle źle się kończy. Ustawiłeś...
Zerknij sobie to pliku .lss i sprawdź następujące rzeczy: 1. czy w ogóle jest tam funkcja SysTick_Handler 2. czy adres funkcji SysTick_Handler zgadza się z adresem widocznym w tablicy wektorów (pod adresem 0x800003c) - adres w tablicy wektorów będzie miał nieparzystą wartość (jeśli np. funkcja SysTick ma adres 0x8001000, to w tablicy wektorów będzie...
(at)Marek_Gorecki Odnoścnie ARM info o czasie reakcji na przerwania znajdziesz tutaj: http://infocenter.arm.com/help/index.jsp... Funkcje: EXTI_GetITStatus EXTI_ClearITPendingBit są specyficzne dla STM32 ponieważ wiele źródeł jest podłączonych do jednego wektora przerwania. Czas reakcji na przerwanie będzie sumą cykli...
Głupi może pomysł, bo ja tylko asm, ale może to? #include <avr/io.h> avr/interrupt.h inkluduje go. Ja od razu mówię Ci, że używa tego starego skoro Ci nie działa. Naprawdę go wywal i będzie po problemie... Po co Ci tak stary kompilator? 4\/3!! Też tak myślę - interfejs przerwań się zmienił jakiś (spory) czas temu a tutaj ewidentnie ISR() nie...
Witam, 1. W postach używaj znaczników kodu tak aby kod był czytelny i wyróżniony 2. W programie brak inicjalizacji stosu. 3. Rozkaz skoku do obsługi przerwania od SPI masz pod złym adresem. Adresy wektorów przerwań są co 2 słowa (4 bajty), a rozkaz RJMP zajmuje tylko 1 słowo (2 bajty) tym samym RJMP SPIIntVecror znajduje się pod adresem 0x000A (0x0014...
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Nawet dla takiego małego Miki jak ja już na pierwszy rzut oka jest jasne że te kody to potężne źródło problemów. Co widać bez wgłębienia się w szczegóły: * Funkcja main() jako rozbiegówka to słaby pomysł. Kolega stmx napisał coś na ten temat (nawet podaje link w promowanych tematach), warto to przeczytać. * Stos musi mieć odpowiednie wyrównanie, zwykle...
poczatek ramu jest wykorzystywany przez bootloader. flash magic - zgodnie z nazwa - sluzy do programowania FLASHa, a nie RAMu. najprawdopodobniej masz w kodzie wlaczone tez remapowanie wektora przerwan na poczatek ramu (czyli od 0x4000000), a ze nic tam nie ma (bo twoj wektor przerwan zaczyna sie na 0x40000200), to program robi jakas blizej niezdefiniowana...
Zastanów się - wektor przerwania jest w pamięci FLASH - jak więc chciałbyś go zmienić? Wymagałoby to przeprogramowania FLASH. Jedyna możliwość to tak jak koledzy pokazali wyżej dodać if i wywołanie kodu. Kod możesz umieścić jako oddzielne funkcje, możesz też w ISR. Możesz użyć do definicji tych funkcji atrybutu always_inline, dzięki czemu kompilator...
Cześć, Nie dawno zacząłem przygodę z STM32. I mam duży problem nad którym siedzę już parę dni. Chciałem stworzyć prostą komunikację z komputerem gdzie przez terminal odpowiednimi komendami będzie można gasić i zapalać diody i w drugą stronę przesyłać które diody są zapalone. nie wiem gdzie jest tu błąd więc Ustawienie GIPO void GPIO_Conf(void) { GPIO_InitTypeDef...
M0 nie obsługuje pełnej relokacji tablicy wyjątków, VTOR nie zadziała. Nie wiem co prawda, po co Kolega usiłuje na siłę zrobić własny bootloader w M0 (można użyć firmowego wywołanego z aplikacji), ale skoro już się uparł, to niestety zostają mu sztuczki z kopiowaniem do RAM. Powinno się dać to zrobić samym skryptem linkera - mi się nigdy nie chciało;...
Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione. W SREG przechowywana jest informacja o fladze I, czyli fakt włączenia lub wyłączenia przerwań globalnych. Nie ma to nic wspólnego z "przechowywaniem" informacji o przerwaniach INTx. Instrukcjami operującymi na fladze I w SREG są:...
Ograniczeniem będzie tylko czas odświeżania interface-u (a w zasadzie skanowania przycisków - 20ms, bo grafika rysuje się raz lub w momencie dotknięcia przycisku). Jezeli uc sie nudzi to mozesz dac rysowanie sceny w petli glownej i zmieniac ja (wyswietlac poszczegolne funkcje - generatory scen) w zaleznosci od zdarzenia (przerwania od ft81x). Wtedy...
Muszę Cię zmartwić ;) , ale to nie jest kod wygenerowany dla ATMega 16. Jakiego środowiska używsz :?: AVRStudio+WinAVR,PN+WinAVR , czy jeszcze coś innego :?: Co z plikiem makefile :?: itp. Tak powinien wyglądać wektor przerwania dla Megi16 i nie tylko: 0:0c 94 2a 00 jmp0x54 <__ctors_end> Jeden wektor zajmuje 2 słowa(4 bajty) , a u Ciebie :?:...
Nie nie nie nie... Swoją funkcję musisz po prostu nazwać tak jak jest w tablicy wektorów, czyli: void FIQ_Handler(void) __attribute__ ((interrupt("FIQ"))); void FIQ_Handler(void) { ... i już. 4\/3!!
Organizacja pamięci programu (flash) jest w słowach - 2 bajty, stąd kolejne adresy np 101 102 103 tak naprawdę przeskakują co 2 bajty. Wektory przerwań używają rozkazu jmp (nigdy rjmp) rozkaz jmp składa się z 2 słow czyli 4 bajtów. Powyższe nie dotyczy pamięci statycznej RAM - tam jest organizacja 1 bajtowa.
.org 0x0000 rjmp reset ;skok do początku programu .org 0x0005 rjmp led_off ;wyskok z wektora 5 do procedury obsługi reset: ldi r16, low(RAMEND) out SPL, r16 ;ustawienie wskaźnika stosu ldi r16, high(0xF0BE) out TCNT1H, r16 ;ustawienie wartosci H timera T1 ldi r16, low(0xF0BE) out TCNT1L, r16 ;ustawienie wartosci L timera...
Przerwania PCINTx wykonują się przy każdej zmianie stanu logicznego, niema możliwości konfiguracji np. tylko dla zbocz narastającego lub opadającego. Stan zbocza na poszczególnym pinie sprawdzasz w przerwaniu. Attiny13 ma 6 pinów PB.0-PB.5 (PCINT0 do PCINT5) które mogą wywołać przerwanie. I tu jest jedna myląca rzecz :) dla tych pinów jest tylko jeden...
No ale elf, *.lst, wszystkie objecty są naprawdę po nic a wielokrotnie zwiększają objętość pliku do ściągnięcia. Poza tym jest super hiper mega mała szansa, że komuś będzie pasowała Twoja binarka do swojej płytki ;)
( void INT(void) interrupt 0 { instrukcje } To akurat przerwanie dotyczy INT0 a to: // Przekroczenie T0 void Timer_0 (void) interrupt 1 właśnie dotyczy T0 Kolejne numerki za słowem interrupt oznaczają wektory przerwań w '51 Tak przynajmniej jest w kompilatorze Raisonance.
długość wektor wektor przerwać wektor przerwań
polsat działa kablu formularz wprowadzanie danych arkusza rozruchu focus
internet satelitarny citroen interfejs diagnostyczny
VW LT 35 2.5 TDI – ciągły pisk po zgaszeniu silnika, brzęczyk, przekaźnik 109, Webasto Przyciemnianie wskaźników w Toyocie Corolla E15 2009