Niedawno było: TWI_master.c i TWI_master.h może wydawać się nieco skomplikowany, ale skorzystanie z zaimplemntowanych tam funkcji jest stosunkowo proste. We wątku, do którego link podałem, jest przykład obsługi pamięci I2C z wykorzystaniem tych funkcji.
[syntax=asm] .device ATmega32 .include "m32def.inc" .def temp= r16 .def counter= r17 .org 0 RJMP start .org $016 ;wektor przerwania dla przepełnienia timera RJMP przerwanie start: ldi temp, high(RAMEND) out SPH, temp ldi temp, (1<<CS00) | (1<<CS02) ;konfiguracja preskalera i zegara out TCCR0, temp ;w rejestrze TCCR0 (ustawienia główne timera)...
Możesz użyć jednego timera. Procedura obsługi przerwania nie może przeszkadzać w obsłudze innych przerwań. W Twoim przypadku nie ma innych przerwań, więc jedyny warunek to ten, żeby procedura obsługi wykonała się w czasie mniejszym niż odstęp pomiędzy przerwaniami. To jest w sam raz dobry materiał na projekt z pustą pętlą główną, i tak to należy zrobić.
Tak, są błędne. ATMega32 dysponuje jednopoziomowym systemem przerwań i aktualnie wykonywana funkcja obsługi przerwania nie może być przerwana. Chyba, że jawnie na to zezwoli odblokowując flagę I rejestru stanu. Z AVR dopiero XMEGA posiadają 3-poziomową obsługę przerwań.
Enkodery dają na wyjściu kod Graya i trzeba to zdekodować zanim zaczniesz zliczać impulsy. Jak to zrobić masz w przykładach do mojej książki o C na AVR (link w stopce, przykłady są za darmo).
Mnie wychodzi, że to nie jest tryb CTC tylko normalny. Po drugie na przerwanie compare trzeba zezwolić w rejestrze TIMSK - bit OCIE0 - masz < zamiast << stąd problem. Jak masz jakieś wątpliwości co do konfiguracji, to użyj symulatora AVR Studio. Można sobie w nim też ustawić tryb pracy i odczytać wartości rejestrów kontrolnych dla niego i potem...
W trakcie obsługi przerwania przychodzi następne i czeka w kolejce. I czekać będzie nie ważne jak bardzo zostanie "przeciągnięte" przerwanie.
Magiczne hasło brzmi PULL-UP. Sprawdź w datasheet i tysiącach publikacji w sieci.
Przerwanie jest zgłaszane, gdy zostanie odebrany bajt. Wywal przynajmniej jedno z porównań z 13. Przecież jeśli jest równe 13 to nei ma sensu sprawdzać, czy jest różne od 13. Stare przysłowie pszczół, które cytuję to co 3 dni: żadnego oczekiwania w obsłudze przerwania. Wyrzuć Waitms 100 z obsługi przerwania! Nie możesz również nic nadawać w obsłudze...
źle zdefiniowana funkcja obsługi przerwania. Sprawdź w odpowiednich plikach nagłówkowych.
Walczyłem z tym problemem bardzo długo, napisałem post tutaj no i proszę - problem rozwiązałem parę godzin później. Otóż procesor nie wskakiwał w przerwania od odbiornika (URXC), nie chodzi na 1MHz tylko na 14754600Hz, BaudRate jest 9600. Okazuje się, że w przerwania w kółko wskakiwał, ale od UDRE! - czyli tak jakby po wysłaniu czegoś (choć niczego...
"uznałem że nie ma sensu uruchamiać przerwania na zbocze narastające" Niesłusznie. O ile pamiętam avr sprawdza sprzętowo czy stan się zmienił. Nie napisałeś nic o kwarcu. Dla 16 MHz jest to 62.5ns na okres. Czy masz oscyloskop? "tranzystor BD237 zwierałem INT0 do masy " Chyba BC. Jest tam coś? Jakiś sygnał na kolektorze? Na C się nie znam ale po tym:...
W google piszesz atmega32 i pierwszy link to dokument doc2503.pdf http://www.atmel.com/dyn/resources/prod_...
Aleś teraz na maxa zakombinował, tak zakręciłeś, że szok ;) nie mówiąc już, że nie ma komendy sli(); Krótko odpowiadając na szereg zakręconych i zapętlonych pytań - NIE MOŻNA..... coś całkowicie źle zrozumiałeś zasadę działania przerwań i ich obsługi.
drogi starosto int0 jako przerwanie zewnętrznę może posłużyć np tak jak na laborkach do obsługi odbioru rc5 gdy podczas wystąpienia tego przerwania odbierany jest kod rc5 z odbiornika podczerwieni . pml11
Musisz zastosować przerwania. Poczytaj o przerwaniu np INT0. Ustaw na reakcję zboczem opadającym. Sygnał który chcesz odebrać daj na któreś z wejść INTn np na INT0, a w obsłudze przerwania robisz co chcesz. Wtedy nie stracisz żadnych sygnałów .
Włączasz przerwania z ADC za pomocą ADIE a nie widzę funkcji obsługi przerwania.
Zadeklarowałeś "Zmianna" a przypisujesz "Zmienna". :) Edit: Wyjście z procedury obsługi przerwania wykonuje się za pomocą Return a nie Goto Glowny ! Resztę błędów znajdziesz sam. :)
Wydaje mi się, że podczas wykonywania komend obsługujących LCD (Locate, Lcd) dzieje się jedna z dwóch rzeczy: a) przerwania zewnętrzne są wyłączane (nie są obsługiwane przerwania, które są zagnieżdżone jedne w drugich), ...............) Tak ma być czy robię coś źle? Jakieś pomysły o co może chodzić i jak podejść do problemu? Pokaż gdzie i jak masz...
To co dawid512 napisał jest najprawdopodobniej na atmega32. Musisz poczytać dokumentację i zmienić ten kod, gdyż timer0 na atmega8 ma trochę mniejsze możliwości. [dodano] Można też skorzystać z timer2, jego obsługa będzie łatwiejsza.
Tak na szybko, włączasz przerwania ale ja nigdzie nie widzę żadnej obsługi przerwania.
Niestety klawiatura matrycowa wymaga nieco zachodu z jej obsługą, za to wymaga mniejszej ilości pinów - coś za coś :) Nie wiem jakie dodatkowe funkcje będzie miał program, ale z reguły skanowanie klawiatury robi się w oparciu o jakiś timer, bo dodatkowo należy eliminować drgania styków. Strona ... korzystaj do woli, a w razie problemów pisz na forum...
Sprawdź te fuse bity czy na pewno atmega nie chodzi na wewnętrznym kwarcu. Po drugie w obsłudze przerwania nie powinno być żadnego wait, szczególnie takiego dugiego. Zmień "Load Timer0 = 250" na "Load Timer0, 250"
A gdzie masz funkcję obsługi przerwania z ADC?
kamyczek: tego nie wiemy, bo nie widzimy kodu. Na zdrowy rozsądek timer powinien działać ciągle, również w czasie obsługi przerwania.
Alternatywą będzie zmniejszenia zegara magistrali SPI transmisji i obsługa w przerwaniu.
W zasadzie to jest jeszcze nieco bardziej skomplikowane. Można ustawić jakiś tryb CTC-albo od ICR albo od COMP- i po osiągnięciu tej wartości licznik się wyzeruje. Ale jeśli się wyzeruje np. po osiągnięciu wartości wpisanej w ICR to jeśli wartość wpisana w COMP będzie mniejsza niż w ICR to też wygeneruje żądanie obsługi przerwania w TIFR. Jeśli na to...
Właczasz/ wyłączasz flagi zezwolenia na obsługę przerwań. A nie kasujesz flag przerwań- tych w rejestrze GIFR. One tam zostają- i jak tylko ponownie zezwolisz na obsługę przerwania- to się wykona, no bo flaga przerwania jest ustawiona. Czym innym jest flaga przerwania a czym innym flaga zezwolenia na obsługę przerwania. Co zresztą pozwala na obsługę...
Twoje procedury obsługi przerwań są stosunkowo długie. Np. ISR(TIMER1_COMPA_vect) trwa ok. 670 taktów zegara. Z kolei odstęp między kolejnymi przerwaniami przy zmiennej okres1=127, jak sam napisałeś, wynosi 8*128=1024 taktów. Jeżeli zmienną okres1 zmniejszysz np. do 80 taktów, to przerwania będą częściej niż trwa ich obsługa, więc niektóre zostaną po...
Wielokrotnie wałkowane. W przerwaniu wrzuciłeś transmisje I2C, CLS, obsługę LCD i inne bzdety. Wydłub to i wstaw do pętli głównej programu. W przerwaniu ustaw tylko sobie jakiś bajt/flagę że coś się stało. Teraz obsługa przerwania zajmuje dłużej niż czas pomiędzy przerwaniami. To się musi sypać. Z PCFa możesz też wyciągnąć sygnał zegarowy (skonfiguruj...
Witam i pozdrawiam. Chciałbym co 5 minut wysyłać przerwanie z pcf8583 do atmegi32. W pcf wszystko działa, chyba (co zadany czas odpowiednie bity są ustawione i jak mierzę napięcie pomiędzy wyprowadzeniu pinu int pcf a +5v to najpierw mam zero a po upływie zadanego czasu 5v,czyli int jest w stanie niskim), obsługa przerwania w Atmega32 działa jak trzeba,...
Od strony AVR napisz to od nowa. Napisz asynchroniczną obsługę wysyłania danych po RS, bo tak jak masz być nie może - blokujesz przerwania na długi czas potrzebny na wysłanie danych przez wolny interfejs szeregowy. Kolejna rzecz - jak ten program działa? Na losową pozycję bufora zapisuje odebrany bajt z PC (w dodatku blokując cały MCU do czasu jego...
OK. Należy także pamiętać o tym, że czasami volatile jest niepotrzebnie stosowane do zmiennych używanych tylko w przerwaniu. Takim przypadkiem jest definiowanie zmiennej globalnej z volatile w celu przechowywania wartości pomiędzy kolejnymi przerwaniami. Zamiast tego należy wykorzystać STATIC: http://mikrokontrolery.blogspot.com/2011...
W slave CPHA nie ustwiam. a po co CS1 skoro mogę operować na wejściach PB3 i PB4?? Układ dwóch Atmeg też nie nie działa zbytnio prawidłowo... czy macie przykład sterowania dwoma AVR?? w slave mam jeszcze obsługę przerwania od komparatora i timera
Krótko: LCD nie obsługuje się w obsłudze przerwania, a jeśli już się obsługuje, to zupełnie inaczej (i nie jest to wcale proste). W każdym razie nie możesz w obsłudze przerwania wyświetlić na LCD nawet dwóch znaków.
Nie chce mi się patrzyć do noty aby sprawdzić rejestry... Objaw ten już znam: masz dobrze napisane wektory przerywań? Oraz czy przypadkiem nie włączyłeś jakiegoś przerywania i zostawiłeś je bez obsługi?
Proszę nie odsyłajcie mnie do wujka google bądź noty katalogowej A jednak odeślę cię: http://www.atmel.com/Images/doc8161.pdf Strona 9, oraz strona 57 (tablica). The interrupts have priority in accordance with their Interrupt Vector position. The lower the Interrupt Vector address, the higher the priority. Myślę, że to rozwieje twoje pytania :) A Wujek...
Oczywiście. Wystarczy na początku obsługi przerwania wstawić SEI();
kolega ma kompletnie skopane procedury obslugi przerwań, nie wiem czemu nikt dotychczas tobie nie napisał że obsługa przerwania to nie jest miejsce na stosowanie procedury delay(). To także nie jest miejsce na to aby wstawiać tam instrukcje case-select choć to jeszcze od biedy przejdzie. Przerwanie musi byc maksymalnie zwięzłe. Dla wyświetlacza musisz...
Proszę bardzo o jakąś pomoc, ciągle stoję w tym samym miejscu. Szukałem jakichś porad w Internecie, przeglądałem nawet gotowe już programy ale nic nie potrafię znaleźć. Rozumiem, że w przerwaniu nie może być nic co zajmuje dużo czasu. To jak inaczej do obsługi takiej funkcji wykorzystać przerwanie?:/
OCR0=0x20; /// podobno mozna zjechac do 0 i otrzymac fck/2 Zjechać może i można, ale chyba tylko do sprzętowego przełączania pinu. bo obsługa przerwania w 1 cyklu jest niemożliwa. void timer0_comp_isr(void) { PORTC ^= BIT(0); } Wrzuć co kompilator wyrzuca do assemblera do kompilacji. W sumie na obsługe jest 32 takty razem...
hmmm takie kombinacje.... przacierz można rejestr odpowiadający za przerwanie ustawaiać w czasie wykonywania programu... raz ustawiasz go na zbocze narastające, a potem w obsłudze przerwania na zbocze opadające.
No to trzeba je oprogramować tak, aby nie bruździło... czas obsługi przerwania ok. 1-2 µs (przez wstawkę asemblerową) chyba nie zrobi na transmisji 1Wire większego wrażenia ? Przy 8 MHz mamy do dyspozycji 8 cykli zegarowych w czasie 1 µs, a przy 16MHz - 16 cykli zegarowych. reti zajmuje 4 cykle, cbi / sbi po 2 cykle, ewentualne nop pomiędzy...
Podobnie jak wyżej, proponowałbym porozdzielać program na bloki funkcjonalne, przeanalizowanie jednej dużej pętli głównej może sprawiać problemy nawet autorowi w trakcie pisania kodu. Moje propozycje poniżej. 1) Obsługa "interfejsu użytkownika" realizowana jest w jednym szeregu z obsługą głównej funkcjonalności. Biorąc pod uwagę, że cała obsługa magistrali...
Na szybko: W kodzie przerwań masz _delay_ms(). Zmień kod tak aby w przerwaniach tylko przechwytywać zaistnienie zdarzenia i całą obsługę zrób w głównej pętli. Jeśli masz tak równe odcinki czasu (50ms i 500ms), to zamiast głównej pętli możesz też zrobić przerwanie timera. Ogólnie: Przerwania to nie procesy :) Update: Jeśli chodzi o Twoje pytanie: jak...
no wszystko fajnie ale możesz napisać dokładniej co to znaczy u ciebie, że "się dziwnie zachowuje" ??? bo może problem wcale nie leży w obsłudze przerwania Timera2 - ona wydaje się być poprawna
Wersja z usypianiem w przerwaniu nie działa, gdyż w czasie wykonywania procedury obsługi przerwania flaga I w SREG jest skasowana – przerwania są zablokowane, więc procesor się nie wybudzi z uśpienia.
// ================= PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH ISR(TIMER0_OVF_vect) Błąd. To jest przerwanie od przepełnienia licznika. Przerwanie od porównania to: TIMER0_COMP_vect . W nagrodę Pomógł od mniej spostrzegawczych użytkowników i moderatorów :) A co do tranzystorów, to oczywiście lepsze by były PNP, ale z NPN też będzie działać (trochę...
Przecież włączasz obsługę przerwania ADC: ADCSRA |= (1 << ADEN) | (1 << ADIE) | (1 << ADPS0) | (1 << ADPS1) | (1 << ADPS2); A nigdzie nie masz napisanej jego obsługi ISR( ) więc się resetuje nie włączaj tego bitu
A ustawienie stosu to gdzie ? Kodu w obrazkach się nie wstawia, tylko w tagach code] ] Kod w ogóle to masakra, użyj preprocesora... Co to za "delaje" w przerwaniu ? Obsługa przycisków przez przerwanie to mi bascomem zalatuje...
A niby czemu ma program skakać do procedury obsługi przerwania od przepełnienia? Przecież on się nie przepełnia, tylko po doliczeniu do wartości OCR lub ICR , natychmiast się zeruję ( przy okazji może ,ale nie musi zmieniać stan pinu OC). Musisz uruchomić przerwanie od tego właśnie porównania - czyli od Compare, tak jak wspomniał kolega wyżej. Tylko...
jak przyciskam i trzymam to KEY1 powoduje znaczne zwolnienie pracy licznika można to jakoś ominąć aby on liczył stabilnie gdy KEY1 jest wciśnięty cały czas ? Dzieje się tak za sprawą _delay_ms(80); w funkcji uint8_t klawisz_wcisniety(uint8_t klawisz) Aby to zlikwidować skorzystaj i innej metody eliminacji drgań styków a najlepiej umieść obsługę przycisków...
Z każdym przyciskiem skojarz jedną zmienną, która będzie zawierała stan licznika timera, w chwili wykrycia jego naciśnięcia. W kolejnych przerwaniach overflow sprawdzasz: 1. czy przycisk jest ciągle naciśnięty, 2. jeśli 1. jest prawdą to czy różnica pomiędzy licznikiem timera a wartością zapamiętaną w skojarzonej z przyciskiem zmiennej jest większa...
Jeśli masz zamiar wykorzystać driver Atmela opisany w nocie aplikacyjnej AVR315, to w załączniku masz przykład użycia do komunikacji z zegarem PCF8563 (kod nie jest mojego autorstwa). IMHO, sam kod drivera jest dobrym przykładem, jak to zrobić na przerwaniach, jednak aby w pełni wykorzystać dobrodziejstwo, jakim są przerwania, należałoby kod tego drivera...
Witam. W swoim robocie mam zainstalowane dwie diody nadawcze IR i dwa czujniki SFH5110. Czujniki te są podłączone do portów INT0 i INT1 (ATmega32). Chciałbym się dowiedzieć jak przy pomocy avr-gcc ustawić odpowiednio stany początkowe portów na których jest odbiornik oraz wywołać przerwanie w przypadku odebrania odbitej wiązki z nadajnika. Pozdrawiam...
Konfigurujesz przerwania, definiujesz procedure obsługi przerwania i powinno zadziałać. Z własnej praktyki wiem że ze 99.999% problemów to błędy w niedoczytaniu specyfikacji.
Witam. Zwykły kwarc 32K. Usypiasz procesor i możesz go budzić na żądanie w określonym czasie. Jak wszystko pójdzie dobrze uzyskać pobór prądu na poziomie 1uA w stanie uśpienia.
cały kod aktualnie wygląda tak. Docelowo w pętli głównej będą inne rzeczy jeszcze. . Może moja metoda jest zła, próbowałem z trybie CTC ale wtedy właśnie nie mam płynnej f wyj tylko właśnie skokowo w związku z rozdzielczością i preskalerem. Stosując prescaler = 1, oraz timer0 preload = 96 zakładasz że przrwania wywołane przez Ovf0 wystąpią co 160 cykli...
Zapytałem ponieważ ja osobiście unikam jak ognia włączania przerwania w funkcji obsługi przerwania, a Ty to robisz :) Co odlicza Timer0, a co Timer1?
Mam kłopot z obsługą przerwania INT0 w ATmega32. Chciałem, żeby były generowane zboczem opadającym. Na nogę ITN0 wchodzi sygnał prostokątny 1Hz z wypełnieniem 50%. Jest rezystor podciągający do +5V. Kod jak niżej. Powinno generować sygnały na beeperzerz podłaczonym do portu D ale nic się nie dzieje. Bascom odmawia skompilowania linijki zawierającej...
To zależy ile taktów zajmuje obsługa przerwania - to pytanie raczej do assemblerowców bo zapewne wstawka asm w przerwaniu będzie najszybsza.
masz totalnie pochrzanioną obsługę przerwania pomijam już ze jest zbyt obszerny ale wpisanie tam transmisji rs232 to już piramidalna pomyłka i to powoduje że nigdy tobie to nie zadziała. Poza tym kompletnie nie widzę powodu aby wyprowadzać sygnał na przerwanie INT0 moze tylko po to aby łatwiej mozna było sprawdzać przytrzymanie klawisza ale innego powodu...
Osobiście używam własnej procedury na zboczach i nie odczuwam z tym żadnej niedogodności. Przerwanie na zboczu opadającym musi być potwierdzone na zboczu narastającym, ot cały debouncing. Obsługa przerwania to mikrosekundy i jest niczym w porównaniu z namiętnie stosowanym przez niektóre przypadki waitms() ;).
Spróbowałbym jeszcze z następującymi ustawieniami SPI [syntax=c]SPCR = (1<<SPE) | (1<<MSTR) | (1<<SPR1); [/syntax] Bez przerwań (nie widzę ich obsługi) oraz w trybie 0.
Witam, Aaaaaa ten chwyt już przerabiałem, ale chyba nie do końca w ten sposób jak kolega opisał. Mianowicie robiłem odczyt DS'a w przerwaniu, ale z oczekiwaniem 750ms na konwersję temperatury, w tym momencie wychodziła już totalna kaszana. Muszę zatem spróbować zrobić samą procedurę obsługi 1Wire w przerwaniu. Spróbuję w przerwaniu obsługi wyświetlaczy...
Cześć! Mam problem z pogodzeniem obsługi 4 wyświetlaczy LED (multipleksowanych za pomocą ATMEGA32) i odczytem temperatury z Dallasa :( Programuje w BascomieAVR. Jest możliwość korzystania z obsługi przerwań (TIMER0) w celu multipleksowania wyświetlaczy i równocześnie "rozmawiać" szyną 1wire z czujnikiem DS18B20 bez konieczności wyłączenia wyświetlaczy...
Moim zdaniem mikrosekunda wystarczy z zapasem (pierwsze dwa opóźnienia). Jeżeli chodzi o trzecie, to jak pisałem, musisz oszacować (albo sprawdzić na symulatorze) czas opóźnienia obsługi przerwań.
W trakcie wykonywania tego podprogramu zostało zgłoszone przerwanie zewnętrzne na nóżce int1 atmega328p. Czy atmega328p przerwie wykonywanie podprogramu nóżki int0 Zależy jak zadeklarujesz przerwanie, czy ISR bez atrybutu lub z atrybutem ISR_BLOCK albo jako SIGNAL czy ISR z atrybutem ISR_NOBLOCK lub jako INTERRUPT. Jeśli przerwanie w przerwaniu jest...
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
Co z tego, że są "w stanie 1"? No zgadza się, że przyciski są tylko tymczasowo, ale one mogą załączyć podczas jednego naciśnięcia przerwanie nawet kilkaset razy. W dodatku w przerwaniu masz operację mnożenia na zmiennej SINGLE co nie jest dobrym rozwiązaniem. Jeszcze raz sugeruję by wywalić LCD z pętli. Najlepiej ją zostawić pustą. Wynik wyświetlać...
Nie no to jakas sieczka jest delay ms(20) w przerwaniu? ta obsługa to chyba długa praca typu aby działało. Obsługę takiej klawiatury najlepiej zrobić w przerwaniu jakiego timera, np co 50ms. 2 kolejne równe odczyty równoznaczne z wciśniętym klawiszem. Zadem problem dorobić opcje dla długiego przytrzymania klawisza. n kolejnych równych odczytów. A reszta...
Piszesz A co za różnica w którym miejscu procedury obsługi przerwania skasuje tą flagę? Później Bodajże w ATmega32 w dokumentacji było to zalecane ręczne wyzerowanie flagi przy zmianie sposobu wyzwalania przerwania. Gdzie logika?
Jezyki wysokiego poziomu nie nadaja sie dopisania zegarka. Z tym stwierdzeniem się nie zgodzę. Napisałem w C dla ATmega32 program sterujący tablicą świetlną, która mierzy: zegar czasu rzeczywistego stoper do 99 min sześć timerów niezależnie startowanych i stopowanych obsługa przerwania od INT0 do odbioru transmisji z CC1000 (2400boud) i jakoś przy...
O ile dorze rozumiem idee tego przerwania (nie miałem okazji wykorzystać go w praktyce) to określona zmiana na którymkolwiek pinie z grupy wywołuje przerwanie... i teraz myślałem, żeby za pomocą prostych warunków zliczać, który wywołał i ile w danym czasie. Problem widzę w momencie, gdy przykładowo czujnik A wywoła przerwanie w bardzo krótkim czasie...
return przydałby się na końcu. I zacznij stosować ISR() Matko boska! tadzik weź ty się ze 4 albo 6 razy zastanów jak coś podpowiesz - RETURN w procedurze obsługi przerwania w C ????? Chyba że ty piszesz swoje programy w Bascomie ze wstawkami w C albo odwrotnie. do autora - żadnego polecenia return w przerwaniu bo będziesz miał tylko jeszcze gorzej....
Twój problem prawdopodobnie polega na tym, że stosujesz instrukcje: [syntax=c]ISR(ADC_vect) // Obsługa przerwania po zakończeniu konwersji ADC { if(wsk_kan==1) { ... wsk_kan=2; } if(wsk_kan==2) { ... wsk_kan=3; } if(wsk_kan==3) { ... wsk_kan=1; } } [/syntax] Przeanalizuj krok po kroku powyższy uproszczony Twój kod, gdy na początku wsk_kan = 1 i wykona...
Może masz błąd w bibliotece I2C (TWI), to może zaistnieć sytuacja że masz nieskończone oczekiwanie w funkcji TWI_read_buf. Wyświetlanie będzie działać poprawnie bo działa w przerwaniu. Często biblioteki I2C są pisane po łebkach bez obsługi błędów. JarekC
Problemem jest to co ci dondu pisał - program odczytuje ADC nie sprawdzając, czy jest tam nowa wartość, bo robi to całkowicie asynchronicznie z pomiarami. Stąd też ten fragment najlepiej przenieść do procedury obsługi przerwania ADC. W takiej sytuacji dodatkowo musisz stworzyć flagę dającą sygnał startu dla ADC (znaczy on sampluje non-stop, lecz ta...
Na początek kwestia formalna: jest za dużo tabulatorów w kodzie przed komentarzami, przez to prawa strona posta oraz kodu jest ucinana na ekranie (mam mały ekran). Co do kodu: czytanie zegarka oraz formatowanie sprintfem w procedurze obsługi przerwania jest mocno słabe. Diabli wiedzą jak jest zrealizowany lib TWI. Jakby był oparty na przerwaniach to...
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...
Ech, czemu ie weźmiesz jakiegoś tańszego mikrokontrolera z odpowiednią liczbą UARTów? Programowy UART w Bascomie nie musi działać - są duże narzuty na obsługę przerwań. Jeśli masz jakieś inne przerwanie o wyższym podpriorytecie to niemal bez szans.
Witam, też aktualnie bawię się impulsatorem na EVB4.3 M32 16MHz. Fajnie działa sterowanie w przerwaniu: http://www.elektroda.pl/rtvforum/topic14... Dołączyłem kondensatory 68 nF równolegle do styków. Na kwarcu 16 MHz nie ma żadnego problemu z liczeniem impulsów w obie strony. Musiałem tylko dokonać modyfikacji kodu ponieważ trafił mi się impulsator,...
... Dlaczego tak się dzieje? :/ Dlatego, że przerwanie ISR(TIMER1_COMPA_vect) jest wywoływane co 128 taktów zegara, a wykonanie procedury przerwania timera1 zajmuje ~200 taktów. Po zakończeniu wykonywania przerwania od timera, gdy uC wraca do programu głównego, ma już ustawioną flagę od OCR1 i ewentualnie flagę RXC. Ponieważ timer "stoi wyżej" w hierarchii...
Menu jest twoją pętlą główna. Załączanie urządzeń proponuje zrobić w przerwaniu z zegarka RTC zgłaszanym co czas od sekundy do minuty a w nim porównanie wartości bieżącej z zadaną dla danego kanału. Proponuję byś obsługę klawiszy również zrealizował na przerwaniach. Ułatwi co to trochę główny algorytm.
Tu masz program pod ATtiny2313, jeśli potrafisz programować, to też potrafisz przerobić program na ATMegę: [syntax=basic4gl]' Bardzo prosty zegar bez możliwości ustawiania Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte Dim , Godzjed As Byte , Godzdzies As Byte , Mux As Byte , Migaj As Bit Config Portb = 255 : Portb = &B255...
Witam Moja propozycja to: ATMEGA32 (13zł) + 2 tranzystory PNP (0,4zł) + kwarc z kondensatorami (2zł) + 3 przyciski typu uswitch (1,5zł) + stabilizator napięcia 7805 (1,2zł) + kondensatory (1,5zł) + rezystory (0,5zł) + kwarc zegarkowy (1,5zł) + dwa wyświetlacze LED (6zł) + laminat (3zł). To jest trochę więcej niż cena ADUC814. Jeśli w Twoim sklepie tego...
3. Co masz na myśli funkcje czujników niedostosowane do przerwań ? Bo są w nich delaye ? Jeśli tak to jak inaczej miałbym poczekać na zakończenie jakiejś konwersji ? Poczytaj o maszynie stanów. Np tak: zmienna licznik odlicza za pomocą np. timera programowego odcinki czasu przykładowo 50ms poniżej pseudokod procedura_nieblokujaca() // wywołanie jeżeli...
Albo w obsłudze przerwania zrobić co trzeba (zapamiętać wynik, dane) a wyniki bierzące + te z przerwania przedstawić (wyświetlić na LCD) tylko w pętli głównej - raz nie na raty.
Zgodze się z Tobą, że STC jest dużo lepszy nić 595 : ) AndrzejZ82, kod: DDRB = 0xBF; // MISO wejście reszta wyjścia inaczej binarnie : 10111111 co oznacza MISO wejście, reszta wyjścia :). Jestem jeszcze przed próbą obsługi przerwania SPI aby sam sprzętowo skasował flagę SPIF. Dam znać.
rsikon -> nie ma co być wstyd ;) "Na spokojnie..." jak widzisz, to podstawa powodzenia ;) a odnośnie kodu - wiadomo testowy - tylko jeśli nie używasz do niczego przerwania to pozostaw ciało procedury puste - kompilator wstawi sobie tylko w odpowiednie miejsce rozkaz RETI i już a w ogóle to warto zapamiętać na wieki wieków - że gdzie jak gdzie - ale...
W obsłudze przerwania nie musisz kasować flagi, to robione jest sprzętowo. A przeciwnie może spowodować wygenerowanie kolejnego przerwania. Zmień i daj znać.
(at)Flesz dziękuję za odpowiedź. Układ buduję w oparciu o ATMegę32, nie ma ona takich możliwości jak XMega,która już ma w sobie funkcje do obsługi enkoderów. Taktuję zewnętrznym kwarcem 16MHz , więc przerwania z częstotliwością 14kHz powinno dać się uzyskać.
Witam, Kilka dodatkowych pytań: 1. jaka prędkość transmisji 2. ile bitów STOPu ? 3. czy w programie obsługującym wyświetlacz jest obsługa innych przerwań niż przerwanie od odbiornika UART? Pozdrawiam JarekC
Co do Twojego pierwszego problemu to prawdę mówiąc nie wiem, ale zwróć uwagę na to że po zakończeniu obsługi przerwania zawartośc R16 i R17 jest zamieniona: ... .org 0x0012 rjmp t1Ovf ... t1Ovf: push r16 push r17 in R16, PORTC ldi R17, 0b00000011 eor R16, R17 out PORTC, R16 pop r16 ; R17 pop r17 ; R16 reti ... Może to wina własnie tego. Co do Towjego...
Drodzy koledzy, procesorami AVR od bardzo niedawna się zajmuję i w związku z tym zadam jedno małe pytanko. Otóż czy obsługa magistrali I2C może być bez zakłoceń wykonywana w w przerwaniach procesora. Pytanie może jest naiwne ale widzę że system potrafi mi całkowicie zgłupieć. INT0 zajmuje się u mnie obsługą przerwania zegara czasu rzeczywistego PCF8583....
1. Można to różnie rozwiązać. Najprościej, to wykorzystać któryś z pinów INT. Algorytm: - ustaw przerwanie z pinu INT0 na zbocze np. narastające, - gdy pojawi się zbocze narastające to wywoła funkcję obsługi przerwania, - w funkcji przerwania uruchamiasz timer i zmieniasz ustawienia INT0 na zbocze opadające, - gdy wystąpi zbocze opadające - zatrzymujesz...
Oj, przejrzałem pobieżnie kod - uwierz mi - skasuj go. W C jest coś takiego jak funkcje - wykorzystaj to, kod, który masz jest kompletnie nieczytelny. Każdy normalny promotor by to coś uwalił chociażby za to. Co do szybkości działania - pokaż kod funkcji odpowiedzialnych za komunikację z czujnikami. Z kodu, który masz: - funkcjie piszące do LCD są zapewne...
witam czemu dioda mi nie miga oto program : [syntax=c][ /* * timer0.c * * Created: 2014-09-20 15:57:03 * Author: */ #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> int main(void) {TCCR0|=(!(1<<WGM01))|(!(1<<... //inicjalizacja timera, ustawienia...
Masz rację. Proponuję dorzucić obsługę UARTa i wyrzucać na port wartości zmiennych flaga buforLCD1 buforLCD2 i tekstu w stylu "Stan programu przed zapisem czasu" itp. Akurat tutaj lepiej sprawdzi się obsługa UARTa bez buforów i obsługi przerwań, bo nie zakłóci działania Twojego programu tylko doda niewielkie opóźnienie potrzebne do wysłania kilkudziesięciu...
Musiałbyś dodać zmienną, która będzie służyła do odmierzania czasu bez impulsów, tzw. "timeout". Jeśli przez okres ponad 10 s nie przyjdzie żaden impuls, to n=0. Wbrew pozorom, liczenie timeoutów najłatwiej zrealizować w przerwaniu :) Dodano po 1 fragmenty kodu: inicjalizacja przerwań (akurat dla Atmega32) [syntax=c] TCCR0 |= (1 << CS02); TIMSK...
atmega32 przerwania przerwania atmega32 atmega32 przerwania zl3avr
akumulator skuter elektryczny uszczelniacze zaworowe koloru lakieru
Wymiana elektrozaworu w zmywarce Mastercook ZBI-478 Montaż zmywarki Mastercook ZBI-478: krok po kroku