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); ? ;]
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...
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...
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,...
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.
Dopisz "volatile".
// ================= 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ę...
źle zdefiniowana funkcja obsługi przerwania. Sprawdź w odpowiednich plikach nagłówkowych.
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
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ń.
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,...
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.
a co z przerwaniem porównania kanału B?
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:)
Ż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...
Pin INT w PCF jest typu otwarty dren. Potrzebujesz więc rezystor podciągający.
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...
w nocie katalogowej jest ładna instrukcja jak kalibrować generator.
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...
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) |...
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).
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.
http://www.elektroda.pl/rtvforum/topic17... http://www.elektroda.pl/rtvforum/topic17...
Zmienną 'flaga' ustalasz w przerwaniu wiec powinna być volatile. p.s. Samych rejestrów nie sprawdzalem.
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...
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...
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...
[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)...
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...
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...
1. Ustawiasz cały portD jako wyjścia a na nim są wejścia INT którymi chcesz generować przerwania. 2. używasz starych wektorów przerwań, używaj nowych ISR: http://www.nongnu.org/avr-libc/user-manu... 3. pokaż schemat swojego układu. 4. return(0) jest zbędne. Wystarczy: [syntax=c]while(1){};[/syntax]
Dokładnie w tej linijce TIMSK | = 1<<TOIE2; //wlacz t2 czyli wysylaj co 5 s stan impulsow Przez ustawienie TOIE2 kasowałaś TOIE0
Prosze o podpowiedz-przykladzik jak configurowac (w ATMEGA32)przerwanie np. INT1 aby reagowalo na opadajace zbocze
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.
Tutaj masz hex'a z tego programu, skompilowanego przez avr-gcc dla atmega32 1Mhz. Zobacz czy zadziała, a ja sprawdzę makefile.
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"....
To raczej zły pomysł. Wyjście prawdopodobnie ustawi się w ciągły stan 1. Trzeba wyłączać przerwanie od Timera i tyle.
500 ms w przerwaniu? Przeczytaj sobie: http://mikrokontrolery.blogspot.com/
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.
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...
Żadne przerwanie nie zmienia "samo z siebie" stanu na jakimkolwiek wyjściu. 4\/3!!
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ń.
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...
... 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.
proponuje znalezc mikrokontroler, ktory ma 8 PWMow [; PIC24, dsPIC - dla przykladu... wiekszosc ARMow rowniez ma ich sporo. a jesli sie nie da, to trzeba sobie zrobic na jednym timerze 'impuls' ktory bedzie rozdzielczoscia twojego PWMa - np co 100us. w przerwaniu od tego timera obsluzysz ile chcesz serw. przerwanie bedzie mialo swoje liczniki, ktore...
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.
Przed petla while wlacz przerwania sei();
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ć.
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...
Nie mogę sobie poradzić z problemem configuracji przerwania zewn. np INT0 tak aby program reagował na któreś zbocze. Po wstawieniu configu żywcem z helpa - przy próbie kompilacji mam komunikat że w ATMEGA32 przerwanie zewn. może być wywołane tylko poziomem. Co ciekawe , gdy w ustawieniach BASCOMA przestawię chip - ATMEGA 16 , jest wszystko ok - kompilacja...
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...
ok zamiast wywołać --> włączyć, uruchomić, zainicjować - ale myślę, że i tak wiesz o co mi chodzi. Przerwanie samo się nie "wywoła" jak mu na to nie zezwolisz, chyba że się mylę...
Jak chcesz koniecznie mieć te zewnetrzne przerwanie do dodaj 7420 zamiast tych diod i będziesz miał przyzwoity sygnał przerwania.
Witam. Zapis (składnia) Load Timer1 jest zły. Sprawdź w pomocy Bascoma.
Jesli chodzi o C++ to niestety nie pomoge, pewnie funkcja wysiwetlajaca liczby interpretuje je jako signed i stad ten problem.
Witam Od kilku dni bawię się (jak narazie) w programowanie ATMEGA32 i trafiłem na problem z przerwaniem zewnętrznym Interrupt 0. Dopiero zaczynam, więc mój problem może okazać się lamerski, więc z góry przepraszam. Napisałem coś takiego: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> //#include <avr/signal.h>...
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).
Poza tym nie ma znaczenia czy kod w przerwaniu zajmuje 3 linijki czy 100. Ciekawe stwierdzenie. Przerwanie jest wykonywane do końca. Kolejne nie zostanie obsłużone do puki nie skończy się poprzednie.
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. :)
skompilowałem dokładnie to co mi przesłałeś tzn: #include <avr/io.h> #include <avr/interrupt.h> // Biblioteka przerwań #define LED_TOGGLE PORTA^=_BV(0); volatile uint8_t stan; ISR (TIMER0_OVF_vect) // Przerwanie od przepełnienia timera0 { //LED_TOGGLE; stan=!stan; if (stan) PORTB=0; else PORTB=255; } int...
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...
Okazało się, że jest kilka wersji ATMEGA32 i akurat włączenie przerwanie licznika TIM0 było w innym miejscu rejestru.
#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)&...
niezbyt jasno chcesz innymi słowy ZAKONCZYĆ wykonywanie jednej pętli, a rozpocząć innej? ja bym to rozwiązał tak: Do 'p. nieskończona Do 'pierwsza pętla loop until funkcja=1 Do 'druga pętla loop until funkcja=2 Loop Przerwanie_int0: if pinb.0 = 0 then funkcja=1 if pinb.1 = 0 then funkcja=2 return oczywiście zakładając, że nie jest konieczne przerwanie...
Witam. Chciałbym prosić o pomoc. Czy ten kod jest poprawny. Program działa bez zarzutów. Natomiast, gdy włączę przerwanie"sei". Układ się zawiesza. [syntax=c]void init_Ex1() { // Timer clock = I/O clock / 1024 TCCR0 |= (1<<CS02)|(1<<CS00); // Clear overflow flag TIFR |= (1<<TOV0); // Enable Overflow Interrupt TIMSK |= (1<<TOIE0);...
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...
Przerwanie ADC zbędne i szkodliwe, a w deklaracji k brak atrybutu volatile.
Tutaj znajdziesz przykład komunikacji w dwie strony z wykorzystaniem przerwań: http://mikrokontrolery.blogspot.com/2011...
Czy ktoś z was uruchamiał w Bascomie na procesorze ATmega32 zewnetrzne przerwanie. Bo ja nie moge go skonfigurowac poniewaz przy kompilacji pojawia sie blad ten sam kod konfiguracyjny dziala np na ATmega32.Nie wiem o co chodzi. Config Int0 = Low Level On Int0 Przerwanie Do Loop Przerwanie: Return blad jest taki : INT0-INT3 are always low level triggered...
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.
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...
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
Próbowałem podłączyć rezonator kwarcowy, oscylator RC, podłączyłem oddzielny generator 6MHZ do we. Xtal i nic nie pomogło. Dodano po 1 Czyli mikrokontroler jest raczej uszkodzony?
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]
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,...
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ń.
SS musisz wykorzystać, bo tylko stan tego pinu gwarantuje przejście pozostałych linii interfejsu SPI w stan wysokiej impedancji. Przerwanie od SS nie jest potrzebne - niski poziom tego sygnału aktywuje interfejs i powoduje wysłanie SPDR. Po zakończeniu wysyłania bajtu danych możesz otrzymać przerwanie zakończenia transferu SPI w którym to przerwaniu...
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.
...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:
Witaj a nie masz czasem "wiszącego" wyprowadzeni rx bez włączonego wewnętrznego podciągania ? To wygląda jak by wyprowadzenie było wiszące i nigdzie nie podłączone bo bez względu na błąd prędkości jeśli zachowa taki sam stan uart nie odbierze ani jednego znaku .
W programie musisz sam badać stan przycisku. Przerwanie to coś innego. Chyba że przycisk będzie podłączony do któregoś INTx.
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.
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...
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ść....
Obawiam się, że bez ASM, nie uda się przy 16MHz odbierać danych z SPI, z prędkością 4Mb/s (tak wnioskuję, że 4). Niestety, Bascom to nie C i rozwinięcia ASM nie zobaczysz :-( Musisz "na piechotę" znaleźć funkcję obsługi przerwania SPI i zdesasemblować aby dowiedzieć się jak długo się wykonuje. Możesz też, zrobić w pętli głównej, "machanie" GPIO. Na...
Bo uparłeś się na PD5 tym czasem wyjście OC1A jest na PB1. Wyjście ma OK, bo to ATmega32. Włączasz przerwanie, ale czy masz funkcję obsługi? Jest Ci potrzebne do innych celów? Wklejaj cały kod. Zamiast COM1A1 ustaw COM1A0 to będziesz miał zmianę stanu na przeciwny za każdym stwierdzeniem zgodności licznika Timera z OCR1A.
Oznacz zmienne występujące w przerwaniach jako volatile.
To mnie uratowałeś!!! Czyli Zmianą zbocza też może wywoływać przerwania? A już o nic nie będę pytał możesz rzucic krótki progs na włączenie tych bitów tak aby ATmega32 obsługiwał właśnie takie przerwanie??? Z góry dzięki za całą pomoc!
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 ?
Kluczem do tej "zagadki" było dodanie pustej procedury Skoro jest pusta, to lepiej nie włączać tego przerwania i ta procedurę wywalić.
Moim zdaniem masz żłe napisaną obsługe przerwania. Procesor jak wejdzie w przerwanie to w niej wisim i wisi. Mogą być problemy ze stosem. Ja bym to napisał tak ze timerem bym wykonywał akcje a w przerwaniu ustawiał flage wciśniętych klawiszy. Otrzymujesz przerwanie i zapisujesz do zmiennej stan klawiatury. W przerwaniu z Timera sprawdzasz jaki stan...
Timery lub lepiej alarm w pcf8583/8563 i przerwanie zewnętrzne
Taj jak pisze dondu, uzupełnianie tablicy zrób w przerwaniu, korzystaj z trybu free running.
Wg mnie przerwanie od Timera0 ma wyższy priorytet i stąd tak się zachowuje, może się mylę. Spróbuj takiej opcji[syntax=c]ISR(XXX_vect, ISR_NOBLOCK) { ... } [/syntax]
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?:/
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 .
przerwanie atmega32 atmega32 przycisk przerwanie serialin przerwanie
przekaźnik maksymalne napięcie silnik pompy hydroforowej transformator ferrytowy
pralka indesit cieknie pralka indesit cieknie
Podłączenie instalacji elektrycznej w KTM LC2 125 Nadmierny pobór prądu w Citroën Berlingo 2006 1.6 HDi