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...
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,...
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...
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...
Bufor cykliczny - tablica o długości N bajtów. Dwa wskażniki na elementy tegoż. Pierwszy wskażnik do odczytu (wo), drugi do zapisu (wz). Początkowo oba wskażniki ustawione na początek bufora. Zapis: Procedura przerwania po każdym odebranym bajcie zapisuje go w miejscu wskazanym przez wz. Następnie wz jest inkrementowany i jeżeli wskazuje na element...
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...
Emulator ma funkcję zachowywania śladu programu, którą właśnie trochę rozszerzyłem, dzięki temu udało mi się odtworzyć to, co emulator faktycznie wykonuje. Próbowałem odszyfrować, co tak naprawdę ma robić ten program. Czy dobrze opisałem? W komentarzach zadałem pytania dotyczące wątpliwości, chyba nie zrozumiałem do końca, co autor miał na myśli i jak...
http://obrazki.elektroda.pl/9589280700_1... HPS 2014 Hybrydowy laboratoryjny zasilacz sieciowy. Parametry użytkowe zasilacza w skrócie: 1. Wykorzystanie tanich i łatwo dostępnych elementów. 2. Wydajność prądowa min 3A (dla niskich napięć może dochodzić do 5A). 3. Rozdzielczość DAC 12bit. (filtrowany PWM 4.9kHz) 4. Rozdzielczość ADC...
http://obrazki.elektroda.pl/3025550100_1... Mając do dyspozycji jedną matrycę 8x8 czerwonych diod LED o boku 60,2mm oraz mikrokontroler ATtiny861 pozostałe po innych projektach postanowiłem zbudować to, co każdy elektronik chociaż raz w życiu zbudować musi: zegar ;). Ze względu na charakter wyświetlacza miał to być zegar binarny, ale...
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...
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.
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...
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...
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ś...
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...
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...
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 //--------------------------------------...
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...
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....
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...
Pewien nie jestem, ale spróbuj zmienne używane w przerwaniu zadeklarować jako volatile, kiedy ja używałem zmiennych w przerwaniu które nie były zadeklarowane jako volatile to też mi program nie działał, wspomniana deklaracja pomogła, z tą różnicą, że u mnie zmienne te były zmiennymi globalnymi, no ale spróbować nie zaszkodzi, a pomóc może. ;)
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...
O to właśnie chodzi - inkrementacja adresu. Ja już jakiś czas temu doszedłem do tego, że testowanie BUSY spowalnia działanie oprogramowania nie dając żadnego zysku (i zajmując dodatkową linię portu do sterowania R/W). Obsługa w przerwaniu timera nie wprowadza opóźnień i minimalizuje czas procesora potrzebny na interakcję z LCD.
Albo puścić na piny, który generują przerwania, a jeśli nie ma takiej możliwości to wrzucić na dowolny port IO, a sygnały zsumować przy pomocy diod (zrobić wired-AND) i zsumowany sygnał puścić na wejście INT. W przerwaniu INT odczytywać porty i XORować z ich stanem poprzednim. Jedynki wskażą piny które zmieniły stan. Potem pętelka, rolowanie i inkrementacja...
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...
Witam! Dopiero zaczynam i nie mogę sobie poradzić z poprawnym zliczaniem w przerwaniu pochodzącym od Timera2 w trybie CTC. Chciałem wykorzystać programowe Timery, które są pomysłem Pana Kardasia (korzystam z jego książki) do tego aby jeden z nich tykał co 1sek. Zacząłem, więc tak: 16MHz/1024/125/125 daje teoretycznie "cyknięcie" co sekundę, a u mnie...
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...
Tak napisałeś ale wtedy mi za wolno o dziwo działał program i np. raz na 3 pstryknięcia działało z przyczyn mi do końca nie znanych. Wykrywanie stanu enkodera powinno się odbywać na przerwaniu np INT0. Zwróć uwagę, że przy tak napisanym programie przy wykonywaniu fragmentu kodu [syntax=cpp]sprintf(str, "%d", war); LCD_GoTo(1,0); LCD_WriteText(str);[/syntax]...
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...
Myślę, ze BlueDraco chcąc wyjaśnić namieszał autorowi jeszcze bardziej. Pierwsza kwestia volatile. Tu faktycznie mamy tylko kwestie języka C. Taki modyfikator mówi kompilatorowy : nie optymalizuj. Jeśli jest przypisanie to je wykonaj. Jeśli jest modyfikacja to ją wykonj. Gdy nie ma takiego modyfikatora kompilator może instrukcję pominąć (np przypisanie...
Kolego ... Tutaj masz specjalnie przygotowany kod dla Ciebie. Srodowisko WinAVR dla atmega8 8MHz W srodku jest driver do display który będzie wyswietlał czas ze struktury ( MIN , SEC ) W pliku aplikacji jest funkcja do inkrementacji czasu i dekrementacji. Kompiluje się na pewno, co do działania bez zadnej ppoprawki to glowy nie dam uciąć bo nie mam...
Ten timer 0 jest raczej nie potrzebny. Za bardzo komplikujesz sprawę. Zrób tak: $crystal = 12000000 Config Timer1 = Timer Gate = Internal Mode = 2 Config Timer0 = Tiemr Gate = Internal Mode = 2 Enable Timer1 Enable Timer0 Enable Interrupts Dim P1 As Byte Dim P2 As Byte pwm: // to sie robi jak przerwanie z timera przychodzi inc P1 // inkrementacja...
Temat często powraca, a rozwiązania ... takie sobie. Skoro czas wykonania przerwania jest wyznacznikiem ilości obsługiwanych serw to go skróćmy. We wszystkich opisanych rozwiązaniach w przerwaniu wykonuje się lwia część logiki, a występujące rzadko przestawienia wartości to funkcje zawierające jedną instrukcję. Bez sensu. Proponuję zmienić format danych...
Moje rozwiązanie jest bardzo podobne do tego, o którym Ty mówisz z tą różnicą, że ja mam 2 bufory zamiast jednego. W przerwaniu timera masz tylko ładować do PWMa bajt z bufora wskazywany przez wskaźnik, nic więcej nie robisz w przerwaniu, a juz na pewno nie przeładowanie bufora lub jakieś inne czasowożerne procedury, tam tylko flagi. Ma to być jak najbardziej...
Witam, próbuję od wczoraj przerobić wprost w Bascomie, dokładnie w przerwaniu pewne polecenie na asembler: PORTA = Lookup(cyfry(nr_wysw) , Tabela) gdzie: cyfry to --> Dim Cyfry(4) as Byte nr_wysw --> Dim nr_wysw as Byte Tabela - to tabela zdefiniowanych cyfr dla wyświetlacza LED mam zrobione wyświetlanie multipleksowane i wszystko działa...
Dość prosto to przeskoczysz. Definiujesz dodatkową zmienną jako znacznik wystąpienia przerwania. W przerwaniu stan tej zmiennej zwiększasz lub ustawiasz na "1". W pętli głównej badasz stan tej zmiennej, jeżeli jest niezerowa, to zmniejszasz ją o 1 i wywołujesz procedurę inkrementacji licznika. Wszystko zależy od tego, jak często przerwanie jest wywoływane...
Makrosik: masz racje, moje niedopatrzenie. Rzucilem okiem na przyklad nie patrzac na dokladna realizacje. Niemniej twoj przyklad jest niezyciowy, bo powoduje gubienie przerwan - jesli licznik jest rowny 0 i nastapi kolejne przerwanie to nie wplynie to na licznilk. Takze powinna byc raczej inkrementacja licznika i jesli jest on rozny od 0 to nastepuje...
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ę...
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....
usunąłem chciałem zobaczyć ile operacji atomowych generuje inkrementacja.
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
> 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ą...
(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;...
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...
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
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;-)
Wiem, wiem ale jak w obsłudze przerwania dałem tylko ten fragment z inkrementacją, a do maina switch(), to efekt był taki sam
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...
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...
inkrementacja przerwać bascom inkrementacja przycisk inkrementacja
udostępnianie samba alarm freeway instrukcja assembler liczba
agregat prądotworczy depollution system faulty peugeot
Pioneer VSX-835 DAB a Tonsil Altus 380S – kompatybilność, moc, ustawienia CV950S-R42 Firmware Download for MAGIC 42" TV, Panel Matching, USB Flashing, Board Variants