Uwaga! 1) Jeżeli zmienną licznik będziesz miał zadeklarowaną wewnątrz funkcji obsługującej przerwanie to przykładowa deklaracja powinna wyglądać tak: static uint8_t licznik = 0; 2) Jeżeli natomiast zmienną licznik zadeklarujesz gdzieś w programie głównym, wtedy powinieneś ją przykładowo zadeklarować jako: volatile uint8_t licznik = 0; po co te "przedrostki"...
... Zwieram port PD2(INT0) oraz PD3(INT1) do masy i nic się nie dzieje... No to ustaw w projekcie właściwy uC, bo jeżeli w/w kod kompiluje się bez błędów, to jest kompilowany dla innego uC. GIMSK = _BV(INT0)|_BV(INT1); M16 nie posiada takiego rejestru.
gdyby to było takie proste to nie pisałbym o tym na forum, ja potrzebuję czytać pozycje przy pełnej prędkości i to bezbłędnie bez żadnych przekłamań... Maksymalnie schrzaniłeś hardware, teraz to już Cię nic nie uratuje. Do zliczania trzeba było wykorzystać ten większy Timer, a do wykrywania zmiany kierunku przerwanie. Pięknie by to chodziło a procek...
Nie za bardzo mi sie chce anlizowac te dwa listingi, ale mozesz sprobowac zaldowac to do avrstudio i debugowac. Po drugie , wylacz optymalizacje kodu w makefile.
Jeżeli już tak to ustaw przerwanie na każdą zmianę i sprawdzaj stan pinu int0. będzie szybsze bo nie będzie procedur ustawiania falling/rising: config int0=change ... przerwanie_int0: if pind.2=0 then 'opadajace zbocze else 'narastajace end if ... return Z analizy kodu asm bascoma wynika ze szybciej zadziała oddzielny warunek: if pind.2=0 end if...
Muszę Cię zmartwić ;) , ale to nie jest kod wygenerowany dla ATMega 16. Jakiego środowiska używsz :?: AVRStudio+WinAVR,PN+WinAVR , czy jeszcze coś innego :?: Co z plikiem makefile :?: itp. Tak powinien wyglądać wektor przerwania dla Megi16 i nie tylko: 0:0c 94 2a 00 jmp0x54 <__ctors_end> Jeden wektor zajmuje 2 słowa(4 bajty) , a u Ciebie :?:...
a słyszałeś kiedyś o zmiennych typu volatile ???? poczytaj sobie do czego służy słówko volatile a na pewno szybko poradzisz sobie z tym problemem
Kolega Mad Jaro mierzy czas pomiedzy INT-em i przelicza na obroty. zablokowanie INT spowoduje pływanie obrotów( INT nie liczy impulsow). Kolega xury ma rację odnośnie jednokrotnego użycia szukania czujników. A poza tym zsynchronizuj odczyt 1wire z przerwaniem INT tzn. komunikację z 1wire podziel na max -5 bajtowe odcinki i wykonuj je po przerwaniu INT....
ISR to tylko makro, w szczególności jedno define załatwia sprawę. Aczkolwiek masz rację, przerwania to też rozszerzenie standardu, tyle, że bez tego rozszerzenia nie można się obejść, bez przedziałów da się. Oczywiście każdy pisze jak uważa za stosowne, a ja nie zamierzam nikogo nawracać. Po prostu stwierdzam pewien fakt.
;... start: ;jmp delay rcall delay ;lub call delay ;... haslo2: ;jmp delay rcall delay ;lub call delay ;... ;---------------------- delay: ;... ;clr r31 ldi r31,255 ;... in r17,pina ; cp r17,r31 brne exit_delay ;... exit_delay: pop r23 ;... pop r16 ret ;---------------------- Niestety nie wszystko działa tak jak powinno Powyżej masz...
Chcesz odebrać dane w PC a pytasz o przerwanie od UARTU. Aby wysłać dane do komputera po RS232 nie trzeba używać przerwania. Masz w programie procedurę obsługi przerwania od UARTU tylko jej nigdzie nie odblokowujesz. WYkasuj ją. Wogóle na początek zrezygnuj z sei bo nie potrzebujesz przerwań.
1. Nie definiuj zegara w kodzie tylko w opcjach kompilatora: http://mikrokontrolery.blogspot.com/2011... 2. Problem natomiast pojawia się wówczas, gdy funkcja obsługi przerwania wykonuje się długo. Docelowo będzie sterować portami przez około 16 sekund. Przerwanie ma się wykonywać krótko i tego zawsze się trzymaj, bo łatwo...
Jak to nie. Przez sekwencję sei+sleep nigdy nie wychodzisz z obsługi przerwania, tzn. rozpoczynasz obsługę następnego przerwania zanim skończysz poprzednią. W efekcie przepełnia Ci się stos. Takich rzeczy po prostu się nie robi. Ogólnie rzecz biorąc, wyświetlanie z poziomu obsługi przerwania też jest niezgodne ze sztuką, chociaż tutaj nie spowoduje...
kolega Freddie zasugerował jedno z możliwych rozwiązań, mianowicie: zamiast deklarować jakiś wskaźnik do bufora, spróbuj zadeklarować tablicę, np: unsigned char bufor[10]; nie jestem pewien co z tą funkcją dtostrf(), może to ona nie działa...
Witam, Napisałem program do odpytywania stanu klawiszy na Atmega16, kwarc-16MHz. Według wyliczeń przerwanie powinno sie pojawiać co 2,5ms, jednak tak nie jest, jest o wiele wolniej (ponad 1s). Analizowałem program i sam juz nie wiem co może być źle. Pomóżcie Preskaler clk/1024=16000000/1024=15625 1/15624=0,064ms 40*0,064ms=2,5ms #include <avr/io.h>...
Witam uruchomiłem ten program na atmega16 innej niż ta co wcześniej i jak na razie liczy tak jak powinno czyli zasłonie szczelinę transoptora i dodaje 1 tak jak miało to być. A na tej drugiej dalej nie działa tak jak powinno nie wiem czy czasem nie jest problem z płytka pcb która dodam wieczorem
Problem dalej istnieje, zakreskowuję obsługę przerwania ISR(TIMER0_COMP_vect}, poprostu je wywalam i w momencie startu timera 0 wiesza się program, a wtedy przecież nie robi żadnych obliczeń. Bo nadal masz włączone to przerwanie, a nie masz funkcji jego obsługi.
Kilka uwag: - korzystaj z funkcji i rozbijaj program na funkcje. Niektórzy twierdzą, że jeśli blok ma więcej niż 10 instrukcji to należy go wyrzucić do funkcji. Moze to przesada, ale ułatwia czytanie kodu. - nie zostawiaj niewykorzystanych pinów jako wejścia w układzie - łapią zakłócenia, co w centralce alarmowej nie jest zalecane. - wewnętrzny pull...
W Slave wpisujesz bajt do SPDR dopiero, gdy wchodzisz do przerwania. Czyli w momencie, gdy transmisja została już zakończona! (Nastąpiła wymiana danych DO i Z) To jest trochę dziwne, ale w przypadku Slave, w momencie wejścia do przerwania od SPI dane z bufora SPDR już zostały wysłane. Oznacza to, że w pewnym sensie trzeba przewidzieć co chcesz wysłać,...
a przejrzał kolega chociaż raz przykład odbioru RC5 z helpa Bascoma ??? oczywiście tam nie jest on w przerwaniu ale to nic. Za to są takie rzeczy jak: - maskowanie tooglebitu - sprawdzanie czy adres jest np = 0 - co oznacza pilota TV albo przynajmniej jakiś warunek czy adres < 255 - bo inaczej to będzie taki klops właśnie jaki u ciebie występuje...
A stan Timera0 się zmienia? Ja też mam problemy z tym. Ale pod pojęciem "tym" kryje się nie Timer, lecz BASCOM. W BASCOMie niektóre rzeczy nie działają z niektórymi procesorami (np. Timery w ATMEBA88 nie działają, w ATMEGA8 już tak. BASCOM ma źle przypisane adresy rejestrów IO).
Uśpiłeś procesor w przerwaniu. W przerwaniu jak wiadomo są blokowane przerwania więc kolejne przerwanie wybudzające już nie wystąpi. Stąd Twój problem. sleep_cpu nie może znajdować się w obsłudze przerwania.
Oto kod: Nie wiem, czy to może być przyczyną, ale taka deklaracja oznacza "wskaźnik na ulotne dane", a potrzebny jest "ulotny wskaźnik" czyli [syntax=c] char * volatile wskaznik; [/syntax] Oczywiście volatile z przodu też może być niezależnie.
Witam Próbuje napisać program w asemblerze wykorzystujący przerwania od dwóch liczników (uczą dopiero programowania avr w asemblerze) Przerwanie od licznika 0 ma obsługiwać pierwsze cztery wyświetlacze a przerwania od licznika 2 kolejne 4 Problem polega na tym - że pojedynczo liczniki działają a jak chce użyć dwóch to działa tylko jeden (licznik 2)....
Emarcus on liczy przepełnienia timera, który generuje przerwania, co 4ms i coś tam robi w przerwaniu. Ostatnia linijka postu, który cytujesz.
Nic nie trzeba informować kompilatora - Bascom ładnie przyjmuje wprost rozkazy asemblera ale w zasadzie atom1477 zrobił to nawet bez asemblera - sorki - po prostu "ręcznie" odwołał się do rejestrów i wpisał do nich odpowiednie wartości tzn poustawiał bity tak żeby coś tam działało w tym przypadku co ja ci podałem trza by to było mniej więcej zrobić...
Nie. Bo to po ustawieniu fuse jest właśnie wraz z wewnętrzną logiką generator sygnału bazowego całego proca (w tym timerów).
Problem rozwiązany, wystarczyło stworzyć plik całkiem na nowo....
Ależ on to ma na timerze chyba, ta flaga flag_timer2, to jest pewnie globalna dla przerwania i funkcji.
Kiedy użycie przerwania jest właśnie łatwiejsze. Ale ok - Twoja wola. Pokazujesz tylko mały fragmencik kodu. Skoro siedzisz nad tak, prostą rzeczą już drugi dzień to znaczy że być może Twój problem leży w zupełnie innym miejscu programu. Dlatego pokaż cały program. I jeszcze drobna uwaga: Mam nadzieję, że schemat połączeń i minimalnych wymagań co do...
spróbuj zmienić ISR na SIGNAL, nie wiem co to da ale :P wszystkiego trzeba spróbować :P kilka razy się spotkałem z zapisem SIGNAL(...)...... no ale ja się ywłączam z tego tematu już, nie znam się na programowaniu uC w C :P poczekaj na kogoś bardziej kompetentnego :P http://www.elektroda.pl/rtvforum/topic38... może pomoże...
Może tak: [syntax=avrasm].org $014 RJMP SPIIntVector[/syntax] ?
Panowie, dziala!!!!! hehe. Okazalo sie ze jednak makefile byl skopany, wygenerowalem nowy specjalnie dla Atmega16 i przerwania INT smigaja juz ze hoho, dzieki za pomoc, pozdro;)
A Enable Timer0 , to pewnie koza zjadła ;) Nie ma pozwolenia na wykonywanie przerwań Timer0. Piotrek
Kwarc 1,8432MHz, prescaler 1024, timer w trybie CTC na 180 taktów. Kwarc 2,4576MHz, prescaler 1024, timer w trybie CTC na 240 taktów.
0. Dioda podłączona jest do PA0 i do masy czy plusa? 1. Wskazane jest jawnie ustawić g inicjalnie na 0. 2. Pętla główna powinna ustawiać g ponownie na zero po wykonaniu akcji. 3. Bit PA0 nie ma wartości 2 tylko 1 (to chyba główny problem). 4. Poczytaj o eliminowaniu efektów drgań styków (debounce).
O matko, a co to ma wspólnego z przerwaniami, wielopoziomowym menu i LCD? :D
nie wiem czemu przeskakuje do 8 od dołu "reti" po czym dochodzi do pętli głównej i co drugi krok wraca do tego nieszczęsnego "reti" Tam nie powinno być reti, a poza tym jako wektrów przerwań dla ATmega16 musisz używać instrukcji 'jmp', a nie 'rjmp'. Spróbuj zrobić tak: ..... .org 0x00 jmp reset jmp ext_int0 jmp def_vect jmp def_vect jmp def_vect jmp...
Musisz wyzrować bity RS1 i RS2 w Control Register (0Eh) ,13 strona DS
A jak ustawić ten licznik żeby generował takie przerwania ??
Uuuupsss a jak to się stało, że tego nie zauważyłem ?????? Trzeba ubierać okulary. :D Ale to i tak delikatne tłumaczenie, ja znam wersję z fu...... zamiast F :)
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
1. T0 w M16 ma tryb CTC. Skorzystaj z niego. 2. Jak już prawie nic nie robisz w przerwaniu to może warto uruchomić je w trybie NAKED i samemu zadbać o jego obsługę i powrót. Skróci to takie przerwanie.
Witam, walczę z tym cały dzień i nie potrafię zrozumieć dlaczego program nie działa. Próbuje poprostu "uruchomić" przerwanie podczas przepełnienia timera0. Jak widać niżej jest bardzo prosty kod który powinien zapalać i gasić diodę. Preskaler ustawiony na 1024, ustawiona odpowiednia flaga w rejestrze TIMSK ...i nei działa. Jeśli w pętli while wrzuce...
Witam. Moja propozycja jest następująca: 1. Bufor kołowy jak już wcześniej koledzy zaznaczyli 2. Format ramki telekomunikacyjnej <STX> <Byte1> <Byte2> <CRC> <ETX> I w tym momencie niczego nie pogubisz nie pozamienia Ci się baj pierwszy z drugim itd. Nie wiem czy tym jesteś to w stanie w labview tak zmodyfikować aby sobie...
Tak w sumie skoro TIMER2 ma być zawsze wykonany po TIMER0 to po co w osobnych przerwaniach?
Ja bym sprawdził, czy przerywa Ci transmisję po którymś konkretnym bajcie, czy przypadkowym. Sprawdziłbym, w jakim stanie jest bufor. Sprawdziłbym, czy w tym "zawieszonym" stanie przychodzą (lub wiszą) jakieś inne przerwania od portu szeregowego i nie tylko. Albert
W przerwaniu INT0 musisz nie tylko włączać przerwanie od timera ale musisz go wystartować - gdzie to robisz? W main jedno razowo - liczy cały czas?
ale przecież ja nie mam przerwania od ADC tylko od timera, co do przerwań to stare przyzwyczajenia, wiem wiem pozmieniało się :)
hmmm Przede wszystkim: Enable Interrupts On Timer0 Przerwanie Stop Watchdog Config Timer0 = Timer , Prescale = 1024 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256 'PWM=250Hz Load Timer0 = 195 To włączenie przerwania jest wstrętne w tym miejscu:P Co do wniosków... może spróbuj zwiększyć stos o...
A w jaki sposób podajesz stan niski na wejście przerwania?
(at)st4chuu - pokazany przez ciebie kod jest poprawny. SFIOR nie musisz ruszać, bo domyślnie ma on 0 - w celu zachowania kompatybilności z MCU, które mają tylko tryb free running. Skąd wiesz, że powyżyszy kod nie działa? Odczytujesz ADC? Jeśli swoje podejrzenia opierasz na braku przerwań to pokaż cały kod testowy, bo może problem tkwi w nieprawidłowej...
Wiec tak: W ogóle wyrzuciłbym zmienna/flagę F. Nie jest potrzebna tutaj. W programie głównym zamiast sprawdzania F, sprawdzaj A, czyli warunek IF z przerwania przenieś do programu głównego, łącznie z zerowaniem A. W przerwaniu zwiększaj tylko A. Zamiast: If F = 1 Then Cls Locate 2 , 1 Lcd "przerwanie" Wait 1 Cls F = 0 Enable Int0 End If zrobilbym...
siema, napisalem probny progamik zeby nauczyc sie wprowadzac procka w rozne stany uspienia, nominalnie progam poprostu trzyma zapalona diode, poprzez przerwanie INT0 najpierw chce uspic procesor a potem obudzic, ale po wywylaniu przerwania dioda dalej mi sie pali, chyba cos mi sie nie wlacza ten POWER DOWN, prosze o podpowiedzi. #include <avr/io.h>...
Witam. Może spróbuj tak po wywołaniu przerwania ( u Ciebie co sekunda) Odczytaj termometr DS. A następnie wydaj rozkaz pomiaru temperatury. W następnym przerwaniu odczytasz go o tak w kółko.
Jeśli wysylasz male porcje danych i rzadko mozesz zastosowac takie roziwazanie. W inym przypadku proponuje wykorzystac przerwania i zrobic jakis buforek nadawczy/odbiorczy.
Witam, Mam pytanie odnośnie obsługi przerwań w mikroprocesorze Atmega16. Procesor ten ma możliwość pracy z trzema przerwaniami zewnętrznymi. Powiedzmy, że aktywuję wszystkie trzy przerwania. Występować one będą średnio co 3,33ms i będą spowodowane detekcją zera na trzech kolejnych fazach zasilania trójfazowego. Czas trwania przerwania będzie się wahać...
Używam zegara PCF8583, działa mi jego obsługa itp, natomiast mam problem z jego przerwaniami. Układ jest skonfigurowany by generować przerwanie co 1s, po którym procesor ponownie ustawia odpowiednie flagi w zegarze, bowiem samo przerwanie jest jednokrotne. W celu inicjalizacji przerwań od zegara używam procedury: Sub Init_alarm I2cstart 'generate start...
Witam, Mam pytanie odnośnie przerwań w Atmedze16. Pisze program alarmu domowego i ten alarm musi wykorzystywac czujke ruchu ( taka jaka jest w tych wlacznikach do lamp halogenowych ). Na wysjciu czujnika w momencie gdy ktos sie poruszy jest napiecie 9V, a w trybie Sygnal od tego czujnika jest polaczony z INT0. Enable Interrupts Enable Int0 Config Int0...
Odblokuj przerwania przed pętlą główną za pomocą polecenia "sei();" bo inaczej nie będzie działać.
wylacz na czes liczenia przerwania.
Dokładnie, w pętli głównej w ogóle nie obsługujesz hmmm tych przycisków.... a jeśli uważasz że je obsługujesz to spróbuj napisać dlaczego tak uważasz może łatwiej będzie cię naprowadzić. Bo tak to sporo jest pomieszane niestety :(
Czy zmienną counter (inkrementowaną prawdopodobnie w przerwaniu) masz zadeklarowaną jako volatile ? Jeśli nie, to kompilator najprawdopodobniej zoptymalizuje porównanie (counter<=nr) jako warunek zawsze spełniony lub zawsze nie spełniony do momentu zakończenia pętli, w której przecież żadna ze zmiennych porównywanych się nie zmienia.
Kod nieczytelny - użyj tagów Syntax C. O eliminacji drgań styków słyszałeś? Ogólnie nie jest dobrym pomysłem włączanie przerwań przy braku procedur ich obsługi.
No cóż, Bascom umożliwia wstawki w asemblerze, co może skrócić obsługę przerwania...
jak już chesz koniecznie marnować wolne piny (bo może masz ich zbyt wiele) to lepiej podłącz sobie te przyciski przez 74HC30 i będziesz miał jeden wspólny sygnał dla przerwania INT jednocześnie wejścia 7430 podłącz pod jakiś port i w przerwaniu odczytasz sobie ich stan. Nie jest to najlepszy sposób bo to samo można zrobić w przerwaniach i uzyć klawiatury...
Jak już kolega Dr_DEAD napisał w obsłudze przerwania możesz zezwolić na inne przerwania niezależnie od priorytetów.
Panowie, bez włączonego PWM'a transoptory radzą sobie świetnie, nie jest to na pewno ich wina. Dla świętego spokoju podpiąłem je odwrotnie i nic to nie dało. Wydaje mi się, że bascom błędnie konfiguruje te przerwania.
W przerwaniu Int0 inkrementuj zmienną. Ustaw timer na jakąś jednostkę czasu i w przerwaniu od tego timera obliczaj cześtotliwość i zeruj zmienną
Pętla jest, ale zanim w nią wejdziesz blokowane są przerwania :( To while(1) z tego powodu jest niezbędne.
Po pierwsze dodaj dyrektywę informującą kompilator z jakiego zegara korzystasz. Po za tym w przerwaniu nigdy nie używaj opóźnień bo to podstawowy błąd.
Tak, coś źle popatrzałem i ze 125kHz zrobiła mi się ATMega128 :) Nie pytaj jak :)
Mnie też się kompletnie nie podoba twoje przerwanie, od kiedy to w przerwaniach stosuje się procedury opóźniajace? Program postawiłeś na głowie inna sprawa że jak skasujesz flagę wystąpienia przerwania w rejestrze GIFR a potem zezwolisz na wykonanie przez SEI to program obsłuży je tylko wtedy kiedy ono wystąpi. Tylko że jak obsługa będzie taka jaką...
Wydaję mi się że jest to możliwe ale procedura umieszczona w podprogramie powinna być bardzo krótka. Pewniejszym sposobem jest stosowanie flagi w przerwaniu a w pętli głównej przetwarzanie jej.
Próbowałem i dalej nie działa. Chodzi o to, że program wogóle nie wchodzi w miejsce podprogramu przerwania "obr"
LCDinit(); LCDcursorOFF(); Daje się raz, na początku funkcji main a nie w pętli a tym bardziej w przerwaniu.
temp powinno być volatile. Inaczej się optymalizuje w pętli głównej, spójrz na wygenerowany kod asemblerowy. Dodano po 1 Zarówno "temp" jak i "i" powinny być volatile. i nie musi. Jest wykorzystywane tylko w przerwaniu. Za to powinno być zadeklarowane jako static w funkcji obsługi przerwania.
Witam Też mnie to dziwi, ale może wyłącz niepotrzebne w tej chwili przerwania.
Sprobuj jeszcze od timera0 obsluge przerwania w petli glownej, a Krotki kod generujacy tego prostokata, mozesz zorbic: -przeliczajac ile z danym kwarcem wynosi okres danej czestotliwosci wpisac do licznika timera1 polowe tej wartosci, aby co pol okresu zmienial stan wyjscia na przeciwnym, przerwanie od Timera1 oczywsice ze wzgledu na prostote zrob w...
Zmieniałem porty nie zmieniając komentarzy:D, poprawie. W każdym razie nie działa ,może trzeba uruchomić przerwania?
Nie prościej generować przerwanie co np 1s od timera?
Albo tryb CTC i przerwania od niego albo normalny tryb pracy i przerwanie od przepełnienia.
Witam! Robię transmisje na podczerwieni i mam problem z przerwaniem zewnętrznym . Chce z pomocą przerwań odbierać dane, ale narzazie mam tylko prosty program reagujący na jakąkolwiek zmianę na INT0 , INT1 , program oczywiście nie działa. Proszę o pomoc, oto kod : int main() { DDRA = 0x11111111; //mam diody na dwóch najstarszych bitach palące...
Witaj. WGM12 jest w ATmega16 w rejestrze TCCR1B. W rezultacie masz ustawiony tryb NORMAL, a nie CTC.
Mam prosty program licznika oparty na wyświetlaczu led. Program nie dokonuje przerwań z timerów. Czy może ktoś jest w stanie rozjaśnić co jest nie tak? Czy jest możliwość, że fuse bit'y od przerwań są źle ustawione? Ten sam program wgrywając do M16 za pomocą STK500 działa sprawnie tylko wtedy, gdy w bascomie ustawie zamiast M16-90S2313 (oczywiście należy...
Może jednak podpowiesz jak to ustawić żeby działało poprawnie? Nawet jeśli ustawie wszystko dobrze to nie będę miał pewności czy tak właśnie jest ponieważ nie jestem pewny czy czujnik działa(wyciągnięty z niedziałającej drukarki).
Tak tylko pętlę główną masz zajętą i nie wiele już zrobisz... A w przerwaniu to w przerwaniu ;)
Nie znam całego twojego programu, ale mam pytanie: Jakie warunki chcesz sprawdzać w przerwaniu?
Czyli nie sprawdzales na gotowym ukladzie ? :) Logicznie patrzac, to przerwanie dodaje jedynie male opoznienie, bo w koncu nic w nim nie robisz, a opoznienie negatywnie na dzialanie lcdka nie wplywa. Dlatego moze zobacz na prawdziwym ukladzie czy bedzie dzialac :)
pier- w tym programie który Ci podałem masz wykorzystać zmienną "flaga_dodatkowa" do sterowania wyświetlaczem w sub- a nie w przerwaniu Timer2. Timer2 wyłącz. I daj program po przeróbkach. Żaden kwarc na to nie pomoże- trzeba korzystać z przerwań.
Jak zrobic Input w przerwaniach ? mam program dla atmega16 odbierajacy dane w przerwaniach aczkolwiek jest to zrobione w taki sposob ze odczytuje Udr i przypisuje jej wartosc do jakies zmiennej no i nie mam jak "ladnie " wyslac np liczby 53 <przypisywanie rejestru Udr do zmiennej powodoje ze zczytywane sa z klawiatury kody ascii a 53 ma "5">
Hmmmm.... Po co włączyłeś odbiornik w UART, skoro go nie wykorzystujesz? A na dodatek włączyłeś przerwanie od odbiornika! UCSRB = (1 << RXCIE) | (1 << RXEN) | (1 << TXEN); Mało tego... TX w uracie jest na tej samej końcówce co PD1, więc jak to możliwe, że po włączeniu nadajnia w UART wogóle program reaguje na tą końcówkę? PD0 to końcówka...
Być może wywyłujesz jeszcze jakieś inne przerwanie które nie ma procedury obsługi - stawiam na UDRIE. Dodaj : SIGNAL(SIG_UART_DATA) //przerwanie - bufor nadajnika pusty { } oraz dla porządku SIGNAL(SIG_UART_RECV) //przerwanie - znak otrzymany { } Pamiętaj że flaga UDRE (bufor nadajnika jest pusty) jest ustawiona po resecie, a ty napisałeś: UCSRB |=...
A mnie właśnie działa bez problemu z BASCOMEM, mam impulsator od kuchni mikrofalowej i jest OK. Jak chciałem zrobić na przerwaniach to liczył cuda. Więc dałem sobie
Umieść odbiór danych w obsłudze przerwania od URXC.
hmmm, chyba sie troche zle zrozumielismy, albo ja problemu nie rozumiem. W mojej AtMega16: int0 jest na PD2, a int1 na PD3. I chodzi mi o to ze w moim zestawie uruchomieniowym nic tam nie jest podlaczone, a chcialbym potrenowac sobie przerwania ktore by przychodzily z innego portu, np. z PC2- poniewaz tam mam przycisk podlaczony. Jak to zrobic? Dodam...
no wykonuje ci się wszystko bardzo wolno - ponieważ w procedury obsługi przerwań pakujesz sobie czaso-żerne procedury w tym te najgorsze czyli opóźniające. popatrz ile np u mnie zajmuje kod przerwania od zegarka PCF // przerwanie INT1 generowane jest przez PCF8583 co 1 sekundę // ustawiana jest flaga od której zależy wyświetlanie // czasu, daty, temperatury...
Skoro wywołuje ci się przerwanie przy starcie to nic dziwnego że masz 9 wpisane. A kasujesz w ogóle fagi przerwań przed włączeniem globalnego zezwolenia i po konfiguracji przerwań???
Jeszcze jedna ważna rzecz - aby funkcja _delay_xx poprawnie działała, należy włączyć optymalizację. ...i nie korzystać z przerwań.
Nie wiem jaki to uP ale np. dla ATmega16 wygląda to tak: Włączasz przerwanie: UCSRB|=(1<<TXCIE); sei(); //dostępne globalne przerwania A tu jest podprogram obsługi przerwania: ISR(USART_TXC_vect) { cbi(PORTB, PB2); //0 na pinie PB2 } aha i jeszcze musisz włączyć bibliotekę: #include <avr/interrupt.h>...
atmega16 przerwania usart przerwania zewnętrzne atmega16 renesas przerwania
przyczyny usterki sondy lambda regulacja turbo wyciek oleju pompy wspomagania
napęd bramy przesuwnej uziemienie basenu
Urządzenia do pomiaru obrotów silnika w dalekopisie Wymiana przegrzanego rezystora: czy to konieczne?