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.
Nie wiem czy odbierasz tam jakieś komendy. Wywal te Wait`y. Tutaj po zmianie stanu do zmiennej Blokada zostanie wpisana wartość do odliczenia w dół. Jeśli nastąpi następne przerwanie to w zależności od tego czy minął już czas blokady, to albo zostanie przedłużony jej czas bo ktoś trzyma przycisk dłużej albo.. :D [syntax=basic4gl]Dim Blokada As Word...
!. Ustaw PIN-y INT jako wejścia z podciąganiem. 2. Tuż przed aktywacją przerwań wyzeruj ich flagi wpisując logiczne 1.
Moze chodzilo Ci o PORTD|=(1<<6); lub PORTD&=~(1<<6); ? ;]
To są zwykłe stałe zapisane w jakimś pliku, Przy instalacji AVRstudio jest to plik m32def.inc. Pod tymi stałymi są adresy które znajdziesz w datenblacie. A skąd wiadomo jakiej nazwy użyć? Zaglądasz do pliku z definicjami stałych już wiesz:)
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...
Zacznij używać TAB-ulatora w kodzie bo analiza Twojego kodu to katorga. Popraw i załącz ponownie. Mamy się domyślać w których liniach występują warningi? Dla Ciebie Warning = Błąd: : http://mikrokontrolery.blogspot.com/2011...
Klawiszy (poza wyjątkowymi sytuacjami typu wybudzanie uC) nie robi się na przerwaniach INT. Delaye w przerwaniu to nieporozumienie. Twoje przerwanie realizuje się tylko po wciśnięciu przycisku, więc trudno by było, aby zwróciło informację o jego zwolnieniu. Zrób przerwanie zegarowe co 25-50ms i cyklicznie sprawdzaj stan klawiatury. Opanujesz w ten sposób...
Niestety problem znów się pojawił: Program nie wchodzi do pętli while, gdzie warunek jest niespełniony dopiero po zatrzymaniu dopiero co ustawionego rejestru licznika, próbowałem jeszcze inny sposób, z bitami zmiennej flag ustawianymi w przerwaniach - do przerwania wchodzi, ale jak wróci do programu to nie wychodzi z pętli - tak jakby warunek był cały...
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ń.
Ten programik miał tylko uruchomić zmianę stanu na porcie w przerwaniu. Pętla while u mnie jest nieskończona tak jak to zaobserwowałem w innych programach, jak na razie nic się w niej nie dzieje bo testuje same przerwania. Dziękuje ci za pomoc popołudniu wprowadzę poprawki i sprawdzę czy zadziała. Może masz jakiś przykład działającego programu który...
Chodzi o to, że po pierwszym przerwaniu TCNT1 będzie miał wartość 0, czyli zliczy potem 65536 impulsów. Zaś do generowania, jak Ty chcesz, przerwań co określony odcinek czasu służy tryb CTC. Wtedy w rejestrze OCR ustawiasz ilość impulsów, które chcesz zliczyć, i wygenerować odpowiednie przerwanie.
Ja bym zrobił na timerach, no bo po co zajmować procesor zapętlonym zadaniem. Ideą wielozadaniowości jest taka konstrukcja programu, tak by nie pracował w bezsensownych pętlach, kiedy może tylko sprawdzić czy wystąpiło zdarzenie (event) i przejść do następnego zadania.
Hmm, ja bym jednak dodał miganie pinem z timerka, chociaż wydaje się że procek idzie w maliny. Jeśli siada wszystko jak wygląda zasilanie? Może tu tkwi problem. Wepnij sondę zaraz przy zasilaniu ustaw wyzwalanie na 4.9V np i sprawdź czy się wyzwoli. Czym taktujesz procesor? Może warto wstawić generator. Ustaw BOR dodatkowo. gaskoin, volatile czy nie,...
fuse bity wyłączasz nie w programie tylko przy programowaniu. np w PonyProg klikasz "Command > Security i Configurations bits..." Potem wciśnij "Read" i zobaczysz jak masz ustawione te bity. Jeżeli tym się jeszcze nie bawiłeś to radzę nic nie ruszać poza wspomnianym bitem JTAGEN, który będzie zaznaczony ptaszkiem (trzeba go odznaczyć) i wcisnąć "Write"....
Nie napisałeś, czy próbowałeś zmieniać ISP frequency. EDIT: Na marginesie, ten program w ASM ma zaledwie kilka bajtów, on nie ma wektorów przerwań.
a co z przerwaniem porównania kanału B?
Na jakiej podstawie twierdzisz, że problemem są priorytety przerwań? Przerwania występują na tyle sporadycznie, że nie ma tutaj miejsca na problemy. Jeśli wysyłany jest znak '2', to porównanie (i==2) jest błędne TCCR2 = 1<<CS00 | 1<<CS02 | 0<<CS01 ; proponuję zapisać tak: TCCR2 = (1<<CS00) | (1<<CS02) |...
A masz gdzieś przerwanie od SPI w kodzie, że chcesz je włączać? Bo ja nie widzę. Ale widzę, że funkcja SPI_WriteByte() opiera się o zwyczajne sprawdzanie flagi końca transmisji, a nie o przerwania.
Dopisz "volatile".
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
Przed petla while wlacz przerwania sei();
// ================= 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ę...
Żeby zrobić za pomocą Timera - to nie możesz używać trybu PowerDown tylko Sleep - żeby właśnie Timery mogły działać to po pierwsze. W taki trybie jednak będziesz miał nieco większy pobór prądu niż w pełnym PowerDown. Więc wszystko zależy na ile ma wystarczać bateria o ile jest to coś zasilane z baterii. Bez PowerDown'a na pewno będzie to sporo krótszy...
źle zdefiniowana funkcja obsługi przerwania. Sprawdź w odpowiednich plikach nagłówkowych.
Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile. p.s. Samych rejestrów nie sprawdzalem.
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...
To raczej zły pomysł. Wyjście prawdopodobnie ustawi się w ciągły stan 1. Trzeba wyłączać przerwanie od Timera i tyle.
Pin INT w PCF jest typu otwarty dren. Potrzebujesz więc rezystor podciągający.
[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)...
http://www.elektroda.pl/rtvforum/topic17... http://www.elektroda.pl/rtvforum/topic17...
Jeżeli piszesz w C i używasz avr-libc, to przerwania "nieblokujące" (takie które mogą być przerwane przez inne przerwanie (lub nawet same przez siebie, trzeba uważać)) deklaruje się tak (przykład dla INT0): ISR(INT0_vect, ISR_NOBLOCK) { jakiś kod } Dzięki temu sei() zostanie wywołane prędzej, niż zrobiłbyś to wewnątrz procedury sam.
... i tej wersji będę się trzymał wysoki sądzie ;-) I bardzo dobrze :-P Zadeklarowałeś przerwanie od porównania, a włączyłeś od przepełnienia więc Ci nie działa. Włącz właściwe przerwanie i będzie git.
Zwłaszcza jak NWW wyjdzie dosyć wysoki np 1000. Jesteś optymistą. Przy podanych parametrach (50 i 0,1s) Maksymalne NWW (najmniejsza wspólna wielokrotność a nie dzielnik) to NWW=47*43*41*37= ponad 3000000. Zastanowiłbym się także nad użyciem przerwania od timera zamiast pętli z delayem. Nie ma się nad czym zastanawiać. Użycie timera to konieczność....
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...
mogą być 2 bity startu, bo standard RC5 właśnie tak jest "skonstruowany", że posiada 2 bity startu. Natomiast jego rozszerzenie czyli RC6 wykorzytuje drugi bit startu jako normalny bit danych. Ok - teraz odpowiedź dla autora, wydaje mi się, że uda się to wyjaśnić bo sam kiedyś miałem podobny problem ze zrozumieniem tego etapu dekodowania. Cały problem...
Działa ;-) Ustaw Breakpoint na linijce (prawy myszy Toggle Breakpoint) [syntax=avrasm]com LED[/syntax] naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 naciśnij F5 (Run) jak zatrzyma się na Breakpoint wykonaj kod przerwania krokowo F11 itd. Zamiast 15625 ładuj do OCR1A 15624. Wieczorem wrzucę inny sposób migania tym...
Fakt, zapomniałem powiedzieć. Mam wyjście JP13 podpięte pod PD2, a klawiaturę (JP23) podpiętą pod port C. Stąd ustawienia wartości dla tego portu (w tutaj podanym kodzie zakomentowane). I którym przyciskiem wywoływać chcesz przerwanie?
Nie mam przerwania program mi ciągle sprawdza w pętli czy pakiet 13 bajtowy przyszedł i czy pierwszy bajt ma wartość 2 (czyli czy karta rfid została przyłożona do anteny). Można zrobić to na zasadzie przerwania, czyli jeżeli jakikolwiek bajt danych napłynie do portu RXD to następuje przerwanie?
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?:/
Dokładnie w tej linijce TIMSK | = 1<<TOIE2; //wlacz t2 czyli wysylaj co 5 s stan impulsow Przez ustawienie TOIE2 kasowałaś TOIE0
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.
Te procesory się aż tak nie różnią. Dodatkowe funkcjonalności pinów nie przeszkadzają w niczym dopóki ich nie uruchomisz. (PCINT - Pin Change Interrupt trzeba wiedzieć jak włączyć). Jest duża różnica jeśli chodzi o Timery właśnie. Mega8 ma na przykład tylko jeden rejestr Compare dla Timer2 dlatego inaczej się nazywają. Opisałem to u siebie na stronie...
Tutaj masz hex'a z tego programu, skompilowanego przez avr-gcc dla atmega32 1Mhz. Zobacz czy zadziała, a ja sprawdzę makefile.
Do tego potrzebne są też timery, pod [url=http://www.avrfreaks.net/index.php?... linkiem masz to wyjaśnione krok po kroku, jak to napisać. I nigdy nic nie może wykonywać się jednocześnie (pomijam wielordzeniowe procesory we współczesnych komputerach ;)), normalnie w AVR kiedy jedno przerwanie jest wykonywane,...
// Clear overflow flag TIFR |= (1<<TOV0); Źle! Prawilnie: Program działa bez zarzutów. Natomiast, gdy włączę przerwanie"sei". Układ się zawiesza to znaczy, że przedstawiony fragment jest całkowicie niepotrzebny do działania bez zarzutu co znaczy, że trzeba go wyrzucić.
...może to wina bascoma.. No tak, winni są wszyscy, tylko nie Ja :D Na Twoim miejscu, zadał bym sobie pytanie:"Ile czasu potrzebuje procek taktowany 16MHz, na wykonanie procedury przerwania Ontimer1 :idea:
Jak chcesz koniecznie mieć te zewnetrzne przerwanie do dodaj 7420 zamiast tych diod i będziesz miał przyzwoity sygnał przerwania.
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...
RTFM, pdf nt. ATMega32, strona 19: Bit 3 – EERIE: EEPROM Ready Interrupt Enable Writing EERIE to one enables the EEPROM Ready Interrupt if the I bit in SREG is set. Writing EERIE to zero disables the interrupt. The EEPROM Ready interrupt generates a constant interrupt when EEWE is cleared. Gdyby się nie dało zrobić jak pisałem tobym Ci głowy głupotami...
witam, próbuję skomunikować 2 procesory: 1) wystawia na złączke 1 i 0 z określonymi przeze mnie przerwami np. 1s 2)próbuję atmegą 32 odczytać przez przerwanie wysłany stan i zapalić diodę Niestety z marnym skutkiem. Program pisany w Bascomie. Poniżej jego treść: //konfiguracja portu D z którego maja byc sczytane wartości Portd = 255 Lcd_io_ind Alias...
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ć.
w nocie katalogowej jest ładna instrukcja jak kalibrować generator.
Hmmm... Nie wiem co działa a co nie działa. Wiem, że pierwsze co mi się rzuca w oczy to to, że rejestr UBRRL jest 8 bitowy, zatem wpisanie do niego wartości większej niż 255 nie daje zamierzonego efektu (wpisze się bowiem młodszy bajt).
Prosze o podpowiedz-przykladzik jak configurowac (w ATMEGA32)przerwanie np. INT1 aby reagowalo na opadajace zbocze
no to można zawsze bardzo brzydko włożyć to sprawdzanie do samego przerwania...
Jesli chodzi o C++ to niestety nie pomoge, pewnie funkcja wysiwetlajaca liczby interpretuje je jako signed i stad ten problem.
ADIF w ogóle się nie zapala. Przez cały czas trwania programu jest równy zero. W datasheecie jest napisane: "ADIF is cleared by hardware when executing the corresponding interrupt handling vector. " Czyli ADIF się automatycznie zeruje gdy korzysta się z przerwań.
Witam. Zapis (składnia) Load Timer1 jest zły. Sprawdź w pomocy Bascoma.
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...
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. :)
Przerwania....
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).
500 ms w przerwaniu? Przeczytaj sobie: http://mikrokontrolery.blogspot.com/
Timery lub lepiej alarm w pcf8583/8563 i przerwanie zewnętrzne
I teraz pierwsze pytanie: czy da się zliczać impulsy z zewnątrz używając Timer2? Wtedy bym podpiął do nóżki TOSC. The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external clock to the TOSC1 pin may result in incorrect Timer/Counter2 operation. Jak źle (lub dobrze) jest z tym w praktyce nie wiem. Tylko jeszcze zostaje...
Kluczem do tej "zagadki" było dodanie pustej procedury Skoro jest pusta, to lepiej nie włączać tego przerwania i ta procedurę wywalić.
Przerwanie ADC zbędne i szkodliwe, a w deklaracji k brak atrybutu volatile.
Okazało się, że jest kilka wersji ATMEGA32 i akurat włączenie przerwanie licznika TIM0 było w innym miejscu rejestru.
To: (zrób....) jest najciekawsze. Co on tam robi w przerwaniu.
To co słychać to napewno nie jest przydźwięk. To są najnormalniejsze zniekształcenia. Zwiększ stałą czasową filtru zdecydowanie. Najwyżej utracisz wysokie dźwięki , ale napewno wtedy powinna poprawić się filtracja. Dla próby podłącz wzmacniacz przez rezystor szeregowy np 100K aby wyeliminować zjawisko małej impedancji wzmacniacza i jego wpływu na filtr....
Oznacz zmienne występujące w przerwaniach jako volatile.
Na pewno jak już to nie SFIOR=(0<<ACME); a SFIOR &= ~(1<<ACME); A zresztą na internecie masz przykłady choćby tu: http://jumptuck.com/2011/12/12/avr-analo... czy tu: http://winavr.scienceprog.com/avr-gcc-tu...
Wystarczy sprawdzić czy funkcja odbierająca kod rc5 wykorzystuje to przerwanie. z listingu wynika, że nie. Jednak odbieranie kodów najczęściej realizuje się w przerwaniu.
Włączasz przerwania z ADC za pomocą ADIE a nie widzę funkcji obsługi przerwania.
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
na podstawie flagi z przerwania INT2 na początku pętli głównej wchodzić w uśpienie. Ale pętla główna jest wykonywana powiedzmy 0.5 sek. Co sekundę wykonywane jest przerwanie od Timer2. Więc procesor będzie w uśpieniu tylko ok. 50% czasu. Ale problem z długim wykonywaniem się pętli głównej wystąpi tylko za pierwszym razem po zaniku zasilania (ustawienie...
Polecam avr-gcc... Uczy cierpliwości i jest dla wytrwałych... ;) Ponadto jest wspierany w wersji WinAVR pod AVRStudio.
Parę podstaw: - w Twoim przypadku procesor wychodzi z uśpienia poprzez przerwanie z ADC - przerwanie z ADC musisz zadeklarować: [syntax=c]ISR(ADC_vect) { ...jakiś kod }[/syntax]
#include<avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000 int main(void) { TCCR0 = 0x05; //(1 << CS02) | (1 << CS00); prescaler na 1024 TIFR |= (1 << TOV0); TIMSK |= (1 << TOIE0); // aktywne przerwanie overflow // timer_enable_int(_BV(TOIE1)&...
Masz rację te procki nie posiadają różnych poziomów przerwań, jak to było w '51, ponieważ posiada on we swoich funkcjach wspomagania sprzętowe, czego '51 nie miała za wiele, dlatego myslę że w tych prockach zrezygnowali z tej funkcji układu przerwań.
Mam niewielkie a raczej bardzo małe doświadczenie z licznikami i przerwaniami i nie za bardzo wiem jak się do tego zabrać,który i jak skonfigurować licznik i gdzie użyć przerwań...
Szczerze mówiąc impulsator w dalszym ciągu nie działa jak powinien :/ Nie mogę sobie z nim poradzić :/ Co do przerwania to nie mogę obsługiwać impulsatora w przerwaniu.
Kolejkować trzeba transakcje - robisz bufor w którym trzymasz dane do wysłania, potrzebujesz jakieś funkcje dodające bufor do kolejki i badające jej status. Po nadaniu danych z bufora, znajdą się w nim dane odebrane. Całość może działać w oparciu o przerwanie SPI.
Dzięki za radę ! :D Popróbuję jeszcze tym trochę pobawić się. A czy da się w jakiś sposób ustawiać te priorytety przerwań w ATMega32 ?
Bezpośrednio raczej nie z uwagi na rezystancję wejściową ADC i ujemny zakres napięć. Trzeba pokombinować z wzmacniaczem operacyjnym w układzie podbijającym składową stałą o 2,5V.
Taj jak pisze dondu, uzupełnianie tablicy zrób w przerwaniu, korzystaj z trybu free running.
Nie mówię o fladze tylko o włączeniu przerwania, skoro przerwanie EE_RDY jest generowane cały czas kiedy pamięć jest gotowa do zapisu (jak wskazuje dokumentacja) to musisz je ręcznie wyłączać. Poza tym ten bit nie jest flagą przerwania tylko ENABLE czyli włącznie przerwania.
A jak stwierdzasz ze się resetuje ? Poza tym używasz ISR(BADISR_vect) a nigdzie nie włączasz jakichkolwiek przerwań.
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.
ale w funkcji obsługi przerwania ustawiaj jedynie flagę, a w main() umieść resztę kodu Czyli rozumiem że najlepszą praktyką jest ustawianie w flagi w procedurze przerwania a resztę wykonywać w main? I tak robić dla każdego rodzaju przerwania?
Alternatywą będzie zmniejszenia zegara magistrali SPI transmisji i obsługa w przerwaniu.
A może wykorzystać Timer0 i ustawić odpowiednio rejestr SFIOR? Wtedy przerwanie od Timer0 compare wyzwala ADC. A pojawienie się flagi moźna sprawdzać w pętli głównej albo w przerwaniu od ADC.
sorki chodziło mi o sei() :| a pomerdało mi się z cli() czyli globalnym wyłączeniem przerwań. Jeśli dobrze zrozumiałem, to w procedurze obsługi przerwania np.INT1 nie można uruchomić np. przerwania od komparatora? To max zagmatwanie nie jest chyba takie tragiczne. Może na innym przykładzie będzie to bardziej jasne. Otóż chcę uruchomić w kodzie programu...
Robisz przerwanie zegarowe co np. 2800Hz i w przerwaniu sprawdzasz stan każdego wejścia do którego masz podpięty czujnik i liczysz im odpowiednio czasy.
Nie wiem jak inni koledzy ale ja bym dał rezystor może 10k między emiter a bazę tranzystorów i multiplexowanie wyświetlaczy najlepiej zrobić na przerwaniach .
Przy 6 kHz to można się pokusić o zliczanie programowe - czyli podajesz sygnał na wejścia mogące generować przerwania. Z drugiej strony, skoro stosujesz ATMega32, to może prościej wykorzystać ATXMEGA32, gdzie w zależności od wersji liczników masz nawet 8 (albo 16 8-bitowych) i sobie to ładnie sprzętowo rozwiążesz.
Ale mieszasz. Ustawiłeś dwa cykliczne przerwania i dziwisz się, że coś nierówno miga. Tu w avr nie ma wielowątkowości sprzętowej i jedno przerwanie przeszkadza drugiemu. Przenieś i wyłącz to przerwanie to co masz w ISR(TIMER2...) do ISR(TIMER1...) . Idea programowego PWM i timerów jest właśnie w tym aby działało wszystko pod jednym wspólnym cyklicznym...
W jednym przerwaniu USART dwa razy czytasz UDR. Za pierwszym razem zwraca ci jego wartość, ale za drugim to raczej śmieci. Kolejne czytanie UDR powinieneś zrobić dopiero przy olejnym przerwaniu - wcześniej nie zawiera on nic sensownego.
atmega32 przerwać atmega32 przycisk przerwać atmega32 przerwać timer
czujnik ropam zasilacz warto naprawiać płyta piszczy
Nagrywarka Daewoo DHR-7105 - komunikat HI__ Jak uprzejmie zwrócić uwagę na głośne pisanie na klawiaturze?