Co to może być? Wróżka jest na urlopie. Pokaż kod źródłowy.
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
Na jakiej podstawie twierdzisz, że problemem są priorytety przerwań? Przerwania występują na tyle sporadycznie, że nie ma tutaj miejsca na problemy. Jeśli wysyłany jest znak '2', to porównanie (i==2) jest błędne TCCR2 = 1<<CS00 | 1<<CS02 | 0<<CS01 ; proponuję zapisać tak: TCCR2 = (1<<CS00) | (1<<CS02) |...
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...
To raczej zły pomysł. Wyjście prawdopodobnie ustawi się w ciągły stan 1. Trzeba wyłączać przerwanie od Timera i tyle.
Na Timerze. W przerwaniu od INTx ustawiasz wartość początkową Timera i uruchamiasz go. A w przerwaniu od Timera ustawiasz/kasujesz pin wyjściowy.
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);...
Z tego co wiem "PIN Change Interrupt" ma np. Atmega168 i Atmega 328. Atmega 32 - jakoś nie widzę takiej możliwości. Proszę o poprawienie mnie, jeśli się mylę. Oczywiście zawsze można skorzystać z tych specjalnych pinów - INT0, 1 czy 2 lub zasymulować taką kontrolę stanu pinu w zwykłym przerwaniu - np. timera.
ADC uruchom w trybie Free Run, bez zgłaszania przerwania po zakończonej konwersji. Przetwornik uruchom w miarę szybko, najlepiej blisko wielokrotności częstotliwości zgłaszania przerwania przez Timer. I wtedy w Przerwaniu od Timera przepisujesz wartość z rejestru ADC do jakiejś zmiennej/bufora.
Nie mogę zliczać impulsów timerami gdyż są one już zajęte do innych celów. A przerwań innych niż INT0, INT1 używasz?
I teraz pierwsze pytanie: czy da się zliczać impulsy z zewnątrz używając Timer2? Wtedy bym podpiął do nóżki TOSC. The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an external clock to the TOSC1 pin may result in incorrect Timer/Counter2 operation. Jak źle (lub dobrze) jest z tym w praktyce nie wiem. Tylko jeszcze zostaje...
Nie mam noty przed sobą, ale o ile mnie pamięc nie myli to timery 0 i 2 mają możliwość zrobienia przerwania typu Compare w trybie CTC. Sprawdź to.
Czy i który timer wykorzystuje 1wire. Chce wyorzystać jeden timer do cyklicznych przerwań, ale jak wykorzystam timer 0 lub timer 1 wysiada transmisja 1wire. Timer2 wykorzystuje zegar czasu rzeczywistego wewnetrzny. ATmega32. Pozdrawiam ! PL
Treść Twojego programu nie odpowiada założonej funkcjonalności. Podobno chcesz, żeby silnik śledził położenie potencjometru, a tymczasem robisz coś zupełnie innego - wykonujesz pewną liczbę kroków w zależności od różnicy dwóch kolejnych pomiarów ADC. Zacznij od przerwania timera, zgłaszanego z okresem kroku. W nim odczytaj ADC i przefiltruj (obecnie...
Zwłaszcza jak NWW wyjdzie dosyć wysoki np 1000. Jesteś optymistą. Przy podanych parametrach (50 i 0,1s) Maksymalne NWW (najmniejsza wspólna wielokrotność a nie dzielnik) to NWW=47*43*41*37= ponad 3000000. Zastanowiłbym się także nad użyciem przerwania od timera zamiast pętli z delayem. Nie ma się nad czym zastanawiać. Użycie timera to konieczność....
Mnie wychodzi, że to nie jest tryb CTC tylko normalny. Po drugie na przerwanie compare trzeba zezwolić w rejestrze TIMSK - bit OCIE0 - masz < zamiast << stąd problem. Jak masz jakieś wątpliwości co do konfiguracji, to użyj symulatora AVR Studio. Można sobie w nim też ustawić tryb pracy i odczytać wartości rejestrów kontrolnych dla niego i potem...
Co może być przyczyną zacinania się programu? W przerwaniu robisz wyświetlanie na lcd - jezeli to np wyświetlacz I2C i komunikacja zdechnie to koniec pieśni. Dałeś o wiele za mało kodu.
[syntax=asm] .device ATmega32 .include "m32def.inc" .def temp= r16 .def counter= r17 .org 0 RJMP start .org $016 ;wektor przerwania dla przepełnienia timera RJMP przerwanie start: ldi temp, high(RAMEND) out SPH, temp ldi temp, (1<<CS00) | (1<<CS02) ;konfiguracja preskalera i zegara out TCCR0, temp ;w rejestrze TCCR0 (ustawienia główne timera)...
nie - bariera jest rozstawiona teraz na powiedzmy około 6 cm od siebie. Wydaje mi się, że jest to problem z timerem, ale wg mojej oceny prawidłowo go zadeklarowałem. Dodam, iż kwarc mam 11.0592MHz. Preskaler 256. Przerwanie timera co 1 sekundę.
Przerwanie od t1 nieblokowane lub w jego wnętrzu sprawdzasz flagę SPI i obsługujesz przerwanie programowo od SPI odbierając bajt
Pokazaną tam funkcję (ReadEncoder) po prostu zamień na ISR z przerwań enkodera, albo zrealizuj obie funkcje oddzielnie - tzw. wykorzystaj przerwania do wybudzania, a odczyt enkodera zrób niezależnie od przerwań pinu, np. w przerwaniu timera
Tyle rad i nadal żadnego pomysłu nie masz?;p Nie ważne w którym miejscu będziesz włączał timer, możesz to zrobić chociażby na początku funkcji main. Ważne jest żeby PRZERWANIE od tego twojego timera zgłaszało się tak często jak jak chcesz odświeżać wynik na wyświetlaczu (czyli te twoje 10 sekund) i w tym przerwaniu musisz wykonać odejmowanie na zmiennych...
Timery lub lepiej alarm w pcf8583/8563 i przerwanie zewnętrzne
.Czy moglibyście popatrzeć na mój kod i spróbować wychwycić jakieś błędy? Włączyłeś niewłaściwe przerwanie. zamiast OCIE1A, masz TOIE1.
Możesz użyć jednego timera. Procedura obsługi przerwania nie może przeszkadzać w obsłudze innych przerwań. W Twoim przypadku nie ma innych przerwań, więc jedyny warunek to ten, żeby procedura obsługi wykonała się w czasie mniejszym niż odstęp pomiędzy przerwaniami. To jest w sam raz dobry materiał na projekt z pustą pętlą główną, i tak to należy zrobić.
Nie mogę niczego wywalić. w USART musi być co jest a timer musi zbierać bity z wejścia dosyć dokładnie
Ż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...
Na szybko: W kodzie przerwań masz _delay_ms(). Zmień kod tak aby w przerwaniach tylko przechwytywać zaistnienie zdarzenia i całą obsługę zrób w głównej pętli. Jeśli masz tak równe odcinki czasu (50ms i 500ms), to zamiast głównej pętli możesz też zrobić przerwanie timera. Ogólnie: Przerwania to nie procesy :) Update: Jeśli chodzi o Twoje pytanie: jak...
Obsługiwał będę w programie docelowym: -UART -Timery Programowe + PWM (Na jednym timerze"2") -3xserva -Czujnik HC-SR04 na timerze ICP Do reszty nie są potrzebne przerwania i timery.
Moim zdaniem masz żłe napisaną obsługe przerwania. Procesor jak wejdzie w przerwanie to w niej wisim i wisi. Mogą być problemy ze stosem. Ja bym to napisał tak ze timerem bym wykonywał akcje a w przerwaniu ustawiał flage wciśniętych klawiszy. Otrzymujesz przerwanie i zapisujesz do zmiennej stan klawiatury. W przerwaniu z Timera sprawdzasz jaki stan...
Nie możesz wykorzystać timera do zliczania impulsów?
Wg mnie zegar Uarta sie powoli rozjeżdża. Sprawdź dokładnie czasy jakie ustawione są dla timerów. Nie zauważyłem także, aby na czas generacji i odbioru znaków blokowane były przerwania, to także może być przyczyną błędów, gdyz przerwanie od timera może byc nie obsłużone.
Szczerze mówiąc impulsator w dalszym ciągu nie działa jak powinien :/ Nie mogę sobie z nim poradzić :/ Co do przerwania to nie mogę obsługiwać impulsatora w przerwaniu.
margas4542 zaopatrz się w program TimerCycles ze tej strony: http://www.wkretak.pl/downloads.php?cat_... Dzięki temu obliczysz liczbę cykli czyli to co zapisuję się do rejestru OCR1A. Jeśli chodzi o timery to po pierwsze preskaler(czyli część obwodu timera który dzieli impuls zegarowy tj. zmienia rozdzielczość timera) jest ustawiony na 1 mówi o tym...
Przy 8MHz i tych ustawieniach Timera 2 częstotliwość PWM powinna być 156Hz jeżeli nic nie przeoczyłem. Czasy opóźnień są trochę naciągane (znaczy, krótkie), ale nie powinno to migać chaotycznie. Chyba, że przerwania się nie wyrabiają. Jaki masz poziom optymalizacji w kompilatorze?
mogą być 2 bity startu, bo standard RC5 właśnie tak jest "skonstruowany", że posiada 2 bity startu. Natomiast jego rozszerzenie czyli RC6 wykorzytuje drugi bit startu jako normalny bit danych. Ok - teraz odpowiedź dla autora, wydaje mi się, że uda się to wyjaśnić bo sam kiedyś miałem podobny problem ze zrozumieniem tego etapu dekodowania. Cały problem...
No umieszczając kod zapodający próbki z przerwaniu od Timera który generuje PWMa.
nie, pętla dojdzie do końca (do słowa Loop Until ...) i potem dopiero zacznie się wykonywać druga polecam jednak zostawić parę zadań timerom
W kodzie jest sporo błędów. Nie do końca jestem pewien, czy rozumiem, o co chodzi, ale jeśli przerwanie INT0 jest od przycisku, to nie ma prawa działać poprawnie, a przyczyna efektu, który obserwujesz, leży w operacjach na zmiennej b. Takie przerwanie po wystąpieniu musiałoby być blokowane przy pomocy timera na jakieś 30 ms, co jest znacznie bardziej...
Ale to już niekoniecznie. Skoro pomiar ADC będzie najczęściej co 1 ms, to spokojnie w przerwaniu timera można odczytywać ADC i rozpoczynać kolejną konwersję, której wynik odczyta się w następnym przerwaniu timera i tak w kółko.
Dodaj to: [syntax=basic4gl]'---PRZERWANIE OD TIMERA 2---------------------------------------... Ms: Enable Interrupts '<-To ... ... ... Disable Interrupts '<-To Return[/syntax]
Witam. Tani uC Atmela: ATmega8 - koszt ok. 6zł Są też układy serii ATtiny za ok. 5zł, ale lepiej już zainwestować w mega8. Posiada więcej pamięci i układów typu timery, przerwania, przetwornik, itd. Można też kupić za ok. 10zł ATmega32 - ten procek już w zupełności wystarczy do większości amatorskich projektów. Tym bardziej dla początkujących. Schemat...
Użyj przerwań timera, PWM możesz zrealizować sprzętowo (też na timerze).
Uruchamianie timera przed zaprogramowaniem okresu nie jest najlepszym zwyczajem. Wartość wpisywana do OCR to okres - 1. Napisz po prostu: OCR1A = FCLK / 256 - 1; (O ile częstotliwość zegara jest zdefiniowana pod nazwą FCLK - nie pamiętam, bo skończyłem z AVR jakieś 4 lata temu.)
Eno bez jaj...wskaźniki?... Co tu jest skomplikowanego? Przecież tu wystarczy aktywować cykliczne przerwanie, którego okres zależy od częstotliwości i rozdzielczości potrzebnego PWM. Programowy PWM to raptem 2-3 linie. Do tego timer programowy do odliczania migania i to wszystko. W pętli głównej pozostaje tylko zarządzanie tym timerem i w zależności...
Tutaj druga instrukcja anuluje pierwszą. Zrób to w jednej instrukcji lub w drugiej użyj operatora |= Poza tym nie ma bitow CS02 i CS00 w rejestrze TCCR1B. Wprawdzie są w rejestrze TCCR0 i mają takie same pozycje, więc kod ma szansę działać, ale jakoś źle się na to patrzy :) To jest zezwolenie na przerwanie od timer overflow. Zezwolenie na przerwanie...
masz totalnie pochrzanioną obsługę przerwania pomijam już ze jest zbyt obszerny ale wpisanie tam transmisji rs232 to już piramidalna pomyłka i to powoduje że nigdy tobie to nie zadziała. Poza tym kompletnie nie widzę powodu aby wyprowadzać sygnał na przerwanie INT0 moze tylko po to aby łatwiej mozna było sprawdzać przytrzymanie klawisza ale innego powodu...
Na nie możesz policzyć? Chyba że nie wiesz jak :D Masz 8MHz. A przerwanie przychodzi z częstotliwością 125Hz (dlatego trzeba 125 razy odliczyć aby wyszła 1 sekunda). Preskaler Timera 256. 8000000/256/125 = 250. I dlatego jest Load Timer0 = 250 Teraz chcesz kwarca 7372800. Więc musisz tak kombinować aby uzyskać jakąś sensowną liczbę przerwań i sensowny...
Może ja wyjaśnię jaśniej. Generujesz przerwanie od timera np. co 800ms, czy 1s. I w przerwaniu wykonujesz operacje: 1. Odczyt temperatury do zmiennej 2. Komenda Convert_T Odpowiadając na Twoje pytanie - 750ms to MINIMALNY czas między CONVERT_T a odczytem (dla 12-bit). Więc odczyt po 1, 2, 3600 sekundach po CONVERT_T nie jest błędem. Dzięki takiej metodzie...
chyba najprościej zastosować przerwanie timer-a , wtedy procek będzie miał czas na wykonywanie innych operacji
Bo bez przerwań nie da się tego sensownie zrealizować. Musi być timer, generujący przerwania, w których sekwencyjnie są sterowane kolejne cyfry.
Podczas odbioru danych z pinu PD2 ( funkcja zgłoszenie ) występuje błąd tylko wtedy gdy przerwanie z timera 0 jest aktywne. Gdy na czas odbioru danych zablokuję to przerwanie procesor ładnie odbiera wysyłane do niego dane. I moje pytanie brzmi: Co jest nie tak z przerwaniem? Konkretnie to, co wskazał albertb: ... jeśli masz włączone przerwanie to jego...
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...
Przecież to tak musi być. 750ms- to 3/4 sekundy. A jest to konieczne do odczytu DS. A jeszcze obsługa LCD. Odczytuj czas co 5s. Dodano po 3 Albo jak napisał HOmiczek- przerwanie od timera- jak masz jakiś wolny.
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ć...
Nie tędy droga, Ty musisz zrobić coś dokładnie odwrotnego - nie wygenerować sygnał, ale go zmierzyć. Rozwiązania są 2, ale jeśli programujesz w bascomie i nie masz ochoty na operacje na rejestrach w procesora to kurczą się do jednego. Mianowicie: 0. ustawiasz timer na zliczanie impulsów i zmianę wartości jakiejś zmiennej - parametry dobierz w zależności...
A po co ta "pętla główna"? Nie wystarczą same przerwania? Np. jedno od timera sterujące pomiarami, drugie od UARTa.
Niestety klawiatura matrycowa wymaga nieco zachodu z jej obsługą, za to wymaga mniejszej ilości pinów - coś za coś :) Nie wiem jakie dodatkowe funkcje będzie miał program, ale z reguły skanowanie klawiatury robi się w oparciu o jakiś timer, bo dodatkowo należy eliminować drgania styków. Strona ... korzystaj do woli, a w razie problemów pisz na forum...
W slave CPHA nie ustwiam. a po co CS1 skoro mogę operować na wejściach PB3 i PB4?? Układ dwóch Atmeg też nie nie działa zbytnio prawidłowo... czy macie przykład sterowania dwoma AVR?? w slave mam jeszcze obsługę przerwania od komparatora i timera
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....
1. Można to różnie rozwiązać. Najprościej, to wykorzystać któryś z pinów INT. Algorytm: - ustaw przerwanie z pinu INT0 na zbocze np. narastające, - gdy pojawi się zbocze narastające to wywoła funkcję obsługi przerwania, - w funkcji przerwania uruchamiasz timer i zmieniasz ustawienia INT0 na zbocze opadające, - gdy wystąpi zbocze opadające - zatrzymujesz...
popelniasz bardzo wiele bledow. zastosowanie SIGNAL zamiast ISR jest pierwszym, zastosowanie dwoch petli opozniajacych w srodku funkcji obslugi przerwania to drugi - 100x powazniejszy. przeladowywanie Timera1 recznie? to zart? przeciez ten timer ma CTC... - blad trzeci. 4\/3!!
(at)stozek - normalnie w Bascom nie jest potrzebna komenda Start Timer0 bo jest on uruchamiany od razu podczas konfiguracji. Używa się tej komendy tylko jeśli poprzednio zatrzymałeś Timer poprzez Stop Timer0. Rozumiem, że zatrzymujesz timer. Tak więc zatrzymywanie timera to zabranie mu źródła taktowania. Bascomowe komendy moża wiec rozumieć tak: Start...
A dlaczego nie w przerwaniu od INT0 lub 1 zmianą stanu. Po co timer do tego? Dobry przykład jest w książce AVR.. Baranowskiego. Jakby co to go mam.
Poszukaj haseł: "wyświetlacz multipleksowany" i "przerwanie timera". Kod, kt'óry napisałeś, daje zmienną jasność obu cyfr i "duchy", czyli cienie cyfr na niewłaściwych pozycjach.
kamyczek: tego nie wiemy, bo nie widzimy kodu. Na zdrowy rozsądek timer powinien działać ciągle, również w czasie obsługi przerwania.
Oj, przejrzałem pobieżnie kod - uwierz mi - skasuj go. W C jest coś takiego jak funkcje - wykorzystaj to, kod, który masz jest kompletnie nieczytelny. Każdy normalny promotor by to coś uwalił chociażby za to. Co do szybkości działania - pokaż kod funkcji odpowiedzialnych za komunikację z czujnikami. Z kodu, który masz: - funkcjie piszące do LCD są zapewne...
No tak masz rację. Ale powiem Ci, że wartości 99900 Hz w ten sposób w ogóle nie da się tutaj osiągnąć przy zegarze 16 MHz i z użyciem jednego timera ;)
Witam. Podepnę się pod temat. Kolega "sulfur" mógłby podać link do tematu? Chciałbym zliczyć ilość obrotów na minutę ( max 250 ). Są 2 wyjścia. - Jedno, to zliczanie impulsów przez zewnętrzne przerwanie oraz obróbka w programie na rpm. - Drugie to zliczanie czasu między impulsami przez timer oraz obróbka w programie. Impulsy będą generowane przez zwieranie...
A nie możesz wykorzystać przerwania od zbocza np INT0? Jak pojawi się dodatnie zbocze to robisz krótki sygnał i program pracuje dalej. Dopiero jak ktoś puści przycisk i znów naciśnie pojawi się znów zbocze narastające które może wywołać przerwanie. Ideałem byłoby abyś po pojawieniu się przerwania od narastającego zbocza, włączał Buzzer potem uruchamiał...
Niektóre z funkcji faktycznie zawierają pętlę oczekującą na zwolnienie magistrali: [syntax=c] while ( TWI_Transceiver_Busy() );[/syntax] Autorzy założyli, że można będzie użyć tej funkcji w dowolnym momencie, niestety powoduje to, że kiedy wywołamy funkcję, kiedy magistrala jest zajęta, to będzie ona czekała na zwolnienie magistrali, co wprowadza czasami...
Potwierdzam, że CTC niepotrzebne - timer jest 8 bitowy. 32768/128=256 czyli 8 bitów timera - i wszystko gra :) Nie zapomnij o kondensatorach przy kwarcu.
Te procesory się aż tak nie różnią. Dodatkowe funkcjonalności pinów nie przeszkadzają w niczym dopóki ich nie uruchomisz. (PCINT - Pin Change Interrupt trzeba wiedzieć jak włączyć). Jest duża różnica jeśli chodzi o Timery właśnie. Mega8 ma na przykład tylko jeden rejestr Compare dla Timer2 dlatego inaczej się nazywają. Opisałem to u siebie na stronie...
Zawsze jest jeszcze komparator do wykorzystania w celu zliczania impulsów (przerwanie). Innymi słowy, zawsze należy kombinować tym co się ma - ja gdybam, bo nie znamy całego projektu.
Temat do zamknięcia - muszę jeszcze wykombinować jak zrobić jedną rzecz bez timera - przerwania zewnętrzne - wykorszystane, a do pętli też nie mogę :P
1) Umieść program w znacznikach CODE 2) Podziel program na części, a w głównej pętli programu odpalaj kolejno podprogramy. 3) Stosuj wcięcia gdyż teraz nie sposób analizować tego programu, gdzie zaczyna się pętla a gdzie warunek, gdzie jest początek a gdzie koniec pętli. 4) Pomyśl nad innym sposobem obsługi klawiszy - wywal _delay_ms(500). W tym momencie...
No to użyj obsługę przerwania od niego (Timer/Counter1 Compare Match A) i ustawiaj wyjście programowo. Light'I
Witam, Aaaaaa ten chwyt już przerabiałem, ale chyba nie do końca w ten sposób jak kolega opisał. Mianowicie robiłem odczyt DS'a w przerwaniu, ale z oczekiwaniem 750ms na konwersję temperatury, w tym momencie wychodziła już totalna kaszana. Muszę zatem spróbować zrobić samą procedurę obsługi 1Wire w przerwaniu. Spróbuję w przerwaniu obsługi wyświetlaczy...
nikt nie każe Ci tego robić na przerwaniach szczególnie jeżeli timer ma tylko generować częstotliwość i możesz wykorzystaćdedykowanąnóżkę to bez sensu jest robić to na przerwaniu. W każdym razie sprawdź osobno czy działają.
Co to ma być? // Przerwanie od klawiatury SIGNAL(SIG_INTERRUPT0){ m++; _delay_ms(100); while(!(PIND & 0x04)) {} _delay_ms(100); } Pomijając już opóźnienia w obsłudze przerwania i użycie przestarzałej funkcji obsługi przerwania (SIGNAL),ta linijka while(!(PIND & 0x04)) {} powoduje zawieszenie się programu w obsłudze przerwania,...
Twoje procedury obsługi przerwań są stosunkowo długie. Np. ISR(TIMER1_COMPA_vect) trwa ok. 670 taktów zegara. Z kolei odstęp między kolejnymi przerwaniami przy zmiennej okres1=127, jak sam napisałeś, wynosi 8*128=1024 taktów. Jeżeli zmienną okres1 zmniejszysz np. do 80 taktów, to przerwania będą częściej niż trwa ich obsługa, więc niektóre zostaną po...
[syntax=c] #define Button (1<<PB0) #define Button_PORT PORTB #define Button_PIN PINB #define Button_DDR DDRB volatile _Bool Key_Pressed = 0; // flaga wciśniętego przycisku [/syntax] [syntax=c] Button_DDR &= ~(Button); //port - wejście Button_PORT |= (Button); //włącz pull up [/syntax] [syntax=c] ISR(TIMER0_OVF_vect)//przerwanie wywoływane...
To moze ja to źle rozumiem: program sobie leci leci, a gdy licznik timera się przepełni następuje przerwanie, program wyskakuje do " ISR (TIMER1_OVF_vect){} " robi tam co ma robić i wraca z powrotem do w tym przypadku pętli.
Wogóle nie grzebałem jeszcze w asm. Chociać- trzeba będzie. Ale tak- masz wektory przerwań. Z danego wektora trzeba zrobić skok do etykiety (chyba tak to się nazywa) która to przerwanie obsłuży. Tam umieszczasz te rol czy ror. Jest to wywoływane co x ms- zależnie od tego co masz w ustawieniu Timera.
Witam. Potrzebuję napisać funkcję która zainicjalizuje Timer w Atmega32 (asynchroniczny) tak, by działał z zewnętrznym kwarcem 32,768kHz podłączonym pod TOSC1/TOSC2. Timer ma zgłaszać przerwanie co 1 sekunde. W przerwaniu powinien zmieniać stan diody na pinie PD0 na przeciwny. Proszę o pomoc w napisaniu kodu . Przepisz dokładnie to samo co napisałeś...
A moje pytanie, czy przy takim algorytmie, pomimo tego że nie wykorzystuje przerwań a na pinie mam częstotliwość którą chciałem procesor będzie miał jeszcze "czas" na po prostu realizację programu ? Czy tak skonfigurowany timer wykorzystuje procesor ? Widzę że timery to twoja słaba strona, więc napiszę ci troche ... Wszystkie timery w AVR mają możliwośc...
Moim zdaniem jest to kepski pomysł. Ew. drgania styków wywołują serię przerwań, dzięki czemu procesor niepotrzebnie jest zajęty. IMHO lepiej to robić na zasadzie poolingu z przerwania timera. Wtedy cały program działa w sposób bardziej deterministyczny.
Nikt nie wie? To ja powiem że kod jest poprawny, a uC ma uszkodzony port. Gdy nie ma obciążenia na LED_PORT.7 timer wariuje, przypisałem inny port i działa elegancko. Pozdrawiam
No widzisz. teraz wiemy już co chcesz zrobić. Od pomiarów są przede wszystkim timery, a nie program. :) Możesz więc zastosować timer podobnie jak to ma miejsce w przykładowym obrotomierzu: http://mikrokontrolery.blogspot.com/2011...
Z demultiplekserem używałbyś prosto trybu fast-PWM do określenia długości impulsu (wyjście OCR podłączone do wejścia multipleksera), ze stałą długością timera (2ms?), przełączając wyjście na przerwanie compare match. Przez pewien czas na wszystkich wyjściach byłoby zero.
No cóż, powinieneś odpalić drugi timer w CTC i przerwanie, w którym wyrzucana była flaga, że trzeba coś wyświetlić. Po prostu LCD ma swoje ograniczenia, i nie można zbyt szybko wciskać mu dane.
Tak, wiem, ale T0 zlicza impulsy drogi, a T1 odmierza czas :) Jest jeszcze T2. Nie wiem jak używasz T1, ale jeżeli tylko do generowania przerwania co 0,5sek to rozrzutność :) Zawsze można zwiększyć częstotliwość przerwań np. 100, czy 1000 krotnie i wykorzystać timer także do innych celów, odmierzając w jego przerwaniu różne odcinki czasowe do różnych...
Mirekk36 a jaką dać częstotliwość taktowania bo dla twojej funkcji mi dioda miga co około 72s Najpierw sprawdź czy jak dasz _delay_ms(1000) to czy miga ci co sekundę - jeśli nie to napisz/powiedz/sprawdź czy masz dobrze przede wszystkim Fusebity ustawione ? Na pewno sama funkcja i while nie robi takiego narzutu żeby zamiast 60s było 72s ;) - jak już...
Przyznam, że najlepiej byłoby uruchomić sprzętowy debuger, którego Bascom nie ma :-( Sprawdź czy timer 1 zachowuje się tak samo. Bascom to taki człowiek zagadka ,z którejś części Batmana.
Myślę że twój program zajmie mniej niz 0.5% zasobów tego procesora. Oczywiście da się to zrobić na 1 Timerze. Wystarczy ,że w przerwaniu od Timera umieścisz 3 zmienne, które będą incrementowane po kązdym przepełnieniu licznika, a w programie głównym korzystając z nich mierzysz 3 niezależne czasy.
PWM potrzebuje licznika, aby odmierzać czas w którym ustawia pin w stan wysoki i niski. Używasz również timera do regularnego pomiaru czasu echa. To nie może być ten sam timer, co do odmierzania czasu w PWM. Atmega32 ma 3 timery (dwa 8-bitowe i jeden 16-bitowy). Spójrz do datasheet-u mikrokontrolera. Pamiętaj również o tym, aby wszystkie zmienne, których...
Bardzo poważny opis problemów... "Przestało działać" taki... rzeczowy Jak pisze nasz muzyk forumowy(:P) nic samo z siebie nie zmienia i nie generuje. Do wyświetlania multiplexowanego użyj timera. Np. OVF na pewno nie zmienia stanów;P
Spojrzałem w ten kod i niestety jest tam o wiele więcej problemów. Typowy kod początkującego, ale OK - każdy kiedyś zaczynał i pisał takie potworki ;-) Co można naprawić? Już Ci to mówili w innym wątku: przede wszystkim wywalić czasochłonne operacje z przerwania. W ISR ustawiasz tylko flagę, a w pętli głównej sprawdzasz jej stan i, jeśli zachodzi warunek,...
Jak napisac funkcje w AVR dla ATMEGA32 w jezyku C, aby mozliwe było przechwycenie przerwania spowodowanego impulsem zewnetrznym w liczniku TIMER0?? Gdyż dla TIMER 1 ustawia sie bit TICIE1 w rejestrze TIMSK, a dla TIMER0 nie ma tam żadnego takiego bitu?? Jak to zrobić?? A drugie pytanko, czy jest mozliwość uzyskania 1 sekundy na TIMER0??? Dzieki za pomoc!!
Nie tak, możesz użyć dowolnych portów, tyle że musisz sterować nimi programowo, z przerwań od timera. To będzie bardziej skomplikowane niż aktualny kod, ale w sumie nic specjalnie trudnego.
przerwać atmega32 atmega32 przerwać atmega32 timer
nasłuchu policji słuchawki bluetooth motorola płyta piszczy
bosch odkurzacz przemysłowy mikrokomputer cobra1
Jak spuścić wodę z pieca węglowego Galmet? Pasy na dolnej części ekranu - przyczyny i rozwiązania