Może to Ci pomoże: http://www.elektroda.pl/rtvforum/topic43... avr'y są rodziną podobnie zbudowaną, więc czy to atmega16 czy 128 to obsługa jest niemalże identyczna.
A jak masz 10 przycisków wykorzystasz 10 przerwań? marnotrawstwo. wykorzystasz jeden licznik i po kłopocie zero opóźnień typu delay. Same zalety. minus? jeden: wykorzystany licznik.
Spróbuj wgrać ten kod.[syntax=basic4gl] $prog &H00 , &H00 , &H00 , &H00 $regfile = "m32def.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , E = Pinb.4 , Rs = Pinc.7 , Db7 = Pinb.3 , Db6 = Pinb.2 , Db5 = Pinb.1 , Db4 = Pinb.0 Config Pinc.2 = Input 'tego chuba nie używasz? Config Pind.1 = Input Przycisk Alias Pinb.7 'tego chuba nie używasz?...
EdW 7/2008 Wielofunkcyjny licznik rowerowy http://www.cyfronika.com.pl/kityavt2/avt...
Przy 6 kHz to można się pokusić o zliczanie programowe - czyli podajesz sygnał na wejścia mogące generować przerwania. Z drugiej strony, skoro stosujesz ATMega32, to może prościej wykorzystać ATXMEGA32, gdzie w zależności od wersji liczników masz nawet 8 (albo 16 8-bitowych) i sobie to ładnie sprzętowo rozwiążesz.
Dlatego, że podczas symulacji Atmel Studio symuluje procesor, w efekcie wie ile wykonał instrukcji i jakich - program jest wykonywany instrukcja po instrukcji, nawet jeśli dajesz mu run. W trybie debugowania sprzętowego pomiędzy pułapkami sprzętowymi może minąć dowolna liczba, dowolnych instrukcji. W efekcie nie ma jak ich policzyć i cycle counter nie...
Chodzi o to, że po pierwszym przerwaniu TCNT1 będzie miał wartość 0, czyli zliczy potem 65536 impulsów. Zaś do generowania, jak Ty chcesz, przerwań co określony odcinek czasu służy tryb CTC. Wtedy w rejestrze OCR ustawiasz ilość impulsów, które chcesz zliczyć, i wygenerować odpowiednie przerwanie.
wyzerowanie licznika
Dokładnie w tej linijce TIMSK | = 1<<TOIE2; //wlacz t2 czyli wysylaj co 5 s stan impulsow Przez ustawienie TOIE2 kasowałaś TOIE0
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Zastanów się co będzie w rejestrze TIMSK po wykonaniu tych dwóch linii Twojego programu: [syntax=c]TIMSK = (1<<TOIE0); //przerwanie na przepełnienie ... TIMSK = (1<<TOIE1); //przerwanie na przepełnienie [/syntax] Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011...
Myślę, że na początek powinnaś sprawdzić ścieżki płytki montażowej, aby wyeliminować możliwość występowania zwarć lub przerw a także zweryfikować, czy przebieg ścieżek jest zgodny z projektem. Ponadto sprawdź jeszcze pod kątem zwarć zamontowane w układzie kondensatory, często zdarza się, że to one właśnie są przyczyną nieprawidłowego działania całego...
Ja obsługę takich enkoderów wykonuje zawsze na jednym przerwaniu. Jeden z impulsów wywołuje przerwanie, w obsłudze przerwania sprawdzam tylko stan drugiego kanału. Jeśli jest wysoki to ++licznik, jeśli jest niski to --licznik.
Oto schemat układziku i program napisany do niego :) http://obrazki.elektroda.net/77_12208075... http://obrazki.elektroda.net/15_12208081... http://obrazki.elektroda.net/72_12208082... http://obrazki.elektroda.net/72_12208082... Wczoraj jeszcze próbowałem na innym porogramie, też z grafiką malutką i nic się nie pojawiało dziwnego...
Jeśli korzystasz z wewnętrznego zegara 8MHz to normalne, że masz niedokładności w odliczaniu czasu. Skorzystaj z zewnętrznego kwarcu jako źródła taktowania.
Czy istnieje jakis konkretny powód dla którego nie używasz prescalera i/lub 16bit licznika?
Można też skorzystać z Watchdoga i co jakiś czas po prostu nie zresetować jego licznika.
juz to robie w inny sposob, ale teraz mecze sie nad czyms innym... chce zrobic licznik impulsow zewnetrznych, na timerze 1 ale nie za bardzo chce mi to wyjsc... po prostu program nie chce wejsc mi w przerwanie :( czy moglby mi ktos napisac co powinienem ustawic poza: config Timer1 = timer, prescale = 1 set (pin tam gdzie jest t1) (pin gdfzie...
Traktuj cyknięcie Timer'a jako kwant czasu. Potem licz oddzielnymi licznikami (programowymi) te kwanty jako czas trwania i czas przerwy. Możesz w ten sposób zrobić, co dusza zapragnie. Przykładowo - gdy timer "cyka" co 1 sek. Możesz ustawić sobie, że masz 20 sekund (kwantów timera) czas trwania - potem (drugi licznik) 30 sekund (kwantów timera) czas...
żeby zgasić wyświetlacz, wystarczy wystawić na port cztery jedynki - nie musisz do tego zaprzęgać bieżącej pozycji i robić rozejść warunkowych. Łatwiej byłoby, gdyby licznik chodził od 0 do 3. Poza tym ok.
Czyli rozumiem że najlepszą praktyką jest ustawianie w flagi w procedurze przerwania a resztę wykonywać w main? W Twoim przypadku na pewno. I tak robić dla każdego rodzaju przerwania? Nie, tylko tam gdzie masz kod, który wykonuje się sporo czasu. Co znaczy "sporo czasu"? A to już zależy, od przypadku :) Innymi słowy chodzi o to, by nie utracić tych...
Układ cały czas liczy-nawet jak czytasz. Odczytujesz ADCH- a ADCL chce tam jakiś bit wsunąć. W starych 8051 tak się odczytywało licznik 16 bitowy. W AVR liczniki są buforowane- czytasz z innego rejestru niż rejestr licznika. ADC nie jest buforowane-czytasz bieżącą wartość.
Słyszałeś o wyświetlaniu multipleksowym?
Timer0 i Timer1 mają wspólny preskaler, Timer2 ma osobny preskaler. Poczytaj o resetowaniu preskalera w dokumentacji. U Ciebie jest inny błąd, w przerwaniu OC2 zmieniasz TCCR1B zamiast TCCR2. Co do zaokrąglania, to 1/76000 jest obliczane wg. zasad arytmetyki liczb całkowitych, a więc wynikiem operacji jest 0. Najprościej policzyć to tak: OCR0 = (1000000+76000/2)/76000;...
Za pomocą R4 (R5) polaryzujesz driver w stan nadawania więc po resecie gdy uC jeszcze nie ustali poprawnej wartości będziesz nadawać "1". Lepiej gdy spolaryzujesz do GND, wówczas zaczniesz nadawać gdy uC to wymusi.
O co ci chodzi? To chcesz obrotomierz, czy licznik obrotów/impulsów? Masz dostępne opisy obrotomierzy optycznych, które realizują podstawowy pomiar ilości obrotów na minutę. Możesz sobie jedynie wejście przerobić. Na pewno też znajdziesz jakiś licznik impulsów.
To rozwiązanie chcę użyć do zliczania sygnałów z czujnika. Na chwilę obecną zliczam impulsy na zmiennej i jest taki efekt, że w trakcie zliczania program wykonuje zliczanie i nie mam możliwości przełączać innych wyjść. (zliczanie jest jednym etapem gdzie musi zostać wykonana określona liczba obrotów)
Witam do postu dołączam kod programu. Problem jak w temacie. Przy "na sztywno" ustawionej częstotliwości pracy f=40000Hz i przy tym timer0 preskaler 8 i OCR0=50. Układ ewidentnie nie wchodzi w obsługę przerwania. Proszę o sugestie i ewentualne pytania co do kodu. Tryb pracy licznika CTC.
nie zabezpieczałem się, ale gdy zliczałem same naciśnięcia bez timera wszystko było dobrze, więc na razie tak zostawiłem a tak czy tak licznik się nie zeruje, więc coś jest nie tak ;D
Możesz zapisywać co sekundę EEPROM, stosując techniki wear leveling. Jeśli masz EEPROM np. 512 bajtów, a wykorzystujesz 4 bajty, to wydłużysz żywotność kilkaset razy.
Witam, Czy da się jakoś magicznie zrobić, żeby licznik w trybie CTC nie kasował się przy dojściu do zadanej wartości, tylko liczył dalej sobie... Chodzi mi o to, ze zrobiłem na rejestrze przesuwnym taktowanym przez CTC sterowanie 8 serwami modelarskimi, a teraz chce jeszcze zrobić odczyt PPM 8 kanałów odbiornika (po kolejki przez multiplexer 74151)...
Wszystkie zmienne programu są przechowywane w RAM. Kod inkrementacji czasu jest błędny - instrukcje If powinny być skaskadowane - nie ma sensu sprawdzać, czy minuty doliczyły do 60, jeśli wcześniej nie zwiększałeś licznika minut.
Jak to, przecież w C (avrgcc) można normalnie tworzyć zmienne lokalne deklarowane właśnie wewnątrz funkcji... Dobrze wiedzieć :) Wydawało mi się, że przy takiej próbie miałem błąd i zawsze wszystkie zmienne używane w funkcji deklaruję na jej początku. Oczywiście jeśli chcesz rozdzielczość 0,1st.C (rozdzielczość DS1820 to 0,0625) to trzeba tylko: [syntax=c]...
Okazało się, że jest kilka wersji ATMEGA32 i akurat włączenie przerwanie licznika TIM0 było w innym miejscu rejestru.
Programu się wstydzę, bo jest bardzo "prostacki", i pewnie zagmatwany :) Wydaje mi się że te resety wynikały z tego, że przerwanie od T0 (które może się pojawiać nawet co ok 0,3s) "nakładało" się z przerwaniem od T2, chociaż takie coś chyba nie powinno mieć miejsca:) A może do odmierzania 0,5s użyć DS1307? Bo mam przygotowaną płytkę pod niego, gdybym...
ad 1. Użyj timerów - taktując je zegarem o odpowiedniej częstotliwości licznik timera będzie zliczał czas. ad. 2. Użyj timera :) Tylko w trybie input capture - w tym trybie licznik zlicza impulsy zegara taktującego i jest stopowany zboczem sygnału doprowadzonego do wejścia ICP timera.
Jeżeli tak zrobisz i nastąpi przypadek, że w momencie w którym licznik będzie miał wartość 125, a warunek który dopisałeś nie będzie spełniony to nie wykona się kod zawarty w instrukcji if, czyli nie wykona się zerowanie zmiennej licznik. W rezultacie zmienna licznik w następnym przerwaniu będzie miała już wartość 126, itd. - i teraz pytanie: Czy to...
DDRB = 0xff; // DDRB jako wyjscie Dlaczego ustawiasz PORTB jak wYjście, a nie jako wEjście? Spróbuj ustawić jako wejście, może zadziała.
Pytanie pomocnicze brzmi - po co zliczać przerwania w C, skoro od tego ma się sprzętowy licznik?
Żeby zrobić za pomocą Timera - to nie możesz używać trybu PowerDown tylko Sleep - żeby właśnie Timery mogły działać to po pierwsze. W taki trybie jednak będziesz miał nieco większy pobór prądu niż w pełnym PowerDown. Więc wszystko zależy na ile ma wystarczać bateria o ile jest to coś zasilane z baterii. Bez PowerDown'a na pewno będzie to sporo krótszy...
Mam niewielkie a raczej bardzo małe doświadczenie z licznikami i przerwaniami i nie za bardzo wiem jak się do tego zabrać,który i jak skonfigurować licznik i gdzie użyć przerwań...
Rzeczywiście na oscyloskopie z przeliczenia częstotliwość wynosi około 100Hz... Dodano po 41 Posiadam dwa silniki, także wykorzystuje licznik T0 i T1 ...
Mnie zastanawia jedna rzecz, skoro korzystasz z przerwań to po jakiego grzyba tam input? Zobacz jak mozna to rozwiazac: Odebrano: Disable Urxc ' wylaczenie przerwania na czas trwania aktualnego 'Jesli licznik znakow jest mniejszy od maksymalnego rozmiaru bufora to... If Licz_znaki < Max_znakow Then '...zwieksz licznik znakow, do buforu transmisji...
A bo tyle stanów potrafi przyjąć licznik 16-bitowy. 2^16=65536.
tak. preskaler dopiera się zwykle tak by otrzymać największą możliwą liczbą którą można zapisać do licznika
Timer1 używają wartości OCR1A do 255 Licznik pracuje w trybie FAST PWM -8 bit.
Atmega32 ma 3 liczniki Atmega128 ma 4 liczniki podobnie Atmega162 i 64. Timery pracują niezależnie od pracy programu, ale z programu można nimi sterować(bo po co by były)
Co do samego stylu ja dodam od siebie. 1. Odświeżanie danych na LCD - nie rób ciągle Cls, Cursor Off Noblink. Ta druga instrukcja tylko na początku programu, a zamiast kasować danych i wyświetlać od nowa, zrób to za pomocą funkcji Locate i nadpisywania odpowiednich miejsc. 2. Konfiguracja pinu sterującego przekaźnikiem na początek programu. 3. Waitms...
1. W trybie CTC licznik liczy aż do osiągnięcia ustalonej wartości, następnie może (ale nie musi) generować przerwanie i zawsze jest automatycznie zerowany i liczy od nowa. 2. Tak, możesz w przerwaniu załadować TCNT dowolną wartością od której licznik będzie liczył. Tylko w przypadku rejestrów 16-bitowych pamiętaj, że koniecznie najpierw musisz załadować...
Spróbuję zaprogramować ATMEGĘ8 tak aby na dwóch przykładowych pinach pojawiały się impulsy STEP_UP, STEP_DOWN, wtedy główny MCU (ATMEGA32) będzie musiał w przerwaniu tylko zmniejszyć lub zwiększyć licznik pozycji silnika.Powinno być sporo szybciej.
Software PWM możesz zrobić na dowolnym pinie wyjściowym cyfrowym. Użyłbym timera 8-bitowego. Należy wtedy włączyć i obsłużyć dwa przerwania: 1. przepełnienie (przy przejściu licznika z wartości 255 na 0) - ustaw wtedy stan wysoki na wymarzonym pinie 2. przekroczenie wartości - ustaw wtedy stan niski na wymarzonym pinie Przykładowy kod: https://www.elektroda.pl/rtvforum/viewto...
Cześć Atmegę 32 chcę dać jako slave. Wysyłana będzie ramka danych składająca się z 2 do 5 bajtów. W książce Język C dla mikrokontrolerów AVR znalazłem świetny przyklad ktory idealnie by się nadał. Jednak w nocie katalogowej atmegi32(atmega32APU) nie mogę znaleźć info o przerwaniu od zmiany stanu na lini SS. Czy jest jakaś możliwość sensownego rozwiązania...
Tzn przed licznikiem??? Załamka ciągle nie działa :(
Nie wiem jak jest w AVR ale w PIC nie wyślesz pustego bufora przerwanie się wykona jeśli jakieś dane są w buforze. Tak samo z odbieraniem. Można dodać licznik by kontrolować wysyłanie i odbieranie.
Oczywiscie ze mozna i tak istnieje jeszcze wiele rozwiazan tego problemu np mozna w ogole licznikow/wskazników. To co zapronowałem wydaje mi sie optymalne ezerwuje tylko 1 bajt na licznik/wskaznik, a program jest prosty.
Oscyloskopem niestety nie dysponuję. Działanie detektora zera sprawdzałem w ten sposób, że przy co setnym impulsie dodawałem sobie do licznika wartość jeden, i - zgodnie z oczekiwaniami - mniej więcej co sekundę licznik zwiększał się o 1. (wartość licznika wyrzucałem na diody).
Wykorzystaj liczniki, na 16 bitowym liczniku spokojnie odmierzysz sekunde.
Wiesz o tym, że licznik sprzętowy z preskalerem 1 jest szybszy od programu jaki masz napisany. Zanim instrukcje się wykonają to licznik zliczy jeszcze parę impulsów. Stąd te wachania.
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...
Zamieszczam przyklad programu napisanego na kolanie, zmienia stan lini PC3 co okolo (LicznikMax*10ms ) - wychodzi co ok. 100 ms Gdybyś miał wątpliwości to podniosłem moje kości z krzesła przed komputerem po płytkę z AtMega32 i sprawdziłem w ukladzie - DZIAŁA! Kompilowany pod ICC626, polecam "Wizarda" ,pomaga w minute ustawić co potrzeba bez sięgania...
A mam jeszcze takie pytanie, czy ustawiając wypełnienie PWM przykładowo tego Timera2 na np. 77.125 przy trybie CTC, licznik zlicza do 77, czy do 77.125 ?
Witam. Chciałbym prosić o pomoc. Czy ten kod jest poprawny. Program działa bez zarzutów. Natomiast, gdy włączę przerwanie"sei". Układ się zawiesza. [syntax=c]void init_Ex1() { // Timer clock = I/O clock / 1024 TCCR0 |= (1<<CS02)|(1<<CS00); // Clear overflow flag TIFR |= (1<<TOV0); // Enable Overflow Interrupt TIMSK |= (1<<TOIE0);...
Co do programu przedstawionego w załączniku. Strasznie marnujesz czas procesora, powinienes w przerwaniu wykonac kilka instrukcji a ty wykonujesz wszystko. Uboczną stroną jest jescze to ze musisz zapisywac wykorzystywane rejestry na stosie i "uziemiasz sobie licznk 0" Proponowałbym taki sposób: czujnik dołaczasz do wejscia into lub int1 ustawiasz na...
Zapewne program się wykrzacza na tym reti(). Skąd pomysł, aby umieścić taką instrukcję? Ponadto raczej lepiej byłoby aby zmienna licznik była zadeklarowana jako static w ISR.
Połącz funkcje wykonywane przez liczniki 0 i 1, zwalniając w ten sposób jeden z nich.
Co do kondensatora tantalowego, to nie ma to dużego znaczenia z jakiej biblioteki i jakiej nazwy użyjesz dla tego elementu. Byle by się zgadzała wielkość obudowy i miejsce wyprowadzeń. Zresztą tak się robi z wszystkimi elementami. Nie szukaj po nazwie tylko po wielkości obudowy. A nazwę nadasz sam narzędziem Value . Kondensator C7 nie podłączaj do wejścia...
A te twoje liczniki i zmienne globalne modyfikowane w przerwaniach sa zadeklarowane jako volatile?
Taki licznik chce zrobić: https://aki-technical.blogspot.com/2020/... Dodano po 31 Jest też projekt na liczniku i nie wiem które rozwiązanie wybrać pod swój projekt: https://www.engineersgarage.co...uilt-co...
return przydałby się na końcu. I zacznij stosować ISR() Matko boska! tadzik weź ty się ze 4 albo 6 razy zastanów jak coś podpowiesz - RETURN w procedurze obsługi przerwania w C ????? Chyba że ty piszesz swoje programy w Bascomie ze wstawkami w C albo odwrotnie. do autora - żadnego polecenia return w przerwaniu bo będziesz miał tylko jeszcze gorzej....
No tak to na pewno, ale chodzi mi o to czy będzie jakiś dłuższy przestój ? Czy w jakiś milisekundach ? Jak ma się to zliczanie do czasu rzeczywistego ? Ile trwa zliczenie całych 16 bitów dla licznika ???
W celu eliminacji drgań styków należy użyć przerwania licznika, by odczytywać stan przycisku tylko raz na około 10 ms . Nie używamy funkcji Debounce i delay_ms ! Czy przycisk został naciśnięty sprawdzamy w zmiennej globalnej dostępnej w programie głównym.
W pdf jest napisane wszystko . Może napiszesz czego oczekujesz a co wychodzi . Pewnie w obliczeniach zapomniałeś o samym liczniku i wychodzi 256 razy mniej . Wielu początkujących robi taki błąd , ze zapomina o tym ze aby licznik się przepełnił musi policzyć tyle impulsów ile ma jego pojemność a w niektórych trybach ta wartość się jeszcze zmienia . Napisz...
Tu nie chodzi o nazewnictwo, tylko o wynik operacji. Najmłodszy bit jest gubiony, a nie wpisywany na najstarszą pozycję. Ale mniejsza z tym. Po maskowaniu będzie wszystko jedno. Natomiast mam pytanko - dlaczego pętla obejmuje te konwersję. Powinno być jakos tak [syntax=c] int licznik; for(licznik=0;licznik<5;licznik++) { buffer_t[licznik] = TWI_read(pcf8583,rtc_adres[licznik]);...
zliczanie impulsów z dwóch enkoderów Jeżeli to są enkodery inkrementalne z sygnałem A, B i ew. Home, zrezygnuj z megi64/128. Xmegi mają wsparcie sprzętowe do obróbki sygnału z takich enkoderów przez użycie liczników w połączeniu z eventami. Na STM32Fxxx zrobisz to łatwiej i być może szybciej korzystając z gotowców. generowanie dwóch przebiegów PWM...
// ================= 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ę...
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...
Ale skąd mam wiedzieć że licznik dobrze zlicza tzn co 1 mikrosekundę? Skąd mam wiedzieć że udało mi się na podstawie taktowania procesora wyliczyć dokładnie jedną mikrosekundę? Zaletą mikrokontrolerów jest to, że wystarczy być pewnym ustawień rejestrów i zegara, i musi odliczać prawidłowo. Pokaż program. Oczywiście kontrola jest wskazana :)
Po pierwsze uruchom timer w trybie CTC, nie będziesz musiał ciągle przeładowywać licznika. Po drugie jak raz uruchmoisz ADC to nie musisz tego robić ponownie, wystarczy uruchamiać konwersję. Po trzecie - po co preskaler ADC? On ma zakończyć konwersję w miarę szybko (w każdym razie przed kolejnym przerwaniem timera. I najważniejsze - w przerwaniu timera...
1. W jakim języku piszesz? 2. Kalkuluje się to tak: Masz kwarc 16 000 000 Hz (16 MHz) i dajesz sobie jeden z dopuszczonych prescalerów, np. 64 i wtedy timer zlicza Ci impulsy z częstotliwością 16 000 000 / 64 = 250 000 Hz, czyli jeden impuls timera to 4*10^-6 s lub inaczej aby odmierzyć 1s musisz zliczyć 250 000 impulsów, Jako, że Timer0 jest 8 bitowy...
Walają mi się jakieś scalaki rejestrów przesuwnych, czy zamiast 7219 można wykorzystać takie rozwiązanie? Nie jestem sympatykiem zamawiania pojedynczych elementów elektronicznych, dlatego chciałbym wykorzystać to co mam pod ręką, ale narazie zadowolę się LCD a w razie potrzeby zamówię ów układ scalony. Mam kilka wyświetlaczy LED głównie 4 cyfrowych...
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...
Moze zastosowanie osobnego zegara np. DS1307 bedzie prostszym rozwiazaniem. Podtrzymywany z aku CR2032 po zaniku zsilania. Nawet po zaniku zasilania , czy wylaczeniu bedzie tykal. Stosowanie zegara zewnętrznego przy ATmegach wydaje się zbyteczne na fakt możliwości wykonanie wręcz sprzętowego zegarka na odrębnym kwarcu 32768kHz na liczniku T2
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...
Dlatego, że w chwili zajścia zdarzenia do ICR przepisywana jest wartość licznika timera. ICR to nie jest rejestr, który jest przez timer inkrementowany, stąd też nie ma wielkiego sensu do niego coś zapisywać. A że licznik timera się inkrementuje, więc kolejne wartości ICR to po prostu wartości licznika timera w momencie zajścia zdarzenia. Aby to zmienić...
kolega ma kompletnie skopane procedury obslugi przerwań, nie wiem czemu nikt dotychczas tobie nie napisał że obsługa przerwania to nie jest miejsce na stosowanie procedury delay(). To także nie jest miejsce na to aby wstawiać tam instrukcje case-select choć to jeszcze od biedy przejdzie. Przerwanie musi byc maksymalnie zwięzłe. Dla wyświetlacza musisz...
...i do tego wszystkiego trzeba jeszcze zablokować przerwania, bo obliczenia się rozjadą. Do takich długich czasów w 99% przypadków używa się timerów - odpowiedni podzielnik razy licznik w przerwaniu i bez skomplikowanych obliczeń masz dokładny wynik.
Takie rzeczy zwykle robi się tylko na liczniku wykorzystując jego odpowiednie wejścia. A skoro zauważyłeś stały błąd uwzględnij go w wynikach.
Przede wszystkim widać , że troszkę na oślep walczysz z prawidłową filtracją zasilania więc może to ci pomoże? http://mirekk36.blogspot.com/2012/04/mik... poczytaj, popatrz i zobacz co z czym jest związane i za co odpowiada .... używasz niewłaściwych kondensatorów ... do filtracji. To jedno... a DRUGIE .... ja bym na...
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ć...
Porty mam podciągnięte do GND przez rezystor 10k W programie chodzi o stopowanie i uruchamianie licznika za pomocą KEY1 I KEY2 KEY3 To przycisk włączający funkcje odblokowania KEY1 i KEY2 jeśli KEY3 nie zostanie wciśnięty to Zablokuj KEY1 i KEY2 Problem polega na tym, że po włączeniu KEY1 lub KEY3 licznik chwilowo się zatrzymuje, po czym uruchamia się...
Z programowaniem w C za pan brat nie jestem ... Z ATMega32 chyba też nie :-P Output Compare Register (OCR0) are 8-bit register
Źle wkleiłem kod, oczywiście ustawiam OCR1A przed włączeniem Timera, jednak bez efektu. Odpaliłem program w avr studio, licznik liczy, ale stan portu odpowiadającego OC1A zawsze jest niski.
Nikt tu nie dodaje "licznika". Timer2 jest przez BASCOMa traktowane na równi z TNCT2. A przynajmniej powinno być. Tak samo jak można napisać: Timer2 = 100 i to nie zapisze wartości 100 do "licznika", tylko konkretnie do rejestru TCNT2.
Ja w swoim stertowniku basenowym obsługę DS x2 zrobiłem w przerwaniach i oba wyniki mam co każde 750ms. Po prostu selektywnie wykonywane są komendy sterujące, które pojedynczo zajmują bardzo mało czsu prockowi. W Twoim przypadku lepiej ten odczyt przenieść do pętli głównej, a przerwania zostawić na bezpieczny niczym nie zakłócony przesył danych i jakiś...
Dokopalem się - chodzi o symulację w VMLab. Moze ktoś z Szanownych Grupowiczów posiada ciekawy program lub programy w WinAVR, które móglbym wykorzystać w swojej pracy (nie naruszjąc praw) a które dobrze zobrazowałyby wykorzystanie liczników i modulatorów Atmegi32. pozdrawiam i dziękuję za pomoc KR
można również ustawić prestaler tak aby licznik się przepełniał i w przerwaniu przepełnienia zwiększać licznik przerwań pozwoli to uzystać wysoką dokładność ( albo zastosować 8 bitowy licznik a 16 zostawić do czego innego )
Programator do pamieci ATtiny AT90S ATmega ATtiny12 AT90S1200 ATmega8 ATtiny15 AT90S2313 ATmega16 ATtiny26 AT90S2323 ATmega32 AT90S2343 ATmega103 AT90S4433 ATmega128 AT90S8515 ATmega161 AT90S8535 ATmega163 ATmega603 ATmega8515
To nie moze nie zadziałać. Jeśli programator widzi procek (programujesz pewnie z poziomu Bascoma) powinien Ci się zwiększać licznik programowań za każdym programowaniem. Czy tak jest? Czy podczas programowania widnieje prcek ATMEGA32? Jak masz ustawione fuse bity?
ale z tego co się już dowiedziałem nie będzie działać na mojej płytce Nie prawda, będzie działał po zmianie kilku linijek kodu. [syntax=basic4gl]$regfile = "8515def.dat" $crystal = 10000000 [/syntax] To zmień na swojego procka i częstotliwość oscylatora, jaki Masz. Na przykład [syntax=basic4gl]$regfile = "m32def.dat" $crystal = 8000000 [/syntax] Tą...
Może Fusebity masz ustawione na uruchamianie bootloadera? Na takiego 4kB? Przy programie poniżej 28kB (na oko te 88%) w bootloaderze lądują same FFy i program je bez zawieszania wykonuje (czyli w praktyce "omija" bo FFy to jakieś dość niegroźne instrukcje, zdaje się że "sbrs") i w końcu licznik programu przewija się do 0 i Twój normalny program startuje....
licznik częstotliwość atmega32 licznik impulsów atmega32 atmega32 20mhz
czujka zalania konfiguracja philips serwisowy zmiana matryca wyłącza subwoofer aktywny
hewalex sterownik hewalex sterownik
Haier pralka wyświetla błąd 8 na każdym programie Brak zasilania przedniej prawej lampy pozycyjnej w Volkswagenie Tiguan 2