Witam raz jeszcze. W zasadzie to pomogły mi wskazówki kolegi Mieciomiecio a także Iwan3000 . nie rozwiązały one problemu, gdyż układ i tak reaguje na wciśnięcie i puszczenie przycisku. Stwierdziłem, że nie tędy droga ... lecz wiem już jak definiuje się te przerwania! Dzięki Wam koledzy. program poprawiłem korzystając z pośredniej zmiennej , którą uzyłem...
Hmmm. Wgrałem oryginalny program z Stm32 MassStorage. vectors.c startup.S i .ld o kolegi Freddie Chopin. Mam obecnie dwa przerwania z Usb: USB_HP_CAN1_TX_IRQHandler i USB_LP_CAN1_RX0_IRQHandler ( w vectors.c było bez jedynek kolo CAN ). Zrobiłem takie coś, orginalny program void USB_HP_CAN1_TX_IRQHandler(void) { CTR_HP(); }...
Mam problem z uzyskaniem oczekiwanego działania przerwań INT0 i INT1. Procesor to ATMEGA 16 z zewnętrznym taktowaniem 16MHz. PD2, PD3 są skonfigurowane jako wejścia z podciągnięciem do 1. W obu przerwaniach jedyną czynnością jest inkrementowanie zmiennych zdefiniowanych jako volatile uint32_t. ISR(INT0_vect) { N_T++; } ISR(INT1_vect) { N_F++; } Przerwania...
Witam męczę się już od dawna z przerwaniem od timera 0. Wymyśliłem sobie że po przepełnieniu licznika 0 ma nastąpić przerwanie. Licznik 0 liczy od 0-255 chciałem miec kontrolę na częstotliwością wywoływania przerwania więc gdy przerwanie jest wykonywane wpisuję od razu do licznika konkretną liczbę tak by miał on mniej do zliczania. Problem polega na...
Witam. Jak program wejdzie raz do obsługi przerwania to je wyłącza. Czyli eliminacja drgań styków jest załatwiona. Przynajmniej w przypadku INT0 i INT1. I to chodzi dobrze. Teraz jak wejdzie do obsługi przerwania INT2 to wyłącza je, dokonuje inkrementacji /dekrementacji zmiennej, kasuje zmienne, włącza przerwania (INT0, INT1) i wyskakuje z przerwania....
Bawiłem się ostatnio CAN'em na STM32F103. Program "demonstracyjny" nie został w pełni ukończony ale działa. Można by poeksperymentować z filtrami bo na początku konfigurowałem wszystkie (albo więcej niż wszystkie). Załączam ważniejsze pliki. Cube nie robi niestety wszystkiego. Sama konfiguracja jest w Cube (nowym). W programie używałem rejestrów. STM...
Witam W moim programie odnosze sie do zmiennych w funkcji przerwania. Ponizej wersja skrocona: unsigned int bdata train; sbit bicik = P1^0; sbit bit0 = train^0; void przerwanie0 (void) interrupt 0 { bit0 = bicik; } Czemu gdy P1.1=1 zmienna train przyjmuje wartosc 0x0100 zamiast zamierzonej 0x0001?
Witam! Proszę o podpowiedź dlaczego w kodzie: unsigned int i, imax, (...) int obsluga_przerwania1() { AT91C_BASE_TC1->TC_SR; i++; if (i > imax) { i = 0; *AT91C_TC1_CCR = 0x2; } AT91C_BASE_AIC->AIC_EOICR = 0x0; } int main() { [konfiguracja tc i aic] while(1) { if (warunek1)...
Rzeczywiście, Atmega32 nie ma PCINT. Niemniej jak wspomniałem takie skanowanie lepiej jest zrealizować w oparciu o cykliczny odczyt. Wyklikałem poniższy kod ale nie gwarantuję, że jest on na 100% poprawny bo: - dawno nie pisałem w asemblerze - nie mam jak sprawdzić jego poprawności Idea jest taka, że w przerwaniu od przepełnienia T0 sprawdzamy klawiaturę...
Witam, jestem swiezy w temacie i borykam sie z przerwaniami - mam nastepujacy kod: #ifndef F_CPU #define F_CPU 16000000 #endif #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> ISR(INT0_vect) { index++; } int main(void) { EIMSK = _BV(INT0); EICRA...
atom1477 Spróbuję tak zrobić z funkcją while, ale muszę pomysleć jak ten warunek w if-ie zapisać, bo w Pic-ach ten rejestr jest dziwnie podzielony na dwa ośmiobitowe. dondu Ma to być zegarek. Nad funkcją main(), będzie tablica z cyframi od 0 do 9, poniżej deklaracje zmiennych. W przerwaniu będą ustawienia odpowiedniego segmentu LED jak i inkrementacje...
Chcę kożystać z przerwania INT0, a w nim o jeden powiększać zmienną zapisywaną w rejestrze np.: r20. Niestety po powrocie z przerwania zerowany jest stan rejestrów, awięc zmienna znika. Komend Push i Pop nie ma w ATtiny12. Jak operować na zmiennych? Jak odkładać je na stos?
Chcę zrobić urządzenie, które zlicza serie impulsów, przy czym po każdej serii musi być zerowane ( tak by wynik następnej serii nie był dodawany do wyniku z poprzedniej).Impulsy doprowadzane są do wejścia INT0. Mam jednak probelm - gdy licznik zliczy np w pierwszej seriii 1000 impulsów i wyświetla mi poprawny wynik to gdy przychodzi druga seria np też...
Kod programu poniżej. Mam nadziej ze ktoś mi doradzi jak go poprawić problem jest miaowicie taki ze zmienna jest zliczana w przerwaniu i w zależności od zmienne jest uruchamiany odpowiedni „program”. Jak na początku programu zadeklaruję zmienna o jakiejś wartości to wchodzi w odpowiednia dla te wartości pętlę jeśli natomiast za pomocą przerwania...
Napotkałem dziwny problem. Spróbuję to dość jasno opisać. W procedurze uruchamiam timer0. Następnie po uruchomieniu program wpada w pętle : flaga=1; timer0_on; while(flaga) { } zmienna flaga zadeklarowana jako globalna (na samym szczycie kodu po define'ach) zerowana jest w procedurze obsługi przerwania timer0. Oczywiscie po tym program...
Witam, mam dwa pliki projektu w C: interrupt. i main.c (dla uproszczenia). interrupt.c: static volatile TFrame Frame ={0}; SIGNAL (SIG_INTERRUPT0) { (...) //m.in. zmienia sie struktura Frame } main.c: extern TFrame Frame; void main (void) { (...) sei(); while (1) { if (Frame.state...
Witam! Główne założenie tej części programu miało być takie, że program sprawdza zmienną w przerwaniu wywoływanym przez timer0 (co 1s) i jeżeli jest warunek spełniony to zwiększa odpowiednią zmienną co 1s. #include <avr/io.h> // dostęp do rejestrów #include <avr/interrupt.h> // funkcje sei(), cli() #include <avr/iotn2313.h>...
Witam! Zaczne od kodu, oto dwa fragmenty: ISR(USART1_RX_vect) { UDR0=UDR1; } Tutaj wszystko dziala, to co dostane na usart1 przesylam odrazu na usart0 Natomiast gdy zapisuje sobie do zmiennej: char wynikGSM[30]="123"; int ilosc_znakow=0; ISR(USART1_RX_vect) { wynikGSM[ilosc_znakow]=UDR1; ++ilosc_znakow;...
Pytałem o to samo zadanie w innym temacie, ale zmieniłem koncepcję i już do tamtego tematu się to nie nadaje. Dlatego zakładam nowy temat. W przerwaniu wygenerowanym przez USART_RXC_vect odczytuję wartość wysłana przez port szeregowy. Chcę tą wartość wynieść do main'a. Poniższy napisany przeze mnie kod nie działa: [syntax=c] #define F_CPU 1000000ul...
Witam Oto moj kod wywolania przerwania __irq void Przerwanie(void) { if ((sstatus & 3) == 3) zdown(); if ((sstatus & 3) == 1) zup(); if ((sstatus & 0xC) == 0xC) extruderdown(); if ((sstatus & 0xC) == 4) extruderup(); AT91C_BASE_AIC->AIC_EOICR...
Jestem w trakcie pisania programu na Atmegę8. Mam zdefiniowane trzy przerwania: [syntax=c] ISR(INT0_vect) { net = 0; //wywołanie co 10ms 50Hz } ISR(ADC_vect) { pomiar = ADCW; } ISR(TIMER1_COMPA_vect) { PORTC ^= 0x10; if (enable_flag == 1) { step++; } if (step == 5000) { step = 0; } } [/syntax] Obecnie pierwsze przerwanie INT0 jest nieaktywne. Początkowo...
W programie poniżej dekrementuję zmienną globalną(volatile) "time" w przerwaniu. Problem tkwi w tym, że dekrementacja działa prawidłowo tylko gdy zainicjuję zmienną globalną "time" początkową wartością, natomiast ja chcę podawać wartość zmiennej do dekrementacji w głównej pętli while(1) tak jak to jest w kodzie poniżej (który oczywiście nie działa)....
Witam, czytając książkę "Język C dla mikrokontrolerów AVR" natknąłem się na stronie 313 na przykład migania diodami led w przerwaniu od timera. Bardzo proszę o wytłumaczenie mi dlaczego w przerwaniu definiowana jest na początku zmienna LED, z tego co rozpisałem sobie na kartce wynika że stan portu b nigdy sie nie zmieni...(chyba ze definicja bylaby...
Z góry uprzedzam, że jestem początkującym w programowaniu µC, jak i w języku C. Uruchomiłem już przerwanie od przepełnienia Timera 7. Działa prawidłowo, np. mogę mrugać diodą. Chciałbym teraz zwiększać w tym przerwaniu zmienną "i", a następnie korzystać z niej w głównej pętli programu. Niestety nie wiem jak i gdzie zadeklarować tą zmienną. Zawsze...
Wszystko - głównie oczekiwanie w przerwaniu timera. Zacznij od określenia okresu przerwań timera. W przerwaniu użyj zmiennej zliczającej przerwania, np.: - inicjujesz ją na wartość 3 - na początku procedury dekrementujesz ją - przy wartości 1 zapalasz diodę, - przy wartości 0 gasisz diodę i reinicjujesz licznik na wartość 3 Oczywiście zamiast 1 i 3...
Mam problem z odpowiednim obsłużeniem przerwania UARTa w ATMega644PA. Główny program wywołuje pewną funkcję, która robi jakieś operacje w pętli (załóżmy kilkadziesiąt razy). W przerwaniu UARTA: [syntax=c]static volatile bool FLAGA; ISR (UART0_RECEIVE_INTERRUPT) { /* .... */ //sprawdzenie czy został przesłany znak o kodzie ASCII = 3 if(UDR0 == 3) FLAGA...
odczytywać stan przycisku w timerze (programowym, sprzętowym, jakimkolwiek) co (przykładowo) - 20-50ms i zapisywać to do zmiennej. Zmienna ta to "odfiltrowany" stan przycisku. Ewentualnie - jeśli masz już RTOSa albo kolejkę zdarzeń - z funkcji wywoływanej co te 20-50ms można od razu kolejkować jakieś zdarzenia.
Brak wywłaszczania stwierdzam po wywołaniu _delay_ms() w procedurze void TIM1_CC_IRQHandler(void). PC wchodzi mi wtedy to pętli, która jest nieskończona bo nie ma dekrementacji zmiennej w przerwaniu SysTick-a. Jak zamiast delay-a dam timer to skutek widoczny jest w pomijaniu ramek modbus-a. Być może wartości, które ustawiasz w polach PreemptionPriority,...
Witam, Pracuje nad kodem programu do komunikacji przez UART (mikrokontroler <-> komputer) i zastanawiam się nad sposobem implementacji w przerwaniach. Na razie zrobiłem to w taki sposób: - Nadawanie danych wykonuje w taki sposób, że w programie głównym zmieniam w wskaźniku adres początku tablicy którą aktualnie przesyłam przez UART, w przerwaniu...
Witam Klawiatura zbudowana jest za pomocą sześciu przycisków monostabilnych, podłączonych do portu PF0-PF5. Równolegle z każdym przyciskiem jest włączony kondensator elektrolityczny o pojemności 1µF w celu eliminacji wpływu drgań styków. Aby nie odczytywać stanu linii cały czas, zdecydowałem się na wykorzystanie przerwania zewnętrznego !INT7. Jest...
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 na płytce stykowej oraz programu na PICa przedstawię krok...
zerowanie TF0 w obsludze przerwania nic nie daje, sprawdzalem wczesniej. w debugerze keila podczas symulacji wszystko jest tak jak powinno. czyli wyrzucajac zmienna k stan portu zmienia sie co ~1s. problem wystepuje dopiero po wgraniu do ukladu. kwarc 12MHz. w specyfikacji jest napisane ze TUSB3210 moze pracowac na f 12 lub 48 MHz. ale jako ze nie ruszam...
Byc moze sa drgania, a byc moze program jest niefortunnie napisany. Najlepiej sprawdzic w praktyce piszac jakis prosty program testowy. uruchomic przerwania od INT i w procedurze przerwania zwiekszac jakas zmienna. Podac jedno zbocze wolno narastajace i po przycisnieciu przycisku niech na port wystawi ta zmienna. nie mam zadnego generatora bo sam bym...
DEX - no cóż dlatego, bo taki układ już jest i nic nie da się teraz zrobić. Kolumny i wiersze są podpięte bezpośredni pod wymienione porty.. Więc bezpośrednie wykorzystanie zewnętrznego przerwania nie wchodzi w rachubę. mariuszlorenc - no wlasnie może o to mi chodzi, ale jak to się robi, bo to moje naprawdę pierwsze doświadczenie z Timerami, flagami...
Witam. Mam problem z przerwaniami w atmega8. Wcześniej nie potrzebowałem przerwań więc to zagadnienie mnie nie interesowało. Potrzebuję wywołać przerwanie zewnętrzne int0 które uruchomi timer1, a ten zacznie odmierzać czas. Napisałem coś takiego (oczywiście to część z większego projektu) '$sim $regfile = "m8def.dat" 'informuje kompilator o...
Wkleję cały program: = 0x33" naprawiło problem, więc gdzieś tu tkwi szkopuł. Bo jeśli dobrze rozumuję , to: bajt XX10 XX11 & ~0x33 1100 1100 ( czyli ~(0011 0011)) bajt XX00 XX00 PD7 jest niepodłączone. PD6 to wyjście na tranzystor (przez rezystor). Nie mam schematu, ale układ elektrycznie działa ok. PD2 i PD3 to switch'e zwierające do masy. Drugi...
Witam Mam taki problem, napisałem program w bascomie, w którym również korzystam z przerwania na INT0 (atmega8-16pu). Ale: Po włączeniu zasilania program przechodzi do obsługi przerwania i zostaje tam na amen - w czym jest błąd. Proszę o jakieś wskazówki. Płytka jest wykonana prawidłowo, na int0 jest stale 5V (podciągnięte do VCC zew, z wyjątkiem kiedy...
mam przerwanie w którym wykonuję operacje na zmiennych "globalnych" niestety po powrocie z przerwania moja zmienna odtwarza sobie wartość z przed przerwania. Czy jest jakaś możliwośc przekazania wartości z przerwania do programu głownego, oprócz on interrupt nosave? Witam, Sorki ale koledze chyba coś się pokręciło i to mocno.... jak już to pokaż swój...
Program napisałem mniej więcej od nowa. Wygląda tak: #include <avr/io.h> #include <avr/interrupt.h> #define Potrzebne_50ms 33 volatile int licznik50ms=0; volatile int SygnalDCF=0; //0 - szukamy szczeliny początku transmisji, 1 - dekodujemy sygnał, 2 -koniec ramki DCF volatile int zbocze1=0; //0 - szukamy opadającego, 1 - narastającego volatile...
Witam, Chciałbym napisać program, w którym użytkownik musi nacisnąc przycisk jak najszybciej po zobaczeniu określonego wzorca na panelu diod. Czas powinien się wyświetlać na wyświetlaczu. Używam edu board LPC2148. Timer1 jest używany do zapalania diod. Procedura przerwania timera1 zapala diody co 2ms aby zapalone diody tworzyły jakiś wzorzec(np. strzałkę)....
to może zamieszczę fragment programu w LAD ponieważ nadal nie rozumiem o co w nim chodzi, czy mógłby ktoś mi wyjaśnić co tam jest realizowane :?: Oto fragment w którym występuje ATCH: A to początkowy fragment przerwania Q_0 (bloczki move mul itp rozumiem ;) ) za to mam wątpliwości do zadeklarowanych do góry zmiennych... o co chodzi :?: co to LW0, LD2,...
Witam, stworzyłem na płytce stykowej układ, gdzie podłączyłem przyciski, LCD hd47780, rtc ds1307 i buzzer. Korzystam z bibliotek do wyświetlacza od "radzia", TWI od p. Mirka oraz ze znalezionej na tym forum biblioteki do RTC. Napisałem szybki program, który wyświetla godzinę w formie hh:mm:ss na ostatnich polach pierwszej linii. Dodatkowo dodałem przerwanie,...
A jeśli chodzi o sam enkoder to możesz go powiesić na jednym przerwaniu- np do nogi A. W obsłudze przerwania badasz wyjście B i jeśli jest np niskie to zwiekszasz wartosć zmiennej, jeśli wysokie to zmniejszasz (czy jaki ci tam pasuje). DO tego jeszcze może jakieś sprawdzenie przepełnienia tej zmiennej. Całosć będzie miała... kilkanaście cykli?
W sumie to mam pytanie czy dobrze rozumiem jak to ma działać. Tak skonfigurowany DMA wykonuje transfer raz, w momencie ustawienia bitu ENABLE. Kod z moimi komentarzami (wypisane z DSa). [syntax=c] void DMA_Conf(void) { RCC->AHBENR = RCC_AHBENR_DMA1EN; /* Procedura konfiguracji kanałów DMA 1. Ustawić adres rejestru peryferiów w rejestrze DMA_CPARx Dane...
Witam, mam problem z opanowaniem przerwań na mikrokontrolerze stm32f401re. Próbuję odczytać pomiary z żyroskopu l3gd20h. Pomiar blokujący działa bez zarzutu, kod załączam. Problem w tym że potrzebuję pomiar nieblokujący i chciałem to zrobić na przerwaniach. Niestety tu pojawia sie problem bo nie działa mi to prawidłowo, są same zera. Specjalistą nie...
Spróbuj może w instrukcjach ldmia i stmfd zapamiętać rejestry {r1-r12,r14} zamiast {r1-r3,r12,r14}. Ja mam procka AT91RM9200, port szeregowy i usb również mam na przerwaniach i mi wszystko działa, ale kiedyś też miałem problem z przerwaniami i mi po tej zmianie pomogło. Druga rzecz to dziwnie wygląda definicja zmiennej Top_Stack, sprawdź jaka jest jej...
witam, mam problem postaci: volatile int i; ISR (INT0_vect) { /* obsługa przerwania */ i-=10; } int main(void) { /* ustawienie wartości początkowych zmiennych, włączenie przerwań itp */ while(1) { /* kod w c */ while (i-- > 0) asm("nop"); /* kod w c */ } } za pomocą pętli...
Witam, ostatnio zająłem się pisaniem stosunkowo prostej aplikacji na AVR ATmega8, potrzebnej mi na studia. Na celu miałem też trochę lepsze poznanie AVR. W czym problem : W moim programie chciałem przetestować typowe zachowanie uC, napisałem kilka prostych funkcji, włączyłem przerwania, zrobiłem pętle nieskończoną w której na moim wyświetlaczu 7 segmentowym...
W przerwaniu deklarujesz zmienna liczba, ktora przy inicjacji jest rowna 0. Po czym dodajesz do niej 1, zatem liczba ta nigdy nie osiagnie 30. Zadeklaruj ją jako zmienną globalną wtedy powinno byc wszysto w porzadku.
Dziękuję za szybką odpowiedź :). Czyli Freddie Chopin napisał że się mylę a to dokładnie tyle samo znaczą te linie w przypadku dokładnie tego procka na który ja piszę. Przez to że nie dałem mu do tego powodu rozumiem, że nie powinien zgłaszać przerwania ponieważ zmieżone wartości napięć nigdy nie przekroczyły ustawionych wartości progowych na 5 V i...
if (!przerwa) {Czasomierz_ON; przerwa=1;} else if (przerwa){Czasomierz_OFF;INT0_OFF;odczyt... } No zastanówmy się przez chwilę. Kiedy to się zdarzy, że zarówno przerwa jak i !przerwa dadzą fałsz? Dlaczego zamiast typu _Bool używasz typu char dla zmiennej logicznej? Do czego służy wywołanie sprintf(bufor,"POMIAR"); To zamiast...
Nie jest możliwe, ale możesz wprowadzić zmienną pomocniczą i w zależności od niej w podprogramie obsługi przerwania zrobić warunek i skakać do innych podprogramów, np. ... dim temp as bit on int0 qwerty temp=0 ... 'tam gdzie chcesz zmienic temp=1 ... qwerty: if temp=1 then gosub q else gosub w end if return q: ... return w: ... return
Jak nie zostaje wyłączone... Przecież podczas wykonywania przerwania inne są automatycznie blokowane, właśnie poprzez wyzerowanie globalnej obsługi przerwań - tak więc nie ma nawet potrzeby stosowania specjalnych zabiegów (cli) w tym celu, to właśnie żeby włączyć stosuje się sei w przypadku, gdy trzeba odblokować przerwanie tak, aby możliwe było jego...
Witam. Tworzę mały projekcik i natrafiłem na pewną zagwózdkę. Na początku wprowadzenie co układ ma robić i jak działać. Układ składa się z części analogowej, tzn. dwóch detektorów tonu (LM567) odpowiedzialnych za detekcję "bitów" łącza fizycznego. Chodzi o to, że rozpoznają "swoją" częstotliwość i gdy stwierdzą zgodność z obwodem czasowym, na swoim...
Tak jest, sprawa zadania odczytu i konwersji danych nie jest tu problemem, kod jest poprawny. Starzy Chińczycy twierdzą, że zupa ogórkowa nigdy nie smakuje tak samo, uważają też, że każdy problem da się rozwiązać wnikliwie studiując literaturę... Panowie, problem tkwił w tym, że wywołanie przerwania zapisuje stan rejestrów, ale.... nie wszystkich !...
Witam, napisałem pierwszy program z zastosowaniem funkcji przerwania. Jest to licznik modulo 10 sterowany przyciskiem X0 (kierunek zliczania). Jednakże nie chce mi się skompilować. Kompilator podpowiada miejsce gdzieś przy funkcji przerwania. Prośba o pomoc i ewentualnie jakieś ciekawe sugestie co do konstrukcji samego programu. EDIT: Poprawiam zapis...
reaguje na oba zbocza, przerwanie wykonuje się kilka razy Może jednak sygnał z tego czujnika, a ściśle napięcie na pinie nie jest czyste jak sobie zakładasz, szczególnie jeśli idzie jakimś dłuższym kablem. Możliwe są odbicia, oscylacje itp. . 411 jest przecież bardzo szybki i już jakieś oscylacje z okresem ułamków mikrosekundy mogą grać rolę. Impedancyjnie...
Witam Postanowiłem zapytać tutaj, ponieważ wydaje mi się że to odpowiedni temat. Uczę się programowania na bazie STM32. Teraz poznaje porty USART i pojawił się problem: Pokazałeś fragmenty kodu i myślę, ze nawet jak będziesz miał funkcję wysyłającą jeden znak na LCD to program nie zadziała poprawnie. Problem najprościej, na szybko, rozwiązać deklarując...
Procedura podana przez Konrada działa bardzo ładnie ale ma jedną wadę odbiera dana jako znak ASCII a ja chce odczytać zwykłą daną byte w ten sam sposób. Zamiast Inkey() możesz dać Waitkey() (waitkey wstrzymuje działanie programu do czasu, aż pojawi sie jakiś znak, ale w tym przykładzie to nie ma znaczenia). Zmienna Znak jest zadeklarowana jako bajt...
Spoko...tylko, że w Bascomie 8051 nie ma komendy Round ;) Ale zwykłe podstawienie działa. Swoją drogą jest to conajmniej idiotyczne, bo powinna być niezgodność typów, no ale cóż... Spoko ... to nie C , a kompilator dla "Nowicjuszy"(podobno ;) ) , więc automatycznie konwertuje typy zmiennych liczbowych , z czego może nieraz wyjść niezły pasztet. Piotrek
Poprawiłem Twój fragment odpowiedzialny za zliczanie count. :) if(++count>WYPELNIENIE) {PortLED=0xFF;} else {PortLED=0x00;} if(count<100){count++;... else {count=0;} Zmienna WYPELNIENIE i count to dwie niezależne zmienne i nie można uwarunkowywać jednej od drugiej.
Witam Mam pewien problem z timerami, jesli dobrze rozumiem dokumentacje to przy kazdym przejsciu wartosci rejestru TMR z 0xFFFF na 0x0000 powinno wystapic przerwanie. Napialem prosty program wywolujacy przerwanie przy pomocy timera0 i niestety wartosc ta musi przjesc przez zero kilkaset razy zanim wystapi przerwanie. Korzystam ze sprzetowaego debuggera,...
Program skacze do przerwania co 50ms więc żeby odmierzyć 1s musi skoczyć 20 razy. Poprostu w programie jest zmienna która jest ładowana stałą 20 i odejmuje się w każdym przerwaniu o jeden. Jak dojdzie do zera to jest 1s i cykl się powtarza (znowu jest przypisywane 20). np: co 50ms w przerwaniu: if(zmienna){zmienna--;}... else { zmienna=CYCLE;...
Pytań ciąg dalszy: alokując wektory przerwań do innej części FLASH za pomocą attribute((section".aaa")) napotkałem na taki oto problem....a mianowicie linker zawsze umieszcza przerwania w tej samej sekcji...nie ma możliwości umieszczenia wektora 1 np w sekcji .aaa a wektora 9 w seksji .bbb !!! jakby tego było mało to najpierw jest umieszczany wektor...
Zmienna "a" musi być "volatile".
Czy jak w Bascomie Avr, zapisuję zmienną X do pamięci EEPROM, to muszę wyłączyć przerwania. ? Bo to wygląda tak , że kręci się pętla główna Do...Loop. Jeżeli w tej pętli zostanie wykryta zmiana stanu zmiennej, to jest nowa wartość wpisywana do pamięci. Dodatkowo działa Timer0 do obsługi wyświetlaczy, przerwanie co 4ms Jeżeli w czasie zapisu do pamięci,...
Mam problem z ogarnięciem kodu, który ma wykonywać obsługę przerwania po przepełnieniu timer'a. Sam licznik działa i po osiągnięciu wartości TCC0_PER ustawiana jest flaga przepełnienia, ale program nie chce wykonać obsługę przerwania. Szukałem w sieci, ale nie znalazłem nic co rozwiązało by ten problem. Będę wdzięczny za pomoc [syntax=c]sei(); //włączenie...
Witam. Nie używaj lookup. Zrób sobie tablicę cyferka[10], nadaj jej wartości na początku programu i będziesz miał port=cyferka[d]. Wszystkie obliczenia rób poza przerwaniem. W przerwaniu tylko wyświetlaj dane na wyświetlaczu. I to tylko jednym naraz. Mój przykładowy programik (zegarek z termometrem do motocykla) A1 A2 A3 A4 to zmienne, które program...
Witam Walczę od kilku dni z stm32f4 oraz i2c. Wysłanie danych działa poprawnie (sprawdzone na regulatorach ESC pod i2c) natomiast problemy pojawiają się przy odbiorze danych. Zawsze jest to 0. Nieważne z którego rejestru odczytuje dane. Moduł odpowiednio skonfigurowany oraz sprawny (działa na prostej komunikacji z pętlami). Init I2C [syntax=c]GPIO_InitTypeDef...
Witam! Od kilku dni siedze i nie mogę nic wymyśleć :( Bez ogrudek - podaje źródło: $regfile = "m16def.dat" $crystal = 8000000 'definiowanie zmiennych i stałych Dim T As Integer Dim Licznik_przerwan As Byte Dim Dioda As Bit 'konfigurowanie interfejsu 1Wire Config 1wire = Portd.1 'konfiguracja wyświetlacza Config Lcdpin = Pin , Db4 = Portc.6...
if (IO0PIN & LED0) { IO0CLR = LED0; } else { IO0SET = LED0; } To w końcu ten pin "LED0" jest wejściem czy wyjściem? Ja rejestr IOPIN używam tylko jak sprawdzam stan wejścia, natomiast do sprawdzania czy dioda LED świeci czy nie służy mi zwykła zmienna.
...czy na czas wytransmitowania, bądź odbioru znaku program wstrzyma swoje działanie na 10ms, czy po prostu odbędzie się to równolegle... Jeśli budujesz transmisję RS232 na przerwaniach, sprzętowy USART odbiera znak w czasie, gdy procesor wykonuje program główny. Po odebraniu całego znaku generowane jest przerwanie. W obsłudze przerwania musisz tylko...
Witam. mam mały kłopot z przerwaniami w bootloaderze na wymienionym procesorze (dataszit o ile mnie oczy nie mylą, mowi ze adresacja sekcji pamieci flash jest taka sama jak w zwyklej atmedze8) proc ustawiony na wielkosc sekcji boot na 1024 słowa, po resecie wskakuje do bootloadera. program skompilowany pod 0xC00 czyli w makefile de facto adres .text...
Niespecjalnie twój pomysł ma sens. A raczej nie do końca ma sens. Spowoduje on tylko zmniejszenie latencji obsługi innych przerwań, ale to samo możesz uzyskać pisząc przerwania nieblokujące (o ile Bascom to umożliwia). Pomysł z flagą ma sens w sytuacji w której obsługa przerwania byłaby koszmarnie długa, ale nie z powodu złożoności obliczeniowej, a...
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 wszystkich zainteresowanych. Może zacznę od opisu kontekstu: W swoim projekcie wykorzystuje czytniki kart. Zasada ich działania jest taka, że gdy na jednej lini pojawia się zbocze opdajace, z drugiej odczytujemy logiczny stan. Wysłanie jednego numeru to wysłanie 40 bitów. W moim urzadzeniu wykorzystuję dwa takie czytniki. W załaczonym obrazku...
Może powinieneś (na przykład) jednak synchronizować ten timer. Dzięki za sugestię bo nie pomyślałem o tym wcześniej, jednak i to nie pomogło. A może powinieneś (na przykład) w ISR, wyłączyć timer na czas ładowania a następnie włączyć z powrotem. To rozwiązanie pomogło, choć nie bezpośrednio. Bowiem rzeczywiście chwilowe wyłączenie timera i włączenie...
W przerwaniu przycisku blokujesz przerwanie przycisku i uruchamiasz timer sterujący wyświetlaniem, który kiedyś tam, gasząc wyświetlacz, włącza przerwanie przycisku. To "czekanie 20 ms" i powtórne sprawdzanie przycisku to jakaś magia i nie ma ani trochę sensu. Nie wspomniałem o jeszcze jednej rzeczy. Gdy wciśnięty zostanie przycisk i włączy się wyświetlacz,...
Witam, czy można w Delphi w pętli repeat ..until ( lub innej ) czekać na zmianę zmiennej ustawianej w przerwaniu np. od Timera ?? Tutaj jest przerwanie zegara systemowego: procedure TfrmMain.Timer_AckWaitTimer(Sender... TObject); begin AckTimeOut := true; Timer_AckWait.Enabled := false; end; a tu jest kod który powoduje zawieszenie...
Jeśli chodzi o mechanizm przerwań, to wszystko masz ładnie opisane w formacie pdf na stronie Atmela . Wywoływanie przerwania w procedurze obsługi jeszcze innego to porażka. Przerwania są kolejkowane i po powrocie z jednego jest wywoływane drugie, dlatego procedury obsługi powinny być jak najkrótsze (polecam asm ;)). W procedurze timera możesz sobie...
Witam mam pewien problem z pętlą while i procedurą obsługi przerwania. Najprawdopodobniej rozwiązane jest banalne, ale jakoś nie mogę wymyślić Otóż mam procedurę obsługi przerwania z UARTA, która do tablicy zadeklarowanej jako zmienna globalna wpisuje 3 liczby odebrane z portu szeregowego w postaci ramki zakończonej znakiem#. Dane nadchodzą co ok 1...
Zaleca sie uzywanie ISR() zamiast SIGNAL(). Makro SIGNAL() będzie w przyszłości usunięte, ISR() robi dokładnie to samo. W zasadzie jako argumentów tych makr powinno się używać SIG_OVERFLOW2 zamiast TIMER2_OVF_vect, ale to akurat nie powinno być przyczyną niedziałania, bo obie te konstrukcje znaczą dokładnie to samo. TIMSK =((1<<TOIE2));...
Witam, Dzieki za wyczerpujaca odpowiedz, widze ze tez zaglebiasz sie w szczegoly tego ustrojstwa ;]. W tej chwili u mnie juz dziala jak trzeba. Jezeli chodzi o wywolanie funkcji to mialem na mysli wywolanie funkcji juz z mojej funkcji obslugi przerwania. Sprawa wygladala tak, ze mialem mthumb-interwork z tym ze dla samej komendy linkowania gotowych...
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...
Mam problem w Bascom AVR. Program w pętli głownej ma wyświetlać odczyt na LCD 3,5 cyfry, tylko to. Wyświetlana wartość -zmienna jest modyfikowana w obsłudze przerwania. Problem jest taki, że pętla główna (wyświetlająca) nie widzi zmian zmiennej i cały czas wyświetla np "0". Pewnie jest to ułatwienie przy kompilacji - jeśli zmienna nie jest zmieniana...
Nic sobie nie robi z naciskania guzika bo właśnie obsługuje przerwanie. Ja bym to zrobił w ten sposób. Przerwanie od czujki uruchamia jakiś timer i kończy się obsługa przerwania. Timer odmierza czas i po jego upłynięciu sprawdza jakąś zmienną i w zależności od niej uruchamia alarm bądź nie. I tak jeśli przed przyjściem przerwania z tego timera naciśnięty...
Nigdy tego nie robiłem z rozrzutności, ale teraz chcę zoptymalizować troche swój program. Deklaruje zmienne będące flagami determinującymi różne warunki w jakiejśc tam nieskończonej pętli programu. Flagi są ustawiane przez procedury, funkcje lub przerwania. Dim flaga1 as Byte Dim flaga2 as Byte ... Dim flaga8 as Byte Zajmuje mi to 8 bajtów. Czy zmiana...
W przerwaniu to tylko chwytasz wartość tego, co chcesz wyświetlić i ustawiasz odpowiednią flagę/bit/wartość w globalnej zmiennej volatile i wypad z tego baru.... ;) W main natomiast sprawdzasz, czy jest coś nowego, jak jest to wyświetlasz lub robisz z tym, co ci się podoba i zaznaczasz flagę/bit/wartość, że już obskoczyłeś temat i tak do następnego...
Zadeklaruj sobie zmienną "flagę" (volatile) i ustawiaj ją w przerwaniu na 1 w procedurze obsługi przerwania. W pętli głównej sprawdzasz if'em stan tej flagi i wykonujesz jakieś działanie, a następnie ustawiasz "flagę" na 0 i tak w kółko. Jak napisał Mirek, w przerwaniach nie używamy żadnych "delay"(!). Pozdrawiam Piotrek
Przepraszam - jasne, że us :-) Problem nie leży w samym wydłużeniu czasu - tylko, że SPI przestaje działać - zatrzymuje się dalsze wysyłanie danych. Procesor to PIC32 taktowany 80MHz, SPI taktowane 20MHz w tym momencie. Kod obu przerwań - prosze: SPI - to jest tylko fragment w którym się akurat zatrzymało - wyżej jest tylko odczyt bufora SPI do zmiennej,...
Witam, mam problem z DMA w STM32F217 w którym przerwanie niestety nie chce ruszyć. Taktowanie DMA sprawdzone, flagi błędów przerwania od DMA są ok(żadna błędna się nie ustawia, jedynie ustawiają się flagi końca transmisji danych). Otóż zmienne VarA i VarB się przepisują czyli DMA działa dobrze, ale przerwanie nie chce wskoczyć do obsługi przerwania....
W przerwaniu USART_RXC musisz odczytać UDR niezależnie od warunków umieszczonych w kodzie, najlepiej, kopiując wartość tego rejestru do lokalnej zmiennej, tuż na początku funkcji. Jeżeli tego nie zrobisz, procesor zakolejkuje kolejne przerwanie. Piszę to na podstawie dokumentacji AVR8. W Twoim przypadku, gdy bufor odbiorczy się zapełni i nadejdzie kolejny...
Witam, Jestem początkujący jeśli chodzi o programowanie ARM wiec proszę o wyrozumiałość. Mam problem z procesorem LPC 1768, konkretnie jest to płytka Mini DK-2. Od pewnego czasu walczę z problemami w przerwaniach i nie mogę sobie poradzić. Przewertowałem setki tematów na forach polskich i zagranicznych, być może źle szukałem, wiec każda wskazówka i...
Cześć, Jest sobie arduino które odczytuje z kilku analogowych czujników i wysyła to przez usb. Stworzyłem taki programik w visual studio: jedno okno jeden label przyciski otworz port odczytaj i ostatni zamknij. [syntax=csharp]namespace WindowsFormsApplication1 { public partial class Form1 : Form { int zmienna1 = 0; public Form1() { InitializeComponent();...
Witam, Mógłbym prosić o przerobienie tych dwóch bibliotek tak aby przerwania nie kolidowały że sobą? tak mi się wydaje że to chodzi o przerwania. Problem polega na tym że, jak wyłączę:
W czasie kompilacji w AVR Studio z GNU GCC programu dla ATMega8 złożonego z kilku osobnych plików (main.c, przerwania.c, wyswietlacz.c, itd), nie potrafię dać sobie rady z zadeklarowaniem w jednym pliku zmiennych globalnych. np. na początku pliku main.c deklaruję: unsigned char wysw_bufor[9] = {0,1,2,3,0,0,0,0,0}; a używam tej tablicy...
Nie jestem za biegły w timerach i się ciut pogubiłem. Proszę zatem o podpowiedzi. Próbuję ustalić ile czasu będzie trwał impuls podawany na INT procesora a jednocześnie zmierzyć czas od początku tego impulsu do początku następnego. Jednym uP podaję impulsy na drugi uP. Do Portc.7 = 0 'stan wysoki Waitms 1 Portc.7 = 1 'stan niski Wait 5 Loop Drugim uP...
np potrzebujesz zmienną którą będziesz zarówno aktualizował w przerwaniu i w pętli głównej programu. Gdy nie dasz jej volatile - to optymalizacja doprowadzi do tego, że w pętli głównej wrzuci sobie zawartość tej zmiennej np do jakiegoś wolnego rejestru procesora i w ramach tej pętli głównej będzie się posługiwać tylko tym rejestrem bez sprawdzania czy...
Witam mam bardzo nietypowy jak dla mnie problem z układem który ostatnio wykonałem. Mianowicie jest to centralka alarmowa oparta o uC ATmega16. Działa na tej zasadzie że pod wejście PB2(INT2) podpięty jest kontrakton (zwiera do masy) do którego przykładam magnes i albo rozbrajam albo uzbrajam centralkę. Z grubsza to wygląda tak: PB2(INT2) skonfigurowane...
Znalazłem specjalnie dla Ciebie jeszcze kilka bajtów :D ahahahahaha Bascom stara się być "ignorantoodpornym" czyli jak ktoś może czegoś nie wiedzieć to on to, na wszelki wypadek, robi za niego. W języku C każdą zadeklarowaną zmienną najczęściej inicjuje się jakąś wartością ponieważ po reset nie można być pewnym, że w niej znajduje sie zero lub potrzebna...