A co jeśli do pierwotnego kodu dodasz: [syntax=c]ISR(TIMER1_COMPB_vect) { }[/syntax]
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)
No jest kretyński :) TIMSK = _BV(TOIE1); // wlacz obsluge przerwan T/C1 TIMSK = _BV(TOIE0); //jw dla T/C2 TIMSK = _BV(TOIE1) ; // wlacz obsluge przerwan T/C1 TIMSK |= _BV(TOIE0); //jw dla T/C2 albo TIMSK = _BV(TOIE1) | _BV(TOIE0) ; ;)
Do obsługi Timera1 są 4 wektory i nie wiem, które aktywować, co wpisać w procedurze odwołującej się, czy w ogóle jest taka potrzebna. Czy wystarczy tylko uruchomić te przerwanie i sygnał będzie generowany automatycznie ? Tabelka jest prosta: TIMER1 CAPT Timer/Counter1 Capture Event Zdarzenie z przechwycenia licznika (zwykle przez zmianę na pinie...
Jeśli do tego włączysz przerwania, ustawisz licznik T1 w tryb porównywania z kasowaniem, to dokładnie co 1 sekundę wywoła się przerwanie przepełnienia licznika T1. Dalej to już tylko odpowiednia obsługa tego przerwania.
Przecież pisze jak na tacy: 1. Licznik nie doliczy do 5000 w trybie CTC - zatem logicznie myśląc trzeba ten tryb wyłączyć . 2. Jeśli licznik ma pracować w trybie CTC to wartość z OCR1B musi być mniejsza niż OCR1A.
Dokumentacja mówi WYRAŹNIE: najpierw należy ładować wartość do TCNT1H (który zostaje zapisany do rejestru TEMP), a dopiero potem do TCNT1L, co pociąga za sobą wpisanie do TCNT1 aktualnej części jako dół i wartości TEMP jako góra (przy odczycie najpierw należy odczytać dół, potem górę). Ciągu skutków powodujących takie zachowanie a inne nie chce mi się...
Sprawdź w symulacji co się dzieje z rejestrem TCCR1B (a szczególnie z bitami CS10 - 12) po komendzie "timer1 = 0".
A nie powinieneś czasem użyć bitu OCF1 i przerwania "0x006 TIMER1 COMPA Timer/Counter1 Compare Match A"?
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=...
Ja się tam na BASCOMie nie znam, ale ten program to wyglada mi na generator liczb pseudolosowych ;) Weź się skup i zastanów co chcesz uzyskać. Kompletnie nie rozumiem, co Ty robisz z tym T. Co to ma reprezentować? Podpowiem, że jeżeli chcesz wyświetlić liczbę X z zakresu 0..99 na swoim wyświetlaczu, to byłoby to chyba coś takiego (zakładając, że wyświetlacz...
Moja uwzględnia czas, który upłynął od przerwania do załadowania timera. Może to mieć wpływ gdy wystąpi w tym samym czasie obsługa innego przerwania.
Witaj. 1. WGM12 nie jest w TCCR1A. 2. Dlaczego nie stosujesz funkcji przerwania? EDIT: Oj, zostałem wyprzedzony przez kolegę wyżej :)
A jak policzyłeś 0x7A11?? Licząc "od tyłu" wychodzi: 0x07a11 * 256 = 31249 * 256 = 7.999.744 Czyli blisko 8MHz. Gdybyś miał 0x7A12 to byłoby równo 8MHz. Czy taki masz kwarc?
Tak się nie robi. Myślę że ten timer się parę razy przepełni zanim obsłuży LCD. Ustaw timer tak aby wywoływał przerwanie przy danej wartości i w tym przerwaniu dodawaj jakąś zmienną o 1 i czyść licznik.
Aż musiałem wyciągnąć płytkę - co prawda c 168PB - przerwania chodzą aż miło :). Przy okazji jak chcesz się męczyć AVR-ami to proponuje kupic płytke z debuggerem typu xpained mini - będzie łatwiej [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> volatile uint16_t cnt; int main(void) { TCCR1B |= (1 << WGM12); TIMSK1 |= (1 <<...
Co robię źle Noty katalogowe czytasz po łebkach, a zwłaszcza fragmenty dotyczące rejestrów. - W TCCR2 nie ma bitów WGM12/CS02/CS00. - W Timer1 oba rejestry TCCR1A/TCCR1B należy konfigurować no i w CTC tylko OCR1A ma znaczenie.
Jeżeli miałbym robić układ od początku to zastosowałbym bardziej oszczędny sposób. Jednak zmuszony jestem do modyfikacji programowej tego co jest zrobione. Proszę jedynie o konfiguracje Timera1 z przerwaniem co 32us.
Potem calosc zestroilbym dodajac nopy i ewentualnie korygujac minimalnie timer Jak czas odmierza timer, to nop nie nadadzą się jako coś do korekcji częstotliwości.[/quote] Nie chodzi mi o korygowanie chwili wystapienia przerwania,lecz o dokladny moment zmiany stanu portu w procedurze obslugi przerwania.
spr dodać 'volatile' przy deklaracji zmiennej, możliwe że kompilator optymalizując wpisuje na stałe wartość zadeklarowaną na początku, w przerwaniu jej wartość się nie zmienia, dla kompilatora jest ona w tym miejscu jako stała ...
Jak już Kolega nabierze wprawy z przerwaniami i timerami to można osiągnąć zamierzony cel w następujący sposób: Dajemy sygnał (którego długość trwania chcemy mierzyć) na wejście INT0 oraz INT1 jednocześnie, przy czym pierwsze ustawiamy na zbocze rosnące a drugie na spadające, w przerwaniu INT0 startujemy timer1 a w przerwaniu INT1 zatrzymujemy go,...
Nie wiem czy chcesz czytać 600 linii kodu ;) Mogę tylko powiedzieć że sprawdziłem cały kod i nigdzie więcej nic z przerwaniami nie robie
Jak mnie pamięć nie myli to powinno być "on timer1 czas" a nie on timer1 goto czas . Tak przynajmniej było w poprzednich wersjach tego kompilatora sprawdź w helpie poza tym dlaczego po zezwoleniu na przerwania dajesz komendę stop timer1? Zatrzymany zegar przerwania nie wyzwoli ...
Portd.3 wiem że to jest przerwanie int1 , timer według pomocy bascoma startuje po wpisaniu preskaler..x a na oscyloscopie cisza. Teoretycznie podaję 0 na portd.3 wtedy następuje przerwanie ale brakuje chyba odblokowań. Mnie tu brakuje Start Timer1 po zadeklarowaniu jego preskalera. Poza tym, obsługę przerwań trzeba umieścić poza pętlą główną. Oraz...
Masz błąd - w przerwaniu jeśli już powinno być Load Timer1
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...
TCCR1B &=~(_BV(CS12)) | ~(_BV(CS11)) Ww. zapis oznacza tyle co TCCR1B &= ~(1 << 2) | ~(1 << 1), to znowuż jest równoważne TCCR1B &= ~4 | ~2. W zapisie zerojedynkowym będzie TCCR1B &= 1111 1011 | 1111 1101, przy czym po wykonaniu operacji OR na tych ślicznych liczbach postanie z nich 1111 1111...
Ja wolę przerwania: Dim Sekunda as byte Config Timer1 = Timer , Prescale = 256 On Timer1 Odmierz_1s Enable Interrupts Enable Timer1 do loop end Odmierz_1s: Counter1 = Counter1 + 34286 Incr Sekunda Return Podałem ci "szkielet" programu do odmierzania 1 sekundy za pomocą timera1. Pamiętaj że procek musi go posiadać i musi być taktowany przez oscylator...
Program działa i nawet licznik się zatrzymuje tylko jaką mam pewność że jest to 250ms? chodzi mi o to żeby uzyskać jak największą dokładność. Dzięki za ten przykład, spróbuję... Nie wiem dokładnie , do czego Ci to potrzebne ale przykład z przerwaniem , który podałem wcześniej działa z dokładnością do ~2 cykli zegara(500)ns.Czy to niezbyt dokładnie...
Witaj, Pobieżnie patrząc na program, wygląda prawidłowo. Może podłącz do jakiegoś pinu LED i zmień: [syntax=c]ISR(TIMER1_COMPA_vect) { PORTTESTOWY ^= (1<<pin_testowy); //zmień stan LED na przeciwny }[/syntax] i sprawdź czy co 1sek się zmienia. Oczywiście ustaw pin jako wyjście.
Wystarczyło dodać polecenie, aby timery ładowane były odpowiednią wartością po wstąpieniu przerwania. Program działa tak jak chciałem.
Config Serialin = Buffered , Size = 80 Enable Interrupts Dim _Flaga_1s as Bit _Flaga_1s = 0 Config Timer1 = Timer , Prescale = 64 Enable Timer1 : On Timer1 Co1s Cls Do If Ischarwaiting() = 1 Then Znak = Inkey() Print Chr(znak) ; End If if _Flaga_1s = 1 then ' ------> a tutaj wyświetlaj już sobie spokojnie co chcesz co...
Włączasz przerwanie od przepełnienia timer1, nie mając procedury jego obsługi. Włączasz także przerwanie od porównania z OCR1B i także nie masz obsługi tego przerwania. Takie podejście = kłopoty.
Przede wszystkim musisz zacząć kolego od poznania timerów. Do odmierzenia czasu używamy timerów ponieważ zlicza nam czas w tle działania procesora. Używając polecenia wait zatrzymujesz kompletnie uC na ten czas. Konfiguracja dla AtMega8 8Mhz u mnie wygląda tak: Config Timer1 = Timer , Prescale = 256 ''''konfiguracja timera On Timer1 1s ''''przy przerwaniu...
Albo cała obsługe przerwania można zrobić prościej tak: Jeszcze prościej: [syntax=c]ISR(TIMER1_COMPA_vect) { if (PORTC & (1 << PC5)) PORTC &= ~(1 << PC5); else PORTC |= (1 << PC5); }[/syntax] najprościej: [syntax=c]ISR(TIMER1_COMPA_vect) { PORTC ^= (1 << PC5); }[/syntax] Skoro jednak pętla główna jest pusta, można nawet...
Nie sprawdzałem wcześniej bo uwierzyłem ci na słowo, że sprawdziłeś rejestry ATMega8. W rejestrze TIMSK przerwanie overflow dla timera0 to TOIE0 ale jest to bit 0 a nie 1. W związku z tym inicjacja powinna wyglądać tak: TIMSK=0x01 lub jak wspomniałem wcześniej zdefiniować bit TOIE0: #define TOIE0 0 wtedy zadziała TIMSK=(1<<TOIE0) Bardzo polecam...
To nie Bascom jest przyczyną tylko źle napisany program ;). 1. odczyt timera1 16bit odbywa się po przez rejestr pomocniczy TEMP, ten rejestr jest też używany przez inne procedury i funkcje i jeśli jest użyty to właśnie niszczona jest wartość High timer1 bo ona tam jest wpisana gdy używasz komendy. wpisując tak timer1 do tablicy możesz gubić High timer1....
Tak jak wcześniej pisałem, najłatwiej podpiąć wyjście detektora do wejścia INT0 lub INT1, w obsłudze przerwania wyłączamy pin odpowiedzialny za triak, ładujemy do TIMER1 ładujemy obliczoną wartość opóźnienia załączenia triaka. W obsłudze przerwania z TIMER1, włączamy pin wyjściowy. Przykład: Atmega8, taktowana 8 MHz, przerwanie INT1 skonfigurowane jako...
[syntax=basic4gl]$regfile = "m8def.dat" $crystal = 8000000 $hwstack = 40 $swstack = 16 $framesize = 32 'timer '16MHz 16000000(16MHz)/256(Prescaler)=62500 i odejmij jeden Config Timer1 = Timer , Prescale = 256 , Compare_a = Disconnect , Compare_b = Disconnect , Clear Timer = 1 Enable Compare1a : On Compare1a Timer1_isr : Compare1a = 62499 '1s (at)16MHz...
Nie pytałem by Ci dopiec, tylko chciałem stwierdzić na ile trzeba Ci tłumaczyć :) Nazwę pinu używaj taką jaką jego funkcje wykorzystujesz, więc nie pisz PBB0(ICP1) tylko ICP1. Wynika to z tego iż w innej obudowie lub innym procesorze może być na innym pinie niż PB0, a warto pisać tak aby było bardziej uniwersalnie. Napisz jak rozumiesz działanie tego...
A nie prościej liczyć to za pomocą Timera1 czyli na sekundę ma być np. wyświetlonych 50 obrazów i każdy z nich zawiera np. 10 części. Daje nam to 500 przerwań na sekundę. W przerwaniu Timer1 ustawiasz za każdym razem początkową wartość timera i ustawiasz jakąś flagę. Możesz również dodać zwiększanie licznika od tego co ma być wyświetlane. W programie...
wynik końcowy faktycznie za każdym razem jest inny. (at) emarcus możesz podpowiedzieć jak powinien wyglądać serwis int1? Popatrzyłem troche bliżej na twoj kod. Z jakiego powodu potrzebujesz otrzymać wynik ("Czas_2") z dokładnocią aż do 9 miejsc decimal? Jeżeli jeden z czynników iloczynu (rozdzielczość timera) jest liczbą wymierną z dokładnościa do...
Takie skomplikowane rzeczy dla jednej sekundy... Takie coś odmierza sekundę dla kwarcu 11059200 , dla innego musisz użyć gdzieś dostępnego kalkulatora tajmerów: $crystal = 11059200 Config Timer1 = Timer , Prescale = 256 Enable Interrupts Enable Timer1 On Timer1 Timer1_int Start Timer1 Dim sekunda as byte ' bo mniej niż 255, 60sekund Do : Loop '...
Po pierwsze jakie czasy chcesz obliczać i jakie przerwania po co ??? To jest bascom nie assembler, deklarujesz na wstępie programu prędkość kwarcu a kompilator troszczy się o resztę tj. dajesz deklarację $regfile = "m8def.dat" $crystal = 12000000 Po drugie, procedura obsługi wyświetlaczy LCD (mowa tu o alfanumerycznych HD44780) jest w BASCOM zaimplementowana...
Witam ! Obliczenia źle oraz pewnie źle ustawione fusebity (pewnie default - 1Mhz internal rc). Instrukcja Load jako parametr ma po ilu impulsach ma wystąpić przerwanie, więc powinno być 625, ale że pojedyńcza połówka przebiegu sieci trwa nie 20ms a tylko 10ms więc powinno być 312,5 :D. Więc lepiej chyba prescale = 64 i load timer1, 1250. Pozdrawiam...
$katalog_WinAVR$/doc/avr-libc/avr-libc-u... Tworzysz osobny plik w asemblerze (.S, nie .s) zawierający procedurę obsługi przerwania, kompilujesz do pliku .o i linkujesz z pozostałymi plikami. W dołączanym wo WinAVR szablonie Makefile jest przewidziane miejsce na wypisanie źródeł w asemblerze (ASRC = $tu wpisz nazwy plików$). Przykład,...
Jak jest z dokładnością zegarka RTC w Atmega8? Słyszałem plotki, że nie chodzi to zbyt idealnie. Potrzebuję zrobić zegar do zliczania tylko dni i zastanawiam się czy jest sens stosować zewnętrzny układ RTC. Układ musi mieć podtrzymanie zegara z baterii/kondensatora w przypadku zaniku zasilania. Śmiało możesz użyć np. Timer1 w trybie CTC jako generatora...
ldi r16,0xA0 out OCR1AL,r16 ldi r16,0xFF out DDRB,r16 main: rjmp main problem w tym że zmieniasz te stany tylko raz, potem w pętli nie robisz nic... powinno moim zdaneim być main: ldi r16,0xA0 out OCR1AL,r16 ldi r16,0xFF out DDRB,r16 rjmp main edit: ups, nie doczytałem że chcesz wykorzystywać timer... więc nie wiem czy moje rozwiązanie problemu...
Wszystko ladnie tlumaczycie tylko ze nie posilkowaliscie sie nota katalogowa i ten program nie bedzie dzialal. ldi r16,0b10000000 out TIMSK,r16 Jesli spojrzec do noty to siodmy bit w TIMSK to OCIE2, czyli nic nie ma wspolnego z T1 czy T0. Mowilem ze ten program jest ZUPELNIE nie czytelny. Na samym pczatku juz kicha jest: .org 0x0005 to wektor od Timer1...
1. Ten kod da się zoptymalizować do Fast PWM bez obsługi przerwania od Timer1 CTC. 2. Te wartości grX to co to jest ? Częstotliwość razy 10 ?
nie słyszałem, ale już buszuję w datasheecie. Pamiętaj że po puszczeniu przycisku wynik musi być wyświetlany. Po wciśnięciu przycisku 2 następuje reset zmiennych. Może jest przerwanie wyzwalane zmianą stanu logicznego na którejś nóżce? Zmieniałoby CS12 na 0 tym samym wyłączając timer1 :)
Zmieniasz wektory w rejestrze MCUCR, a odpowiednie bity są w rejestrze GICR. Więc table jest nie tam gdzie trzeba.
Widzę, że coraz bardziej zbliżamy się do assemblera. W bascomie da się wyłączyć generowanie odkładania i pobierania ze stosu rejestrów w czasie ubsługi przerwania: On timer1 nazwa_suba NOSAVE Ale wtedy to asm w obsłudze przerwania obowiązkowy (bo kto odkryje, które rejestry zmienia Bascom). Ewentualnie można zdekompilować prog sprawdzić i potem dopisać.
To co piszesz jest słuszne i mądre, widzisz, jest tylko jeden problem - soft jest skomplikowany bardziej niż by się wydawało, atmega8 ma tylko 8kb flash a wszystkie przerwania Atmega8 są zajęte (w tym timer1 do zliczania pojedynczych sekund, int1 i timer2 wykorzystywany przez getrc5). Oczywiście zawsze można skonfigurować bufor wejściowy, np. gdy spodziewamy...
Prog zumek-a jest O.K. i jest w przerwaniach tak jak wlasnie potrzebowalem. W jakich przerwaniach :?: No chyba że Ty , spłodziłeś jakieś przerwanie , bo ja od tego umywam ręce :D I jak zwykle mam kilka pytan :P .equ res=4096-1 ;rozdzielczość .equ pwm=127 ;wypełnienie .if pwm>res .error "stala pwm jest wieksza od rozdzielczosci" .endif...
Trzeba mierzyć czas impulsu i jeśli wynik = ileśtam to wtedy dzieje sie cośtam Może : $regfile = "twój uP" $crystal = twój crystal Config Timer1 = Counter , Edge = Rising Config Portc = Input Do If Portc.1 = 1 Then Start Timer1 If Portc.1 = 0 Then Stop Timer1 End If End If For Timer1 = 100 To 200 Reset Porta.1 Next For Timer1 = 300 To 600...
Niestety nie pomogło... :/ Te polecenie Start Timer1 to wstawiałem w miejsce gdzie są globalne zezwolenia oraz w miejscu przerwania od tego timer'a i nic...
Jaka jest maksymalna częstotliwość pracy kwarca wewnętrznego Atmegi8? ATmega nie ma w środku kwarc u , tylko oscylator RC, to tak gwoli ścisłości. Mam ustawione 4Mhz i kiedy ustawiam prescaler w timerze 16bitowym na 64 (TCCR1B|=1<<CS11|1<<CS10;) tak aby przerwanie spowodowane przepełniniem timera było wywoływane mniejwięcej co 1s 4000000/64/2^16...
brakuje instrukcji sei(); włącza ona globalną obsługę przerwań. Umieść ją zaraz przed pętlą while(true) Dodano po 5 a poprawnie jest TIMSK1 = _BV(TOIE1);
Witam. Mam takie o to zagadnienie, potrzebuje zrobić regulowany generator 0-15hz. Na wyjściu sygnał prostokątny, albo tylko same impulsy mogą być. Wszystko było by fajnie, ale muszę do tego użyć Timera i przerwania. A nie mam w ogóle pomysłu od czego zacząć i jak to zorganizować. Potrzebuję zrealizować coś takiego aby nie zależnie od głównej pętli...
Ale przenieś choć część swoich Sub do przerwania Timer2, lub 1 i zobacz jaka jest różnica w działaniu programu. A różnica jest i to spora, program przyśpiesza znacznie, wczoraj przerobiłem cały program na timer1, skończyły się problemy z komendą wait. Więc jeżeli timer1 jest wolny to będę go bardzo chętnie używał.
witam. dziś także juz nerwa złapałem z tym timer0 i wierzyłem ze na elektrodzie będzie jakieś rozwiązanie, ale z tego co czytam nie tylko ja tak mam;/ .wracając do tematu: 1.próbowałeś zmienić port dla 1-wire? 2.jesli problemem jest już zamiana pinów to być może załączenie timer1 pomoże i na nim odliczanie sekundy,przykładowe uruchomienie: Config Timer1...
w tym momencie wykorzystuje do multipleksowania timer1 czyli B (chyba), a mam wykorzystać pierwszy, czyli timer0 czyli A. W obsłudze tego przerwania nic ma nie być?
Wystarczy jedno wejście I NTx , które będzie wykrywało ten impuls. Ale jeśli to będzie impuls "z ręki" jakiś klawisz to bez sensu - ze względu na drgania styków a potrzebny minimalny czas np 1ms. Jeśli to będzie impuls z jakiegoś wyjścia cyfrowego to ok. Założenia: - wykorzystamy tylko jedno wejście INTx - wykorzystamy tylko jeden Timer sprzętowy Przygotować...
Faktycznie Drzasiek pisząc kod bazował pewnie na poprzednim swoim przykładzie i nie usunął włączania przerwania Timer1. W jego przypadku to nic nie zmieniało - w Twoim i owszem :) Poprawię więc kod Drzaśka.
Nie wiem w jakim celu wyłączasz timer na czas obsługi przycisku. Procedura obsługi przerwania powinna być jak najkrótsza. Niepotrzebnie wywołujesz za każdym razem funkcję setNum(). Warto byłoby ją wyrzucić do pętli głównej i wykonywać tylko w momencie zmiany prędkości. Utwórz sobie tablicę trzech elementów, w których przechowywał będziesz kolejne cyfry....
Można jeszcze inaczej, jeżeli zależy Ci na przerwaniach, to przy deklaracji, na końcu parametr NOSAVE On Timer1 Gen NOSAVE Durny BASCOM wrzuca na stos prawie wszystkie rejestry po wejściu do przerwania (w sumie 29 sztuk w AVR), a przed wyjściem z przerwania zdejmuje rejestry ze stosu. Stąd niesamowite opóźnienie. Oczywiście po zastosowania NOSAVE rejestrami...
Generalnie kod nie wygląda tak źle. Jak na początkującego, to muszę nawet pochwalić! Formatowanie poziome i rozdzielenie różnych części programu białymi znakami na duży plus. Bardzo wiele osób ma z tym problem, mimo tego, że nowoczesne IDE dbają o to praktycznie same. Kilka uwag się znajdzie, ale myślę, że będzie to konstruktywna krytyka. Po pierwsze...
Witam chciałem skonfigurować timer1 w ten sposób że: 1.chodzi on cały czas odliczając 0-255 2.Przerwanie wywoływane jest po pierwsze po każdym przepełnieniu (czyli SIG_OVERFLOW1) 3.Przerwanie wywoływane jest w określonym czasie odliczania zapisanym w ICR1 (czyli TIMER1_CAPT_vect) Mój kod inicjujący przerwanie wygląda tak: TCCR1A = (1<<WGM10);...
Tu masz kod który korzysta z przerwań i co 1 sekundę ustawią zmienną s1_flag na 1. Musisz pamiętać, aby ją w funkcji głównej zerować, bo tak cały czas będzie ona usttawiona na 1. Ten kod jest tylko poglądowy, ma ci tylko przybliżyć co i jak z przerwaniami. [syntax=c]int main(void){ volatile uint8_t s1_flag, /********** KONFIGURACJA TIMERA2 do wygenerowania...
Zaczyna mieć jakiś sens. Wyrzuć ten waitms200 z przerwania. LCD wstaw do głównej pętli. Wyrzuć LCDbus- przecież definiujesz piny do LCD. Time1 as word- przecież timer1 jest 16-bitowy- zmienna nie będzie dłuższa.
Sprawdź na symulatorze w którym momencie się rozjeżdżają wartości badanej zmiennej i timera1 Możliwe, że ta pętla się wykonuje więcej razy, bo warunek stopu przeskakuje. Timer jest zwiększany asynchronicznie w stosunku do programu i program może przeoczyć moment gdy Timer=konkretna wartość, bo sprawdza Timer1 w przypadkowych momentach a nie po każdej...
Jeżeli w swoim kodzie , wykorzystujesz tylko procedury przerwania INT0 i TIMER1 i RC5_init() ,to wystarczy obliczyć i zmienić , wartości ładowane do TCNT1H,TCNT1L. Piotrek
Do przeładowania Timer'a1 używaj: Int_timer1: Load Timer1 , 62500 [...] Return Mam jeszcze jedną regułę z przeszłości aby nie używać obsługi pamięci EEPROM w obsłudze przerwań (starsze wersje BASCOM'a przy rozbudowanych programach powodowały błędne działanie programu). Stosuję to do dziś dnia i nie mam zamiaru sprawdzać to w nowszych wersjach...
Włącz timer1 i w jego przerwaniu wstaw getadc np co sekundę. To ma być woltomierz? Rozumię , że masz tylko jedną cyfrę na wyświetlaczu?
Ok rozumiem. Spróbuj tego. Użyte przerwanie. Można też zrobić bez zależnie od potrzeb. $regfile = "m8def.dat" $crystal = 8000000 Dim Zmienna As Word Dim A As Bit Config Pinb.1 = Output Config Pind.2 = Input Set Portd.2 '============ definicje timera ================================ Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect...
Nie ma się co poddawać. Prędzej czy później i tak będziesz musiał używać przerwań i liczników bo bez tego większość programów robi się zagmatwana o ile nie niemożliwa do napisania. W necie jest dużo przykładów, Bascom jest o tyle prosty, że nie grzebiesz po rejestrach. Timer już masz, dodatkowa linia konfiguracji i kawałek kodu da Ci obsługę przerwania...
Cóż to za "kwiatki" w pętli głównej z zerowaniem TIMER2 oraz cyklicznym wyłączaniem źródła taktowania TIMER1? Jak myślisz, kompilator poważnie potraktował tą pustą pętlę? for(unsigned int i=0;i<60001;i++);
Witam, potrzebuję wygenerować przerwanie analogicznie do stworzonego w atmega8. W Atmega8 użyłem Timer1 tryb CTC, teraz chcę osiągnąć podobny efekt na pic16f1716. Może ktoś pomóc? [syntax=c] void Init_Timer1A(void) { TCCR1A = 0x00; TCCR1B =(1<<CS11) | (1<<CS10) | (1 << WGM12); //tryb CTC (WGM12), Prescaler = 64 (CS11,cs10) clk = 8Mhz...
Niestety schemat mi nie pomógł. Ależ pomógł, bo nie znalazłeś w nim żadnych zależności dot. kasowania timera przy jego wyłączaniu poprzez ustawienie preskalera zero. Jest to logiczne, ponieważ gdyby licznik timera był automatycznie kasowany, to zmniejszałoby jego możliwości, bo nie można byłoby go "puścić dalej" Schemat preskalera pokazuje natomiast,...
[syntax=c] void Timer1_init() { OCR1A=65534; TCCR1B =(1 << CS11)|(1<<WGM12); TIMSK = (1 << TOIE1)|(1<<OCIE1A) ; sei(); } ISR(TIMER1_COMPA_vect) { czas(); } [/syntax] Rozwiązałem problem. Trzeba było ustawić bit OCIE1A. Jak policzyć odmierzany czas? X=11059200 Hz
A po co włączasz przerwania skoro nie napisałeś procedur ich obsługi? I dlaczego najpierw ładujesz część młodszą do OCR a potem starszą, a nie na odwrót jak to zalecają? I dlaczego dziwisz się, że kod potem nie działa?
W twoim programie wg BASCOM-AVR są błędy: Error : 254 Line : 17 Variable expected Przepraszam za pomyłkę. W BASCOM-AVR, do przerwań od timera, powinniśmy użyć 'TIMER1_OVF' zamiast 'TIMER1 OVERFLOW'. Podobna sytuacja jest z przerwaniem od INT0, powinniśmy użyć 'INT0_ISR'. Najpierw musimy skonfigurować Timer1 i INT0, następnie włączyć przerwania. Kiedy...
Nie lepiej wykorzystać przerwanie ICP1 timer1. Tam przepisywać zapamiętaną wartość timer1 (timer1 w konfiguracji timera zmienna = capture1), i przeliczać na prędkość, znamy przecież drogę (odległość między magnesami) a potrzebujemy tylko czas pomiędzy kolejnymi przerwaniami wywołanymi tymi magnesami. Po co zliczać ilość impulsów (drogi) w danym czasie...
Udało mi się uruchomić tryb asynchroniczny, a zrobiłem to tak: #include <avr/io.h> #include <avr/interrupt.h> int main (void) { ASSR |= (1 << AS2); // tryb asynchroniczny TCCR2 |= (1 << CS22) | (1 << CS20); // preskalery TIMSK |= (1 << TOIE2); // odblokowanie przerwań z...
Zrób "po bożemu": - ustaw tryb CTC - ustaw OCR1A na 31250 (dla zegara 8MHz) - zmień wektor przerwania na TIMER1_COMPA_vect - wyrzuć z przerwania ustawianie TCNT1 i zostaw tylko PORTD ^= (1 << PD2); Tak ustawiony licznik + PORTD ^= (1 << PD2) będą zmieniać stan diody na przeciwny z częstotliwością 1Hz. A zegar mam nadzieję ustawiasz w opcjach...
Witam W projekcie wysyłanych będzie około 800bytów danych do PC i w PC bedzie na bieżąco wyświetlane. Do czego zmierzam. W czasie kiedy bedę obsługiwać przerwanie od Timer1 może pojawić się sygnał do PC, że dokonywana bedzie tramsm,isja. W atmega8 nie mozna ustawiać priorytetów przerwań w odróżnieniu do 8051. Kiedy pojawiało mi się przerwanie do timer1...
A gdzie "wsiąkła" procedura obsługi przerwania TIMER1_COMPA_vect :?: Piotrek
Zobacz do czego Drzasiek użył zmiennej cnt - odlicza ona 4 przerwania, Ty możesz odliczać ile zechcesz. Preskaler także możesz zmieniać - Ty decydujesz. Oczywiście możesz także użyć 16-bitowego timera np. Timer1, o którym piszesz.
Witam, Witam, poprawiłem Ci ten kod - działa ok. Przeczytaj komentarze. o dziwo dioda nie miga coś musisz chyba źle robić, u mnie miga. Co prawda sprawdzałem na AT328P, bo taki akurat miałem pod ręką, ale jeśli chodzi o Timer1 to praktycznie identyczne uC. Pozdrawiam, QuadMan.
Witam, zagadnienie, w którego sprawie chciałbym się poradzić wygląda następująco. Muszę sterować serwomechanizmem modelarskim przy jak najmniejszym udziale głównego wątku programu. Pytanie z tym związane, czy da się to zrobić używając 16-bitowego timera1, rejestrowi OCR1A przypisać wartość odpowiadającą 20ms oraz ustawić zdarzenie aby wyjście OC1A był...
Witam Próbuję zrealizować multipleksowanie wyświetlaczy 7-seg.(dwóch) na atmega8, piszę w C, korzystam z WinAVR, mam wyświetlacze ze wspólną anodą, wykorzystałem tranzystory PNP. Z częstotliwością zegara nic nie kombinowałem więc mega pracuje na 1MHz. Napisałem taki kod: #include <avr/io.h> #include <avr/interrupt.h> /* cyfry na wyświetlaczu...
c1 to przerwanie na nodze procesora atmega8 pod tytułem "ICP" Portb.0 wystarczy że zamiast pod int0 podepniesz się tutaj.
Jeśli pomiędzy przerwaniem od timera a wpisaniem do niego nowej wartości upływa zbyt "długi" czas to może się okazać, że timer zgłosił przerwanie w międzyczasie, które zostanie uwzględnione jeśli zapiszemy Timer1 = Timer1+wartość, a utracone jeśli zastosujemy Timer1 = wartość.
Symulator ten działa dla większości osób więc i u mnie teoretycznie powinno być dobrze. A na mikrokontrolerze i wyświetlaczu będę mógł zrobić dopiero jak opanuję eagle. [syntax=cpp]#define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> int znak[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8...
Hmmm. Policzmy. fpwm = fclk/prescaler/pojemność licznika/2. Przy fclk=16MHz daje to fpwm=16MHz/1/256/2=31,250kHz. Wypełnienie zmienne 0%-100%, oczywiście tryb Phase Correct. fbase = fclk/prescaler/(ocr+1). Przy OCR1A=1 (najszybsze przerwania) próbki mogą być podsyłane do PWM z częstotliwością 16MHz/8/2=1MHz. Czyli do 1 nie warto dojść bo fbase>fpwm,...
Mam problem z przerwaniami, a raczej z pewną różnicą w budowie Atmega8 i Atmega32, a mianowicie mam program, który działa prawidłowo na Atmega8 poniżej fragment http://obrazki.elektroda.pl/7547240700_1... Jakaś sugestia/pomoc?
Teraz mam taki kod dotyczący ustawień TIMER1 ISR(TIMER1_COMPA_vect) { flag_timer_1 = 1; } // interrupt TCCR1A |= (1 << CS10); //ustaw timer1 z preskalerem 1 TCCR1A |= (1 << WGM12); //ustaw timer1 w tryb CTC OCR1A = 10000; TIMSK |= (1 << OCIE1A); //zezwolenie na przerwania dla CTC SREG |= _BV(7);...
Dodatkowy wpływ na błąd ma niedokładność częstotliwości generatora kwarcowego. Błąd w sekundach na dobę, wyraża się wzorem: \Delta=86400*(1-\frac{fwzr}{f}) \Delta - błąd w sekundach na dobę (wartość ujemna oznacza spóźnianie się) fwzr - częstotliwość wzorcowa (czyli to co ma być np. 4000000 Hz) f - częstotliwość rzeczywista kwarcu lub generatora kwarcowego...
ustaw sobie przerwanie od np. TIMER2 co 10ms i sprawdzaj 4 ostatnie stany przycisku. teoria: http://mikrokontrolery.blogspot.com/2011... powyższe zaadoptowane do A8: [syntax=c] //**************definicja przycisku************** #define _Key _BV(PD7) #define Key_PIN PIND #define Key_DDR DDRD #define Key_PORTPORTD...
timer1 przerwania atmega8 timer1 atmega8 przerwania
netia net24 hasło ogrzewać scania nadawać 433mhz
Silvercrest SSRA-1 błąd 42 – czujniki antykolizyjne, kod E42, naprawa, czyszczenie Krups EA8260 – brak menu kalibracji młynka, regulacja i tryb serwisowy