A sprawdzałeś w ogóle ile masz SRAM w tej Atmedze? 8KB więc starcza na różne sprawy a takie dwa "pliki" to u Ciebie tylko 1,5KB Jeśli za każdym razem to inny "plik" to to nie ma większego sensu i faktycznie lepiej użyć lookup. Co do karty SD to bezproblemowo. AVR DOS potrzebuje 2x512B SRAM. Można też czytać w takim pliku nawet tylko jeden bajt jeśli...
jest to normalne. gdy k jest rowne 7, wyswietlasz ostatni znak, gdy k jest rowne 8, jedynie je zerujesz, a w przerwaniu nic juz sie nie dzieje. jesli chcesz tego uniknac, to zamiast: if(k==8) { k=0; } daj: if(k==7) { k=0; } swoja droga, nie wiem czy to zauwazyles, ale twoj kod nie wyswietli tez nigdy pierwszego znaku...
Moim zdaniem jest prostsza metoda. Tworzy się dwa indeksy i tablice buforującą. Oprogramowanie zapisuje znaki to bufora i zwiększa pierwszy indeks (umownie indeks programowy). Po takim zapisie przed wyjściem zezwala na przerwanie. Przerwanie z kolei jak wykryje, że bufor programowy jest różny od drugiego buforu (umownie bufor sprzętowy) to z aktualnie...
strstr poda ci wskaźnik na pierwszą pozycję RING. Jeżeli chcesz dalej przeszukiwć to robisz buffor+offset i daje szukasz. Jak znajdziesz to znowu zwiększasz offset. Np: char *s; char offset; offset=0; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; offset=pozycja; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; itd :) Dodano...
Jeśli zaprogramowałeś Megę8 wsadem do 90S4433 to nie ma prawa to działać, bo te procesory się różnią, mają inną tablicę przerwań i troche zmian w rejestrach. Jeśli wyświetlacz jest poprawnie podłączony i wyrególowany kontrast, to jedna linia (dolna) jest ciemna, a górna jasna, z tego pomocą ustawia się kontrast
Sprawdź, cza nazwa Twojej procedury obsługi przerwania jest taka sama, jak w tablicy adresów przerwań w pliku startup. Wyrzuć zbędne wywołanie SetPriority.
Wydaje mi się że nie "przesunąłeś" tablicy wektorów przerwań: SCB->VTOR = VECT_TAB_BASE_ADDRESS | VECT_TAB_OFFSET; w pliku system_stm32l4xx.c
Ok. Przeszukaj pliki w swoim projekcie po nazwie "SysTick_Handler". Znajdziesz tą nazwę w pliku asemblerowym (lub w pliku *.c) w tablicy wektorów przerwań. Ta tablica zawiera między innymi adres funkcji o nazwie SysTick_Handler. Linker umieszcza tablicę pod odpowiednim adresie w pamięci (zgodnie z datasheet procesora).
Podsumowując... Loader umieszczony jest we flash od adresu 0 i nie ma od tego odstępstw. Aplikacja umieszczona jest pod dowolnym adresem we flash z wyrównaniem do 512. Żadne biblioteki nie maja kodu na stałe przypisanego pod konkretny adres, nawet SPL, wszystkie startupy i tak zależą od linkera, no chyba, że ktoś sobie coś udziwił i coś na stałe przypisał....
To nad czym się zastanawiacie intvect jest przecież wyjaśnione (internal vectors = wektory skoków wewnętrzne) czyli tablica przerwań procesora. Np.: .ext0 DC.W it_ret oznacza że jeżeli wystąpi przerwanie wewnętrznego modułu przerwania zewnetrznego EXT0 (.ext0) to procesor wykona skok do etykiety w programie it_ret lub zapewne jest to zakodowana nazwa...
Użyj sekcji .progmem.gcc - położona jest ona tuż za tablicą wektorów przerwań i standardowo nic w niej nie ma, a więc ma stały dla danego procesora adres początku.
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 ponownie Ja zdecydowanie obstaję za wczytaniem do tablicy. Łatwiej wtedy o jakąś kontrolę. Sprawdzę poprawność danych, zrobię z nimi co trzeba i będę czekał na kolejną paczkę. Dane oczywiście ładowane do tablicy przerwaniem a obsługa danych w normalnym toku programu. Stąd tablica. Gdyby coś się z jakichś powodów zbyt długo wykonywało to nie stracę...
Jak to zrobić: 1. włączasz przerwanie od timera w NVIC 2. Konfigurujesz timer, żeby generował jakieśtam przerwanie Odpowiedzi na pytania: 1. No bez timera raczej nie zrobisz przerwań co jakiś czas [; 2. Funkcja przerwania po prostu musi nazywać się DOKŁADNIE TAK SAMO jak jest wpisana w tablicy przerwań (zwykle CośtamCośtam_IRQHandler() ) 3. Hę? Przykłady...
Jeślii masz wolny pin to możesz sobie na nim otworzyć port COM. Taki programik wciągający cztery bajty po serialu zajmuje w Bascom 288 B a to pewnie dlatego że jeszcze musiał się zająć stosem i tablica przerwań co Ty juz pewnie tez masz zrobione więc to by odpadło. Zapisujesz to sobie do Eeproma przy starcie i gotowe. [syntax=vbnet]$regfile = "attiny13A.dat"...
W plikach ".cpp" extern "C" [syntax=c]extern "C" void SysTick_Handler(void) { GPIOA->MODER = 0; }[/syntax]
Taj jak pisze dondu, uzupełnianie tablicy zrób w przerwaniu, korzystaj z trybu free running.
Początkujący to widać. Wielokrotnie na tym forum powtarzana jest złota rada: obsługa przerwania musi być jak na krótsza, czyt. nie w ilości linii kodu a w czasie. Dlatego często ustawiana jest flaga w przerwaniu a dopiero w pętli głównej wykonywane jest to co należy. System przerwań jest zależny od architektury procesora można je dowolnie włączać i...
Wpadłem na pomysł jak to "obejść". - w bootloaderze przekierować tablice na RAM; - "skoczyć" pod adres Reset_Handler w aplikacji użytkowej; - podczas inicjalizacji przekopiować adresy wektorów z flash do RAM (sekcja .data); Na razie próbuję: 1. umieścić wektor przerwań w sekcji .data; 2. umieścić startup.S na początku aplikacji użytkowej; Jak ktoś ma...
A zainstalowałeś sterowniki do chipsetu płyty głównej?(nie tylko do zintegrowanej grafiki) Niestety Intelowski BX był ostatnim chipsetem do którego wystarczał goły windows, a wielu ludzi o tym zapomina. Te powinny pasować: Sterowniki do płyty głównej instalowałem z płyty instalacyjnej producenta. Co do przepięcia karty sieciowej na inne złącze PCI,...
Witam, Wg manual'a do procesora Cortex M3 jeśli się zmienia kod programu lub/i tablicę wektorów przerwań, to przed następną instrukcją powinno się użyć instrukcji ISB, DSB i DMB aby bufory załadowały nowe wartości.
Czy procedurę o etykiecie "timer0" masz daleko od początku programu? A może jej w ogóle nie masz? W zasadzie dla procesorów o tak dużym Flash'u powinno się używać rozkazu "jmp", a nie "rjmp" (dlateg adresy w tablicy przerwań są co 2 bajty), ale tak jak napisałeś może też być, pod warunkiem, że nie zostanie przekroczony zasięg rozkazu "rjmp". Wówczas...
Po czym to rozpoznałeś? Powtarzające się bloki po 8 bajtów na początku pliku wyglądają na zaszyfrowaną tablicę wektorów przerwań. Nie zaszyfrowane powinny się powtarzać 4 bajty adresu we flashu lub ramie. Ktoś się nie przyłożył do szyfrowania. Jak by było zrobione porządnie to cały plik wyglądał by na losowy. Nie jest to AES ani prosty XOR. XTEA? Raczej...
Cześć, Mam problem ze zmianą położenia tablicy wektorów przerwań na STM32F417. Potrzebuję dostępu do pierwszych 4 sektorów pamięci, więc rdzeń musi od początku szukać wektorów pod innym adresem. Odpalenie programu normalnie, a potem ręczne przesunięcie wektorów nie wchodzi w grę. Potrzebują początkowych sektorów do przechowywania nieulotnych danych...
Włączyłeś przerwania, jednak nigdzie nie masz procedury obsługi dla RXCIE i TXCIE. Wywołanie przerwania powoduje skok programu pod adres zdefiniowany w tablicy wektorów przerwań, czyli w Twoim przypadku reset procka. Druga sprawa to błąd w tej funkcji. Ona nigdy się nie zakończy, gdyż brakuje inkrementacji wskaźnika s w pętli. Ale zakładam, że to błąd...
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ś...
Bo nic nie przerywa. Gdybyś policzył o ile różni się wartość w tablicy po "przerwaniu" od poprzedniej, tobyś wiedział, że ta różnica wskazuje na rozmiar tablicy - czyli 100. I dlatego proponowałem zmienić rozmiar tablicy, żeby tą teorię potwierdzić.
Od razu niemożliwe... ...jest możliwe. Trzeba by nie używać bibliotek standardowych ST i CMSIS - zrobić wszystko na rejestrach, a przynajmniej przepisać startup i tablice przerwań według siebie. Można też kombinować z manipulacjami tablicą przerwań, ale po co utrudniać sobie życie? Sam robię tak jak sugeruje -psiak-.
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...
Używam właśnie gplinka. Kompilator (chyba) jest ok. To raczej problem z linkerem. Po zlinkowaniu mam w 0x82A kod programu, w 0x800 tablice przerwań i pod 0x000 instrukcje skoku (chodzi chyba o przeskoczenie tablicy przerwań) pod pierwszą instrukcje programu!
Twój kod jest zły, bo czwórki bitów dla poszczególnych przerwań są w tych tablicach IP[] upakowane po 8. Funkcje z CMSISa do przerwań (do NVIC) są generalnie funkcjami inline, więc efekt finalny będziesz miał taki sam - czy użyjesz swoich dostępów do rejestrów, czy tych funkcji. Ja bym proponował zostać przy tych funkcjach. Jak koniecznie chcesz poczytać,...
Może na starcie jest dodawana tablica przerwań itp.
Czyli w domyślnej podstawowej konfiguracji nie muszę inicjować stosu w inny sposób niż ustawienie odpowiedniej wartości w tablicy przerwań?
Ja na przykład robiłem pomiary z częstotliwością 24kHz wyzwalane przez timer. Dane zapisywane do tablicy. Przerwania DMA w połowie i na końcu wypełniania tablicy. W przerwaniach tych przesyłanie odpowiedniej połówki tablicy na kartę pamięci. Coś się tak uparł? m.ki i BlueDraco dobrze piszą, a ty dalej swoje. Z nadzieją jakby jeszcze Freddie miał uratować...
Najprostsze rozwiązanie. Tworzysz w pamięci programu tablicę funkcji sinus (na 8 bitach). Tworzysz trzy wskażniki do danych w tablicy, przesunięte o 1/3 rozmiaru tablicy. Ze zmienną częstotliwością (zmienianą np. przerwaniem od timera) odczytujesz wartości z tablicy i wystawiasz na trzy porty. Zwiększasz wskaźniki. I to chyba cały algorytm
Na początku flasha masz tablicę wektorów przerwań. Za pomocą NVICa możesz przesunąć tą tablicę lub przenieść do RAM. W załączniku masz przykładowy plik z tablicą wektorów przerwań
Mam pytanko czy, żeby przerwania poprawnie działały na podstawie tego szablonu od f4, to czy wystarczy tą tablicę przerwań skonstruować zgodnie z datasheetem od f3, czy wymagane są jeszcze jakieś inne zabiegi działania w kodzie??
Tak na chłopski rozum to tablica przerwań może się zaczynać tylko od adresów, które mają 7 najmłodszych bitów równe 0 i dlatego w rejestrze VTOR te bity są nie zaimplementowane. Wyszczególnienie bitu 29 jako selektora FLASH/RAM służy chyba do zaznaczenia, że np. pamięć zewnętrzna nie może służyć do przechowywania tablicy wektorów przerwań, pomimo że...
"seg &= 2;" nie zostawia najniższego bitu, tylko drugi z kolei. Zamień 2 na 1. Ponieważ seg zwiększasz maksymalnie o 1, jego wartość będzie zawsze równa 0. Wpisanie 0 do DDRD spowoduje tylko wygaszenie wszystkiego. Co do kodu - definiowanie znaków wyrzuć z przerwania, daj do stałej tablicy. Tracisz na tym wiele cennych cykli.
vtable? To vtable od polimorficznych funkcji C++ (virtual, dziedziczenie klas, ...)? Wiesz że vtable to nie jest to samo co tablica wektorów przerwań? Przy okazji, tablica wektorów przerwań musi być we flash, dopiero po uruchomieniu układu (bez niej się nie uruchomi) można sobie przestawić NVIC tak aby korzystał z tablicy w RAM. Tak więc należy jedynie...
Wszystko zależy od sposobu napisania programu obsługi przerwań i wywołań pod programów. Jeśli wykonasz to prawidłowo zmienne i adresy powrotu zostaną pobrane ze stosu. jeśli jednak pozostaną stos rośnie aż przepełni ram. Dobrą praktyką jest symulowanie programu i zwracanie uwagi na wskaźnik stosu który powinien po zakończeniu obsługi pod programów i...
Ta pętla [syntax=c] while(1) { ... wsk_do_wyslania=0; USART_Tx(buff[0]); wsk_do_wyslania++; } [/syntax] wykonuje się cały czas, więc naokrągło zerujesz ten indeks tablicy, który nazwałeś wskaźnikiem. Tzn z tego urywka kodu tak wynika, nie wiem czemu nie pokażesz więcej.
Regulamin pkt.15 W momencie wystąpienia przerwania AVR skacze do pierwszych komórek pamięci programu, zgodnie z tablicą przerwań, czyli w momencie kiedy wystąpi przerwanie od timera0 skacze do pamięci pod adres 0x0009 i wykonuje znajdujący się tam kod, czyli skok do podprogramu obsługi przerwania "timer0".
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...
Problem z przerwaniami a raczej ich brakiem był związany, wg mojej wiedzy/ obserwacji z nieprawidłowym przeniesieniem tablicy wektorów przerwań. Same instrukcji wg książki: [syntax=c] MCUCR|=(1<<IVCE);// Uaktywnij zmianę wektorów przerwań MCUCR|=(1<<IVSEL);// Przenieś przerwania do sekcji boot-loadera [/syntax] Nie działały, trafiłem na...
Bo może wektor przerwań dla tego akurat kanału DMA się nazywa inaczej? Porównaj nazwę Twojej funkcji z zawartością tablicy wektorów. Jeśli masz w projekcie pliki C++, to trzeba przerwania deklarować jako extern "C". 4\/3!!
U mnie kod: .org 0 start: inc r1 rjmp start działa poprawnie (AVR Studio 4, ver 4.12 sp1 build 462). No wiec asemblacja przebiega prawidlowo, lecz podczas debugowania program wyskakuje z obiegu. Tzn. co się dzieje ? Co do eeprom, spróbuj tak: .ESEG eevar1: .DW 0x1234 Po asemblacji wygenerowany zostanie plik nazwa_projektu.eep, wrzucasz go za pomoca...
A deklarujesz w programie jakieś wieksze tablice w pamieci RAM?? Bo 512B RAM na 3kB kodu to jest bardzo dużo. Jeżeli to problem ze stosem wyłącz przerwania, jeżeli uzywasz wskaźników do tablic sprawdz czy "nie wyskakują" one poza obszar na jakie wskazują. Debagowanie nie do końca "pokazuje" działanie z rzeczywistymi zmiennymi.
Freddie, to wiadomo. Zastanawiam się właśnie na tablicą wektorów przerwań. Myślałem, że do FreeRTOS muszę mieć to inaczej rozwiązane niż dla programu bez systemu. Rozumiem, że wystarczy mi plik z tablicą wektorów.
Zmień podejście. Tryb free running praktycznie nie nadaje się w sytuacji w której planujesz zmieniać kanały. Lepiej zastosować single conversion i przerwania. W takiej sytuacji w procedurze obsługi przerwania zapisujesz do tablicy wartość ADC, inkrementujesz indeks tablicy, inkrementujesz ADMUX (kanał) i zaczynasz kolejną konwersję. I tak w kółko. W...
No to musisz mieć tablicę wektorów w RAM [; 4\/3!!
Dokładnie, skorzystanie z timera ułatwia sprawę - nie trzeba liczyć instrukcji procesora. Poniżej mała wskazówka z komentarzami (może nie jest to podręcznikowe cudo, ale najprostsze i najczytelniejsze zrealizowanie migacza na procesor attiny10 w ASM). [syntax=asm] /* * Created: 2012-07-12 10:32:21 * Author: Piotr */ ;dołączenie definicji procesora .include...
A ja zapytam : czy w tablicy wektorów przerwań znajduje się pod właściwym adresem handler obsługi przerwania od UART4? Bo zapewne nie i dlatego ląduje w DefaultHandlerze. Podejrzewam, że tablicę wektorów masz od STM32 z trzema uartami.
Czy ktoś może mi powiedzieć czy poniższy algorytm ma szanse na realizację? co o nim myślicie? http://obrazki.elektroda.pl/9694939500_1... Po tym jak nowe oprogramowanie znajdzie się w buforze (new soft ) zostanie wywołany bootloader który skopiuje starą tablicę wektorów przerwać pod nowy adres (isr tab 1) i ustawi offset na tą tablicę....
Czyli jeśli w kodzie C inicjuję jedynie wektor powiedzmy ADC_vect, to jedynie w kodzie asemblerowym jedynie .org ADCaddr będzie pozbawione komentarza <__bad_interrupt>. A propos wektorów i tablicy: Czy inicjalizacja tablicy wektorów przerwań jest zależna od typu mikrokontrolera? W literaturze i w poradnikach internetowych widzę, że wszędzie wektory...
Pomysł jest taki: Jedną tablicę przerwania kierują na wyświetlacz Są zadeklarowane tablice i trzeba tylko przepisywać je do tej którą odświeża przerwanie. To co napisałem: [syntax=cpp] char tablica1[10] = {1,2,3,4,5,6,7,8,9,10}; char tablica2[10] = {11,12,13,14,15,16,17,18,19,20}; // tablic będzie sporo char tablica[10]; // ta tablica ma być wizualizowana...
(at)robiw na 99.99% to błąd kompilatora, bo kiedy definiujemy procedurę przerwań np. ISR(INT0_vect) to w domyśle jest ISR(INT0_vect, ISR_BLOCK), czyli w trakcie wykonywania przerwania ponowne przerwanie nie zostanie wywołane dopóki aktualne się nie zakończy. Ten rcall powoduje że blokowanie zostało zdjęte przez reti i to jest problem. No i kod wcale...
Próbuje rozwiązać problem zmiany tablicy wektorów przerwań w AVR-GCC. Rozwijając temat: Czy istnieje inny sposób zapisania adresu do tablicy przerwania niż deklaracja ISR() / vektora ? A co gdybym chciał wymusić np. w przypadku przerwania INT0 skok do adresu 0x1400 nie deklarując pod tym adresem w sposób jawny żadnej procedury (w szczególności nie deklarując...
Funkcja obsługi przerwania od UART'a jest jedna. Jej nazwę znajdziesz w tablicy wektorów przerwań. Przykładów obsługi UART'a z wykorzystaniem przerwań w sieci nie brakuje - szukaj. Pozdro.
Ja nie wiem co tu kogo dziwi. Tablicę do której formatujesz dane masz na stosie w przerwaniu. Tablicę tą przekazujesz do nieblokującej funkcji, która rozpoczyna transfer przez UART. Następnie wychodzisz z przerwania, tablica przestaje istnieć, a UART sobie dalej z niej odczytuje dane... Dodano po 30 Nie wiemy nic o typie uC. Jeśli nie jest to Cortex-M4,...
1. The maximal possible delay is 262.14 ms / F_CPU in MHz. 2. Zapamiętam z tymi nawiasami, co do ampersandu to faktycznie błąd ale działało jak jest, oczywiście o tym też będę już pamiętać. 3. Tymczasowo bym dobrze widział co jest w zmiennych. Po zmianie dalej świeci jedna dioda (od dziesiątek godzin). Kompiluje to komendą: "avr-gcc main.c -O3" Jeśli...
Najłatwiej kod bootloadera pisać jako osobny projekt - wtedy nie pojawiają się żadne konflikty, a docelowo i tak podczas aktualizowania nie wysyła sie już bootloadera. MarcinKawka : Twój kod wykonuje dwa odwołania do MCUCR w celu zmiany lokalizacji tablicy wektorów przerwań. Wstawka zawiera błąd, ponieważ nie informuje kompilatora o zniszczeniu zawartości...
Mniej ambitne to może być tylko miganie diodą ;) Pobierasz dane po usart do tablicy, w przerwaniu odejmujesz w bcd i odsyłasz z powrotem aż dojdzie do zera.
Spróbuj tak: odczyt [syntax=c] if(eeprom_is_ready()) { eeprom_read_block(&ustawienia,&ustawieni... } [/syntax] zapis [syntax=c] cli();//Globalna blokada przerwań if(eeprom_is_ready()) { eprom_write_block(&ustawienia,&ustawieni... } sei();//odblokowanie przerwań [/syntax]
Jestem w błędzie ? Tak, bo do samej kompilacji to Ci jeszcze potrzebne kilka plików - startup, skrypt linkera, tablica przerwań - zakładam tutaj, że sprawę Makefile załatwia Netbeans. Standardowo więc poradzę to co zawsze - ściągnij z mojej strony przykład dla stm32f4 i zobacz jak to jest tam zrobione pod "lepszym" IDE (; http://www.elektroda.pl/rtvforum/topic13...
Kolejne pytanie: Jeśli chcę odebrać kilka znaków z klawiatury to powinienem wpisać to w jakąś tablicę? Jeśli chcę wysłać do PC cały wyraz to jak to robić? Możesz to zrobić różnie. Zależy czego potrzebujesz i na ile jesteś wprawny w programowaniu w C. W każdym z przypadków trudno jednak będzie się obyć bez tablic dla ciągów znaków odbieranych i wysyłanych....
Pierwsze, to nie możesz kuglować włączaniem i wyłączaniem przerwań. Silnik musisz zatrzymywać w inny sposób. z stepCounter zrób tablicę stepCounter[4]; Przerwanie zmodyfikuj mniej więcej tak [syntax=c] ISR(TIMER0_COMP_vect) //funkcja obsługi przerwania { for(char l=0; l<4; x++) { // lepiej for(char l=0; l<LSILNIKOW; x++) // i zrobić #define LSILNIKOW...
Nie, nie odczytujesz wszystkich elementów. Odczytujesz dokładnie tyle ile potrzeba. Po prostu interpolacja liniowa działa na podstawie dwóch wartości z tablicy które są "najbliżej" fazy którą sobie wyliczyłeś. Przykładowo w pierwszym przerwaniu wartość dla DAC obliczona zostanie z elementu 0 i 1 tablicy, w kolejnym przerwaniu może to być równie dobrze...
hmmm Dobre pytanie. Ponieważ takie umieszczenie bootloadera pozwala mi uniknąć zabawy z tablicą wektorów przerwań, ominięcie przesunięcia początku programu i tym podobne.
Skonfigurowałem w tym procesorze odbiór i nadawanie poprzez rs232. Jak stworzyć przerwanie od odbiornika? Gdzie jest tablica wektorów obsługi przerwań itp?
Wywal opóźnienie z przerwania. Po za tym wygaszaj kolumny za każdym razem jak wchodzisz w przerwanie.
Dziękuję wszystkim za konstruktywne wskazówki. Na pierwszy ogień pójdzie sprawdzenie poprawności tablicy przerwań co wskazał stmx. Potem, jeśli nie ruszy postaram się dostosować do mojego hello-worldowego mrygadła przykłady Freddiego. Dziękuję też ex-or za wskazówki. Chciałem by początkowo mój kod był jak najmniejszy i robił tylko co niezbędne, ale...
A przyczyna była błacha. Albo to przeoczyłem bo zdublowałem trochę kodu z aplikacji st u siebie - albo tego tam nie było. Nie był ustawiony adres bazowy tablicy wektorów przerwań - a powinien być na flash. A przed wywołaniem kodu st była u mnie pozostałość (z wcześniejszych aplikacji) która ustawiała adres bazowy tablicy wektorów na ram. no i przerwania...
Dlatego tak się dzieje, że _delay_ms(50); powoduje, że procesor mieli sobie coś w pętli przez 50ms nie interesując się niczym innym niż przerwaniami. Jeżeli chcesz coś robić w pewnych określonych interwałach czasowych użyj przerwań od timera.
Odczyt enkodera tylko przez pooling. Z tego prostego powodu ze jest deterministyczny. W przypadku drgających styków na przerwaniach nagle dostaniesz 10x taka częstotliwość wywoływania funkcji. Ja w jednej maszynie mam serwomotor którym steruję impulsowo i odczytuję pozycję enkoderem. Podczas ruchu jest jakieś 20-30 tys impulsów z enkodera na sekundę....
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.
myślałem że mogę wpisać praktycznie częstotliwość taktowania procka. Po zastanowieniu wiem że to niemożliwe. Podzielnik przez 8 można włączyć. Dodano po 4 Nie każdy pływa z zamiarem udziału w olimpiadzie ;-) Jest coś takiego jak hobby, ciekawość... na różnym poziomie wiedzy. Tu użyj CubeMX. Prosto, szybko i przyjemnie. Dużo kursów jest na Forbocie,...
w pliku Makefile była linijka: CXX_DEFS = -DSTM32F10X_MD zmieniłem ją na: CXX_DEFS = -DSTM32F10X_HD Ale nie wiem czy ma to jakiś wpływ. A gdzie mogę sprawdzić tablicę wektorów przerwań?
Tak, jest to możliwe - tak jak kompiluje się bootloader, tak można skompilować program, aby zaczynał się pod innym adresem w pamięci. Niedogodnością będzie to, że program znajdujący się gdzieś w środku nie będzie mógł obsługiwać przerwań (tablica wektorów przerwań może być umieszczona tylko pod dwoma adresami - 0 i w sekcji bootloadera). Co prawda można...
Przerwanie timera, tablica wartości cyfr do wyświetlenia, tablica obrazów cyfr. W każdym przerwaniu wybierasz cyfrę, pobierasz jej obraz z tablicy i wyrzucasz na wyświetlacz.
#pragma vector = <VECTOR_NAME> __interrupt void <ISR_NAME> (void) { // сюда вписыk... код обрабl... прерыk...
Jak wygląda sprawa z przerwaniami? Tam zamiast przerwań są używane callbacki. To nie tak jest. Callbacki są całkiem do czego innego. W programie HALowym, to użytkownik pisze obsługę przerwań sprzętowych (tak jak w klasycznym podejściu "rejestrowym") a specyfiką HAL jest tylko to że dostarcza pewnych gotowców na obsługę przerwań. Przykładowo weźmy uart....
Bootloader jeśli jest prosty, potrafi też zajmować o wiele mniej. U mnie w jednym z projektów procesor podrzędny jest przeprogramowywany przez procesor główny, protokół jest więc bardzo prosty (zakładam, że błędy transmisji nie występują), sam bootloader zajmuje 358 bajtów (załącznik: źródła, 5 plików, m8). Co do pierwszego postu: ad 1/ Przy linkowaniu...
(o ile to co zostało to bootloader) Bootloader 0x7000 - 0C94F23E - jump 0x3ef2 (0x7DE4) i cały początek wygląda na tablicę wektorów przerwań bootloadera ( 5 instrukcji jump)
Magiczne słowo static daje dokładnie to samo co zmienna globalna. Przekazywanie wyniku przez zmienne globalne owszem jest w niektórych przypadkach dobre lub jedyne możliwe (z przerwania do kodu), ale pomiędzy funkcjami - nigdy. Przyjmijmy, że mamy n funkcji, każda może zwrócić tablicę o rozmiarze m. Jeśli każda funkcja przydzieli sobie tą tablicę mającą...
Sprawdź przewody łączące klapę z resztą samochodu możliwe że się przerwały.
Operacje jakie masz do wykonania przy skoku do swojej aplikacji to: - Ustawienie wektora tablicy przerwań na Adres Bazowy Aplikacji (nazwijmy to ABA) - przepisanie z ABA+0x0 wskaźnika stosu do MSP (główny wskaźnik stosu) - pobrania z ABA + 0x4 wektora resetu i skok pod ten wektor - nie skaczesz pod ABA +0x4 tylko pod ten adres który znajduje się w ABA+0x4...
Chciałem się zapytać czy ten przykład od Freddie Chopin'a pasował by do STM32F2. Czy trzeba coś zmieniać prócz rozmiaru pamięci Flash, RAM i tablicy wektorów przerwań ?
Witam, Przed DO stosuje się BY ale że ono domyślnie jest na 1 to nie trzeba go stosować. Tak. ]I pętla dopóki będzie liczyła do N to za każdym obiegiem pętli będzie kopiowała dane z tablica do tablica_nowa? Tak. Element po elemencie bo zmieniamy indeks tablicy za pomocą zmiennej "i". Pozdrawiam,
SYSCFG->EXTICR Nie powinieneś działać na rejestrze 0? void EXTI1_0_IRQHandler(void) To przerwanie na pewno się tak nazywa? Bo tutaj się nazywa ...0_1... NVIC_EnableIRQ(EXTI0_1_IRQn); Masz dobrą tablicę wektorów? 4\/3!!
Dwóch rdzeni to tam raczej nie masz, więc oczywiście że może. Są dwa warianty, albo drugie przerwanie zostanie przyblokowane na czas wykonywania pierwszego, albo pierwsze przerwanie zostanie przerwane przez drugie. Jeżeli wystąpią jednocześnie, to jako pierwsze zostanie wywołane to, które ma niższy adres w tablicy wektorów przerwań.
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!!
Sprawdź, czy w module startup masz w ogóle w tablicy wyjątków nazwę procedury obsługi tego przerwania. Kiedy ostatni raz bawiłem się AC6, generował puste tablice wyjątków. Po drugie, przerwania portów nie służą do obsługi przycisków - jedno wciśnięcie przycisku może generować np. 2 przerwania, i wtedy stan diody się nie zmieni.
Ok. Dałem skrypt linkera i plik Startup z projektu do STM32F4. Program zatrzymuje mi się w tablicy wektorów przerwań. Na marginesie zaznaczę, że jeszcze nie modyfikowałem tej tablicy. Czy ewentualna modyfikacja tej tablicy może rozwiązać problem? http://obrazki.elektroda.pl/4579209200_1...
Ja bym zrobił tak: 1. Znalazłbym najmniejszy odstep czasu pomiędzy stanem niskim a wysokim. 2. cały przebieg podzielibym sobie na małe fragmenty o szerokości czasu odczytną z punktu pierwszzego. 3. Do tablicy zapisałbym ciąg zer i jedynek odczytnaych z tej tablicy. 4. Ustawiłbym timer w tryb CTC o okresie z punktu 1. i napisał procedure wyslij_dane,...
Proszę o informacje, gdzie w nocie katalogowej można znaleźć informacje na temat priorytetów wykonywania przerwań, jeżeli wystąpią w tym samym czasie. Nie można, ale ten co ma niższy adres w tablicy wektorów wykona się pierwszy jak przyjdą w tym samym czasie. Co najwyżej możesz właczyć przerwania na początku obsługi aby umożliwić obsługę kolejnych...
Mam wielką prośbe. Czy wie ktos co wykonuje program do przeglądania zawartości dysku (np. Total Commander, Explorer itp.) jak wchodzimy na jakiś dysk. A dokładnie czy zgłasza on jakieś przerwanie. Jeśli tak to jakie i jak można się dobrac do niego. Chodzi mi dokładnie o małą podmiane tego przerwania tak jak to się robi w Dosie z tablicą przerwań. Wiem...
Lampki świeca jak podłączyłem dodatkowy plus z lampy tylnej, wychodzi na to że nie ma plusa. Bo jak zmostkowalem kable to podświetlenie przycisków i zegarow wróciło, tylko w tablicy nie. Chyba poprowadzę dodatkowy plus z lampy i będzie po sprawie. Dodano po 1 Zamykam temat problem usunięty. W tablicy przerwany szaro-zielony kabel. Dziękuję za pomoc.
Ja nie pisałem o generatorze 15Hz w kontekście symulacji tylko wykonania rzeczywistego :-) W 51' masz 2 poziomy przerwań. Jeżeli zgłoszone zostanie przerwanie od timera i zacznie się wykonywać a później zgłosi się przerwanie zewnętrzne to to pierwsze zostanie zawieszone, wykona się przerwanie zewnętrzne a później program wróci do przerwania od timera...
Nie wiem w jakim celu wyłączasz timer na czas obsługi przycisku. Procedura obsługi przerwania powinna być jak najkrótsza. Niepotrzebnie wywołujesz za każdym razem funkcję setNum(). Warto byłoby ją wyrzucić do pętli głównej i wykonywać tylko w momencie zmiany prędkości. Utwórz sobie tablicę trzech elementów, w których przechowywał będziesz kolejne cyfry....
tablica wektorów przerwań kalkulator przerwań wykonywanie przerwań
emulator android gniazdo ładowania tomtom samsung firmware update
esp8266 zegar schemat podłączenia różnicówki
Jak odblokować telefon Samsung bez kodu? Radio przestało grać po naciśnięciu przycisku - wyświetla tylko kilometry