Rejestr EIFR to rejestr FLAGI przerwania, która jest automatycznie zerowana po zakończeniu przerwania. Badanie jej w przerwaniu musi dac wynik pozytywny. Poza tym masz w tym kodzie błąd: reset eifr.0 if eift.0 = 1 then set led chyba powinno być: if eifr.0 = 1 then set led Napisz jak ustawiasz rejestr EICRA Na końcu przerwania zbadaj If EIMSK.0=1 then...
Witam, zaczynam dopiero w AVR GCC, więc pytam, bo nie znalazłem odpowiedzi na forum. Jest sobie struktura,która składa się z 4 bitów. Te cztery bity mają być ustawiane i kasowane co pewien okres czasu przez przerwanie. Wartości tych bitów mają potem być kopiowane na odpowiednie piny portu D. #include<avr/io.h> #include <avr/interrupt.h>...
przyzwyczajony do uC pokroju atmeg8 A jaka jest róznica w tym? Czy to atmega czy attiny dziala tak samo ale wyczyszczenie flagi tak? Po to jest
Polecam blog naszego kolegi: http://www.stsystem.elektroda.eu/index.p...
Witam wszystkich Mamy przedświąteczny okres a tu jeszcze taki problemik mnie dorwał Jak dokonać podziału żeby uzyskać 1/12 sekundy w pełnej wartości bez przecinków O ile jest to wykonalne ? Do dobrania jest kwarc preskaler i dowolna wartość podziału flagi.
Efekt jest dokładnie taki jak kod - o to mogę się założyć. Twój kod ma po prostu błędy i tyle, więc czego oczekujesz? Poza faktem braku volatile "tu i tam", to zerowanie tej flagi w przerwaniu masz, ale gdzie masz jej ustawianie? Nigdzie. 4\/3!!
są różne tryby obsługi lcd(4/8 bitowy, zodczytem flagi zajętości i bez), i nie wszystkie piny musisz wykorzystywać http://radzio.dxp.pl/hd44780/
Odbiór znaków rób w przerwaniu i zapisuj je kolejno do bufora. W przerwaniu tym włączaj lub resetuj przerwanie timera tak, aby przerwanie timera było wyzwolone dokładnie 3,5 znaku później. Jeśli w tym czasie przyjdzie jakiś znak resetuj timer i cykl będzie mógł powtórzyć się, jesli jednak znak nie zostanie odebrany w tym czasie przerwanie timera wyzwoli...
A jakiego kompilatora używasz? Jesteś pewien że on łyka zapis typu RXC? Bo np w Code vision musze zrobić tak: if(UCSRA.7) ... za to w winavr czy innym gcc żeby wytestować bit to trzeba użyć lepszych myczków :) Pozdrawiam.
Czy "flagi" odpowiednio ustawione ? Mam na myśli "FUSES".
Też mi się tak wydaje. Najprościej sobie napisać funkcję, która dodaje nowy komunikat, lub czeka aż możliwość takiego dodania wystąpi, czyli sprawdzać stan flagi.
Ok, ale ciągle czekam jak nazwiesz flagi w pokazanej przeze mnie strukturze.
Witam, Niestety natrafiłeś na ogólnie znany problem :-) I2C w stm32f103 jest po prostu ... nie działa najlepiej. Jeżeli dobrze pamiętam przy próbie odczytu nie ustawia mu flagi IV5 i można tak czekać i czekać. Jeżeli masz nowe biblioteki to spróbuj zmienić prędkość transmisji na 50kB. Jeżeli to nie pomoże to zostaje ci bitbanging :)
No dobra to tak trochę "po chłopsku" to opiszę: Jeśli ustawisz Bytematch = 13 to znaczy to tyle, że program przejdzie od podprogramu w którym może być tylko jedna linijka np. jak ja to zrobiłem w moim programie wysylania sms: Serial0charmatch: Input Todczyt Noecho Return Oczywiście trzeba ustawić Input na działanie tylko na znak enter (13). Proste...
Te Waity do diody Led żeby patrzeć czy program się zawiesił nie są szczęśliwym rozwiązaniem dla programowego portu :D Zobacz tak. Dioda błyśnie jak coś odbierze i oczywiście wyśle Ci to drugim portem software`owym. [syntax=vbnet]$regfile = "m328pdef.dat" $crystal = 8000000 $hwstack = 32 ' default use 32 for the hardware stack $swstack = 10 ' default...
Co do tych flag - nie prosciej ustawic ktrotki okres WD i w kazdym miejscu umiescic WDR? Wtedy na biezaco WD jest resetowany w miare poprawnego wykonywania kodu. W miarę niepoprawnego również. Dlatego flagi są lepsze.
Wymuszasz zmianę wartości danego pinu, ale bez ustawienia flagi OCFnx. Nie działa w trybach PWM.
flagi te zerujesz poprzez wpisanie w to miejsce logicznej "1" czyli mozna to zrobic naprzyklad tak: ldi r16,(1<<INTF0) out GIFR,r16 pozdrawiam
Powiem Ci, że nie wiem po co tak ma być, ale podam Ci mój kod. [syntax=basic4gl]Rc5get: Disable Int0 Enable Interrupts Set Rc5flag Return[/syntax] Zamiast ustawiania flagi można dać odbiór kodu. Ale ja wolę to robić w pętli. Nie wiem tylko po co to Enable Interrupts skoro jest ustawione na początku programu, ale bez tego nie działa.
Napisałem Ci już wcześniej żebyś się zdecydował, z którego przerwania chcesz korzystać. Ładujesz wartość do OCRA, a włączasz przerwanie z kanału B. To jest akurat dobrze, w rejestrze OCR1A mam wartosc porownywaną tak jest w dokumentacji. A co dokumentacja mówi na temat zezwoleń i flag przerwań?
Aby korzystać z flag resetu do rozróżniania poszczególnych warunków wystąpienia resetu, użytkownik powinien odczytać i dopiero później resetować MCUCSR najwcześniej jak tylko to możliwe w programie. Jeżeli rejestr ten jest wyzerowany nim zajdzie inny reset, źródło resetu może zostać ustalone poprzez sprawdzanie flag reset. Atmega sterująca piecem co...
Szkoda, że kolega nie umieścił kodu. Akurat teraz ten temat mnie interesuje. Jeśli to ktoś czyta to proszę o linka (Atmega i zwykły generator fali prostokątnej)
W ogóle nie używamy _delay() -nie tylko w przerwaniach. Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
Mam dobry pomysł na owy problem :) A więc zatrudnię timera2 i tryb asynchroniczny. Na nóżki PC7 (TOSC2) PC6 (TOSC1) podłączę kwarc zegarkowy. Przy odpowiednim preskalerze będzie mi on generować przerwanie co 1s. Aplikacja C# wyśle mi ustawione przeze mnie dane czasowe na atmegę - np 18/6h. Atmega przeliczy sobie ile sekund to te dane godziny i podstawi...
Nie da się skasować flagi, jest ustawiona tak długo, jak długo wejście INT ma poziom niski. Jest to prawdą (i to częściową) w przypadku wyzwalania przerwania poziomem niskim. W przypadku wyzwalania zboczem, lub zmianą poziomu flaga jest jak najbardziej kasowalna czy to sprzętowo czy programowo. Wracając do wyzwalania poziomem niskim: flaga nie "jest...
Korzystając z sin ,cos, asin ,acos na avr mam inny wynik niż na komputerze kod identyczny a chodzi o wschód zach. słońca ,nie bardzo już wiem dlaczego tak się dzieje ,potrzebne jakieś flagi kompilatora czy co?
tak.. tzn pomysł z globalną flagą nie jest dobry? są lepsze rozwiązania od tej flagi? no bo rozumiem, że ze skokiem nie ma sensu
.... W pętli głównej sprawdzam na okrągło bit 0 rejestru 0 układu ( sprawdzam flagę alarmu timera). .... "Additionally, a timer alarm can be programmed by setting the timer alarm enable (bit6 of the alarm control register). When the value of the timer equals a pre-programmed value in the alarm timer register (location0F), the alarm flag is set ( bit1...
Czekaj, czekaj. Jeden czujnik odpali przerwanie INT0 a w tym przerwaniu sie uruchomi timer. Drugi czujnik po INT1 ma go wyłączyć. Raczej o tym myślałem. Lepiej tak: czy ktoś by mi dokładnie wytłumaczył jak wywoływać timery, zbierać z nich czas, do czego służą poszczególne rejestry. Noty katalogowej tego procka po polsku nie znalazłem, a dobrego poradnika...
Przerwania tutaj są zbędne. Polecam zrobić tutaj pomiar na flagach, ale tych sprzętowych. Z jaką częstotliwością działa ta atmega ?
Czeka Cię cierpliwe studiowanie DS. W trybie asynchronicznym- który musisz skonfigurować w twoim projekcie- przerwanie co 1s będziesz miał gdy w trybie CTC ustawisz rejestr 0CRA na 127 (str.160). Oczywiście musisz też ustawić zezwolenie na obsługę tego przerwania. Jeśli chodzi o 20ms- to z dokładnością jest trochę gorzej. Przy początkowej wartości timera...
W timerze (np. co 0.5 sek) gasisz albo zapalasz flagę (powiedzmy o nazwie fMiganie) Oczywiście po każdej zmianie flagi (fMiganie) następuje odrysowanie całości wyświetlanego zbioru elementów w najstępujący sposób: 1. Jeśli fPozycja jest poza zakresem zbioru wyświetlanych elementów (np. =0) - wtedy obraz wyświetlany jest bez migania. 2. Jeśli fPozycja...
Przyczyna jest w tych linijkach Trzeba też pamiętać, że jeżeli zdefiniujemy tablicę n elementową i spróbujemy zapisać coś pod indeksem równym lub większym n to kompilator nie zgłosi błędu, ale skutkować to może nieprawidłowym działaniem programu.
W przerwaniach wywołujesz bardzo długie funkcje. A przerwania masz szybkie więc zanim funkcja się skończy to już kilka-kilkaset przerwań Ci ucieknie pozostawiając po sobie flagi które wywołują przerwanie natychmiast po zakończeniu poprzedniego.
Nic nie trzeba przestawiać. UARTem jako slave ne generujesz przecież resetu. Pisałeś o wykrywaniu resetu przez uart. Jak jednym uartem wykryję wartość bitu, reset, zgłoszenie alarmu (przedłużony reset) i reset overdrive? Dodano po 18 chyba, że masz kuszącą dla mnie ofertę finansową :) Jeżeli uartem załatwisz wszystkie powyższe stany magistrali to,...
Dlaczego wykorzystałeś drugie rozwiązanie zamiast pierwszego (IMHO - znacznie lepszego)? Wykorzystując takie zmienne jako flagi prowadzisz do niepotrzebnego komplikowania kodu i utrudnienia kontroli dynamicznie rozwijającego się programu :) Jedna z propozycji rozwiązania problemu: [syntax=c]char SPI_MasterTransmit(char cData){ char spi_return; ATOMIC_BLOCK(ATOMIC_RESTORESTATE){...
Witam, a może po prostu ustawiaj w przerwaniach flagi, a dane umieszczaj w odpowiednich buforach? Funkcja main może te dane przetwarzać :)
Najprościej to chyba tak: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define TIMERSTART 6 volatile uint8_t FLAGA_50 = 0; volatile uint8_t FLAGA_1000 = 0; // funkcja obslugi przerwania TIMER0_OVF 8MHz / 64 * 250 wychodzi co 2ms // dla innego taktowania nalezy ustawic inny preskaler i/lub inne liczniki stawiania flag ISR(TIMER0_OVF_vect)...
programu to ja ci już nie przeanalizuję teraz bo padnięty jestem ..... .... ale to że wgrywasz bootloaderem i że atmega była programowana wiele razy - nie ma tu najmniejszego znaczenia Dodano po 22 ok - po pierwsze nie stosujesz wcięć w kodzie a jak stosujesz to totalnie bez ładu - przez co nawet tobie trudno później dostrzec jakieś błędy (a szczególnie...
http://www.btc.pl/pliki/bas_listingi.zip ->program 8_24.BAS Ja też długo się męczyłem z RC5, ale odpaliłem to i już wiedziałem, gdzie miałem błędy. Spróbuj sobie tak jak w tym przykładzie dołożyć jakąś flagę i ustawiaj ją w procedurze obsługi przerwania RC5, a dopiero w pętli głównej badaj jej stan, bo bezcelowe wydaje się "Enable INT0" w każdym przejściu...
Wyłącz optymalizację. Tak swoją drogą, to styl pisania jest zły. Możesz śmiało wyłączyć przerwanie i usunąć jego wektor, a zamiast tej blokady którą masz na początku wstaw czekanie na ustawienie bitu mówiącego o przerwaniu. Tylko musisz pamiętać o wyczyszczeniu flagi po jej ustawieniu (rejestr r/cw!) while(bit_is_clear(flaga przerwania)){}; wyczyść_flagę;...
Cos zle kombinujesz. Po co chcesz przesuwac PORTB ?? Przesuwasz rejestr z dana do wyslania szeregowego a nie rejestr portu. Do tego zadania najlepiej wykorzystac instrukcje ROL lub ROR i testowac flage C instrukcjami BRCC i BRCS (oczywiscie asembler) i w zaleznosci od stanu flagi ustawiac pin lub zerowac. Pozdro Dexter
Witam, Może wiecie gdzie znajdę opis znaczenia poszczególnych bitów specjalnych rejestrów Atmega8 - chodzi mi przede wszystkim o bity i znaczniki przerwań od USART'a (flagi) i Timerów - w pdf'ie tego nie widziałem? I jeszcze jedno, skoro ta Atmega posiada sprzętowy I2C to czy Bascom korzysta z programowej obsługi tego protokołu tak jak w przypadku 89C2051...
Funkcja czekająca na odpowiedz powinna być odporna na brak jakiekolwiek odpowiedzi. W przypadku braku odpowiedzi z modemu Twój kod się "zapetli". Jak wygląda kod usr0_getc()? Nie widzę związku między ISR a tą funkcją. Zakładam również, ze flagi (flagGotLine i pozostałe) zadeklarowales jako volatile. Postaraj się zaimplementować pkt. 4 z mojej poprzedniej...
Przerwania w takich mikrokontrolerach to nie wątki niestety - całkowicie złe podejście. Ale kombinować warto ;) Ja zwykle wykorzystuję jakiś Timer do generowania tzw tyknięć systemowych co jakiś krótki czas np kilkanaście- kilkadziesiąt ms oraz oznaczania tylko kilku flag oznaczających upływ kilku stałych odcinków czasu np Flaga co 40ms, Flaga co 1s...
... ale wtedy musisz mieć pewność, że obsłużysz to przed pojawieniem się kolejnej sytuacji ustawienia flagi przerwania. Oczywiście TIFR to tylko przykład, bo flagi są także w innych rejestrach, np. TXC w UCSRA.
CTS i RTS możesz zignorować, a możesz podłączyć, jak ci wygodnie, najfajniej byłoby do tego samego portu co RxD i TxD, to są flagi dla programów obsługujących, usprawniające wysyłanie pakietu danych. Samo ich podłączenie niczego specjalnego nie tworzy, trzeba do tego zgrać oprogramowanie w mikrokontrolerze i w PC, aby ze soba współdziałały.
Myślę, że jedynym sposobem jest odbieranie danych z USARTa za pomocą przerwań. W programie należałoby ustawić jakieś opóźnienie i sprawdzać cyklicznie, czy nadszedł nowy znak. Jeśli w określonym czasie (zależnym od częstotliwości "powtarzania" klawiatury) nie nadejdzie nowy znak to diodę wyłączyć, jeśli nadejdzie i jest to 'w' to zapalić. Więc w funkcji...
srób jeszcze warunek na sprawdzanie czy nie wyjezdzasz poza bufor. Nie widzimy funkcji send. Jestes pewien ze dostajesz znak '\n'?
O kolejkowaniu też myślałem ale to sporo przebudowa programu. Tylko jeśli program jest koszmarnie napisany :) Kolejkowanie to jedyne sensowne rozwiązanie. W aplikacji sprowadzi się do prostej wymiany instrukcji odwołującej się do SPI na funkcję realizującą transakcję. Wkleiłbym ci kod, ale jest tego trochę, tak jak pisałem, ściągnij sobie przykady...
To jest przyklad tego jak mozna obsluzyc DS1820 przez mega 8 ale jest tam tez obsluga wyswietlacza w C.Moze sie pryda.Sam to dostalem od jednego kolegi z forum:-) wiec mam nadzieje ze sie nie obrazi...mnie interesowal DS. Pozdrawiam Maciek! #include <avr/io.h> #include <avr/pgmspace.h> #include <stdlib.h> #include <ctype.h> #include...
Rejestr SREG zawiera podstawowe flagi mówiące o stanie procesora potrzebne do kontroli wykonywania programu (warunki, skoki itd.) Na czas obsługi przerwania należy zapamiętać te flagi gdyż kod w przerwaniu je oczywiscie może zmienić. Po powrocie z przerwania procesor podejmuje program w miejscu wystąpienia przerwania i musi wiedzieć co sie działo wcześniej....
W zasadzie dlugiiii chyba robisz w tym przerwaniu "masło maślane". To chyba będzie działać bo kasowanie flagi przerwania następuje po obsłudze ale rozumiem irytację tadzik85. Mnie taki kod też nieco irytuje.
Przez ostatnie 2h doszedłem do tego w czym tkwi problem zarówno w obsłudze przerwania od timera0 oraz od zewnętrznego INT1. Problem polega na tym że zmienna globalna którą wykorzystuję jako flagę istnieje tylko w obsłudze przerwania,flaga nie jest widoczna w głównej pętli programu lub po obsłudze przerwania resetuje się ATmega. Wywnioskowałem to gdy...
To by tłumaczyło dlaczego odbierasz 3 znaki - (at)tmf miał rację. Odbierasz pierwszy i np wyświetlasz, w tym czasie przychodzą kolejne, AVR ma bufor na dwa znaki, więc dwa odbierzesz poprawnie, resztę gubisz. Niestety nie wiesz o tym, bo nie sprawdzasz w USARTReadChar() flagi przepełnienia :-( Odbieraj na przerwaniach, zrób sensowny bufor na dane a...
niech kolega właczy sobie symulator i w pracy krokowej od razu zobaczysz w którym miejscu programu program się resetuje, przerwanie zasymulujesz przez ustawienie z ręki odpowiedniej flagi.
Dokładnie tak to powinno wygladać. Nie próbowałem jeszcze, ale wydaje mi się, że jeszcze będę musiał ręcznie kasować flagę TXC, bo nie wywołuję obsługi przerwania i nic mi tej flagi z automatu nie wykasuje - ale jeszcze to sprawdzę.
Postanowiłem zamknąć temat, a żeby był jakiś porządek. Ostatecznie na razie przerobiłem trochę kod i zastosowałem flagi i instrukcje if. Dzięki temu jest jakaś logika i prządek. Temat wielowątkowości na ten moment odpuściłem. Pozdrawiam.
Ale zdaje się chodzi o to że jeśli masz podłączoną linię R/W do uC to pewnie przeprowadzasz inicjalizację(czy jakąkolwiek operację na LCD) z odczytem flagi zajętości LCD. Nie wczytywałem się jak to wygląda bo używam biblioteki bez odczytu tej flagi ale prawdopodobnie każda funkcja odczytuje flagę zajętości na lcd aby przyspieszyć jego działanie(pominięcie...
http://obrazki.elektroda.pl/9745806300_1... Witam. Sesja się zbliża, więc tradycyjnie zacząłem już prokrastynować :D . Ostatnio zacząłem pisać bibliotekę do obsługi klawiatury PS/2 w C dla AVR i postanowiłem na szybko w godzinkę lub dwie stworzyć jakiś praktyczny projekt w celu jej przetestowania. Początkowo nie planowałem tego publikować,...
A testowanie ADSC zamiast ADIF nie załatwia sprawy? ps. Reinicjowanie adc "w kółko macieju " to nie jest dobry pomysł.
Ta zmienna "flag" jest po to żeby odbiornik był jednorazowo ustawiony w tryb oczekiwania na dane do momentu ich odebrania. Spróbuj wyłączać poszczególne podprogramy żeby sprawdzić co Ci blokuje.
A wzmacniacz przed głośnikiem dałeś oby? Sam TEA5767 nie wysteruje nawet słuchawek. Oczywiście że można zrobić szukanie - bity sterujące SEARCH, SUD (up/down), MUTE i flagi w statusie READY i BAND_LIMIT, zdaje się że nawet było to w osobnym dokumencie opisane.
To się zgadza. Ale czy flaga RXC nie mówi o zakończeniu odbioru? Zrobiłem pętle warunkową do-while sprawdzająca właśnie tą flagę...
Dokumentacja nie daje odpowiedzi. Jest uzasadniona tylko utrata jednego bajtu a nie dwóch. https://obrazki.elektroda.pl/8259748000_... Teoretycznie ta pętla (at)excray A Twoja odpowiedź tego nie wyjaśnia. A z zachowania procesora można wnioskować, że procesor przepisując dane z UDR0 do rejestru przesuwnego tą właśnie czynność sygnalizuje...
Możesz wrzucić jakiś schemat jak to masz w rzeczywistości połączone? Po za tym chyba pomiędzy, LCD_Clear(); a LCD_WriteText("Hello"); powinno być void LCD_GoTo(unsigned char, unsigned char); np. void LCD_GoTo(0,0); bo skąd ma wiedzieć w którym wierszu i kolumnie ma wyświetlić tekst? I jak to jest że u mnie po otwarciu te biblioteki z podanego przez...
Zamiana wyświetlaczy nic nie daje, zamieniałem nawet same kabelki łączące je z płytką i też nic. Jeśli chodzi o przerwania to mam odbiór danych z RFM12 oraz obsługę klawiatury na PCF8574. Może faktycznie coś na rzeczy z tymi przerwaniami. Wyświetlacz, który nie działa jak trzeba oprócz wyświetlania daty, godziny oraz części odebranych danych wyświetlać...
I dlaczego trzeba ustawiać ten bit na 1, a nie na 0? Musiałbyś zerknąć na wewnętrzną budowę rejestru. To jest zapewne realizowane jako przerzutnik, a doprowadzenie "1" je zeruje. Ponadto to jest wygodne, masz rejestr, któy zawiera kilka flag, zerujesz tylko te dla których na odpowiednich pozycjach zapisywanego bajtu są "1", zera są ignorowane. Dzięki...
Chciałbym zadać jeszcze pytanie nie związanie z tematem odnośnie programowania w Bascomie. Wiem, że jeśli postawie flagę w procedurze obsługi przerwania będzie ona widzialna w pętli głównej. Czy w odwrotną stronę też to działa? Chciałbym aby procedura obsługująca przerwanie wykonywała się inaczej w zależności od flag, które ustawie w głównej pętli DO..LOOP...
KS0066U jest kompatybilny z HD44780. Jeżeli korzystasz z opracowań które podałem to muszą one działać w 100%. Co do inicjalizacji: kiedyś miałęm z jakimiś LCD problem dla kwarców większych niż 11MHz. Wtedy sprowadziło się to do modyfikacji kodów obsługi LCD o wprowadzenie wymuszonych opóźnień (define "Szybkosc") co jednak jest bardzo nieeleganckie....
Skorzystaj z tych bibliotek w trybie 4 bitowym bez flagi zajętości: http://radzio.dxp.pl/hd44780/hd44780_4bi... + poczytaj http://radzio.dxp.pl/hd44780/hd44780_avr... http://mirekk36.blogspot.com/2012/04/lcd...
Domyślnie atmegi są taktowane wewnętrznie 1MHz. Przyłączenie kwarcu bez przestawieniu fusebitów nie jest problemem. Atmega go nie używa i tak co jest napisane w dokumentacji. Wszystkie porty na starcie programu są wejściami co można przeczytać w dokumentacji kontrolera w opisie portów wejścia/wyjścia. Źle myślisz: Flagi kasuje się wpisując do nich programowo...
Witam. Mam następujący problem: gdy deklaruje zmienną jako float bądz double, po kompilacji mam około 4 kilo kodu więcej niż gdy jest zadeklarowana jako int, potrzebuje liczby ułamkowej dzieląc tę zmienną w tym przypadku przez tysiąc słyszalem coś ze mogę mieć zle ustawione flagi w kompilatorze ale nie bardzo wiem ocb. proszę o jakąś podpowiedz, dzięki.
Tak też jest dobrze, unia to tylko nieprzenośny sposób ułatwienia sobie zadania :) Kilka błędów - użyj uint16_t zamiast unsigned short. Jak już tmf wspomniał do uśredniania musisz użyć większego rozmiaru zmiennej żeby wykluczyć przepełnienie, a na avr int ma rozmiar taki sam jak short. Użyj uint32_t. Poza tym całe to testowanie flag i numeru czujnika...
Jeśli chodzi o tę poprawkę z poprzedniego postu, to jak na razie po 1 dniu nie ma błędów w zapisie. Tak, myślałem o użyciu FOR... NEXT i flagi od timera. Ciekawsze byłoby sprawdzenie, czy aktualny folder to ten do którego miał wejść, jeśli nie to ponowić Chdir, ale przeglądam help'a Bascoma i nic takiego nie widzę. Ale można by sprawdzić, czy jest w...
To chyba jakiś primaaprilisowy spóźniony żart. Cały program nadaje się do śmieci: 1. Wyświetlanie realizujemy w przerwaniu timera, każde przerwanie na jedną cyfrę (cyfry lecą w pętli) 2. wzory cyfr zapisujemy w tablicy, a nie jako 10 funkcji... To mnie przekonuje do udziału tego kodu w konkursie na najgorszy program roku 3. Od razu w przerwaniu od odświeżania...
Pojawia się nagle przerwanie od przycisku S2 impulsatora.... czy to normalne? Podejrzewewam że naciśnięcie S2 uaktywnia globalne przerwania. Idzmy głównym wątkiem bez cofania sie. Tak, uaktywnia ale już wiem, ze było ono przechowywane w SREG. To jest wyjaśnione. Pytanie które teraz musimy wyjasnic w ramach tego tematu, jest to, zeby odpowiedziec czy...
"Nowe" czyli od Xmega i nowsze AVR mają mozliwość priorytetu przerwania. Poprzednie miały ustalony. Nie wiem jaki to AVR, ale jeśli ustawisz Timer i przerwanie od niego to jak będzie w przerwaniu to oczywiście zauważy potem flagę przerwania z USART, ale może być za późno, dlatego jeśli nie trzeba, to się przerwań od wszystkiego nie uruchamia. Rzadko...
A po co tak teoretyzować - wystarczy zajrzeć do PDF'a scalonego odbiornika TFMS czy TSOP żeby zobaczyć jak należy postąpić nie tylko z linią sygnału wyjściowego ale też jak podać zasilanie. Ludziom nie chce się tam zajrzeć a potem zdziwienie, że nawet jak działa - to jednak jakieś błędy się wkradają, czasem jakieś zakłócenia itp (jak tam już zajrzysz...
Co innego Atmega---Atmega (oczywiście z zewnetrznymi kwarcami), jeśli ustawisz na obu przykładowo 9317 b/s to pójdzie. Nie zapomnij tylko ustawić flagi: multiprocessor communication. O matko! i znowu - widzę, że kolega nienawidzi wewnętrznego oscylatora i uważa go za jakieś zło konieczne. A szkoda bo wiele kolega na tym traci ;) Oj dużo, dużo .......
CodeVision ma taki fajny bajer jak ALTERNATE PUTCHAR...Dowiedz się wiecej na temat tej mozliwosci - napiszesz sam sobie putchar'a w ktorym np. za pomocą prostej flagi zdecydujesz na który UART chcesz wysłać dane. Funkcja print jak i printf korzystają własnie z putchar'a - zmieniając jego zmienisz również sposób 'wysyłania' ciągu znaków generowanych...
Coś te flagi przecież ustawiło... Najpierw włączasz obsługę tych przerwań, potem włączasz podciąganie pinu to flaga już ustawiona...a kasowana jest przez AVR sprzętowo kiedy obsługiwane jest przerwanie. Bascom nie musi obsługiwać żadnego kasowania flagi przerwania bo robi to sam procesor tyle, że w przerwaniu (jednym w wyjątków potwierdzających regułę...
Przerwania traktuj jako coś wykonywanego równolegle "obok" programu głównego". Jedna z podstawowych zasad pisania obsługi przerwań to to że ma być ona jak najkrótsza. Reszta ewentualnie obsługiwana jest w pętli głównej w poprzez ustawianie i testowanie odpowiedniej flagi. Jeśli chcesz zrobić menu wielopoziomowe poradzę zapoznać się z kodem z butterfly...
int main(void) { //zliczanie timera od 0 -> wart OCR1A TCCR1A |= ( _BV(COM1A0)| _BV(COM1A1)); TCCR1B |= ( _BV(CS10) | _BV(WGM12) ); ustaw_OCR1A(119); TIFR |= _BV(OCF1A); // wlaczenie flagi OCM if(TIFR!=0) { TCCR1B = 0x00; DDRA |= _BV(PA6); PORTA &=...
Dlaczego definicje wszystkich funkcji masz w funkcji main? Powinny być przed nią. Raczej nie wykorzystujesz linii Busy/Ready wyświetlacza a cały czas pchasz w niego informacje. Czyścisz go tylko raz. Uzależnij wyświetlanie od jakiejś flagi ustawianej w timerze 2 (np co 0,5s) i wtedy czyść wyświetlacz i wyświetlaj dane. Pewnie dlatego działa Ci z delayem...
Mnie uczono, że w przerwaniach najlepiej umieszczać jedynie ustawianie flagi, a jego obsługę w pętli głównej (pracującej z max. częstotliwością). Może spróbuj takiego rozwiązania, bo bez kodu źródłowego ciężko coś więcej doradzać.
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...
Co 3.88us wywołujesz przerwanie od przepełnienia timera. A przetwarzanie ADC w pętli while trwa 0.12ms- czyli 120us. Czyli podczas tej pętli pojawi się wielokrotnie przerwanie od timera0. A jeśli się pojawi podczas sprawdzania warunków tej pętli to moga się dziać dziwne rzeczy. Jedna instrukcja przy 8Mhz trwa 0.125us. Czyli obsługa przerwania powinna...
Nie chodzi mi o optymalny kod itp., chcę tylko by ATMEGA miała poprawne dane w pamięci! Ale Twoje rozwiązanie transmisji jest najgorsze z możliwych...dlatego masz z nim problemy. ISR(USART_RXC_vect) { buf_odbioru[poz_znaku_odbioru]=U... if(buf_odbioru[poz_znaku_odbioru... && buf_odbioru[poz_znaku_odbioru-1]...
Fajnie, że Ci program działa. Kilka sugesti: 1) nazwij jakoś te flagi. Możesz uzyć np: struct { unsigned mute:1; unsigned inna:1; } flags; /* dalej w kodzie */ flags.mute = 1; 2) używasz "magicznych stałych" w stylu 0xFD, 0x18, 63 itd. Wszystkie powinny być opisane i zdeklarowane na początku pliku za pomocą static const ... albo #define...
Witaj, Skleiłeś kod z kilku stron, jak sądzę, bo na tym blogu nie używamy sbi() :) Włączasz ADC i od razu go odczytujesz. Należy poczekać na zgaszenie flagi ADSC, albo na przerwanie. A tutaj masz ładnie opisane czynności: http://mikrokontrolery.blogspot.com/2011... EDIT. Drzasiek mnie wyprzedził. EDIT 2: Definiowanie F_CPU...
Ja zawsze stosuję na pinie RST zestaw "antyESD" w postaci diody Schottkiego, rezystora pull-up (w wersji A jest o większej rezystancji) i kondensatora około 10nF. Spróbuj takiego zestawu. Przy cewkach wypróbuj szybką diodę np. LL4148 plus kondensator np. 10nF. Do testów wyłącz wszystkie peryferia (takie jak I2C, RS485, etc.) oraz ustaw jako wyjścia...
Po upływie 655.35ms następuje przepełnienie licznika, w takiej sytuacji trzeba utworzyć zmienną która będzie zliczać ilość przepełnień. Czyli.......... W takiej sytuacji (.."time out"; => Err=1) - trzeba przyjąc że instrukcja została zakończona i processor już nie powróci do jej kontynuacji, a raczej przystąpi do kolejnej instrukcji przewidzianej programem....
Nie sprawdzaj flagi ADIF, tylko ADSC. ADIF nigdzie nie zerujesz więc przy kolejnym pomiarze od razu przechodzisz do odczytu ADC.
Aby kod łatwo było analizować używaj znaczniki SYNTAX: [syntax=c] tu wklej Twój kod [/syntax] Plik : HD44780.c Plik : HD44780.h Dodano po 25 Ja połączyłem je w ten sposób ale pewnie źle bo wystąpiły błędy w kompilacji. Proszę o pokazanie mi sposób połączenia tych dwóch plików w prawidłowy sposób. Pierwsze uwagi: - te dwa pliki to tylko...
O ile dorze rozumiem idee tego przerwania (nie miałem okazji wykorzystać go w praktyce) to określona zmiana na którymkolwiek pinie z grupy wywołuje przerwanie... i teraz myślałem, żeby za pomocą prostych warunków zliczać, który wywołał i ile w danym czasie. Problem widzę w momencie, gdy przykładowo czujnik A wywoła przerwanie w bardzo krótkim czasie...
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.
Mam problem, który właśnie zaczyna mi spędzać sen z powiek. Założenie było proste wysyłać dane do wyświetlacza, gdy flaga BUSY = 0. Niestety nie wiem gdzie robię błąd, ale gdy próbuję coś wyświetlić na LCD, badając stan flagi BUSY, to wyświetlacz działa nieprawidłowo. Albo nic nie wyświetli, albo jakieś dziwne rzeczy. Sprawa jest niezwykle prosta ,...
Ten krótki program, to będzie praktycznie wszystko. Rozumiem, popatrzyłem w różne bootoladery i faktycznie są obudowane całą masą różnych zabezpieczeń/ komunikacji. Czyli wychodzi na to, że wystarczy dosłownie kilka linii by zapisać nową zawartość do flasha. Załóżmy więc, że zaczynam od samego początku, korzystając z książki Tomka: https://obrazki.elektroda.pl/3648619400_...
Może się pomyliłem, ale chyba przerywasz sobie odbiór co 2ms. Dlaczego nie użyjesz wyższego preskalera? Np. 1024? Możesz nawet po ustawieniu Flagi wyłączyc Timer i po odbiorze włączyć ;) Timery można dowolnie konfigurować podczas pracy programu. Druga sprawa ustaw sobie odbiór do bufora w tle (Config Serialin = Buffered, Size..)
flagi funkcji markery flagi restart flagi
opticum oprogramowanie excel porównywanie kilku kolumn president schemat
ekspres philips zapowietrzony reset pilota
Bezpiecznik sygnału cofania w Passacie B5 - numer 31 Podłączenie licznika Toyota Corolla 2005 na stole