Przecież to Ty programujesz timer, a timer może po każdym okresie np. zgłosić przerwanie.
Kiedy leci pytanie i Atmega ma przerwanie od USART... Pokaż lepiej jak to wygląda. Handler obsługi USART. Od zboczy też by się przydał, a najlepiej cały kod.
Uruchomić timer w trybie CTC. Tryb CTC Ludzie, dajcie sobie z tym spokój bo nie zgadniecie co autor potrzebuje. 1-szy Kwietnia na moim kalendarzu jest dopiero jutro...... czyżby kalendarz się spóźniał ? - pewnie będe musiał wymienic baterie... Zdaje się, gośc szuka 'agentów' aby ich czymś poważniejszymm zając!!(?) TU założył podobny temat (cross-posting...
PA1 to nie jest nóżka związana z INT1! Pod PA1 siedzi PC INT1 - Pin Change Interrupt. "Zwykłe" przerwanie zewnętrzne INT1 to nóżka PD3 ;)
A gdzie jest obsługa przerwania?
Dodaj kolejną zmienną w obsłudze przerwania.
Zacznijmy od pytań: 1. Które bity według Ciebie ustawiłeś w TCCR2B : [syntax=c]TCCR2B = (1CS20) (1CS22); ustawienie prescalera na 1024, jeden impuls licznika to 64us TCCR2B = (1WGM22); wprowadzam timer2 w tryb CTC [/syntax] pomijając już fakt, że ten fragment się nie skompiluje. A może wszystko jest ok, tylko to problem wklejania kodu na forum? 2. Gdzie...
Jeszcze jedno. Na czas wyświetlania grafik wyłącz wszystkie przerwania.
krzychusss - przeanalizuj co ile wykonuje się pętla główna, co ile zgłasza się przerwanie od przepełnienia.
Zamiast obwiniać ATmegę, zaglądnij do dokumentacji :) Jak rozumiesz ten opis: https://obrazki.elektroda.pl/8792144700_...
Organizacja pamięci programu (flash) jest w słowach - 2 bajty, stąd kolejne adresy np 101 102 103 tak naprawdę przeskakują co 2 bajty. Wektory przerwań używają rozkazu jmp (nigdy rjmp) rozkaz jmp składa się z 2 słow czyli 4 bajtów. Powyższe nie dotyczy pamięci statycznej RAM - tam jest organizacja 1 bajtowa.
jako ze jestem początkujący to po prostu robię kopiuj i wklej z innych przykładów ;) nie do końca rozumiejąc o co chodzi (C to czarna magia na razie jeszcze). dlatego przydałby ci się jakiś dobry kurs C ;) A w uproszczeniu jak zamienić SIGNAL na ISR - po prostu na razie zamiast SIGNAL pisz ISR tylko podawaj nieco inne nazwy wektorów tych przerwań....
Pewnie że nie będzie działać, ustawiłeś Preskaler =256 a więc przy zegarze 16MHz przerwanie od Timer0 będzie pojawiać się z częstotliwością 62500 razy na sekundę. (16000000/256 = 62500). Zalałeś modem zapytaniami o CSQ i biedny nie ma czasu na odpowiedź.
8Mhz /256 daje 31 250. 31250/125 daje 250 (ms) (250 -125ms) * 8 (co ósme przerwanie) = 1s.
Przychodzi Tobie prostokąt o wypełnieniu ok. 1-2ms co kilkadziesiąt ms. Musisz podłączyć ten sygnał pod przerwanie w atmega i timerem mierzyć czas pomiędzy zmianą sygnału z "0" na "1" a zmianą z "1" na "0". Z tej informacji generujesz odpowiednie PWM. PS. Ze względu na to, że nowsze atmegi mają więcej wyjść PWM polecam np. atmega88 zamiast atmega8.
1. z tego co piszesz to przerwanie o najwyższym piriorytecie będzie występowało z częstotliwością 4kHz. Zakładając że będziesz miał zegar 8MHz to na obsługe przerwania (zapisanie 8 bajtów) i obsługe innych przerwań będziesz miał: 8MHz/4kHz = 2000 cykli zegarowych co w przypadku procesorów typu RISC daje jakieś 1500 instrukcji. A to jest całkiem sporo....
deklarujesz skok do przerwania pod jakims tam adresem: .org INT0addr rjmp klawiatura teraz deklarujesz skok do resetu .ORG $000 rjmp reset reset: i dalej jakis kod... tyle ze ten kod zaczyna sie zaraz za rjmp RESET jednoczesnie zamazujac skok do Twojego przerwania INT0. Zakrecone no nie?;]
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...
Może powinieneś włączyć przerwania - enable interrupts .
Czyli co mam zrobić, żeby wywołać przerwanie przyciskiem? Dać DDRD &= ~1<<PD2; ?
Jeżeli zmienna jest globalna, to masz dostęp do niej zarówno w przerwaniu jak i poza ciałem przerwania.
Chwila. Timer bez preskalera, częstotliwość procesora nieznana, załóżmy, że 1 MHz (nieistotne). Timer zgłasza przerwanie co 21 cykli zegara, czyli ATmega zajmuje się na okrągło obsługą przerwań timera, nie mając szans obsłużyć żadnych przerwań o niższym priorytecie (ADC).
Mam teraz dość nietypowy problem z przerwaniem. Miał ktoś kiedy tak, że wystarczy jak dotyka przewodu (do INT0) i się wywołuje przerwanie?
Może trzeba odblokować jakoś globalnie to przerwanie... Dokładnie :-) Należy jeszcze ustawić bit RXCIE w rejestrze UCSRB. Ale kiedy testy się skończą, to lepiej z przerwania usunąć czasochłonne rzeczy - typu obsługa LCD :idea:
ATmega128 ma "tylko" 8 zewnętrznych przerwań i nie ma tam przerwania PCICR. Przerwania możesz deklarować poprzez nazwy rejestrów: ON INTX lub jak dla M168: ON PCIEX i dalej korzystać z normalnej składni Bascoma.
1. oczywiście że ATmega obsługuje przerwania na każdy rodzaj zbocza a także na poziom ;) (na pewno!) 2. Przerwania INT0 i INT1 to standardowe i opisane oddzielne dwa przerwania hmmm mają można tak ogólnie powiedzieć więcej opcji działania ;) Natomiast przerwania PCINTx mogą być wygenerowane przez wybrane piny danego AVRka, przeważnie to jest jakiś...
Proszę o informacje, gdzie w nocie katalogowej można znaleźć informacje na temat priorytetów wykonywania przerwań, jeżeli wystąpią w tym samym czasie. Nie można, ale ten co ma niższy adres w tablicy wektorów wykona się pierwszy jak przyjdą w tym samym czasie. Co najwyżej możesz właczyć przerwania na początku obsługi aby umożliwić obsługę kolejnych...
A może masz gdzieś funkcję obsługi tego przerwania? Dodano po 4 Dodam, że korzystam z programowego bufora cyklicznego, który w przerwaniach odbiera dane od UDR. Jedyne co mi przychodzi na myśl to to, że przerwanie tak szybko się wykona (odebranie danych do bufora i skasowanie flagi RXC), że część programu: while ( !(UCSRA & (1<<RXC)) ); nawet...
Zmień vector przerwania na ISR(USART_RX_vect)
Na czas programowania należy wylutować kwarca i połączyć przerwaną ścieżką i programować według opisów. Potem wróć do stanu z wlutowanym kwarcem i przerwaną ścieżką.
Przerwanie: ISR(TIMER1_COMPA_vect){ gatherData(); displayResult(); showBar(); } musi być poza funkcją main.
W PDF jest napisane, że flaga jest zerowana gdy : "interrupt routine is executed". Ja to tłumaczę jako obsługa przerwania jest WYKONANA. CZYLI po ZAKOŃCZENIU. W PDF jest też napisane, że zerujemy ją wpisując do rejestru wartość na określonym bicie 1.Czyli EIFR.0=1. Dlatego wpisując EIFR.0=0 NIE ZEROWAŁEŚ FLAGI!. Spróbuj ja wyzerować następująco If EIFR.0=1...
Obsługa WS2812 na AVR nie może działać przy aktywnych przerwaniach z jakiegokolwiek źródła. Obsługa DMX korzysta z przerwania UART i masz jeszcze przerwanie timera. Proste? Zmień mikrokontroler.... Z ATmega WS2812 DOBRZE nie popędzisz.
W przerwaniu timera kolejno: 1. odczytujesz poprzedni pomiar ADC i przetwarzasz wyniki 2. startujesz kolejny pomiar, którego wynik odczytasz przy następnym wejściu w przerwanie timera
Atmega 328 Przerwanie 50hz do sterowania fazowego blokuje odliczanie millis(); , występują opóźnienia w całym programie. Trudno cię zrozumieć, ale sprawdzanie millis() wskazuje na to że nie używasz potencjału jaki jest w sprzęcie, powinieneś ustawić przerwanie tak aby timer wywołał je kiedy jest potrzeba zmiany stanu wyjścia, albo w ogóle bez udziału...
Diody masz podpięte bezpośrednio pod porty ATmega? Jeśli tak to lepiej dołóż sobie oporniki aby nie spalić wyjść ATmegi. Bezpośrednio przy procku daj kondensator 100nF. Przed stabilizatorem np. 1000uF, a za stabilizatorem 100u (to i tak za dużo, ale lepiej więcej niż za mało). Zliczanie zrealizowałbym w taki sposób: - Odpalić któryś z wewnętrznych timerów...
W przerwaniu USART_RXC musisz odczytać UDR niezależnie od warunków umieszczonych w kodzie, najlepiej, kopiując wartość tego rejestru do lokalnej zmiennej, tuż na początku funkcji. Jeżeli tego nie zrobisz, procesor zakolejkuje kolejne przerwanie. Piszę to na podstawie dokumentacji AVR8. W Twoim przypadku, gdy bufor odbiorczy się zapełni i nadejdzie kolejny...
A sprawdzałeś w ogóle ile masz SRAM w tej Atmedze? 8KB więc starcza na różne sprawy a takie dwa "pliki" to u Ciebie tylko 1,5KB Jeśli za każdym razem to inny "plik" to to nie ma większego sensu i faktycznie lepiej użyć lookup. Co do karty SD to bezproblemowo. AVR DOS potrzebuje 2x512B SRAM. Można też czytać w takim pliku nawet tylko jeden bajt jeśli...
Czy RTC (zegar czasu rzeczywistego) używający Timera 2 w trybie asunchronicznym , działa nawet wtedy gdy wyłączone sa przerwania globalne ? ... kwarc, preskaler oraz Timer2 nie potrzebuje przerwań ale to nie wystarcza do zrobienia całego RTC to wystarcza do zrobienia przerwania co 1 sekundę a reszta zegara musisz zrobić programowo i to właśnie na przerwaniu...
Użyj komparatora. ... tym bardziej, że ten wbudowany w mikrokontroler, także posiada własne przerwanie.
To jest przerwanie a nie pętla, musisz tylko dopisac rjmp podprogram, wykonać podprogram i powrócic z przerwania
Jeśli w przerwaniu wyświetlania będzie tylko zatrzaśnięcie danych w HC585 i wybór kolumny, to nie ma problemu. Do OW najlepiej jednak będzie użyć UARTa, bo na przerwaniach timera na ATmega raczej się zarżniesz. OW na UART, ładowanie danych wiersza w pętli głównej i jakoś to poleci nawet na cienkim ATmega.
Tak. Tylko mniej świadomość że procek będzie odrywany od pracy wieloma nieprzydatnymi impulsami. Ewentualnie po pierwszym impulsie na INT, wyłącz przerwania na czas drgań. Jak teraz masz podłączony kontrakton ? INT podciągnięty pod +5V ? Jak INT wyzwalasz ? W docelowym projekcie koniecznie czujnik kontraktonowy zamień na jakiś halotron albo transoptor...
i jak zwykle, odpowiedz standardowa - volatile. ile razy bedzie musiala jeszcze pasc, aby forumowicze znajdywali ja w wyszukiwarce, a nie pytali o nia co chwile? 4\/3!!
500ms to trochę za dużo jak na drgania styków. To jest microswitch czy jakiś przycisk przemysłowy? Spróbuj wyzwalać przerwanie stanem niskim a nie zboczem opadającym. Ustawiając inny zegar nie spalisz chipu. Co najwyżej ustawiając niższy zegar niż dotychczas możesz mieć problemy z zaprogramowaniem jeśli nie zmienisz też częstotliwości w programatorze....
Bardzo dziękuję, ale jeszcze dopytam. Czy symulację należy wywołać poprzez Alt+F5 (Start Debugging and Break) bez zaznaczania punktu "break", a następnie wcisnąć pauzę w dowolnym momencie? Co znaczy kliknąć na flagę? W AVRStudio 4 jest to czerwona chorągiewka, podobnie jak w MS Outlook, ale w symulatorze AVRStudio 5 nic jej nie przypomina. Moim zamiarem...
Dokładnie masz I2S interfejs służący właśnie do tego celu. Dobierz interfwjs do zadania. To nie atmega.
Zanim włączysz konkretne przerwanie włącz przerwania globalne. wpisz tak Enable interrupts Enable int0 Pozdrawiam :)
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....
Spróbuj tak: odczyt [syntax=c] if(eeprom_is_ready()) { eeprom_read_block(&ustawienia,&ustawieni... } [/syntax] zapis [syntax=c] cli();//Globalna blokada przerwań if(eeprom_is_ready()) { eprom_write_block(&ustawienia,&ustawieni... } sei();//odblokowanie przerwań [/syntax]
Istotne może być to, kiedy startujesz pomiar. Rejestr OCR w każdym przyzwoitym mikrokontolerze jest buforowany, więc można go aktualizować w dowolnym momencie - fizycznie zostanie przeładowany przy zawinięciu okresu. Na pewno nie ma sensu aktualizować go w pętli głównej, podobnie jak sama "pętla główna" nie ma sensu. Jeśli natomiast używasz zmiennych...
No to zrób tak, że zmieniaj OCR1A w pprzerwaniu od adc: [syntax=c] ISR(ADC_vect) { pomiar = ADCW; if (pomiar < 100) { speed = 7288; } else if (pomiar >= 100 && pomiar < 200) { speed = 3367; } OCR1A = speed; } [/syntax]
A po co tak teoretyzować - wystarczy zajrzeć do PDF'a scalonego odbiornika TFMS czy TSOP żeby zobaczyć jak należy postąpić nie tylko z linią sygnału wyjściowego ale też jak podać zasilanie. Ludziom nie chce się tam zajrzeć a potem zdziwienie, że nawet jak działa - to jednak jakieś błędy się wkradają, czasem jakieś zakłócenia itp (jak tam już zajrzysz...
Witaj. WGM12 jest w ATmega16 w rejestrze TCCR1B. W rezultacie masz ustawiony tryb NORMAL, a nie CTC.
Czy są jakieś znaczące róznice tak aby program napisany na 1284 nie chodzil na 644P? Np. M1284p ma 4 timery, a mniejsze siostry tylko 3 :D Wiąże się to więc, z 4 dodatkowymi źródłami przerwań i większym o 16 bajtów obszarem wektorów przerwań.
sbi i cbi nie powodują żadnej zmiany SREG więc zapisywanie i odtwarzanie SREG w tym przypadku jest niepotrzebne. Zgadza się, dlatego są zakomentowane na wypadek, gdyby jeszcze coś w tym przerwaniu miało być robione... :P Nie rozumiem tego. Skoro już używasz rejestrów is0 i is1 to czemu bezpośrednio do nich nie załadujesz ADCH i ADCL. Dlatego, że w...
a ja chce zauważyć pewien średnik po while
(terminal wysyła tak jakby po 1 widać to w logach). Tak działa większość terminali (np TeraTerm), nieliczne (np Termite) wysyła całą linię tekstu po naciśnięciu enter. Z tego co widzę to terminal wysyła na końcu 0x0D a mój program 0x0A Też wysyłaj LF. Jeśli problem będzie występował nadal, to masz błąd w odbiorze znaków w AVR (np za dużo czasu mija...
A czy to też nie działa : Config Watchdog = 16 Start Watchdog Disable Interrupts być może Bascom odblokowuje przerwania w starcie watchdoga?
ATmega48 to wersja ATMega88, która jest podobna, ale nie identyczna z M8. Oprócz innego nagłówka może zajść konieczność dostosowania nazw niektórych rejestrów. Inna jest też tabela wektorów przerwań.
Witam, Niedawno zrobiłem programik, który generuje 3przebiegi przesunięte w fazie. Triggerem dla pierwszego przebiegu jest detektor zera sieci na INT0. Chciałem całą obsługę generowania sygnałów zrobić na przerwaniu Timera. Ale mój ból jak wywołać przerwanie Timera natychmiast po otrzymaniu sygnału na INT0 Wykombinowałem sobie takie o to rzeczy tuż...
Jeżeli komuś zależy na szybkim "machaniu" pinami na AVR z Arduino HAL, to polecam bibliotekę [url=https://pololu.github.io/fastgpio-a... Ustawianie i czytanie pinów odbywa się bez blokowania przerwań i zdecydowanie szybciej.
Ale po co wskaźnik ? Normalnie nie da się wywołać funkcji obsługi przerwania ?
Może przerwanie od INT0 albo INT1 :?:
Pokaż pełny kod. Jak wygląda ISR dla tego przerwania?
Po pierwsze nie podoba mi się zapis: Pinc.1 = not Pinc.1 Powinno być raczej: Portc.1 = Not Portc.1 Albo jak ktoś się bardzo uprze: Portc.1 = Not Pinc.1 Ale ogólnie do rejestru Pinx raczej nie zapisujemy. Ponadto... zegar 4MHz, dzielnik w timerze przez 256, timer0 (8 bitowy) ładowany wartością 250.... to daje podział przez 6*256 = 1536. To częstotliwość...
W ogóle nie używamy _delay() -nie tylko w przerwaniach. Poza tym- po co jest to kasowanie flagi przerwania w przerwaniu- po obsłudze przerwania ta flaga sama się kasuje.
Tak te funkcje powinny wyglądać: [syntax=c]void uart_putc(unsigned char data) { // Oczekiwanie na zakończenie nadawania while (!(UCSR0A & (1 << UDRE0))); // Wysłanie danych UDR0 = data; }[/syntax] [syntax=C]unsigned char uart_getc() { // Czy w buforze są dane? while(!(UCSR0A & (1 << RXC0))); // Dane z bufora return UDR0; }[/syntax]...
Wpisać magiczne "volatile" volatile int sekunda=0;
Tylko ja nie mowie o żadnych flagach sprzętowych, a o zmiennej "straznik". Sorry. Źle zrozumiałem. Faktycznie 'straznik' jest tylko zainicjowany z wartością 1, a później tylko zerowany w przerwaniu. Tego nie zauważyłem :)
a może jakiś pull-up? 4\/3!!
1. ok, z 1 się wycofuję bo masz zrobione zewnętrzne pull-upy ale niepotrzebnie mnożysz rezystory, gdyż takowe są wewnątrz procesora - wystarczy tylko włączyć je z poziomu programu. 2. to teoretycznie może powodować problem - najlepiej sprawdzaj przerwania w jakiś inny sposób - np. w każdym tylko zapalać lub gasić diodę 3. Rozumiem istotę Twojego problemu,...
Load Timer0 = 625 ?? Mam nadzieję, że kolega sam rozumie błąd w tym miejscu:> Poza tym ładnie jest najpierw włączyć timer a potem zezwolenie na globalne przerwania:>
Co to za przerwanie? Od porównania? Przepełnienia? Czy może od przechwycenia - co sugerują komentarze. Nie używasz innych przerwań? Załącz cały program.
Chyba nie zrozumiałeś, o jakie flagi chodzi ;) Często tak właśnie robię: mam kilka zmiennych globalnych, typu liczniki, stany itp. i w przerwaniu jedynie zmieniam ich wartość (np. zwiększam licznik po jeden) - a co z tego wynika, to już w pętli głównej. To dobra praktyka, ograniczająca czas wykonania przerwania - przecież licząc, powiedzmy, częstotliwość,...
OK. Jestem teraz prawie pewien gdzie leży problem. Otóż ten program VMLAB jest kiepskim symulatorem i nie za bardzo łapie operator volatile. Program zawiesza się na pętli while() w funkcji licz(), ignorując zupełnie przerwania. Jest to moim zdaniem wina tego symulatora. Układ fizyczny powinien działać. W wolnej chwili odpalę na symulatorze AS6. Edit:...
Na jakiej czestotliwosci dziala procek? Poza tym ja bym zliczal sekundy przez tryb CTC, w przerwaniu bym aktualizowal zmienna. Oczywiscie samo wyswietlanie poza przerwaniem.
No i jest błąd w PCB musisz przerwać ścieżkę. 5 pin LCD-atmega http://obrazki.elektroda.pl/2662254900_1... i połączyć ten pin wyświetlacza z masą.
Mam dziwny problem ze znikającym jednym tickiem w liczniku gdy są włączone przerwania przy przepełnieniu. Licznik pracuje w trybie normalnym, taki sam efekt przy 8 i 16 bitowym, zaobserwowałem na atmedze 16 i 644P (bo takie miałem akurat pod ręka). Normalnie bez przerwań, licznik przy przepełnieniu zeruje się i zaczyna liczyć od 0, wszystko tak jak...
No właśnie, czyli pozostaje programowe sprawdzanie stanu wejscia przerwania w procedurze obasługi przerwania. Pod warunkiem, że impuls wywołujący przerwanie będzie dopowiednio długi.
sei nie ma nic do priorytetu przerwań - to po prostu instrukcja włączająca przerwania.
Na pewno jak już to nie SFIOR=(0<<ACME); a SFIOR &= ~(1<<ACME); A zresztą na internecie masz przykłady choćby tu: http://jumptuck.com/2011/12/12/avr-analo... czy tu: http://winavr.scienceprog.com/avr-gcc-tu...
Przerwania są wyłączone i trzeba zezwolić na konkretne przerwanie i w ogóle na jakiekolwiek przerwania.
Nie reaguje, gdyż normalnie M8 nie obsługuje zagnieżdżonych przerwań.
Brakuje globalnego odblokowania przerwań: "Enable Interrupts"
Przeczytaj najpierw ze zrozumieniem dokumentację uC. Dodatkowo: po co pętla while w przerwaniu?
Zmień doświadczalnie wartość wpisywaną do timera. Zobacz czy poprawnie wyświetla ci to co chcesz. Ważne jest także żeby przerwanie nie było za długie bo wtedy może grozić to resetem uc.
Taktowane wewnętrznym zegarem 8Mhz przy oryginalnie ustawionym osccall lub około 12 MHz przy osccall = 244 Częstotliwość przebiegu to około 120 kHz Błąd z procedury przerwania ?
Witam, chciałbym odświeżyć temat. Czy przy słabym sygnale powinienem odbierać jakieś dane, lecz mogą być błędne czy może nie otrzymam żadnego sygnału który wygenerowałby przerwanie?
atom1477, wydaje mi się że chyba nie ;) Aczkolwiek na pewno spróbuje je osobno deklarować, szczególnie że wszystkie zmienne są wykorzystywane w przerwaniu.
marcinek.p - to gotowiec dla ciebie, nie mam jak go przetestować ale jestem pewien że zadziała jak trzeba. Masz tu przerwanie, miganie led i zliczanie migniec z incr Mozna to wszystko wkleic do przerwania ale dobra zasada nakazuje w przerwaniach umieszczać jak najmniej kodu. [syntax=basic4gl] $regfile = "m8def.dat" $crystal = 1000000 $hwstack = 32 $swstack...
Co za problem z podłączeniem dwóch odbiorników IR? Nie widzę żadnego problemu. Podłączyć najlepiej pod zewnętrzne przerwania.
OK, już działa i zmienia czestotliwość. Pozostaje 1 pytanie. Jak ustawie przerwanie co 32kHz to układ wystawia przerwanie dla Atmega. Problem w tym ze wglada tak jakby ta czynność tak obciażała Atmega16, że nie ma on już czasu na normalne obsługiwanie programu. Dzięki w/w funkcji chciałbym uzyskać taki efekt gdzie będe mógł zliczać czas 100ms.
Dokładnie w taki sam sposób jak w ATMega. Różnice występują w konfiguracji całego podsystemu przerwań.
Czyli zrobić zewnętrzne przerwanie na te funkcje??
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.
Skróć czas kiedy przerwanie są zablokowane - wywal wysyłanie danych po RSie poza ten obszar kodu gdzie są zablokowane przerwania.
A skąd wiesz , że nie "wchodzi" , no i rzuć jakiś ochłap kodu ;) Piotrek
Wykorzystaj zewnętrze przerwanie a programie przerwania odpal timer potem następne przerwanie i timer stop i wynik timera do zmiennej. i tak w koło. Fototranzytor np możesz wykorzystać w momencie zaniku/przerwanie wiązki światła tranzystor przestaje przewodzić a przy pomocy rezystora podajesz w tedy logiczne zero na wejscie przerwania.
Może tak to wyglądać, ale IMHO lepiej to zrobić na przerwaniach - nie musisz sprawdzać, którą tablicę przeliczać, bo to załatwia wektor przerwania powiązanego z kanałem, no i nie musisz sprawdzać, czy kanał jest wolny, bo masz to zagwarantowane w chwili wywołania handlera przerwania.
atmega przerwać atmega obsługa przerwać przerwać pcint atmega
schemat prasa hydrauliczna iskrownik ustawić napełniania syfony
Aparat zmierzchowy AZ-B nie załącza świateł - przyczyny Schemat podłączenia układu Sił 19587