Witam. Mam problem z przerwaniami w atmega8. Wcześniej nie potrzebowałem przerwań więc to zagadnienie mnie nie interesowało. Potrzebuję wywołać przerwanie zewnętrzne int0 które uruchomi timer1, a ten zacznie odmierzać czas. Proszę o pomoc. Pierwsza zasadnicza uwaga to nie zauważyłem w programie konfiguracji interruptu0- coś np. takiego: config INT0=...
czy można w przerwaniu odwołać się do SUBa ?? bo chciałbym tak zrobić ale mi coś nie działa :(
Tu mam jeszcze pytanie - czy mogę wykorzystać timer, do odpytania co kilka sekund o czas z rtc, co kilkadziesiąt ms o stany przycisków, co kilka sekund o temperatury? Użyj techniki opisanej [url=http://stsystem.elektroda.eu/progra... Co prawda kody są w C, ale z opisu bez problemu...
Instrukcja Wait nie stopuje procesora. Procesor odlicza czas poprzez zmianę wartości rejestrów a więc działa. A skoro działa to powinien także odczytać informację, że nastąpiła sygnalizacja od przepełnienia Timera. Spróbuj zastosować tą instrukcję. Tylko nie wywołuj jej w obsłudze przerwania a w pętli głównej. Bo gdybyś wywołał jej obsługę w przerwaniu...
Przenieś Enable Pcint0 i Enable Pcint3 zaraz przed Enable interrupts, albo zobacz co sie stanie jak skasujesz flagi tych przerwań. PCIFR.PCIF0 = 1 PCIFR.PCIF3 = 1
Nie wiem czy to może coś mieć do rzeczy ale konfigurujesz przerwanie na porcie Int0 na falling a potem obsługujesz przerwanie od Int1. Przy resecie jak nic nie ustawiasz to przerwania zewnętrzne są aktywne stanem niskim. Jak nie ustawiasz Int1 na falling a potem pozwalasz na przyjmowanie przerwania z Int1 to możliwe, że wciśnięcie guzika powoduje kilkakrotne...
Może uaktywniłeś obydwa zbocza ??
Witam Mam takie pytanie.. Czy Bascom potrafi symulować przerwania od Tmerów?? Chodzi mi o to ze gdy napiszę taki program : Config Lcd = 20 * 2 Config Timer0 = Timer , Prescale = 64 Enable Interrupts Enable Timer0 Start Timer0 On Timer0 Etyk Do Loop Etyk: 'tu program obsługi przerwania return To sam nie wchodzi do obsługi przerwania. Zrobi to jedynie...
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.
To jest tak: Config Int0 = P3.2 ' Ustawienie przerwania zewnętrznego na pin P3.2 Reset Tcon.0 ' Przerwanie wywoła stan niski Set Tcon.0 ' Przerwanie wywola opadające zbocze (z H do L) To samo z Int1 To tyle pozdrowienia.
Start timer1 jest zapomniałem o tym w poście pierwszym dopisać. Tylko dlaczego ten sam kod ale przerwanie wywołane na nodze Portb.0 działa?
Chodzi Ci o ilość źródeł przerwań, czy ilość wywołań konkretnego przerwania (np od timera)?
Za dużo kodu wewnątrz obsługi przerwań. Spróbuj wyrzucić wszystkie warunki do głównej pętli, w przerwaniach tylko zliczanie wywołań. Ewentualnie na początku obsługi przerwania zatrzymaj obsługę dla uniknięcia wywołania przed zakończeniem bieżącego (ochrona stosu).
Bascom powinien po wywołaniu procedury obsługi przerwania skasować flagę a tego nie robi...i po obsłużeniu przerwania znów jest ono natychmiast wywoływane i program się zapętla. Trzeba ręcznie ustawić flagę w rejestrze GIFR. Wiem, że C jest dużo mniej problematyczny...sam kompilator ma też mnie roboty, bo to język niższego rzędu jak Basic Bascom, ale...
Co do bascomowego symulatora to działa on u mnie bardzo wolno, a Hardware simulator wyświetla jakieś bzdury Symulację można przyśpieszyć dodając $sim , ale działa to przez usunięcie opóźnień, więc może zmienić zachowanie. W każdym razie polecam przyjrzeć się co się dzieje w pamięci RAM. [url=https://avrhelp.mcselec.com/index.h...
Procesor ATmega od biedy "ma możliwość" obsługi przerwań zgłaszanych z częstotliwością 33 kHz, ale pod warunkiem, że jest programowany w C lub asemblerze, a nie w Arduino ani Bascomie. Obsługa takiego przerwania w C musi być b. uważnie napisana - kilkanaście linii kodu, bez wywołań procedur, mnożeń ani dzieleń.
Nie wiem jak to w bascomie nie wnikałem w kod, ale można to zrobić tak że deklarujesz aktywację przerwania jednym zboczem, a po jego wywołaniu zmieniasz tą konfigurację na drugie zbocze (zmiana w rejestrze MCUCR). Albo wywołanie przerwania ustawiasz na dowolną zmianę sygnału i w jakiejś zmiennej przechowujesz stan wcześniejszy i porównujesz
Dzięki za uwagę. Przyznałem rację poprzednikowi ponieważ wskazał mi przyczynę moich problemów. Natomiast faktycznie częstotliwość wywołania przerwania jest taka jak piszesz. Pozdrawiam i dziękuję!
Może jakiś wyłącznik krańcowy. Szyba dochodzi do końca w skutek czego zwiera wyłącznik krańcowy co powoduje wywołanie przerwania zewnętrznego na atmedze i ona wyłącza silnik.
witam. W internecie jest takich przykładów mnóstwo, wystarczy poszukać, ale napewno skup się na tym, aby kożystać z przerwań wywołanych zliczaniem taktów generatora kwarcowego. pozdrawiam.
Zmienia postać rzeczy a więc... musisz wykorzystać źródło zewnetrznego pzrerwania czyli INT. Podlacz przycisk do INT0 i wtedy wpisz: .... Config INT0 = Low level On INT0 przycisk ......... ..... przycisk: .... .... .... return Teraz wpisz tylko co ma się wykonywać w przerwaniu które wywoła nacisniecia przyckisku ;)
Program w tej formie jaką zamieściłeś zaraz po zainicjowaniu zmiennych i sprzętu wchodzi w warunek "If Timer1" nawet bez wywołania przerwaniem. Później zdejmie coś ze stosu, albo przeleci się po pustym flash`u i zacznie od początku. Żeby w ogóle to zaczęło coś robić to powinieneś po Start Timer dodać, jakąś pustą nawet, pętlę "Do : Loop" Wtedy w pętli...
Przeglądając Twój program mam takie małe spostrzeżenie, a mianowicie w pętli głównej masz wywołaną procedurę Gettime - ' Call Gettime' - która działa na I2C. Co się stanie gdy podczas wykonywania procedury Gettime zostanie zgłoszone przerwanie od Timer'a?? Program przerywa wykonywanie procedury Gettime i skacze do obsługi Timera a tam jest wywoływana...
...Jakie jest zatem rozwiązanie tego problemu (jeśli jest)? Bascomowy UART programowy działa jedynie wtedy , kiedy wywołamy funkcję z nim współpracującą. W pozostałych przypadkach ( kiedy działają funkcje/procedury nie związane z programowym UART-em ) , nadchodzące dane są "niewidoczne" dla procka :( Np. jeśli masz w kodzie Wait 1 , a w czasie działania...
Ja to widzę tak: - ustawisz ADC w tryb Free Running, czyli będzie na okrągło wykonywał pomiary na jakimś wejściu a ponieważ wejście zostawimy niepodłączone, to jest szansa na losowe bity. - po skończeniu pomiaru ADC wywoła przerwanie które będziemy wykorzystywać do wszystkich Twoich potrzeb nie tylko do generowania losowej liczby. Innymi słowy ADC zastąpi...
Hehe, zapomnisz o Wait tak jak ja zapomniałem :) - już nie pamiętam kiedy go używałem. Powinieneś też wiedzieć, że korzystając z przerwań drastycznie odbija się to na dokładności instrukcji Wait - najczęściej opóźnienie nie ma już nic wspólnego z tym co tam wpisujesz. Oczywiście zależy to od "gęstości" wywoływania przerwania - czym częściej wywołanie...
No tak, ale to się nazywa programowe wywołanie przerwania. A tu w programie nie widziałem nigdzie "Clr Pind.2" po uzbrojeniu przerwań. :) Stąd przypuszczenie o ręcznym "doziemianiu". :)
Reti a kasowanie flagi to dwie różne rzeczy, domyślnie przerwania są załączone, wywołanie przerwania powoduje blokowanie reszty przerwań (żeby nienastępowały w czasie trwania jednego przerwania kolejne przerwanie), reti to powrót z przerwania.. powoduje ponowne załączenie przerwań i powraca do właściwego kodu programu, kasowanie flagi jest poto, że...
Jeżeli chodzi o sumulatory Bascoma AVR i 8051 to nie nalęży im za bardzo wierzyć w podawane czasy, jężeli przerwanie miało być wywołane np. co 10ms, Bascom mówi 15 to należy go olać i wierzyć we własne obliczenia (o ile są poprawne).
Nie bardzo jest co komentować, bo najważniejszej procedury (ISR) nie pokazałeś. Jedno jest pewne: Taka konstrukcja i wywołanie procedury 800_ms zakończy się opóźnieniem programu głównego o parę mikrosekund i tyle. Zmienna Licz_8ms będzie się inkrementować tzw. "sobie a muzom". Co więcej, nawet jakbyś poprawnie skonstruował tą procedurę to dalej zamiana...
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ć...
ldi R16,0 Out &H38 , R16 spróbuj to zamienić na : ldi R16,1 Out &H58 , R16 Co do tłumaczeń to jednak w oryginale brzmi to tak: -When an edge or logic change on the INT7:0 pin triggers an interrupt request, INTF7:0 becomes set (one). Co dla mnie w wolnym tłumaczeniu brzmi -Kiedy zbocze lub poziom logiczny na pinie przeniwania 7-0 się zmieni wywoła to...
Myślę że można by użyć przerwania do tego. Np. Sygnał o zmiennym wypełnieniu podać ma na wejscie przerwania INT0 (skonfigurowanego na wywołanie przerwania przy rosnącym zboczu). W obsłudze przerwania należałoby: Włączyć licznik T0 w trybie licznika 16-to bitowego wykonywac pętlę trwającą dopóki INT0 jest wysokie gdy pętla się skończy zatrzymać TIMER0...
Wszystko pięknie działa, ale myślę nad jedną opcją. Inkubator będzie trzebalo chłodzić. Chciałbym z menu wywołać program, który odliczal by 15 min i przez ten czas nie grzać. Jest to wykonalne?
Sprawdzałem woltomierzem i zmienia się na pewno, jak spróbowałem na prostszym programie to działało tzn. jednokrotne wejście do podprogramu wywołanego przerwaniem a później blokada przerwań. O jakie bity dokładnie Ci chodzi?
pier - twój program działa bardzo dobrze, dokładnie tak jak go napisałeś. A że napisałeś go badziewnie to taki masz efekt. Błędy: 1) W przerwaniu INT0 wyskakujesz z niego GOTO do głównego programu, tak nie można. Wyjdź z przerwania komendą RETURN, ale na jego końcu a nie przez podmianę GOSUB. Powinno być: If Sw = 1 Then Powerdown i RETURN na koncu....
Moim zdaniem koncepcja powinna być taka: 1. Obsługa przetwornika analog-cyfra. Na początek dobrze żebyś umiał dobrze zmierzyć liczbę impulsów. Nie wiem dokładnie jaka jest specyfika Twojego sygnału, jaką amplitudę mają owe szumy, skąd się biorą i czy nie warto by ich po prostu potraktować filtrem dolnoprzepustowym, a jeśli mają odpowiednio niską amplitudę...
Chodzi mi o bascom. Dodam, że jak dubluję tą procedurę wewnętrz procedury przerwania to jest wszystko ok. Problem jest wtedy, by odwołuję się do innej zadeklarowanej wcześniej.
Mam rozumieć, że układ zliczał prawidłowo, jeśli nie wykorzystywałeś INT0. Jeśli tak, to ja mam taką teorię: enkoder podaję impulsy o częstotliwości 250kHz (impuls co 4us), w czasie 100ms, takich impulsów może przyjść 25000. Z racji że opóźnienie jest programowe, każde wywołanie przerwania INT0, powoduje "wyskok" z procedury waitms (załóżmy że to jest...
Mówimy cały czas o przerwaniu z timer0, ustawionym na jak najdłuższy czas (1024). Samo przerwanie działa ok, i funkcja, którą skąd zapożyczyłem też działa ok, o ile jest wywoływana nie z przerwania a z głównego programu. Funkcja jest oczywiście zadeklarowana. A po co blokuję przerwania ? No widocznie bez sensu, na wszelki wypadek, bo nie wiedziałem,...
Może spróbuj w ten sposób : $crystal = 4000000 Config Pind.5 = Output 'ustawienie wyjścia na pinie który standardowo sygnalizuje przepełnienie timer-a Config Timer0 = Timer , Prescale = 1 'ustawienie timer1 dzielnik 1 On Timer0 Przerwanie_timer1 'wywołanie przerwania po przepełnieniu timera Timer0 = 145 'wartość początkowa od której timer bedzie zliczł...
He..He.. W książce kilkanaście rozdziałów wcześniej napisali. „W mikrokontrolerach AVR nie jest, zatem możliwe swobodne ustawianie priorytetów źródeł przerwań, tak jak to jest np. w 8051. Czasami może zdarzyć się, że podczas obsługi jednego z przerwań potrzebne będzie obsłużenie innego przerwania.”.. bla..bla..”Wykrycie przez odbiornik...
Pamiętać należy że w ATMEGA8 przerwania wywoływane są stanem logicznym a nie zboczem, więc jeśli na wejściu przerwania jest stan aktywny to po wykonaniu podprogramu przerwania od razu zostanie on ponownie wywołany. To się da ustawić. Nie musi tak być.
Tzn to bedzie jednym przyciskiem włączane ,a drugim wyłączane. Rozwiąże to raczej w ten sposób że będe wysyłał na początku 3-4 bajty samych jedynek(tak żeby wraz z ukladem RC dostać na wyjściu pewny stan nadający się na wywołanie przerwania),a potem jeden bajt odpowiadający za włącz/wyłącz
Przerwania PCINTx wykonują się przy każdej zmianie stanu logicznego, niema możliwości konfiguracji np. tylko dla zbocz narastającego lub opadającego. Stan zbocza na poszczególnym pinie sprawdzasz w przerwaniu. Attiny13 ma 6 pinów PB.0-PB.5 (PCINT0 do PCINT5) które mogą wywołać przerwanie. I tu jest jedna myląca rzecz :) dla tych pinów jest tylko jeden...
Dla mnie byka masz w przerwaniu timer0=1023 ? Ten zegar jest 8bitowy więc brana jest pod uwagę wartość młodszego bajtu w tym przypadku 255, Przepełnienie zegara następuje po jednym impulsie taktującym timer0 czyli po 1024 impulsach zegarowych (prescaler) nie masz tam 5s tylko $crystal/1024 . W przerwaniach unikał bym wywołania call i if . Ustaw flagę...
Podepnij diody pod minus... Aha, w symulatorze stoi bo czeka na sygnał aż zmienna przyjmie odpowiednią wartość, która jest w przerwaniu zmieniana, a żeby wywołać przerwanie to wejdź w symulatorze w zakładkę Interrupts i kliknij OVF0. Program na 100% działa - Atmegę8 sobie właśnie zaprogramowałem...
Skoro moje wywody są bez podstawy ... to dlaczego :?: Dziwne, że ten program nawet komplacji nie przeszedł a zgodnie z helpem działa jak należy. Bo kolega , który go tu wrzucił , powinien był załączyć kompletny projekt , a nie tylko samo źródło.Kod , który u niego się kompilował prawidłowo , u Ciebie nie musi , bo masz inaczej niż On ustawione środowisko...
To wywołanie obsługi pilota też zrób w procedurze przerwania. M. Wiązania w swojej książce to opisał. Listingi są dostępne na http://www.btc.pl/pliki/bas_listingi.zip Jest to program 8_24.BAS
witam ponownie. Innym wyjściem jest zastosowanie przerwania z TIMER1 (16bit.) z preskalerem 1024, oraz ustawienie wartości początkowej po każdym przerwaniu na 55770, wtedy przerwanie będzie realizowane co 1,00003800 s, więc zdążysz ze wszystkim, a jeśli jeszcze wywołasz sprawdzenie temperatury zaraz po wykonaniu przerwania wtedy już napewno zegar będzie...
z tym ładowaniem timera to jest tak że timer startuje od wartości 0 i liczy sobie w górę, aż doliczy do 255 wtedy jest zerowany i zostaje wywołane przerwanie, natomiast instrukcja load timer0, x wpisuje do timera wartość wg wzoru: 256 - x dzięki czemu timer musi zliczyć tylko x impulsów żeby nastąpiło przepełnienie(oraz w tym wypadku przerwanie), tylko...
Teoretycznie wystarczy, ale jak już było powiedziane rozjadą sie czasy. Ja np. zawsze robię obsługę DS w przerwaniach i nigdy nie mam błędów... dla początkującego może to byc trudne, bo trzeba zdążyć z obsługą przed kolejnym wywołaniem przerwania. Odpowiednie ustawienie stosu i ramki to kolejny ważny element aby zmienne przyjmowały właściwe wartości...
W przerwaniu tylko ustaw flagę a w pętli głównej wywołaj procedure wyświetlania i skasuj flagę . Może okazać się , że obsługa procedury trwa dłużej niż czas pomiędzy przerwaniami i program " pójdzie w krzaki " .Były już podobne tematy
W INT0 - STARTUJ dodałbym DISABLE INT0, a dopiero potem w INT1 komendę ENABLE INT0 Drgania styku "startującego" spowodują ci wielokrotne wywołania INT0 i zerowania timera i fałszowanie czasu. Drgania przycisku stopującego nie wpływają na pomiar i można je zignorować.
A mógłbyś kolego napisać jak realizujesz regulację u2008 za pomocą procka ? Co do waszych powyższych rozważań należy pamiętać o działaniu w bascomie funkcji Load TimerX - jest to wartość jaka pozosała do wywołania przerwania czyli dla timera1 np Load timer1 200 oznacza że timer zostanie załadowany wartością 65535 - 200 = 65335 i po 200 mamy przewanie....
Do drasmen: jeżeli chcesz aby układ zadziałał musisz przestawić fuse bity na wew. generator np. 8MHz a do pinów gdzie podłączasz kwarc musisz wpiąć kwarc zegarkowy 32.768kHz. Program dla autora tematu: 'Program wykorzystujący przerwanie od timera0(8 bitowego) generowane co 8ms 'jeżeli przerwanie zostanie wywołane 125 razy, otrzymamy 1 sekundę...
To co napisałeś to pewnie Bascom, ale po pierwsze nie używasz przerwania INT0 tylko portu jako wejścia. Żeby używać INT0 jako przerwania powinieneś po pierwsze skonfigurować jakie zdarzenie na INT0 ma wywołać przerwanie: zmiana stanu czy poziom? Zezwolić na obsługę przerwania INT0 i odblokować globalnie przerwania. Po wystąpieniu zdarzenia nastąpi skok...
Jeśli wywołanie nie działa to znaczy że masz coś w kodzie nie tak. Z tego co dobrze pamiętam to jak wywołujesz funkcję to chyba najlepiej z parametrem. Sprawdź jak masz przerwania.
obsługa guzików w przerwaniu to bardzo dobry pomysł. Zastanawiałbym się również czy by jednak nie przenieść wszystkiego na timer0 (ten jest 8 bitowy) ale taki akurat miałęm projekcik. Do wygaszania zer trzeba by dodać 10 cyfrę (która będzie pusta - 255). Są trzy cyfry więc trzeba zacząc sprawdzanie od lewej (czyli w przykładzie od trzeciej) .... if...
Kod jest za krótki brakuje wywołania timera co 4 ms na tym polega cala idea multipleksowania. Przerwanie musi wywoływać procedurę wyświetlanie. Brakuje deklaracji zmiennych.
Hm, rzeczywiście obsługę "dekodowania" zawartości odebranego stringu można przenieść poza przerwanie. Choć - to akurat rzeczywiście działa :) Ale - to raczej nie zmieni problemu z "ginącą" częścią odebranego stringu, bo przecież zawartość bufora się nie zmienia od momentu "poskładania" go w serial1charmatch. Kiedy następuje wywołanie serialcharmatch...
smalski->O priorytecie przerwań w AVR-ach , można powiedziec tak , że im niższy(mniejszy) adres wektora , tym wyższy priorytet posiada dane przerwanie. To jest zasada stosowana w PC, (np przerwanie 2h ma prorytet wyższy od 3h, ale niższy od 0h... 0h (dzielenie przez zero) ma najwyższy priorytet..).. w AVR wszystkie przerwania mają taki sam priorytet.....
A skąd tam Ci się 39 wzięło ??? :!: Sprawdź to: [syntax=basic4gl]regfile "m88def.dat" $crystal = 16000000 '---------------------------------------... Config Timer0 = Timer , Prescale = 64 On Timer0 Ti_prog Const Przerwanie = 231 '16000000/64/(256-25)=10kHz (100us) Counter0 = Przerwanie Enable Timer0 Enable Interrupts Do ' ' Loop End '--------------------------------------....
... 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. Rozumiem, że zmieniam etykietę przy "ON cośtam skocz_do_obsługi", więc ostatecznie na pałę sprawdziłem wszystkie etykiety z helpa : OC2 , OVF2, ICP1,...
Witam. Czy ktoś z kolegów piszących w bascomie podpowie jak dobrać się do przerwań zewnętrznych z innych pinów niż INT0,INT1,np. w atmega 168 lub 128 gdzie jest dostępna opcja wywołania przerwania z dowolnego wejścia portu?,jak to aktywować , jak zrobić konfigurację i jak wpisać adres gdzie ma nastąpić skok po wywołaniu takowego przerwania? bo nie działa...
Wkońcu to jest Bascom. w bascomie na pożądku dziennym jest mówienie "moduł działa poprawnie gdy inny moduł jest niezaładowany, ponieważ również używa timera i moduły zaczynają interferować niemożna używać ich razem" (zakładając że moduł jest niejawnie dołączany do projektu w bascomie, gdy tylko w kodzie występuje wywołanie funkcji modułu) jeśli program...
źle myślisz. Przerwanie masz 7372800 / 256 / 200 razy na sekundę, a w każdym wywołaniu obsługi przerwania odliczasz sobie dodając 1, aż odliczysz do 144, co oznacza, że upłynęła sekunda (mniej więcej, bo nie wiem dokładnie, co w Bascomie robi tajemnicze "Load Timer0 = 200").
Myślę, że najlepiej usyawić TIMER tak, aby co sekunde wywoływał podprogam zmieniający zawartość wyświetlacza. Chociaż, jak tak teraz myślę, to zły pomysł :D, bo możesz nie trafić i sekundy zmienią się co np. dwie. Może przerwanie INT które wywoła program przy zmianie na wejściu, np. z PCF.
Program w bascom'ie, Procesor ATMEGA 2560. Program ma działać następująco: po wywołaniu przerwania pobierz daną z pozycji nr x z pliku 1 , pobierz daną z pozycji y z pliku 2, wykonaj dodawanie i ustaw port wyj. Program działa ale mam problem z ilością danych, (jeden plik (. txt) to 720 danych jednobajtowych), przy czym mam kilka takich zestawów. Jak...
Witam ! Napotkałem taki problem: Mój program wykorzystuje przerwanie z końcówki INT1. uC M32. Program w Bascomie. Zdarza się, że na wejściu INT1 pojawia się stałe zero i wtedy przerwanie wykonuje się na okrągło, co powoduje zwis programu i reakcję watchdog'a. Próbowałem po wywołaniu przerwania wyłączyć go poprzez Disable INT1 i właczać po pewnym czasie...
Eifr = &B00000011 Set Eifr Sprawdziłeś co robi ten zapis bo coś mi się wydaje że tu masz problem , jak skasować wskaźnik przerwania masz w PDFie atmegi . Wywołanie przerwania powoduje zapis 1 w eifr kasuje się go manualnie zapisując wartość 1 , ale zeruje go też instrukcja powrotu z przerwania "reti" więc jak go ustawiasz manualnie przerwanie ko kasuje...
Witam, Mam mały problem z ogarnięciem tematu odnośnie przerwań. Używam Mega644p i potrzebuję odpalić procedurkę wywołaną zewnętrznym przerwaniem sygnałem podłączonym pod PD6. W sumie to czy ta nóżka czy inna nie ma większego znaczenia. Problem jest ten sam jak odpalić przerwanie inne niż "typowe" w BASCOM. W opisie Atmelowskim ten port przykładowy opisany...
Wiatm potrzebuję zrobić pewną procedurkę ale nie wiem jak to wykonać. A mainowicie podczas wykonywania programu gdy wygenerowane zostanie rzerwanie INT0, program wchodzi do procedury przerwania, a po wykonaniu wraca do miejsca w programie z którego zostało wywołane. Chodzi mi o taką sytuacje żeby program zależnie od wartości zmiennej sprawdzanej w przerwaniu...
naklepaliscie juz 13 postow o rzeczy, ktora dla osoby zapoznanej z tym dokumentem jest oczywista jak to, ze liczby binarne to tylko 0 i 1. Dla jednych oczywiste, dla innych nie, kolega Cepelia jak sam napisał, siedzi dopiero w tym dwa tygodnie. Proponuję zrobić to na timer1 - jest 16 bitowy, dlatego można go użyć do zliczania większej ilości impulsów...
Nie możesz "przekierować" pinu. Przypisanie przerwania zewnętrznego jest hardwareowe. Generalnie wszystko zależeć będzie od tego jak masz skonstruowaną główną funkcję. Jeżeli stosujesz w niej co rusz jakieś opóźnienia to będzie lipa, ale jeżeli cała główna funkcja wykonuje się szybko, bez zbędnych opóźnień to wtedy bez problemu w głównej pętli analizujesz...
No nie wiem czy tak można. Podłączenie 2 wyjść razem gdy jedno daje 1 a drugie 0 źle się kończy. Nie sądzę żeby MAX232 był jakiś inny. Nadal pozostaje problem rozpoznania z którego portu przyszły dane bo mam też 2 COMy wyjściowe i zależnie z którego przyjdą dane to na odpowiedniego muszę je przekierować. ------------ zauważyłem że Bascom (bo w tym piszę+wstawki...
Aby obliczyć prawidłowe wartości stosów wystarczy znać swój program, zwłaszcza to co ze stosów korzysta najwięcej. - Ile jest przerwań i jak mogą się wywoływać wzajemnie. Każde przerwanie może odłożyć na stos prawie 40 bajtów w prologu. - Ile mamy wywołań podprogramów przez GOSUB. Ile mamy wywołań wbudowanych funkcji i czy korzystają z operacji na zmiennych...
Napisałem sobie prosty program w Bascomie AVR - wiem że bascom nie cieszy się najlepszą opinią(...) może zła opinia to po części zasługa początkujących którzy zwalają brak umiejętności na kompilator. Wiec jestem początkujący albo rzeczywiście Bascom to badziewie. Zrobiłem dwa projekty na Bascom (wcześniej używałem C ale chciałem spróbować). Zadziałały...
Tak jest, sprawa zadania odczytu i konwersji danych nie jest tu problemem, kod jest poprawny. Starzy Chińczycy twierdzą, że zupa ogórkowa nigdy nie smakuje tak samo, uważają też, że każdy problem da się rozwiązać wnikliwie studiując literaturę... Panowie, problem tkwił w tym, że wywołanie przerwania zapisuje stan rejestrów, ale.... nie wszystkich !...
Witam. Dobra, już wiem o co chodzi. Problemem jest to, że mikrokontrolery liczą czas jak im się podoba. Po drugie wywołanie funkcji odbierającej trwa jakiś czas i zsynchronizowanie jej z przerwaniem to też spory problem. Ja zrobiłem tak: nadajnik nadaje kilka razy sygnał (tak ze dwie, trzy paczki kodu) pierwszym, a odbiornik po wywołaniu przerwania...
Witam, proszę o pomoc w następującym problemie. Uproszczony przeklejony program w bascom działa w ten sposób że po przesłaniu określonych liter przez rs zapala RGB ledy w odopowiedni sposób. Przerwanie działa dobrze. Natomiast chodzi o procedure "zmieniaj" która to wywołana w przerwaniu działa, ale przerwanie nie powoduje wyjścia z niej. Musi wykonać...
Jest jakaś opcja, żeby w każdej chwili wyjść z wywołanej wcześniej procedury? [syntax=vbnet] If T >=5 Then call "Procedura" End If If T<5 Then Przerwij procedurę, wróć do pętli głównej End If [/syntax] Teraz w razie kiedy nagle T < 5 Procedura musi zostać przerwana i program ma wrócić do pętli głównej. Dobra, chyba wiem, to będzie EXIT SUB...
konfiguracja TIMERA: [syntax=basic4gl]Config Timer0 = Timer , Prescale = 256 'konfiguracja Timer0 jako timer On Timer0 Przerwanie 'wywołanie procedury liczącej przy przerwaniu Enable Timer0 'włączamy Timer0 Enable Interrupts 'włączamy przerwania[/syntax] [syntax=basic4gl] Loop Prztimer: Incr Licznik If Licznik = 100 Then Licznik = 0 If Licznik = X Then...
A ja z kolei znalazłem gdzieś taki programik: Enable Interrupts Config Timer0 = Timer , Prescale = 64 On Timer0 Tim Enable Timer0 Dim M As Byte Do Loop End Tim: Timer0 = 6 Incr M Return Jeśli dobrze licze, to przy kwarcu 4MHz przerwanie będzie wywołane co 4ms, zgadza się? Jak to wszystko przeliczać na Hz? Pozdrawiam
możesz zrobić podprogram do INT1, polegający na tym że gdy zostanie wywołane przerwanie INT1, podprogram zapisuje jakąś liczbe do rejestru, a w programie przerwania INT0 dać linijke żeby sprawdzał co w tym danym rejestrze jest i odpowiednio reagował (zakończył przerwanie lub przed zakończeniem przerwania wykonał dodatkowy podprogram).
Witam po długiej przerwie. Przez ten czas próbowałem napisać sterowanie do mojego LCD Opla. Całość pisałem w bascomie 8051, ale wszystkie procki do sterowania napisałem jako wstawki w ASM (jak na początkującego to sam siebie zadziwiam :) ) Niestety natrafiłem na raczej poważny problem. Procka napisana przeze mnie działa poprawnie. Wszystkie testy robiłem...
Witam forumowiczów, Natknąłem się na pewien problem, z którym nie wiem jak sobie poradzić. Sprawa dotyczy nieprawidłowej obsługi przerwania INT0 podczas wykonywania komend sterujących wyświetlaczem LCD. Do Atmega32 podłączone są: - standardowy wyświetlacz LCD, - źródło impulsów (dokładniej jest to liniał cyfrowy), - przyciski. Impulsy wprowadzone na...
Witam. Mam program, który działa w pętli DO..LOOP typu: DO ... IF warunek THEN procedura ... LOOP przerwanie: ... return sub procedura ... end sub Procedura wywołana w pętli głównej ma opóźnienia na WAITMS. Chciałbym przy pomocy przerwania (przycisk) zrezygnować w dowolnym momencie z wykonywania 'procedury' i wyjść z jej obsługi do pierwszej instrukcji...
Przede wszystkim nie wiecz czy wykrywasz początek bitu startu, jego środek, czy może prawie koniec. Gdybyć wykrywł zbocze z wykorzystaniem przerwania, to dopiero wtedy mozna mówić o synchronizacji. Przecież on b. szybko wykonuje kod, a jedyne co sprawdza to czy zbocze opadło. Nie ma możliwości, żeby udało mu się podczas np. skoku do początku pętli...
to już było. Trzeba samemu skasować odpowiednią flagę która wywołała przerwanie: Przerwanie_rs: If Scon.0 = 1 Then 'czy przerwanie od odbioru <tu program> Scon.0 = 0 Else 'jezeli inaczej to przerwanie od nadawania <tu program> Scon.1 = 0 End If Return
. Zamierzam zrobić tak by mogli wprowadzić korektę (jeśli będzie potrzebna) i zapisać w eeprom. czy to dobry pomysł? Jakoś tak; $Crystal=12000000 Config Timer1 = Timer , Prescale = 8 On Timer1 Inter_1mS Inter_1mS: Counter1 = Counter1 + Licznik (64036 - wychodzi z obliczeń, że da to 1ms) /tu odliczę sobie 103/ Błednie to rozumujesz, albo błednie podałeś...
Cały problem jest w tym żeby te dwie ATmegi się zsynchronizowały. Przerwanie od SPI występuje po zakończenia transmisji pierwszego bajtu. Zanim nastąpi obsługa przerwania to pierwszy bajt zostanie utracony. Nie mamy też gwarancji że dwie Atmegi "wystrzeliły" :) równocześnie i Slave nie czyta np. 4 bajtu nadanego przez Mastera. Jeżeli to by była np....
Fragment: Incr Licznik If Licznik = P Then Portd.2 = 0 End If If Licznik >= C Then Portd.2 = 1 Licznik = 0 End If wykonuje się w najlepszym przypadku (bez wchodzenia do IFów) 6us. Z wejściem do drugiego IFa 7us. Krótko mówiąc procesor nie ma nawet czasu na wyjście z przerwania a już powinien obsłużyć następne. Czyli na tym kwarcu nie widać szans na...
takie locate wywołane z przerwania przyjmując ze właśnie był wyswietlany tekst i dokladnie to zostało przerwane, spowoduje wyswietlenie tekstu tego 'z przerwania' jak najbardziej prawidłowo, ALE... Po powrocie z przerwania procesor wraca w miejsce gdzie był przed przerwaniem, a wiec 'wyslij kolejny znak'....efektem tego jest ze pojawi ci sie napis np....
Najprościej chyba to zrobić w przerwaniu od jakiegoś timera. W każdym wywołaniu sprawdzasz warunki dla każdego silnika: "jeżeli prędkość_aktualna>prędkość_zadana to prędkość_aktualna+1" "jeżeli prędkość_aktualna<prędkość_zadana to prędkość_aktualna=prędkość_zadana" Potem w tym przerwaniu zamieniasz "Prędkość_aktualna" na odpowiednią wartość PWM...
(at)excray On timer1 impulsuj znaczy: wywołaj przerwanie przy przepełnieniu Wpisując do rejestru timera określone wartości SKUTECZNIE steruję przebiegiem wyjściowym. Więc wybór rodzaju przerwania jest OK. Recz w tym że OPRÓCZ oczekiwanych przerwań wskakują mi jakieś obce (at)nowyARM Czytałem, a po Twojej wskazówce przeczytałem jeszcze raz. Pomijając...
A nie możesz wykorzystać przerwania od zbocza np INT0? Jak pojawi się dodatnie zbocze to robisz krótki sygnał i program pracuje dalej. Dopiero jak ktoś puści przycisk i znów naciśnie pojawi się znów zbocze narastające które może wywołać przerwanie. Ideałem byłoby abyś po pojawieniu się przerwania od narastającego zbocza, włączał Buzzer potem uruchamiał...
Ja bym stawiał na brak debounce. Skoro sprawdzany jest stan przycisku to pewnie on do czegoś służy. Może do wyświetlenia informacji na wyświetlaczu. Jeżeli brak debounce to przerwanie to wywoła się pewnie z kilkanaście razy. Może być tez tak ze przepełnia się stos, kilkanaście razy 32 bajty.... i koniec RAM, procek sie resetuje. Ale to tylko zgadywanie...
Nic, wybrać tryb ICP i zbocze opadające, po czym zakończyć. Zbocze opadające na pinie ICP zatrzaśnie bieżący stan licznika i ew. wywoła przerwanie. Alternatywnie sam możesz sobie okresowo sprawdzać stosowną flagę - ponieważ stan licznika jest zatrzaśnięty w ICR nie ulega on zmianie i możesz sobie jego wartość odczytać w dowolnym momencie.
W jaki sposób można odebrać dane o czasie (przez uk) w formacie: c\SS:MM gdzie: c - "wywołanie" ss - ilość sekund mm - ilość minut można to zrobić za pomocą input a,b ale po każdej zmiennej trzeba dać enter. Niestety zmienne muszą być rozdzielone ":" Muszę się dostosować do "nadajnika" i dlatego mam z tym taki problem. Drugie pytanie to, jak to zrobić,...
wywołanie przerwania bascom przerwania bascom encoder przerwania
wiercenie betonie rezystor cewka zapłonowa pułapka basowa
ekspres naprawa żarówka szeregowo
Strojenie zera detektora w radiu Menuet UKF Diesel zamiast benzyny w baku – co zrobić? Objawy, skutki, procedura naprawy