to specyficzny program i nie musze wracac z przerwania brakuje mi tych 2 cykli
Jak przerwanie? To ma działać z automatu czy na przerwaniach? Bo jak na przerwaniach to musisz zerować w nim licznik, bo od ocr2b nie ma opcji ctc. Najlepiej zrób tak : ustaw licznik w tryb ctc i do ocr2a wpisz odpowiednią wartość skracającą cykl, do ocr2b wpisz dowolną wartość od 0 - ocr2a, ustaw bit COM2B0, włącz licznik z odpowiednim preskalerem....
Sprawdź czy skok do obsługi przerwania to JMP czy RJMP? JarekC
zależy jak tą ramkę sobie zorganizujesz ale jeden z prostszych sposobów, gdy przesyłamy znaki ASCII to koniec ramki łatwo np odróżnić po tym, że nadleciał znak ENTER (0x0d). Gdy wykryjesz go w przerwaniu to już możesz powiadomić pętlę główną czy jakieś zdarzenie w tej pętli, że już jakaś cała i gotowa ramka czeka na odczytanie. Jeśli pętla główna będzie...
Wystarczyło by wykorzystać licznik tryb CTC z dodatkowym przerwaniem od OCRB. OCRA odpowiada z f OCRB za wypełnienie.
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...
Należy: - zadeklarować zmienną globalną np. LICZNIK i nadać jej wartość zera, - włączyć przerwania od przepełnienia Timer0, - w funkcji przerwania należy zwiększać wartość zmiennej LICZNIK o jeden Aby poznać liczbę impulsów wystarczy pomnożyć LICZNIK*256 i dodać do niego aktualną wartość rejestru licznika timera, czyli jak sądzę counter0 (nie znam BASCOM).
ale procesor był wiecznie zajęty Pewnie przykład był delay'ach. Dziecinada. Macie jakiś pomysł na tachometr z czterech czujników? Tak samo jak z jednego - o ile jest dobrze zrobiony, tj z wykorzystaniem możliwości hardwarowych (w tym liczniki) i na przerwaniach
Witam. Tak na szybko analizując kod: Dla Timer0 włączasz dwa przerwania od porównania: http://obrazki.elektroda.pl/6165324400_1...
Wypróbuj ten kod: [syntax=c] #define F_CPU 16000000 #include <stdlib.h> #include <avr/io.h> #include <util/delay.h> //-------LCD------------------------ #define LCD_ADDRESS (0x7C) /* * LCD_commands */ #define LCD_CLEARDISPLAY 0x01 #define LCD_RETURNHOME 0x02 #define LCD_ENTRYMODESET 0x04 #define LCD_DISPLAYCONTROL 0x08 #define LCD_CURSORSHIFT...
Ja mam podobny problem z ATmega 32 i z przerwaniem od przepelnienia licznika T1. Program caly czas siedzi w przerwaniu nie moze nie z niego wrocic. Kod wyglada mniejwiecej jak ponizej. jezeli w funkcji main w petli while jest printf to program wraca z przerwania. Jezeli wstawie tam np swiecenie diody to program krazy caly czas w przerwaniu. Moze mi...
Kompiluje czy nie, to nie ma większego znaczenia, bo ja nie mam układu, żeby sprawdzić czy to działa czy nie. Żeby nie brnąć w przerwania można zrobić liczenie timeout w pętli głównej.
Dzięki tmf. prześledziłem te darmowe, ale na razie nic nie znalazłem, było sporo o przerwaniach, więc na razie drepcę w miejscu. Pozdrawiam - też Tomek.
Wykorzystanie timera do odliczanie czasu impulsów. Tablica z z wszystkimi krokami silnika, zmieniany indeks tablicy po przepełnieniu licznika.
Witam No cóż rozwiązanie problemu jest programowe. W obsłudze przerwania deklarujesz trzy liczniki zliczające do np. 100 (wygodne bo masz skok 1%). Zawartość tych liczników "przyrównywana" jest do trzech kolejnych zmiennych, na które z kolei Ty masz wpływ. W zależności od zadanych wartości coś włącza się szybciej coś później. I po sprawie. Ot, cała...
Zdaje się, że PWM-y generują przerwania a te pochodzą jak stwierdziłeś od zegarów. To w czym problem? Wyzwalaj pomiary A/D od przerwań PWM. Jak będzie za gęsto to dodaj prosty licznik w zmiennej z porównaniem i uruchamiaj przetwornik co n-te przerwanie od TOVn. Biorąc sygnał z wyjścia PWM i dzieląc go przez 2 uzyskasz przebieg o stałym współczynniku...
http://obrazki.elektroda.pl/5431448900_1... 74HC74 bramkuje sygnał wejściowy tak aby jego impulsy nie były krótsze niż impulsy taktowania licznika 74HC590(już samo to wyfiltrowuje część krótkich szpilek) - blokuje to możliwość wyzwalania przerwania ICR1 z nadmierną częstotliwością. W układzie jak na rysunku 74HC590 zlicza gdy sygnał...
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ę...
Czyli poprawka... pewnie najlepiej to zrobić na jakimś liczniku przerwań? Jeżeli tak to z tym już sobie poradzę :)
czy taki kod na Atmedze 8 da się zrealizować Zdecydowanie nie przewyższa możliwości obliczeniowych atmegi. Proponuje w pierwszej kolejności przemyslec definicję pierwszego impulsu. Jak kolega to zrobi to znajdzie (bez programowania w pierwszej kolejności) algorytm wykrywania że jest on pierwszy i należy liczyć od poczatku. A jak juz bedzie wiadomo...
Drogi kolego , popełniłeś szkolny błąd :D W procedurze obsługi przerwania Timer0 masz ... SIGNAL(SIG_OVERFLOW0) //obsługa multipleksowania wyswietlaczy { //extern unsigned char wyswietl[7]; unsigned char licznik;//<-- ********** błąd !!!!!!!!!!! ... zmienną licznik , tyle że jest to zmienna lokalna , czyli istnieje w pamięci...
1.Każdy Timer działa niezależnie- to jest licznik sprzętowy działający jak zewnętrzny układ. To że został "wsadzony" w układ scalony OBOK procesora to tylko żeby użytkownikom było wygodniej. Dlatego nazywa się to "układem peryferyjnym", peryferiami itp. Takich "układów peryferyjnych" w mikroprocesorach jest dużo. Nie tylko liczniki ale też przetworniki...
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"...
policz sobie 8e6 / 1024 i jeszcze / 256 to dostaniesz czestotliwosc. Zrób sobie licznik (zmienna) zliczajaca do góry, jak osiagnie jakas wartosc to wtedy przełaczaj diode i zeruj licznik
A liczenie Ci samo idzie bo umieściłeś kod "liczący" w jakimś przerwaniu: SIGNAL(SIG_OVERFLOW0) { licz++; } Nie wiem co to jest, ale wygląda jak przerwanie od Timera0. Dodano po 2 Już pomijam fakt że obsługa przycisków w przerwaniu (bez żadnego odkłócania, bo samo wykorzystanie przerwania to może jeszcze nie jest tragedia) jest trochę...
Nie podoba mi się twoje rozwiązanie. Ja bym to zrobił tak - timer odmierzający takty w rytm podstawowego okresu PWM (czyli przerwania np. 1kHz). Teraz zamiast tych porównań z licznikami, wrzuć wartość licznika do rejestru compare register. Dzięki temu masz przerwanie po przepełnieniu timera (nowy okres) - w tym przerwaniu inicjujesz wysyłkę danych po...
Zacznijmy od pytań: 1. Które bity według Ciebie ustawiłeś w TCCR2B : Autor tematu pisał, że stosuje gotową bibliotekę do obsługi jakiegoś panelu dotykowego. Z tego, co zrozumiałem, to przerwanie to znajduje się we "wnętrzu" tej biblioteki. Takie efekty są oczywiście normalne, gdy ktoś mało świadomy tego, co się dzieje w jego programie stosuje gotowe...
Prawie cały czas procesora, wykonują się przerwania, nie starcza czasu na pętlę główną, to skutek wpisania bzdur do rejestrów konfiguracyjnych licznika.
Twoje 50 Hz (pomijam, że nie da się tak dokładnej częstotliwości ustawić) daje okres = 20 Chyba źle zrozumiałeś kolegę michalko12 . Te "jego" 50Hz to nie częstotliwość przerwań, tylko sygnału sterującego serwem (tak przynajmniej sterowana jest zdecydowana większość serw modelarskich). Okres tego sygnału powinien mieć 20ms, z czego 0,5÷2,4ms trwa stan...
Opczytaj o działaniu operatorów. & to operator iloczynu logicznego, czego się spodziewasz? Ma być PORTC^=0xFF;
Wszystko - głównie oczekiwanie w przerwaniu timera. Zacznij od określenia okresu przerwań timera. W przerwaniu użyj zmiennej zliczającej przerwania, np.: - inicjujesz ją na wartość 3 - na początku procedury dekrementujesz ją - przy wartości 1 zapalasz diodę, - przy wartości 0 gasisz diodę i reinicjujesz licznik na wartość 3 Oczywiście zamiast 1 i 3...
W dokumentacji niestety dla licznika 1 nie występuje preskaler 128. Występuje natomiast 256. Zakładając, że licznik pracuje w trybie CTC (WGM12 =1) i zakładając 8MHz źródło sygnału zegarowego (tak jak jest w komentarzu w kodzie) należy wpisać do OCR1A= 31249 oraz ustawić preskaler na 256 czyli CS12=1 A tak na przyszłość ...nota katalogowa. Tam wszystko...
Z tego co wiem, to Atmega 8 NIE MA zegara RTC. Można na niej zrobić zegar stosując przerwania od licznika, ale trudno to nazwać RTC. Łatwo natomiast oprogramować zegarek DS1307 - do pracy potrzebuje dosłownie garść elementów.
No właśnie, zamiast liczyćna piechotkę, odpal w AVR Studio symulator, ustaw breakpoiny i porównaj wartość licznika taktów. Inna sprawa, że generuje ci dziwny kod dla zmiennych pinlevel, nie wiem czemu nie umieszcza ich w rejestrach. Dodanie do nich register skróci kod o połowę i przy okazji go mniej więcej dwa razy przyśpieszy.
Jako ze nie przepadam za pisaniem na maile, to odpowiem tutaj... Musisz skonfigurowac odpowiedni timer i przy przerwaniu, jakie generuje int czas=0; int timer0=131; SIGNAL (SIG_OVERFLOW0) { czas++; if (czas==5000) BUUM(); //jezeli czas osiagnal 5000ms, to wywolaj funkcje BUUM(); TCNT0 = timer0; // zaladowanie do...
I pomyśleć, że tyle dyskutujecie o dwóch liniach kodu w przerwaniu timera wywoływanym np. co 10 ms. http://mikrokontrolery.blogspot.com/2011... Obejrzyj ten przykład, a pod if() wstaw instrukcję licznik ++ - i masz całe rozwiązanie.
twój program doskonale miga diodą zgodnie z zamierzeniem ale musisz poczekać nie sekundę a kilka minut bo z powodu niezerowania licznika count kolejne mrugnięcie zachodzi dopiero po przekręceniu inta :) (btw. w tej sytuacji volatile jest niepotrzebne)
Ja bym proponował na początek przerwanie zewnętrzne INT w którym liczysz impulsy, oraz przerwanie timera w trybie CTC co około 1s w której jak kolega (at)bochnio wspomniał będziesz zerować licznik. Kolejny krok to mniej więcej tak:[syntax=c]if(licznik > 6) POTRB |= (1<<PB0); // ustaw stan wysoki gdy przekroczy wartość else POTRB &= ~(1<<PB0);...
Dzięki wielkie- ale to nie do mnie pisałeś. O Atomic_Block dowiedziałem się w czwartek- sprawdziłem- od czwartku jest to pierwsza wiadomość na ten temat. A wracając do tematu Fir3man- wymyśliłem taki schemat programu: #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> volatile uint8_t dol;...
ehhh a nie lepiej jest użyć jednego licznika 8-bitowego ustawionego tak aby w ciągu sekundy np 32k razy przepełniał się - a w trakcie przepełnienia (przerwania) wpisać do odpowiedniego rejestru licznika kolejną wartość nowej próbki?
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...
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...
Dokładnie tak. Pytanie z jakiego uP korzystasz? Np.: tiny2313 ma 4 wyjścia OC: OC0A i OC0B dla Timer0 oraz OC1A i OC1B dla Timer1. Dla mega8 masz trzy wyjścia OC: OC1A i OC1B dla Timer1 oraz jedno dla Timer2 (OC2) Co do wejść oznaczonych TOSC1 i TOSC2 - w kontrolerach ATmega służą do podłączenia kwarcu zegarkowego (32kHz). Przy wykorzystaniu licznika...
Witam. Jako, że dopiero powoli zaczynam zabawę z Atmegą (posiadam Atmege 32). Zaczynam od bardzo podstawowych rzeczy - chciałem liczyć częstotliwość naciśnięć przycisku a dokładniej ilość naciśnięć do momentu przepełnienia się licznika przez obsługę przerwań. Niestety nawet z tak trywialnym zagadnieniem mam kłopot, coś nie działa jak powinno.;) Zamieszczę...
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)...
mały błąd, myślałem że w danej chwili tylko 1 timer może przyjmować sygnały zewnętrzne. W takim razie pozostaje mi wykorzystać 3 timer do odmierzania okresu czasu. Zastanawia mnie jeszcze rozwiązanie z rejestrami ICP/(Input Caputre Unit?) Nie wiem czy dobrze to rozumiem: narastające zbocze sygnału podane na nóżkę ICP uruchamia timer, opadające go zatrzymuje....
:arrow: dscreator Przede wszystkim koniecznie skomentuj każdą linię i wklejaj za pomocą znaczników Code , ponieważ (jak widzisz) Twój program jest zupełnie nieczytelny (forum usuwa spacje na początku linii). Program powinien zaczynać się zaraz za obszarem wektorów przerwań. Jeśli jakiegoś przerwania nie wykorzystujesz to zamiast mnemonika rjmp wstawiasz...
ElKuba, a czy atmega8 i AtMega16 masz fabrycznie nowe, czy od kogoś ? Może ktoś wpisał fuse jak już napisałem w pierwszym poście: ...Napisany program testuję w programie Proteus 6.5. ... I teraz mam pytanie czy jest to problem wynikający z niedociągnięć programu proteus... Tak więc projekt testuję tylko wirtualnie za pomoca Proteusa, i dla atmega 8...
Przyjrzałem się tej Twojej (znaczy - nie Twojej :)) płytce i wygląda mi, że podchodzisz do problemu od złej strony. Na tej płytce wyświetlaczy jest licznik 7493, który steruje multipleksowaniem (to widać nawet na tym niewyraźnym zdjęciu, które zamieściłeś). Zatem wystarczy tylko podać na wejście INT sygnał z wejścia zegarowego 7493 aby mieć stabilny...
Oczywiście, że się da jeśli chodzi o sekundy . Teoretycznie ;). Wystarczy wziąć "nierówny" kwarc. Jego wartość powinna dzielić się odpowiednio przez dwa podniesione do odpowiedniej potęgi. Tak aby np. przerwanie przepełnienia od licznika było wywoływane dokładnie co 1 sekundę, albo inną jej część (zdatną do przeprowadzania obliczeń). Dla przykładu kwarc...
Cześć, Próbuję zaadaptować przerwania do swoich potrzeb z pomocą datasheet atmegi328p i strony [url=http://mikrokontrolery.blogspot.com ]Link Niestety napotkałem pewien problem z którym nie umiem sobie poradzić. Za pomocą przerwań chciałbym odczytywać stany z dwóch podłączonych potencjometrów. Reprezentuję ich wartości na LCD leczy w zakresie 0-255....
Myślę, że mikro-kontroler będzie idealny. ATmega 8 będzie ok choć moim zdaniem trochę nadmiarowa. Ale jak jest w szufladzie ...jak najbardziej. Co do programu..wydaje mi się, że to raczej dość łatwa sprawa. Np. wejścia układu po obniżeniu napięcia do akceptowalnych przez AVR'a można podać na wejścia INT0 i INT1. Zmiana stanu na wejściu INT0 niech spowoduje...
Kurdę no przerwanie jest wywoływane co 310us a to jest bardzoooo wiele cykli zegara na to by mogła się wykonać cała pętla while, cały czas nie rozumiem czemu na atmega 16 działa a na atmega128 nie chce działać :/ sprawdzałem bity ustawiające timer i przerwanie, są one takie same dla mega 16 i 128 więc nie wiem w czym jest problem :( Ten program działa...
OCnX to wyjścia, nie wejścia. Skoro nie możesz odblokować timera0 (bo T0 i T1 można taktować z zewnątrz) to są opcje takie: 1. Zastosowanie przerwań INT0 i INT1 z detekcją odpowiednich zbocz i zliczanie imp. w przerwaniach 2. Polling pinów z odpowiednią częstotliwością Poza tym jaka częstotliwość impulsów?
Tylko nie wywołuj w przerwaniach tak długich bloków instrukcji - lepiej ustaw flagę, która wskaże pętli głównej programu wykonać te instrukcje. Ale co tu możemy mówić, jak widać tylko wycinek programu. Zgadza się, dlatego wklejam nieco więcej Flaga_wybor jest co 10 sekund, Blokada zatrzymuje odczytywanie czujników na czas odbioru DCF77, zwłaszcza DS18B20...
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....
Witam. Kolego spróbuj wykorzystać do odmierzania czasu TIMER, jeśli jest taka możliwość. Mała podpowiedz jak napisać program: W pętli głównej: - sprawdzasz czy masz zapaloną diodę jeśli tak to gasisz i zatrzymujesz licznik - sprawdzasz czy dioda jest zgaszona jeśli tak to zapalasz i startujesz licznik W przerwaniu licznika i odmierzeniu odpowiedniego...
Jak już napisałem, można kombinować różnie. W tym przypadku po prostu po 62 przerwaniach zapalasz diodę, a po 124 gasisz (lub odwrotnie). W tym przypadku czas zapalenia (62 przerwania) i czas zgaszenia (124 - 62 = 62 przerwania) są równe, ale nie muszą być. Poza tym w takim rozwiązaniu znasz stan sterowanego pinu, kiedy jest w stanie niskim (pierwsze...
Jeśli chcesz uzyskać takie szybkie przedziały czasowe to proponuję popędzić licznik TIMER1 bez preskalera i ustawić go w tryb CTC by sam się przeładowywał. W przypadku gdy zliczy 1000 impulsów to przerwania właśnie będą generowane z częstotliwością 16kHz (To daje jakieś 400 instrukcji maszynowych możliwych do wykonania między przerwaniami). Niestety...
(at)atom1477 Wzmacniacz był badany za detektorem. Sprawdzane było zbocze narastające przy wywołaniu pojedynczym impulsem i przy wywołaniu sygnałem prostokątnym 40kHz nie było różnicy w amplitudzie ani w czasie narastania. Na tej podstawie stwierdziłem że wzmacniacz działa prawidłowo. Dodatkowo na oscylogramach kanał niebieski to bezpośrednio wyjście...
Zliczaj impulsy timerem w trybie licznika. Nie potrzebujesz dwóch przerwań timera - użyj jednego, np. 800 Hz - co 80 przerwań masz odliczony odcinek 100 ms.
Ja bym nawet przerwania odpuścił. W każdym rozbudowanym programie jitter przerwania będzie na tyle duży, że w praktyce uniemożliwi sensowne sterowanie serwami. Więc skorzystałbym z rady BlueDraco - wiął procek z odpowiednią liczbą kanałów PWM - masz takowe i w rodzinie ATMega i w XMEGA lub ARM jeśli chcesz zmienić architekturę. Ew. użyć licznika Johnsona...
Dokładnie tak. Flagę sprzętową, np. w rejestrze EIFR, tak samo można kasować programowo. Więc stosując flagę programową nic nie zyskujemy. Tracimy za to czas na obsługę przerwania (mały, ale zawsze te kilka cykli) oraz kilka B Flasha. A to co napisałeś, o zwiększaniu licznika wystąpień, to już nie jest flaga. Licznik to nie flaga.
Dla większych wartości wypełnienia (powyżej 25%) przerwanie Timera0 przestawia Timer1 (ustawia go dla kolejnego pinu) zanim ten się przepełni i wywoła swoją procedurę przerwania. W efekcie ta nie jest wywoływana nigdy. Najlepiej przerób to tak by działało na dwóch przerwaniach 1 timera i wykorzystaj osobny dla każdego bitu licznik określający po ilu...
Witam wszystkich. Pisze program do pewnej maszyny gdzie pracują silniki krokowe itp. Ale jest tez pomiar temperatury (termostat) jak zrobic zeby co ok 2s niezaleznie od głównego programu procesor sprawdzal czy wlaczyc czy wylaczyc grzalke. Slyszalem o przerwaniu z przepelnienia licznika ale nigdy tego nie praktykowalem. Procek to ATMEGA 128 a kompilator...
// ================= 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ę...
Każdy licznik ma własny preskaler, własne rejestry i własne przerwania - to 7segmentów starczy Ci 8 bitów i preskaler. Zreszta zerknij sobie na: http://www.et06.dk/atmega_timers/
Na początek kwestia formalna: jest za dużo tabulatorów w kodzie przed komentarzami, przez to prawa strona posta oraz kodu jest ucinana na ekranie (mam mały ekran). Co do kodu: czytanie zegarka oraz formatowanie sprintfem w procedurze obsługi przerwania jest mocno słabe. Diabli wiedzą jak jest zrealizowany lib TWI. Jakby był oparty na przerwaniach to...
A nie łatwiej jest policzyć DO ilu ma liczyć a nie OD ilu? :) i robić przerwania COMP a nie OVF? Ja tak robię i na kwarcu 4MHz timer1 odlicza sekundy bardzo ładnie. Ale u Ciebie timer1 wydaje się mieć dobrze ustawianą wartość. Przy prescalerze 256 musisz mieć 15625 taktów zegara, aby osiągnąć sekundę. W drugim coś mi nie gra. Odliczasz od 0x0F czyli...
Witam , posiadam enkoder , dajacy sygnały A i B chce dołaczyc go do uC Atmega, tu jest problem poniewaz procesor ma za zadanie wykonywac pewna czynnosc na wewnetrznym przerwaniu od licznika.... bedzie ona wywoływana z pewna czestotliwoscia i ona ma najwyzszy priorytet. teraz pytanko , jak podlaczyc enkoder do uC aby nie zgubic zadnego impulsu z niego..........
Nie muszę używać NE555, tylko chciałem dla przykładu napisać, że muszę zliczać impulsy. Zastanawiam się, która metoda liczenia jest dokładniejsza - liczyć na licznikach czy na przerwaniach. Myślę, że zbuduję układ uniwersalny i za pomocą zworek będę ustawiał czy impulsy trafiają do licznika czy na wejście INTx. Obydwie metody są równie dokładne. Różnica...
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Całkiem błędna sugestia - sygnał pochodzi ze styków, a ATmega nie ma sprzętowego filtrowania wejść timera. Tu sprawdzi się tylko zliczanie programowe w przerwaniu timera. Proponuję na początek częstotliwość ok. 50..100 Hz - powinieneś w ten sposób bezpiecznie ominąć drgania styków. Jeśli styki to ja bym zrobił na przerwaniu INT a w nim: [syntax=c]...
Samo działanie liczników i uarta sprzętowego nie obciąża procesora poza obsługą przerwań i konfiguracją. Jak brakuje portów i pojemności można zastosować ATMEGA 2560 w 100-pinowej obudowie.
Teraz nie mam pod ręką niczego co jednostajnie i stabilnie może dawać sensowne impulsy zdatne do jakichkolwiek testów prędkości. Mam impulsator z rolki myszki, ale nie mam za specjalnie czym nim kręcić (w rozsądnych prędkościach). Nie wiem jak to jest rozwiązane w oryginalnych licznikach, ale zdaje się, że jest tam zwykły kontaktron i działa. Rozwiązań...
W ATMEGA808 (zapewne w innych nowych też występujący) wychwyciłem błąd związany z zachowaniem się RTC po wybudzeniu z uśpienia STANDBY. Mam kod, który w przerwaniu od pinu odczytuje zawartość RTC_CNT. RTC oczywiście ustawiony w trybie RUNSTDBY. Odczyt CNT odbywa się zaraz na początku obsługi przerwania. Okazuje się, że raz na kilkanaście odczytów wartość...
Witam serdecznie. Piszę program, w którym muszę zliczać przychodzące impulsy z licznika energetycznego do procka. Aby nie zliczać impulsów pochodzących od drgań styków wymyśliłam takie rozwiązanie. Jeśli na INT0 przyjedzie zbocze opadające, włącz licznik T0. Gdy licznik przepełni się- minie 32ms i w tym miejscu będzie poziom niski na pinie, to atmega...
Tu masz program pod ATtiny2313, jeśli potrafisz programować, to też potrafisz przerobić program na ATMegę: [syntax=basic4gl]' Bardzo prosty zegar bez możliwości ustawiania Dim Sekjed As Byte , Sekdzies As Byte , Minjed As Byte , Mindzies As Byte Dim , Godzjed As Byte , Godzdzies As Byte , Mux As Byte , Migaj As Bit Config Portb = 255 : Portb = &B255...
Szanowni Forumowicze, mam problem z regulacją prędkości obrotowej silnika DC wyposażonego w enkoder za pomocą przerwań INT. Enkoder to czujnik Halla i odbiera impulsy z magnesu neodymowego na wale silnika (magnes 8-polowy). Prędkość kontroluję za pomocą generowanego PWM na atmedze podawanego na mostek L293DNE. Atmega pracuje na 1MHz, a licznik to Timer/Counter0...
Dzień dobry, witam wszystkich. Mam problem z wstawką asemblerową do języka C. Programuję procesor atmega2560. Nie rozumiem dlaczego nie działa funkcja "asm volatile ("mov r21,MCUSR");". Chcę dzięki niej przenieść wartość rejestru mcusr do rejestru r21. Lista błędów w załączniku. Wiem, że one wprost mogą nie wskazywać na to, że ich źródłem jest ta linijka...
Wpisywanie $CRYSTAL bez rzeczywistej zmiany taktowania procesora będzie powodować, że wszelkie opóźnienia i obliczenia kompilatora dotyczące liczników nie będą zgodne ze stanem faktycznym. GETRC5() korzysta aktywnie z licznika TIMER0. Tak manewruje wartością wpisaną do rejestru licznika oraz preskalerem by otrzymać jednakowe odcinki czasu zliczane później...
//konfiguracja przerwania z INT2 GICR|=(1<<INT2); //wlaczenie przerwan od INT2 EMCUCR|=(1<<ISC2); //reakcja na zbocze narastajace ISR(INT2_vect) //procedura obslugi przerwania { static char x; x++; } Jezeli chodzi o drugi problem, to najlatwiej podlaczyc dodatkowy kwarc 32.768kHz i zliczac z niego impulsy w TIMER2. Dla prescalera=0x05 otrzymujesz...
Witam, mam problem z połączeniem po USARCIE tych dwóch procesorów. Sprawa wygląda następująco: atmega1284p ma być docelowo masterem, wysyła ramkę i w odpowiedzi dostaje ramkę zwrotną od atmega8. Obsługa ramek nie jest jeszcze napisana, na razie wysyłam 8 bajtów atmegą1284p i jeżeli wszystkie bajty zostają poprawnie odebrane, to atmega8 odsyła mi 11...
Atmega jest taktowana zewnętrznym kwarcem 12MHz, żeby jeden tick timera trwał ~1us. 1. Czy timer 8-bitowy przyjmujący zewnętrzne impulsy, może je przyjmować w takich samych odstępach czasowych jak 16-bitowy? Niestety na etapie projektowania nie zauważyłem, że żeby użyć 16-bit timera do przyjmowania impulsów zewnętrznych należy użyć nóżki T1, a nie T0,...
Witam, mam problem z okiełznaniem programowego PWM. Pacjent to Atmega 16 taktowana zewnętrznym kwarcem 8MHz. Niby wszystko tak jak powinno być, a ruszyć nie chce. Będę wdzięczny za rzucenie świeżym okiem na program, bo kończą mi się pomysły co jest nie tak. #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile...
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
Witam. Chciałem wykorzystać w Atmedze 128 Timer1 do wykonania zegara zliczającego sekundy. W tym celu ustawiłem go w trybie CTC i po zliczeniu do 62500 (taką wartość wpisuje do OCR1A] powinno nastąpić przerwanie. Nie wiem czemu tak się nie dzieje. Atmega taktowana jest kwarcem 16MHz. W układzie cały czas aktywne jest globalne zezwolenie na przerwania...
Okej, wklejam zatem treść polecenia. "Napisać program, który po uruchomieniu konfiguruje licznik WDT w tryb Interrupt and System Reset Mode z czasem przepełnienia 1000 mikrosekund. Wykorzystać jeden z rejestrów ogólnego przeznaczenia do zliczania liczby wystąpień przerwań od WDT. Drugi z rejestrów wykorzystać do odczytania wartości z rejestru MCUSR,...
IRQ tester https://obrazki.elektroda.pl/3243423400_... IRQ Tester to proste narzędzie, głównie do testowania czasu odpowiedzi na impulsy, lub czasów międzyzboczowych dostarczonego sygnału. Program został napsiany na ukontroler AVR Atmega168, a jego głównym zadaniem jest funkcja multiwibratora monostabilnego, którego działanie polega...
Dzięki, już działa. Wiedziałem, że mogę liczyć na forumowiczów :] ... Chociaż może nie do końca, bo teraz tylko timer 2 działa ;/ a 0 stoi. [syntax=c]void Timer0Init(void) { TCCR0 = 1<<CS01|1<<CS00; // Prescaler 64 TCNT0 = 128; // ~ 1.0 ms TIMSK |= 1<<TOIE0; // odblokowanie przerwania od licznika } void Timer2Init(void) { TCCR2 = 1;...
hmmm no ja to robiłem wtedy w Bascomie mniej więcej tak: ustawiałem sobie tak któryś Timer, żeby przerwanie wykonywało się powiedzmy 64 albo 128 czy ze 200 razy w ciągu czasu trwania jednej połówki czyli w trakcie ok 10ms tak? Gdy pojawiło się przerwanie INTx to odpalałem ten Timer, który zaczynał tykać i wykonywać przerwanie tyle razy ile ustalonych...
Tu można kilka rozwiązań zastosować: 1. Po komparatorze dać układ monostabilny rozciągający czas trwania impulsu do rozmiarów wystarczających by go Atmega zobaczyła (czas impulsu oczywiście mniejszy niż minimalny okres powtarzania impulsów). 2. Po komparatorze dać przerzutnik typu D, ustawiany zliczanymi impulsami. Wyjście przerzutnika podajemy na wejście...
Osobiście wyznaję zasadę, im trudniej, tym ciekawiej i można się więcej nauczyć... Jeśli chodzi o zasilanie awaryjne to ATmega wcale dużo pradu nie pobiera w odpowiednim trybie uśpienia. Można ją wybudzać przerwaniem z licznika, może to byc reset z watchdoga (Źródło resetu jest rozpoznawalne w MCUCSR), obsłużyć co trzeba i znowu uśpić - przeliczanie...
http://www.edw.com.pl/ftp/kalkavr.zip
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...
Chyba tutaj jest pogrzebane nadmiarowe wygaszanie z wzajemnością: Mielenie tego w pętli nie ma sensu, warto zaprząc tu przerwania od Timera (Jest jeszcze Timer3, gdyby z czymś kolidowało użycie Timer1), a pętla główna niech tylko oblicza odpowiednie wartości licznika.
Pomiar odcinków czasu dłuższych od okresu timera sprzętowego i w oparciu o przerwania będzie zawsze kłopotliwy z uwagi na nieunikniony hazard związany z kolejnością obsługi przerwań. Na AVR przerwanie ICP ma wyższy priorytet obsługi niż przerwania od przepełnienia. Ale problem wystąpi nie tylko, gdy mierzone zbocze pojawi się dokładnie w momencie przekręcenia...
Z kwarcu i preskalera wyliczasz sobie przy jakiej wartości licznik powinien się przepełnić i taką wartość ustawiasz w rejestrze OCRx. Włączasz tryb CTC timera, preskaler i przerwanie.
Przerobiłem program na Atmega328. Teraz ma tylko odbierać dane z master na Atega1284p i wysyłać do Domoticz. [syntax=vbnet] $regfile = "m328pdef.dat" $crystal = 8000000 $hwstack = 100 ' rozmiar stosu sprzętowego $swstack = 100 ' rozmiar stosu programowego $framesize = 128 $baud = 19200 '************ Uart 0 Config Serialin0 = Buffered , Size = 150 ,...
Witam Mimo, że większość proponowanych tutaj rozwiązań podłączenia RFM12 do Atmegi wykorzystuje SPI programowe, ja podłączyłem tradycyjnie, przez SPI sprzętowe - mimo, że nie miałem problemów z wgrywaniem kodu do Atmegi spiętej z RFM12, to uruchomienie ich razem jest problematyczne ( każde osobno działa bez problemu ) [syntax=basic4gl] $include "Config_AVR-DOS.BAS"...
przerwania pcint atmega atmega przerwania timera atmega przerwania timer
dwufazowy jednofazowy telewizory jedna antena zwrotnica berlingo schemat klimatyzacja
speakon łączenie drzwi rozsuwane
Whirlpool AWE 6519/P – silnik zakręca i zatrzymuje się, szczotki, tachogenerator, triak Peiying PY-3118M4 – zwarcie żółtego przewodu BATT+, przyczyny i diagnostyka