Napisz tak: Dim Zmienna As Byte Zmienna = 0 Config Intx = Low Level | Rising | Falling [ | Change ] 'Konfiguracja reakcji na sygnał przerwania 'za x podstaw nr przerwania wybierz jeden ze sposobów pobudzenia kocówki uC Enable Interrupts 'Uruchomienie przerwań globalnych Enable Intx 'Uruchomienie przerwania INTx On Intx Obsluga_przerwania 'wskazanie...
a jak zatem rozumieć priorytety przerwań związane ze slotami? Nie jestem biegły w ARM7, powtórzę, ale polegam tu na tej publikacji: http://engenuics.com/wp-content/uploads/... a szczególnie na tym fragmencie: 4. On the LPC214x processors, two hardware priority groups are available. The high priority interrupt is referred to as...
Podczas obslugi przerwania wykonuje inkrementacje jakiegos tam rejestru GPR, ale czemu podczas obslugi kolejnych przerwan rejestr ten nie zwieksza sie ? Dodam ze jak wpisze konkretna wartosc to podczas przerwania wpisuje sie ona do rejestru, ale jak juz z kazdym przerwaniem chce zwiekszac zawartosc rejestru to nie da rady :( (programowalem kilka razy...
Powinien się wyrobić, ważna informacja dla Ciebie, s7 1200 potrzebuje ok 175us na odpalenie przerwania (więc dobrze że ta "dziura" 2ms do kolejnego bitu). W obsłudze przerwania odczyt bitu jakaś inkrementacja żeby wklepać to w tablicę booli i jakaś obsługa flagi końca ramki i tyle. Osobiście wolałbym dać małego AVRa czy coś a do 1200 wsadzić płytkę...
Według mnie błędem jest inkrementacja w przerwaniu. Lepiej ustawić sobie w nim tylko flagę że wystąpiło. Teraz w pętli głównej jeśli flaga wystąpiła to zwiększamy wartość zmiennej stan o 1. Następnie w main zerujemy flagę. Napisz czy pomogło. Pozdrawiam
Aj, aj, źle sformułowałem temat - już poprawilem ;) Częstość przerwań nie ma tu znaczenia dla mnie, jeśli trzeba pomiar może być robiony co sekundę, chodzi o to, aby inkrementacja zmiennej w przerwaniu była wykonywana co 1uS. Co do 'Input Capture' to zajmę się tym jutro.
usunąłem chciałem zobaczyć ile operacji atomowych generuje inkrementacja.
Wybudzaj przerwaniem watchdoga nie resetem. Ja bym to zrobił tak (w C, w bascomie pewnie też tak się da): W głównej pętli: - konfiguracja watchdoga z przerwaniem na jak najdłuższy czas- - wejście w power down - pętla nieskończona z ciągłym przechodzeniem do idle. W przerwaniu watchdoga: - wyzerowanie watchdoga - inkrementacja zmiennej odliczającej od...
TOSC1 i TOSC2 to są piny do podłączenia kwarcu, jak nie używasz kwarcu to podajesz sygnał tylko na TOSC1. ASSRn to rejestr konfiguracyjno-statusowy do Synchronization unit. Sam synchronization unit to chyba tylko prosty arbiter do komunikacji z samym licznikiem, pilnuje on żeby np zapis do licznika nie był w dokładnie tym samym momencie co inkrementacja....
Kwarc 16MHz pewnie ma dokładność rzędu 50ppm. Czy to dużo czy mało to sam musisz zdecydować. Da się znaleźć specjalne rezonatory o mniejszej tolerancji. 20 albo 10ppm. Opóźnienie w przerwaniu nie ma znaczenia jak obsługa przerwania będzie dobrze napisana. Po protu powstanie wtedy przesunięcie fazy. Ale to przesuniecie będzie stałe. Dodatkowo w mojej...
i będziesz miał przerwanie co 1us, Porada pierwsza klasa ;-) Na procesorze 8bit przerwanie co 1us. Prolog + epilog przerwania + inkrementacja zmiennej co najmniej 32bit. Jesteś pewien, że zmieścisz się z tym w mniej niż 16 cyklach w C? Ile zostanie Ci czasu na resztę programu? Albert
> stoowa Twoje kłopoty powodują 3 ostatnie linijki w pętli while czyli obsługa LCD. W ciele funkcji obsługujących lcd na pewno sa instrukcje blokowania przerwań na czas transmisji danych do lcd. Powoduje to pomijanie wywołań przerwań a co za tym idzie zegarek będzie się spóźniał. Chcemy skrócić czas do następnego przerwania o czas opóźnienia obsługi...
Nie chcę inkrementacji. Wysyłam cały czas tą samą zmienną kilkukrotnie z jednej lokalizacji pamięci. W przerwaniu jest przeliczana na inną wartość w taki sposób: Ok. Niemniej jednak skopiowałem ten kod z #8 do CubeIDE 1.5.0, zrobiłem parę korekt pod moje PCB, dokonałem poprawnej implementacji flagi BUSY i wszytko działa jak powinno z inkrementacją...
Problem raczej w tym ze nie jestem jeszcze az takim "wymiataczem" jak niektorzy tutaj koledzy. Tu nie ma wymiataczy. :) No chyba poza nielicznymi wyjątkami... faktycznie wyglada mi na to ze uC sie resetuje ale jak moge zatem znalesc zrodlo resetu i je wyeliminowac? Hmm. Sprawdź ile razy przerwanie jest wywoływane: - inkrementacja w przerwaniu jakiejś...
Jeśli masz kod, który odnajduje liczbę, to w prosty sposób możesz przerobić go na taki, który zlicza ilość wystąpień liczby spełniającej dane warunki, prawda? Wystarczy zamiast zwracać wartość (return) - inkrementować licznik (licznik++). Po takiej inkrementacji wystarczy tylko sprawdzić stan licznika i przerwać na interesującej Cię jego wartości (if...
Też byłby problem, wyobraź sobie, że x zawiera 0xFFFF i chcesz go wyzerować. Zerując od najmłodszego bajtu przejściowo masz 0xFF00, od najstarszego 0x00FF, jeśli w trakcie zapisu jednego bajtu wystąpi przerwanie to tak czy siak x będzie miało nieprawidłową wartość. Co prawda niby inkrementacja w przerwaniu będzie działać poprawnie, wrócisz z przerwania...
No właśnie- przerwanie od Timera co 16.384 ms a w przerwaniu tylko inkrementacja jakiejś zmiennej. No ale to Bascom- odkładanie na stos i zdejmowanie zajmie jeszcze kilkadziesiąt instrukcji po 0.0625us przy zegarze 16MHz. Ale nawet wtedy to będzie poniżej 6us. Wystarczy aby obsługa przerwania INT0 była krótsza od 16ms. Zwłaszcza że przerwanie zewnętrzne...
Po pierwsze to powinieneś najpierw zadbać o TL0 bowiem to on "ucierpi" w pierwszej kolejności pod wpływem impulsów z licznika. Korekty dokonujesz dodając niezerową zdefiniowaną stałą do obecnej wartości młodszego bajtu licznika. TL0=TL0 | 0x30; TH0=0xF8; W asemblerze będzie to: ORL TL0,#30h MOV TH0,#0F8h Można także dokonać dodawania jak zaproponował...
(at)Gunis-92: Możesz wykorzystać do odmierzania czasu np. SysTick [syntax=c] volatile uint32_t licznik_tykniec;// zmienna globalna /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec = licznik_tykniec;...
Inicjacja timera w trybie normalnym, z odpowiednim prescalerem. Zezwolenie na przerwania od OVF + załadowanie timera wartością (0xffff-wyliczona wartość). Tak będzie działać z 10Mhz. W każdym przerwaniu przeładowanie timera + (de)inkrementacja zmiennej globalnej :) i to tyle folks;-)
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...
Podaję ładniejszą formę obsługi opóźnienia na SysTick: [syntax=c] #include "LPC17xx.h" #include "lpc17xx_gpio.h" volatile uint32_t licznik_tykniec; /* obsluga przerwania od licznika/timera SysTick */ void SysTick_Handler(void) { licznik_tykniec++;// inkrementacja licznika } void delay(uint32_t czas) { uint32_t aktaualny_licznik_tykniec; aktaualny_licznik_tykniec...
Cześć, Mam taki fragment kodu: [syntax=c] static const volatile uint32_t systick = 0; uint32_t GetTimeUs(void) { return systick; } void HAL_SYSTICK_Callback() { systick++; }[/syntax] który się nie kompiluje, dostaję taki błąd kompilacji. [syntax=c]../Application/Time.c:31:19: error: increment of read-only variable 'systick'[/syntax] Z tego co wiem powinno...
Wystarczy ustawić go na zewnętrzne przerwanie i nie wyzwalać go zboczem tylko poziomem :) W przerwaniu robić inkrementację temperatury
Zasadniczo możesz wczytywać znaki w samej pętli już, którą przerwiesz, gdy napotkasz znak o wartości ASCII mniejszej od poprzedniego (nie musisz wykorzystywać wcale tablicy). 2. Warunek po kodach ASCII oraz inkrementacja dwóch zmiennych (w zalezności od rodzaju znaku)
To nie pozostaje nic innego, jak zrobić w/g wskazówek najlepiej sygnał taktujący zliczaniem podaj na pin INT0 lub INT1 i ustaw przerwanie żeby reagowało na zbocze. Wtedy inkrementacje zrobisz w przerwaniu a w pętli głównej tylko wyświetlisz wynik. . Tylko jaka jest maksymalna częstotliwość? Bo, może się okazać, iż przerwanie trzeba będzie napisać w...
Wiem, wiem ale jak w obsłudze przerwania dałem tylko ten fragment z inkrementacją, a do maina switch(), to efekt był taki sam
1)Okej, czyli procedura przerwanie_od_T0 trwa 1 s ? 2)Gdzie tutaj miejsce dla właściwej treści programu, pomiędzy TR0=1 ,a while(1) w programie głównym? 3) Chciałbym uzyskać procedure która trwa równo jedną sekundę używając timerów, bo ponoć tak jest najdokładniej. Chciałbym później ta procedurę, SEKUNDA wykorzystać w dalszej części programu. 4) pojecia...
Rzeczywiście takie jest działanie układu przerwań w systemach mikroprocesorowych. Dzięki temu przerwanie może czekać w kolejce na swoją obsługę, nawet gdy obsługiwane jest w tym czasie inne. W twoim przypadku ponownie włączając przerwanie dla int0 powinieneś, jak słusznie zauważyłeś, wykonać dwie instrukcje: wyzerować bit INT0(GIFR,6), a następnie włączyć(zdjąć...
ustawias z wolny timer na najdłuższy czas jak sie da. w przerwaniu dajesz inkrementacje tak jak pisał kolega następnie dalej w przerwaniu dajesz porównianie czy zmienna osiągneła daną wartość. jeśli tak to wyswietlasz to co chcesz i zatrzymujsze timer i zerujesz zmienną. chyba źle zrozumiałeś kolegę. w pętli głównej nic nie musisz robić
Oddzielam temat od poprzedniego ze względu na inną naturę problemu. Master generuje przerwanie od Timera2 co 1.15ms. Transmisja SPI ustawiona jest na CLK/4 co przy ośmiu bitach daje czas transmisji równy 0.004ms. Co jedno tyknięcie timera wysyłany jest jeden bajt - zatem 0.004ms co 1.15ms. Działa to wszystko pięknie, bez lagów i przepełniania stosu....
Możesz użyc tzw. flag w programie. W programie obsługi przerwania od timera musisz stworzyc znacznik minięcia określonego czasu. Oto fragment programu w którym w przerwaniu Timera ustawiam taki znacznik. [syntax=c] //--------------------------------------... // czesc wspolna procedury obslugi przerwania //--------------------------------------...
Tak, wiem, dlatego napisałem teoretyczne. Czas przetwarzania oraz zapisywania do tablicy również trzeba uwzględnić. Ale to raczej nie ma nic do tego szatkowania przebiegu.. po prostu próbkowanie odbywa się z mniejszą częstotliwością ale nie rozumiem czemu przykładowo 2, 3, 4 itd element tablicy ma tą samą wartość, skoro jest to już zapis z poprzedniego...
to tylko przykładowy fragment, nie mam zamiaru zamieszczać całego kodu, dodam że całość działa, a z góry ustalone pojedyncze znaki wysyła do PC bez problemu. Chodzi mi, że nie wiem czemu nie chce wysyłać po inkrementacji. Hmm przerwanie timera nie chce mi jakoś działać, ale popróbuję. Nie powinno się użyć jakiegoś TIMERA, który zmienną czasową przechowywałby...
Przerysowywac należy wtedy kiedy zdarzy się coś co spowoduje konieczność takiego przerysowywania. Bardzo chętnie zrealizuję przerysowanie w reakcji na zdarzenie jakim będzie inkrementacja zmiennej "procent" (inkrementacja realizowana będzie w metodzie obsługi przerwania od timera). Tylko nie wiem jak to zrobić. Mój kod realizuje przerysowanie od zdarzenia...
Ty ustalasz reguły, jak często następuje przerwanie CTC, a w nim tylko zmieniasz wyświetlaną cyfrę. Cyfta będzie się cały czas świecić aź do następnej zmiany. Ok, ustawię by wywoływał się co 150Hz, natomiast skąd Wy wiecie, że 98% czasu procesora to będzie czas dla main? Przez to, ze pozbędę się delayów w przerwaniu? Moje założenie było takie, by w...
Niestety dalej ten sam objaw, tak jakby licznik sie nie przeladowywal lub jego przeladowanie nie powodowalo przerwania tj. inkrementacji n A co do debugera to nie potrafie za bardzo go uzywac.
ogolnie jest zasada tak ze w przerwaniach nie powinno byc jakis procedur opozniajacych, przerwanie powinno sie wykonac , obliczyc i wylaczyc jak najszybciej,glowny program jest od czasowek , komunikacji i2c itp. przynajmniej ja sie staram trzymac tych zasad.czasami mozna je nagiac oczywiscie.to zalezy od zlozonosci projektu. ja PCF8583 obsluguje zawsze...
float pulse_frequency; - powinien być volatile bo jest operacja na przerwaniu. Ale ja właśnie potrzebuję aby mieć chociaż jedną liczbę po przecinku To w czym problem zrobić pulse_frequency -liczbą całkowitą i tak na przerwaniu jest inkrementacja zmiennej o liczbę całkowitą A w literperhour = (pulse_frequency * 60 / 7.5); Czemu nie przyjąć za punkt oszukania...
Mam dwa pytania. 1. Czy jest możliwy pomiar częstotliwości 5 sygnałów przy użyciu F2013 wyposażonego jedynie w dwa rejestry porównująco-przechwytujące? 2. Nie jestem pewny czy dobrze rozumiem sposób pomiaru częstotliwości wejściowego sygnału, więc proszę o potwierdzenie lub nie prawidłowości mojego rozumienia: 1. Definiuje wejściowe piny jako źródło...
Słyszałem o przerwaniach, ale trzeba by brać poprawkę na czas potrzebny do obsługi przerwania.Zauważ ze z każdą inkrementacją sekundy błąd stale rośnie. Kiedyś napisałem zegarek w BASCOMie właśnie z użyciem przerwań i po kilku tygodniach widać było wyraźne odchylenia, natomiast w zegarku z użyciem PCF8583 nie ma takiego problemu.
ustawiasz DMA w ADC, W odpowiednim strumieniu DMA - kanał, kierunek, ilosć transmisji, adresy, inkrementacja i jezeli potrzeba przerwanie - ja np używam do obsługi błedów i sygnalizacji że dane sa w pamięci.
Nie stosuj itoa w przerwaniu, tylko jakąś flagę dla pętli głównej, że możesz przekonwertować czas.
Wybacz ale nie znam dokładnie twojego mikrokontrolera, ale w Atmega zdecydowanie lepiej jest ustawić taki preskaler aby czasy jak w one-wire po prostu do niego ładować i stan nóżki z termometrem zmieniać programowo w przerwaniu - w końcu po co robić programowo licznik skoro masz sprzętowy, który nie zajmuje procesora z tak błahego powodu jak inkrementacja...
Jeszcze raz podstawa - wrzuć obsługę inkrementacji minut i godzin DO PRZERWANIA. Inaczej w pewnym momencie zgubisz tu sekundę, tam sekundę i będzie się rozjeżdżać bardziej niż by na to wskazywał błąd kwarcu...
Może przerwania wcale nie są generowane co 1s i inkrementacja zmiennej czas_przyciskania_plus odbywa się tak szybko, że szybko jest ona większa od 2? Twój warunek może być maksymalnie spełniony przez 1s w przypadku ciągłego wciśnięcia przycisku. Nie zamieściłeś całego kodu ale może zastąp warunek czas_przyciskania_plus==2 warunkiem czas_przyciskania_plus>=2....
Banalne pytanie: Skąd wiesz, że to timer nie zgłasza przerwań częściej? Na moje oko to wywołania procedur HAL_cośtam zżerają tyle czasu, że przerwanie timera ciągle wisi, bo nie nadążasz z jego obsługą. Prosty test - umieść w obsłudze przerwania tylko kasowanie znacznika i zapis portu (rejestru, nie HAL_cośtam) albo inkrementację zmiennej.
hmm no dobra, czyli po prostu mogę w tym samym przerwaniu dać inkrementację zmiennej? A jeśli mam licznik ustawiony w tryb CTC, pracujący z częstotliwością 1kHz i faktycznie przerwanie od przepełnienia, to ta zmienna będzie się inkrementowała z taką właśnie częstotliwością tak? czyli 1kHz=0,001s, więc jeśli chcę odmierzyć 1 sekundę to w programie głównym...
wprowadź w programie flagę statusu połączenia ,przy odbieraniu danych flaga przyjmowała by wartość 1 ,w przerwaniach od timer wprowadź warunek jesli flaga jest rózna od 0 następuje inkrementacja jej , przy istnieniu transmisi flaga przyjmuje wartość 1 jesli jednak brak transmisji ,w przerwaniach od timera wartość flagi bedzie rosła ,do ilu ? zależy...
Ok, moje błędy, niemniej wcale mi to nie pomogło, mówię, widzę brak inkrementacji z IDE Simulator po prostu. A to dziwne, bo sobie wkleiłem twój kod, wywaliłem to cli/sei z przerwania i wszystko działa ok. Co znaczy, że nie widzisz brak inkrementacji? U mnie wchodząc w przerwanie TCNT0 jest równy 8, potem 12 i 15, bo tak jest kompilowana obsługa przerwania....
To chyba w dziesiątkach milisekund jak 2 cyfry po przecinku. Najprościej to będzie na jakimś Atmelku z kwarcem + kondensator strojący - trymer (by maksymalnie dokładnośc ustawić). Ewentualnie zewnętrzny generator precyzyjny. Pomiar czasu w przerwaniach co 10 ms. Przerwanie najpierw dokonuje inkrementacji czasu a potem np. obsługuje wyświetlacze multipleksowo....
Ale i tak masz stały wzorzec czasu, czyli o więcej niż 1s nie powinno się rozjechać... + - impuls/inkrementacja _ - bezczynność/brak impulsu ______+______+______+______+______+_____... - przebieg impulsu z zegara _______+________+_____+_____+________+__... - inkrementacje sekund i nie ważne ile by nie trwało przeładowywanie timerów i programowych liczników...
Przede wszystkim tak jak już napisał emarcus na początku, wyrzuć wszystko co niepotrzebne z obsługi przerwania zostaw tam samą inkrementacje sekundy a całą reszt wrzuć do głównej pętli, wtedy powinieneś osiągnąć 1s=const. W zasadzie to jest prawidłowy sposób wykorzystania przerwania. To obsługa tak "skomplikowanego" przerwania generuje Ci błąd.
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...
O taką odpowiedź własnie mi chodziło. Rodzi sie kolejne pytanie: Skoro timer0 mam już zajęty generowaniem impulsu służącego do naliczania sekund... Mam zaprząc do obsługi wyświetlacza kolejne przerwanie, czy wpakować przełączanie anod, i szukanie odpowiedniej wartości dla portu, na których wiszą katody w tym samym miejscu, co inkrementacja zmiennej...
Platon - rzeczywiscie masz racje. Wygladaloby to chyba tak : przy kwarcu 4MHz jeden takt zegara trwa 0.25us, co daje przerwanie po 64us (0.25us * 256 taktow, przy Preskale = 1). W obsludze przerwania nastepuje np. inkrementacja jakiejs zmiennej. Po zakonczeniu impulsu i zatrzymaniu timera2 trzeba pomnozyc wartosc tej zmiennej przez te 64us. I to bylby...
Dobra, poradziłem sobie inaczej. Użyłem timera, ale nie korzystałem z przerwań, tylko ustawiłem częstotliwość inkrementacji timera na 1us i czekałem, aż wartość timera przekroczy zadany czas ;) Na potrzeby 1-wire wystarczyło :)
użyj timera oraz przerwań ,wprowadź do programu zmienną która bedzie ulegać inkrementacji podczas przepełnienia timera
Hmm- nie rozumiem. Przerwanie jest sprzętowe- co 2ms. Oczywiście nie wiem jak długo Bascom wykonuje operacje na single- pewnie długo. I operacje na LCD- też długo- chociaż wielokrotnie szybciej niz bez odczytu RW. Sugerujesz że inkrementację należy robić w przerwaniu? Dobrze- ale z drugiej strony obsługa przerwania ma być krótka. Jak zrobić żeby ten...
Przerwanie z inkrementacją całego zegarka zajmie max. 80 taktów (a pewnie sporo mniej), więc szalone optymalizacje nie mają tu sensu. Atrybut register wg .standardu języka C służy wyłącznie do tego, żeby przy próbie pobrania adresu zmiennej kompilator sygnalizował błąd. W przypadku, który pokazjesz, mamy do czynienia z niestandardowym rozszerzeniem...
Nie o to mi chodziło ale mniejsza z tym :) Poprawka oprogramowania z 14 kwietnia. Dziś sobie przypomniałem, że jak zaczynałem robić oscyloskop (jeszcze na wyświetlaczu L2F50) miałem go w drugą stronę (Jakby do góry nogami) i dlatego zapisywanie do bufora próbek musiało być wykonywane od tyłu żeby potem dobrze było to wyświetlać. I zapomniałem potem...
Light-I -> wszystko w porządku ale osunąłbym to ustawianie czasu w pętli głównej. Bo bez wciśniętego przycisku zmienna ta z 0 przechodzi na 0xFFFF; Kod jest sprawdzony na dyżurnym µC, o czym pisałem wyżej, to nie są jakieś banialuki "na sucho"... Nie przyjrzałeś się dokładnie obsłudze zmiennej Key_locktime w przerwaniu, gdy jest równa 0, nie jest...
Jaki zysk z tego ze cały odczyt w przerwaniu? W/g mnie żaden. I do tego przerwanie co 1 sek? dla mnie bzdura. Niech sobie przerwanie bedzie co sek ale w przerwaniu zrobic tylko inkrementacje dowolnej zmiennej. Reszte przepisac do głownego i sprawdzac czy ta zmienna sie zmieniła a w przypadku zmiany wykonać odpowiedni odczyt w zaleznosci od warosci tej...
hmm, przerwania co 20 instrukcji procesora ;-) Wydaje mi się, że nie uwzględniasz czasu pomiędzy wywołaniem przerwania a ustawieniem timera. Dla przykładu ; INTERRUPT ORG0x004 ; interrupt vector location btfscINTCON,T0IF; TMR0 overflow gotoserv_t0 retfie ; return from interrupt serv_t0 bsfPORTC,0 movlw.256 - (.20 - X) movwfTMR0 bcfINTCON,T0IF;...
Jak jest zadeklarowana zmienna Flaga? Litości, to są podstawy 😉. Volatile... R Dodano po 5 (at)robiw Pokaż resztę kodu. Ta część jest ok. Jutro zamieszczę, jestem poza domem. Ale generalnie nie ma tam nic takiego: konfiguracja timera TB0 według zamieszczonego kodu (łącznie z przerwaniem), sei() oraz pętla główna, w której wyświetlam zmienną...
Można też tak: '''''''''''''''''''''''''''''''''''''men... glowne'''''''''''''''''''''' Sub Menu Cls Menu_number = 1 Do Keyscan Waitms 300 Select Case Key Case 0: Incr Menu_number If Menu_number = 11 Then Menu_number = 1 Case 2: Decr Menu_number If Menu_number = 0 Then Menu_number = 10 End Select Lcd " MENU " Lowerline Lcd Menu_number...
Nadmieńmy jeszcze jedno - w C instrukcja ta działa trochę jak "goto", a nie jak pascalowy case. Zatem przejście do warunku 1 spowoduje też wykonanie 2, o ile nie zostanie jawnie zapisane przerwanie (break).
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....
0. Stos pozwala m.in zapamiętać kolejność powrotów i zagnieżdżać przerwania i procedury, czego by się nie dało prosto zrobić na rejestrach. 1. Wektory przerwań zależnie od typu procesora mogą być umieszczone na poczatku, końcu programu lub w innym obszarze. W przypadku popularnych ósemek faktycznie na początku 2. W niektórych procesorach zamiast rozkazów...
Load Timer0 = 45 - jak sądzę oznacza nadanie wartości początkowej timerowi. Oznacza to, że powinieneś załadować tę wartość do rejestru TCNT0. Zakładam, że funkcja inicjująca BASOM inicjuje go w tryb normalny (czyli mode 0). W funkcji przerwania: - Incr A, Incr B - po prostu dodaj jeden do zmiennych A i B lub wykonaj inkrementację - If A = 305 Then ......
Żeby dokładnie odliczać czas musisz użyć timera z automatycznym przeładowaniem (tryb 2 timera 0/1, albo timer 2), albo nie przeładowywać timera wcale. Żeby obliczyć czas pomiędzy przerwaniami mnożysz N * 12 / Fosc, gdzie N = liczba inkrementacji licznika pomiędzy przeładowaniami. O tym jak napisać funkcję obsługi przerwania poczytasz w dokumentacji...
Czytam i sam się pogubiłem hehe . Czy tu chodzi o względne przesunięcie (tmf) czy bezwzględne (satanistik). Parę miesięcy temu robiłem sterowanie PID dla servo Xmega w bascom . [youtube]https://www.youtube.com/watch?v... Nie obyło się bez problemu , który polegał na zliczaniu bezwzględnym więcej niż 65535 impulsów . Mój wpis z innego...
Witam, Zacząłem pisać program na atmege8 w bascomie, do sterowania preampem tda8425 przez enkoder, wyświetlając to wszystko na LCD póki co 8x2. Program jest w fazie powstawania, ale mam kilka pytań co sądzicie o moich rozwiązaniach i czy tak w ogóle może być? Enkoder obsługuję przez INT0 i INT1, zbocze opadające. Jeśli wejdzie w procedurę przerwania...
No tak, nie zauważyłem, że urządzenie jest odpalane z przycisku, niezbyt jasno to jest opisane. Wydawało mi się, że przerwanie INT0 jest od któregoś z czujników 1-wire. Przykład, który podałem nadaje się raczej do systemu cały czas włączonego. Dodano po 9 Co do czasu wykonywania przerwania to nie będzie trwało 100ms. Tylko dużo, dużo, krócej bo tylko...
Jak rozumiem chcesz defakto dzielić częstotliwość przebiegu jeżeli tak to nic prostszego: pętla for inkrementowana stanem wysokim np. i po osiągnięciu określonej ilości powtórzeń zmiana jakiegoś pinu "wynikowego" na stan przeciwny. problem się zacznie jak będziesz chciał podzielić przez liczbę inną niż wielokrotność 2 nie mam pomysłu jak takie dzielenie...
no to ja mam znow pomysl na garsc poprawek [; w przerwaniu: 1. if (nr > 1) {nr = 0;} jak widze nr oznacza u ciebie jakby 'faze' danego bitu. zamiast wiec kombinowac z ta cala inkrementacja i sprawdzaniem, zrob po prostu XOR'a: nr^=1; tym sposobem bedzie ta zmienna rowna na zmiane 1 i 0. niemniej jednak zauwaz, ze twoja zmienna nr to jest ... ostatni...
Witam, 2) Jeżeli chcę w przerwaniu ustawić flagę , czyli zmienną typu char, to czy szybciej będzie, jeśli zrobię to jako flaga=1; czy flaga++; ? Oczywiście zdaje sobie sprawę, że druga opcja może spowodować po jakims czasie przepełnienie i wyzerowanie się mi tej flagi, ale sytuacja jest bardzo rzadka, więc nie obawiam się takiego przypadku. Przerwanie,...
Jeszcze prościej: trzymaj ten licznik w postaci tylu bajtów, ile masz cyfr dziesiętnych - po jednej cyfrze w bajcie. Inkrementacja takiego licznika jest całkiem szybka, a jego zawartość jest stale gotowa do wyświetlenia.
1) AVR studio nie chce przyjąć typu uint_8t 2) Przy preskalerze na 1024 i kwarcu 1MHz przerwanie jest co ponad 260ms. Obsługa przerwania nigdy się nie włączyła nawet jeżeli kod był napisany tak, że samo przerwanie to była zaledwie inkrementacja zmiennej. Przy maksymalnie odchudzonym kodzie przerwanie nadal nie działa! Timer powinien się zatrzymać. #include...
chodziło mi o zupełnie co innego. potrzebuję raczej timer odmierzający czas rzeczywisty a na jego bazie muszę wchodzić z przerwań do pętli zadawania trajektorii i problem jest w napisaniu tego timera, zwykła inkrementacja na końcu każdej pętli jest złym pomysłem.
Witam! Od jakiegoś czasu bawię się AVR Studio 4 po przesiadce z BASCOMA. Jak narazie jest nieźle ;) ale mam mały problem. Mianowicie, chciałbym sobie przy pomocy ADC próbkować sygnał z częstotliwością X (dajmy na to 8kHz) i zapisać go do tablicy. O ile w BASCOMIE napisałem sobie taki programik (przerwanie Timer2 8kHz, w przerwaniu odczyt ADC do tablicy...
Ciężko mi się odnieść do tego bo nie mam aż takiego doświadczenia. To co napisał Rariusz to wiem z teorii. Jak przerwanie byłoby długie to wydłużyłoby działania całego programu i to o bardzo wiele ms. Jeżeli MB20 jest inkrementowane w przerwaniu, może się zdarzyć, że przerwanie wystąpi pomiędzy sprawdzeniem warunku a faktycznym użyciem MB20. Operacja...
Hmm, sprawdziłem ten warunek jednak nic się nie zmieniło. Analizując Twojego if'a, wychodzi mi że w momencie kiedy channal == 4 następuje inkrementacja na 5 po czym jest on zerowany gdyż channal > 4. Więc w obsłudze jednego przerwania jest to wykonywane. Nie zmienia to faktu że nadal nie działa odczyt ze zmianą kanałów poszczególnych.
Timer 1 potrafi działać w trybie CTC tak, że przy zauważeniu równej wartości licznika z rejestrem OCRA może sam zmienić ci stan jednej końcówki procka zwanej OCR na przeciwny. Włącz sobie taki tryb - to wtedy będzie ci to działać automatycznie - czyli bez procedury obsługi przerwania , w pełni sprzętowo. Aby to zrobić zaprogramuj bit COM1A0 czyli TCCR1A|=(1<<6)...
A dokładniej aby nie została przerwana w momencie da niej krytycznym - między przepisywaniem zmiennej data do bufora i inkrementacją zmiennej ut1_end. W czym przeszkadza, ze przerwanie od np timera, który nie ma nic wspólnego z UART, wykona się pomiędzy krytycznymi operacjami? Jeśli natomiast chodzi o przerwanie, które może wywołać odbiór czy tam nadawanie...
Tak na szybko, to powinieneś dorzucić do przerwania jakąś zmienną którą możnaby inkrementować i obliczyć ile takich inkrementacji jest potrzebne dla konwersji danych dla ds18b20. Potrzebujesz 750ms o ile się nie mylę, więc lepiej to dorzucić do przerwania niż stosować WAIT 1. Zlicz ilość przerwań aby Ci wyszło >750ms i daj IF'a dla odczytu DS'a. Z Wait...
Przepraszam, przeoczyłem znacznie grubszy błąd. Problemem jest to, że inkrementujesz x i y zarówno w przerwaniu, jak i poza nim. Zupełnie nie wiem, po co to robisz, ale to na pewno nie zadziała dobrze - po drodze zgubisz parę inkrementacji, i żadne volatile na to nie pomoże. Możesz w pętli zerować zmienne, które inkrementujesz w przerwaniu, ale nie...
IRQ tester https://obrazki.elektroda.pl/3243423400_... IRQ Tester to proste narzędzie, głównie do testowania czasu odpowiedzi na impulsy, lub czasów międzyzboczowych dostarczonego sygnału. Program został napsiany na ukontroler AVR Atmega168, a jego głównym zadaniem jest funkcja multiwibratora monostabilnego, którego działanie polega...
Doskrobałem trochę kodu, program działa jeżeli w linii CJNE A,03h,LOOP zmienię 03h na np. #03h co da mi dokładnie taką wartość, a nie wartość rejestru (będzie skakać do etykiety CORRECT jeśli nacisnę '3' na klawiaturze. Może linijkaMOV R3,#32h nie jest poprawna? Z tego by to wynikało. Ponadto aktualnie mój timer może zliczyć coś około 13 sekund, pomyślałem...
Aby wejść do drugiego warunku i musi przyjąć wartość co najmniej 256, co jest nie możliwe, bo przy i == 255 program nie wejdzie do pierwszego warunku w którym jest inkrementacja. W drugim warunku z kolei nie osiągnie wartości potrzebnej do wyzerowania i. Czemu nie nie zastosujesz if()...else?
Drogi kolego , popełniłeś szkolny błąd :D W procedurze obsługi przerwania Timer0 masz ... SIGNAL(SIG_OVERFLOW0) //obsługa multipleksowania wyswietlaczy { //extern unsigned char wyswietl[7]; unsigned char licznik;//<-- ********** błąd !!!!!!!!!!! ... zmienną licznik , tyle że jest to zmienna lokalna , czyli istnieje w pamięci...
1 Nadal źle napisane Load Timer. 2 Brak inkrementacji zmiennej Sekunda. 3 Sprawdzanie warunków powinno być w pętli lub (gorsze rozwiązanie) w przerwaniu.
A przerwania chociarz umiesz?, jedno wyjscie z impulsatora podłaczasz pod przerwanie, drugie wyjscie do jakiegokolwiek innego pinu. w obsłudze przerwania od impulsatora sprawdzasz stan tego drugiego pinu i jeśli jest on równy 1 to wykonujesz jakąś tam operacje (np inkrementacja), jeśli = 0 to wykonujesz coś innego (np dekrementacje)
Zmieniasz wartość x w przerwaniu i w pętli główniej (pętlą while) - to jest jakaś forma wyścigu? Co ten program ma robić? Ja przypuszczam co się dzieje ale opisz swój mechanizm myślenia- bo może coś mi umyka. Ano umyka. X w przerwaniu to zupełnie inna zmienna niż x w pętli głównej. Obie są lokalne. A co do problemu autora: Nie sądzisz, że inkrementacja...
Witam; jestem początkującym, więc proszę nie śmiejcie się z pytania. Ale ledwo co w miarę dobrze zrozumiałem pojęcie wskaźników i zaczełem je używać a teraz chciałbym zrozumieć wskaźniki na funkcję. Tyle tylko, że kompletnie nie mogę zrozumieć ich sensu, do czego służą, kiedy się przydają. Czy mógłby któryś kolega podać mi jakiś uproszczony przykład...
Możliwe, że trzeba dać tranzystorowi czas na otwarcie, jedno NOP może nie wystarcza, a więc odczyt portu przycisków należało by raczej umieścić na początku procedury obsługi przerwania. Wiersze klawiatury w tablicy będą wtedy przesunięte, chyba że operację inkrementacji licznika też się przeniesie.
Hmmm... do tej pory żyłem z przeświadczeniem, że standardowo w AVR przerwania nie da się przerwać innym przerwaniem... Ale ja rzeźbię w asm i też kopiuję istniejący kod... ;)
problem w tym ze na razie piszę to na AVR tak dla siebie, żeby się wprawić w pisaniu programów w C ale później będą do tego wykorzystywane bardziej zaawansowane procesory. Chciałem jeszcze zrobić tak by każdy silnik pracował z inna ale z góry ustaloną prędkością dlatego miał by być przerwanie a w nim inkrementacja zmiennych k1,k2,k3 które będą taki...
Dużo kodu, ale patrząc po opisie objawów program wykonuje przerwanie od odbioru. W nim masz dwa wywołania funkcji i jedną inkrementację zmiennej. To ostatnie chyba możesz wykluczyć. Tak więc pozostaje niepoprawne wywołanie lub wykonanie CAN_GetITStatus(CAN1,CAN_IT_FMP0) lub CAN_Receive(CAN1,0,&RxMessage) Czy w STM32F103 nie trzeba wyczyścić jakichś...
If Flaga_1s = 1then To tak ma być? Trzeba zacząć oszczędzać- może Timer jednak w innym trybie? Load Timer0 , 250 W trybie przechwytywania czy porównania oszczędzamy instrukcję podstawienia. No i LCD- w bascomie jest jakaś biblioteka obsługi LCD sprawdzająca flagę zajętości LCD- pozwala to trochę oszczędzić czasu. No i może w przerwaniu tylko inkrementować...
inkrementacja przerwać bascom inkrementacja przycisk inkrementacja
polar wypompowuje moduł zawieszenia odzyskać zdjąć telefon
Jak usunąć zablokowane konto Google z Galaxy A14 5G Check Brake Pads - Co oznacza ten komunikat?