[syntax=vbnet]Automatycznie2: Locate 1 , 1 Lcd " Tryb Automat. " Locate 2 , 1 Lcd "Aktualnie: PR:2" Prog1 = 0 Prog2 = 1 Prog3 = 0 Prog4 = 0 Prog5 = 0 If Cofn = 0 Then Goto Wybor Else Dim Odlicz As Byte Odlicz = 120 Do Wait 1 Decr Odlicz If Cofn = 0 Then Goto Wybor Loop Until Odlicz = 0 Goto Automatycznie3 End If[/syntax] Możesz nawet zwiększyć czułość...
Wywal opóźnienie z przerwania. Po za tym wygaszaj kolumny za każdym razem jak wchodzisz w przerwanie.
Ten drugi pomysł jest moim zdaniem lepszy. Do tego możesz użyć końcówki przerwania INT - ma konfigurację zbocza, którym jest wyzwalane przerwanie.
Czyli teoretycznie co takt zegara ma być przerwanie. Teoretycznie bo w praktyce będzie po takcie od wpisania do TCNT0->255 ale następne będą co 256 cykli. Swoją drogą jak chcesz w jednym takcie obsłużyć całe przerwanie?
Dokumentacja ATmega8, strona 71: The bit TOV0 is set (one) when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware when executing the corresponding interrupt Handling Vector. Alternatively, TOV0 is cleared by writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow Interrupt Enable), and TOV0 are set (one),...
W programie sterowanie diodą D1 jest na porcie B, nie C.
SIGNAL(SIG_INTERRUPT0) { ... GIFR = 0x40; //****************co to ?? ... GIFR|=_BV(INTF0); //***********co to ? ... MCUCR = 0x00; //INT0 reaguje na stan niski ********** przestaw na FALLING(opadające) Nie wiem czy main pokazałes w całości , ale ja bym w takim przypadku wogóle zrezygnował z przerwnia , a w pętli głównej...
na pierwszy rzut oka wygląda ok.. jedynie co przychodzi na myśl ingerencja kompilatora który zoptymalizował funkcję. Sprawdź może czy program dochodzi za pętle for(;; ) (może daj mu cos tam do roboty). TIMSK = 1<<TOIE0; lepiej TIMSK| = 1<<TOIE0; Sprzwdź (np. na diodzie ) czy wchodzi w przerwanie..
Można, ale nie jak masz włączone przerwanie sprzętowe które ją skasuje... (SEI)
Jeśli chodzi o mechanizm przerwań, to wszystko masz ładnie opisane w formacie pdf na stronie Atmela . Wywoływanie przerwania w procedurze obsługi jeszcze innego to porażka. Przerwania są kolejkowane i po powrocie z jednego jest wywoływane drugie, dlatego procedury obsługi powinny być jak najkrótsze (polecam asm ;)). W procedurze timera możesz sobie...
SIGNAL(SIG_OVERFLOW0) - w ten sposób definiowały obsługę przerwania jeszcze nasze babcie i jeszcze za ich czasów wprowadzono nowy sposób - ISR(TIMER0_OVF_vect) 3-sekundowy delay w przerwaniu? "Super" pomysł.
W zasadzie co ten program robi? Bascom jest wolny- ale procesor wykonuje instrukcje co 0.125us przy tym zegarze. Załóżmy 1000 cykli w pętli- zajmie mu 125us policzenie stanów 0 na wejściu i co dalej? Od wykrycia 0 powinien zblokować na jakiś czas zmianę stanu, odliczyć czas w ms a nie w us i zmienić stan wyjścia. Timer i ewentualnie przerwanie.
To co sugerowal Tajwoj - źle ustawiłeś preskaler, powinno być: TCCR0 = 0b00000101;
Bo jak ma działać? Widać kolega nie do końca rozumie mechanizm przerwań, skoro czeka na przerwanie INT0, a włącza przerwanie przepełnienia Timera0. Adresem przerwania przepełnienia Timera0 jest OVF0addr, a nie INT0addr. Przerwanie od INT0 wyzwalane jest ZEWNĘTRZNIE zboczem lub stanem na fizycznym wejściu INT0 mikrokontrolera, a nie Timerem. Skąd ten...
A pod Bascom'em tak: Set Gifr.intf0 Oczywiście trzeba wstawić tą linijkę przed 'Enable Int0'
Jeśli funkcja obsługi przerwania powoduje ponowne wyzwolenie samego siebie, to jest to wynikiem tego, że flaga przerwania jest kasowana tylko podczas wchodzenia do przerwania. Podczas wykonywania funkcji obsługi przerwania flaga INTF0 może zostać ponownie ustawiona, co spowoduje ponowne wejście do ISR zaraz po zakończeniu (ISR_BLOCK nie powoduje zablokowania...
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).
I dla tego właśnie ja nie podalem tego z przerwaniem :]
bierzesz pod uwagę nie to przerwanie. zobacz czasy dla TIMER/COUNTER1 OCR1A Compare Match
UCSRB = (1<<RXEN)|(1<<TX... chyba UCSRB = (1<<RXEN)|(1<<TX...
Kwarc 16.384MHz i do tego timer z preksalerem 1024 w trycie CTC z przerwaniem co 16.
Bity w MCUCR określają na co będzie reagować przerwanie zewnętrzne... Zmiana stanu, opadające lub narastające zbocze więc jest to jak najbardziej potrzebne... SIGNAL (INT0_vect) - obsługa zewnętrznego przerwania INT0... SIGNAL (TIMER0_OVF_vect) - obsługa przerwania od przepełnienia timer0... Co do portu... Jak na mój gust powinno być PORTC = !PORTC;...
Skompilowałem to u siebie i od razu widać błąd: makro do przerwań pisze się z dużych liter: SIGNAL(...) - w takim przypadku uzyskałem poprawny kod. Przy "signal" z małych liter powstała funkcja o nazwie "signal" (zwracany typ domyślnie int, przez co kompilator wyrzucał jeden warning). C jest językiem case-sensitive. Co do reszty kodu: zmień dołączenie...
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.
Najpierw spróbuj może dodać: ...ale jak ustawię ręcznie bit UDRE w UCSRA który oznacza że bufor jest pusty, także nic się nie wysyła. To nie jest argument. Flag przerwań w AVR generalnie nie da się ustawiać programowo, niektóre można tylko wyzerować. Akurat UDRE można wyzerować tylko poprzez wpisanie bajtu danych do rejestru UDR, flaga ustawiana jest...
No to dobrze... uC taktowany jest najniższą dostępną z wewnętrznego RC częstotliwością 1MHz... Ustawiam prescaler na 1 i mam przerwanie co 256us... Czy nadal powinienem coś wpisywać do TCNT0...?.?.?
1. powinieneś zamiast SIGNAL(SIG_UART_RECV) zastosować makro ISR( _vect) 2. przerwanie to nie zwykła funkcja którą od tak sobie można przerwać prze break albo return 3.uart_rx_buffer[uart_rx_len] = 0; tu powinien być NULL('\0'), a nie zero 4.nie rozumiem Twojego sposobu wykorzystania flag spróbuj uart_rx_complete = 1; i uart_rx_complete = 0;
No dobra ale weź na razie odstaw angielski na bok i zajrzyj na obrazki do noty - jak niżej - same nazwy rejestrów TCCR1A i TCCR1B jak niżej. Czy widzisz gdzie są bity CS1x ?? http://obrazki.elektroda.pl/6191317800_1... http://obrazki.elektroda.pl/9529904800_1... może to ci coś podpowie ? Dodano po 5 Poza tym zobacz jak trzeba podejść...
Stąd, że porty D2 i D3 są portami dedykowanymi do wprowadzenia zewnętrznych przerwań. Spójrz datasheeta megi8.
Tak poza tematem, czy to sie nie pisze "Load Timer0, 100" ? i zrob timer0=cos na starcie i w przerwaniu.
O i dzięki schematowi od razu widać błąd: http://obrazki.elektroda.pl/6463515500_1... Przyciski podłącz do GND, a nie Vcc, a w programie włącz pull-up, i ustaw reakcję INT na zbocze opadające. Tylko czy wiesz dlaczego Twój układ nie działał? Osobna sprawa do drgania styków przycisku: http://mikrokontrolery.blogspot.com/2011...
Wyrzuciłem z obsługi przerwania pętle opóźnijące: SIGNAL(SIG_INTERUPT1){ if(bit_is_clear(PINC,PC5)){sbi(PORTC,PC5... else cbi(PORTC,PC5); } Niestety nic nie pomaga. Nadal nie działa. Nie działa , bo ... kompilator nie wie ,co to za wektor SIG_INTE R UPT1.Gdybyś napisał SIG_INTE RR UPT1 , to by wiedział :D Piotrek PS Odpowiednikiem powyższych "zabiegów"...
a _delay_ms i _delay_us Ci nie wystarcza ? Do opóźnień nie trzeba wykorzystywać koniecznie przerwań timera. Można wykorzystać flagi timera (o ile się da, ale wszystko zależy). Poza tym, zmienna deb w Twoim programie zapewne nie jest volatile, ale wrzuciłeś nam NIC, także pomoc też nijaka
Nie pokazałeś całości, a problem może właśnie tkwić w rzeczach, których nie pokazałeś. Ale kilka uwag - po pierwsze przyciski drgają, w efekcie nie dostajesz jednego przerwania tylko dziesiątki. Twoja procedura obsługi to eliminuje, bo jest strasznie długa, ale i tak co najmniej 2 razy zostanie wywołana. Przyciski jak rozumiem masz podciągnięte rezystorem?...
Zmienne static są inicjowane przypisaną wartością tylko raz, na początku programu. Kolejne wejście do procedury obsługi przerwania nie powoduje ponownego przypisania im wartości; mają wartość taką, jak po zakończeniu poprzedniej obsługi przerwania.
Gdy procesor jest w trakcie wykonywania procedury przerwania, następne przerwanie nie będzie przyjęte , gdyż procesor (nie kompilator!) zeruję flagę globalnego zezwolenia na przerwania. Tak samo flaga bieżącego przerwania (tego, którego procedura obsługi jest wykonywana) zostaje automatycznie wyzerowana. Po zakończeniu przerwania flaga globalnego zezwolenia...
"Zbyt dużo" - to może być 200 linii, ale nie 10 czy dwie, jak w Twoim przypadku. Ja bym raczej radził nie pakować kodu do pętli głównej, o ile potrafisz zrobić obsługę DS18xx w przerwaniu.
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) ; ;)
Nie włączyłeś asynchronicznego typu pracy timer2 przykład: http://mikrokontrolery.blogspot.com/2011...
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=...
Ale o co konkretnie Ci chodzi ?? Wogole nie wiesz co robia instrukcje czy jak ? Co do programu to jest malo przejrzyscie napisany. Jesli to jest kurs dla poczatkujacych to proponuje poszukac innego. Sam patrzac na to cos z poczatku zglupialem i musialem sie wgapic zeby zrozumiec o co chodzi. Do meritum: Na poczatku sa sa dwie dyrektywy org ktore mowia...
Ja bym zrobił na przerwaniu + timer.
[syntax=C]// enable timer1 interrupts TIMSK |= (1<<TOIE1); [/syntax] Wybierasz tryb CTC, a włączasz przerwania od przepełnienia, które w trybie CTC wystąpi tylko dla maksymalnej wartości OCR1A. Dlatego nie działa. Włącz odpowiednie przerwanie i będzie ok.
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...
Domyślny stan 0 pomnożony przez 1 nadal daje 0. Wydaje mi się że to nie pierwszy kod był błędny, tylko drugi "prawidłowy" uruchamiał rezystory pullup dla wejść PD2 i PD3 i dlatego przerwania przestały się wywoływać. W całym kodzie brakowało po prostu linii w której wpisujesz 1 do PD2 i PD3, przed włączeniem przerwań.
Trochę szybciej: PORTB = PORTB & 0xf0 | nowe_bity & 0xf; Pamiętaj, że tak można zrobić tylko wtedy, gdy zawartość portu jest modyfikowana wyłącznie w procedurach obsługi przerwań albo wyłącznie w programie głównym. Jeśli modyfikacja zachodzi i tu, i tu - w programie głównym trzeba ją zamknąć w sekcję krytyczną - obudować wyłączeniem i włączeniem przerwań.
nie mylisz się Dodano po 20 już się poprawiam, bo w temacie napisałeś ATmega8, jakoś mi to umknęło i skupiłem się tylko na tekście i pytaniach o sposobie wyzwalania przerwań. Z opisu dokumentacji jaką czytałeś poprostu domyśleć się można że chodzi o procki inne niż ATmega8 bo akurat ten procek nie ma przerwań PCINTx, Więc co do tego co przeczytałeś...
Gdy już usuniesz wewnętrzną pętlę do..loop to zwróć uwagę, że stan przycisku będzie sprawdzany raz na 60s. Możesz zrobić sprawdzanie np. tak (co 1 sek.): dim x as byte ... do 'sprawdź przyciski if x=60 then x=0 toggle ... end if wait1 incr x loop end Albo wykorzystać timer lub przerwanie.
1 jak i 2 zależy od układu w jakim będzie pracował CNY17. Tam jest minimalny prąd diody przy której transoptor przewodzi i przy spodku po niżej tej wartości nastąpi wyłączenie transoptora. W układzie jaki ja zbudowałem do wykrywania zera z sieci mam stan wysoki dla zera i występuje on około 0,5 ms przed faktycznym zerem z sieci. Wg mnie lepiej użyć...
Co wywołuje fizycznie przerwanie?
http://www.edw.com.pl/ftp/kalkavr.zip
Na pewno musisz zrozumieć jak działają operatory: 1. Na początek ~ i & 2. || w następnej kolejności. Albert no to analiza krok-po-kroku: No niestety milisz się bo owszem jest robiona operacja PIND & 0b11111100 ale da ona 1 gdy któryś z przycisków od PD7 do PD3 nie będzie wciśnięty (więc jego bit w rejestrze PIND będzie ustawiony) żeby to poprawnie...
Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz...
A co się wyświetla? W wielu przypadkach po tym co otrzymujesz można się domyśleć, gdzie tkwi błąd. Na szybko widzę co najmniej jeden - funkcja odbioru odbiera bajt, wyświetla go na LCD i czeka 300ms na kolejny po czym kasuje LCD. Jeśli nadajesz więcej niż 2 bajty to je gubisz, bo odbiornik ma bufor tylko na 2 bajty. Zrób odbiór w przerwaniach.
a jak dziala w "realu"? a powiedz mi jeszcze skad wiesz ze on wywoluje przerwanie co 1s?
Pozostaje ustawienie bitów COM. W zależności jak je ustawię mogę wykryć zgodność przy zliczaniu w górę lub w dół, zatem decyduje się na zgodność jak w góre COM1A1, COM1A0 = 11 Tu nie chodzi o zgodność, tylko o ustawianie i zerowanie wyjścia OCx. W jednym trybie jak wystąpi zgodność przy liczeniu w górę to pin OCx=1, a w drugim pin OCx=0, i vice versa...
1/ #include "avr/io.h" <- zdecydowanie powinno być <avr/io.h> 2/ z tego co widać w "test.txt", nie ma tam żadnych funkcji odpowiedzialnych za przerwania (nazwy właśnie __vector_* [po rozwinieciu SIGNAL(x) przez preprocesor]), a skok do wektora przerwania, w którym brak funkcji przerwania powoduje skok do resetu (domyślna funkcja do wektorów...
1) Czas masz źle policzony, rzeczywiście wychodzi 2 sekundy :) Policz jeszcze raz, np: #define F_CPU 14745000ul #define TIMER_PRESCALE 1024 #define SECONDS(s) ((s)*(F_CPU)/(TI... 2) podpięcie przycisku pod przerwanie to pomyłka - poczytaj o eliminacji drgań styków 3) po wyłączeniu diody musisz zatrzymać...
Włączyłeś przerwanie od "Timer Compare" (OCIE1A) które nie jest obsłużone.
O nie na gotowca nie licz :) Ale jeżeli chcesz to mogę Cię naprowadzać i poprawiać błędy w kodzie. To pozwoli Ci nauczyć się czytać i rozumieć datasheet w zakresie timerów i przerwań. Pasuje?
Tabelka w DS na str. 98 i zobacz sobie tryb 4 CTC (opis trybu masz na str. 88) kolumna TOP i nazwa rejestru do którego wartość TOP powinna trafić, bit w rejestrze TIMSK tez nie ten i co za tym idzie nie ten wektor przerwania.
Dla BREAK ustawiasz 125kHz, 9 bitów danych i jeden bit stopu. Wystarczy tylko UART.
Bufor cykliczny trzeba zorganizować na RS232 oraz wysyłanie na przerwaniach i po kłopocie.
Debouncing można wykonywać na wiele sposobów. Twój sposób jest jak najbardziej poprawny. Ta bezsensowność jest tylko z pozoru bezsensowna :) - jakoś trzeba poinformować main(). Taka technika jest powszechnie stosowana nie tylko do debouncingu. Pamiętaj także, że zawsze możesz na końcu while() w main() uśpić mikrokontroler do następnego przerwania -...
Oj pomieszałeś :) Dwie możliwości: Pierwsza wersja (opisałem wyżej): 1. wyłącz Free Running 2. zostaw przerwanie ADC, 3. przed pętlą główną w main() wywołaj pierwszą konwersję, 4. w przerwaniu ADC wykonuj to, co aktualnie wykonujesz w przerwaniu + wystartuj kolejną konwersję. Druga wersja zaproponowana przez BlueDraco: 1. wyłącz Free Running 2. zostaw...
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...
Nie mogę znaleźć uchwytu przerwania od USART, jest jedynie od UART i nie chce działać. O ile mi wiadomo to nie ma żadnego rozróżznienia między przerwaniem od USART a UART. Niewazne czy Uklad transmisji szeregowej pracuje synchronicznie czy asynchronicznie i tak zawsze jest to samo przerwanie generowane. A moze by tak odblokowac przerwania od odbioru...
Nie to przerwanie. Zobacz na mój post wyżej. Ma być przerwanie overflow a nie compare A.
Coś ze stosem może masz zamieszne.
Czy przy kwarcu masz prawidłowo kondensatory do masy? Czy w ogóle masa nie jest w którymś miejscu przerwana?
Niedokładnie przeczytałeś. W zakładce nawigator: Config Timer- uwaga! po ustawieniu prascale licznik natychmiast zaczyna zliczanie. Można użyć start Timerx i stop Timerx Np. Config timerx, prescale 'timer zaczyna liczyć stop Timerx 'timer stoi- ale już coś zliczył Timerx=y 'timer ma wartość początkową =y - np.0 Start timerx ' Timerx zaczyna liczyć od...
atmel.com nie działa ? ;-) http://atmel.com/dyn/resources/prod_docu... TOIE0: Timer/Counter0 Overflow Interrupt Enable When the TOIE0 bit is written to one, and the I-bit in the Status Register is set (one), the Timer/Counter0 Overflow interrupt is enabled. The corresponding interrupt is executed if an overflow in Timer/Counter0 occurs,...
http://www.nongnu.org/avr-libc/user-manu... O to chodzilo ?
zobacz tu: http://mikrokontrolery.net/avr_c_06.htm
oraz jeszcze: 1. stosujesz stare funkcje obsługi przerwań a nowe wektory - stosuj nowe funkcje ISR(): http://nongnu.org/avr-libc/user-manual/g... i wywal nagłówek #include <avr/signal.h> 2. returny w funkcjach ISR() i main() są zbędne. 3. Ostatnia uwaga kol Zaquadnik jest baaaardzo istotna. Nie dość, że czekasz w funkcji...
OK, mam nadzieję, że zegar ustawiłeś w opcjach. Ponieważ muszę wyjść, to dam Ci wskazówki, a resztę wymyślisz sam lub koledzy pewnie podpowiedzą. Gdy pierwsze zbocze drgania styku ustawi flagę przerwania i mikrokontroler wejdzie w funkcję jego obsługi, to zaraz na początku automatycznie kasuje (w tym mikrokontrolerze) flagę przerwania. Ty w swoim programie...
Stosy to dla mnie czarna magia, wiem tylko, że każdy przeskok wymaga zapisania adresu zwrotnego, ale nic poza tym :oops: No przy takim podprogramie to 1 megabajtowy stos to za mało :D, to się chyba nazywa rekurencja: [syntax=basic4gl]Petlapomiarowa: If Impulsy < 15 Then 'Jesli nie ruszono, wyswietlaj dalej napiecie Gosub Pomiaradc If Konwersja >...
ISR( TIMER1_CAPT_vect ) //przerwanie od icp1 { cli(); //globalne zabronienie przerwan sygnal=ICR1; //odczyt timera TCNT1=0; //zerowanie timera i++; //dodanie wartosci i wyskok_do_funkcji(); sei(); //globalne zezwolenie na przerwanie }// koniec przerwania A po co to cli(); oraz sei(); w przerwaniu ????? może...
A co jeśli do pierwotnego kodu dodasz: [syntax=c]ISR(TIMER1_COMPB_vect) { }[/syntax]
Odnalazłem problem a powód był taki iż nie wyzerowałem flagi INTF0 od int0 Nie wystarczy wyłączyć przerwanie.
...Symulator pokazuje 1us a mi sie wydaje ze 10us. W tym wypadku , uwierz symulatorowi ;) Piotrek
Na ostatnie pytania odpowiedź standardowa: potrzebna jest stabilizacja i filtracja napięcia zasilania mikrokontrolera. Tematów o tym zagadnieniu też tysiące. Wewnętrzny pull-up nie spali ci optotriaka. Czasem może paść raczej port, kiedy jest przeciążony.
Przerwać delay możesz tylko przerwaniem. Jeśli chcesz mieć możliwość normalnie przerwania delay to rozbij je na sekwencje kilku mniejszych opóźnień pomiędzy którymi sprawdzaj stan przycisków. A najlepiej zrobić to przy pomocy timerów i przerwań.
Raczej jednak w przerwaniu bo zabezpiecza to przed zgubieniem impulsów. Dodano po 1 W przerwaniu od jakiegoś licznika oczywiście
A nie lepiej do komparacji użyć komparatora? Zamiast wzmacniacza operacyjnego? W dodatku możesz mieć 2 w jednej obudowie (nawet jak się upierasz na wzmacniacz operacyjny). Czyli użyj LM393 (komparatory), albo LM358 (wzmacniacze operacyjne). A podłączenie proste: http://obrazki.elektroda.net/50_12654738... (W przypadku użycia komparatorów będą jeszcze...
Jaki skok do 0x00 ? jaki skok do miejsca w którym przerwanie nastąpiło ? ;) A po co ci rozkaz RETI ???? to on robi za ciebie wszystko co potrzeba czyli wraca dokładnie do miejsca w kodzie programu gdzie został on przerwany.
Z tego co wiem pomiar metodą kolejnych przybliżeń z ADC trwa jakiś czas. Co będzie, jeśli w tym czasie nastąpi przerwanie? Konwersja ADC realizowana jest sprzętowo, to co w tym czasie robi procesor nie ma na nią wpływu. Także ew. przerwanie z pewnością nie wpłynie na wynik konwersji.
while(1) { AD(); //obsluga ADC if(ADC>630) { PORTC=0X00; //wlacza,wylacza diode TIMSK |=1<<TOIE2; //ZEZWOLANIE NA PRZERWANIE OD T0 } } } Moze tak?
Czyli wynika z tego, że nie da się zrobić tego z trybem power down. Bo nigdy nie przyjdzie przerwanie od timera2. Pisałem o tym w tym poście: http://www.elektroda.pl/rtvforum/viewtop... ATmega8A ma inne parametry elektryczne, a reszta jest taka sama. Czasami jednak występują dodatkowe problemy ujęte w erracie: http://mikrokontrolery.blogspot.com/2011...
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?
Na przerwaniu zewnetrznym!
No tak. Ja korzystałem ze sprzętowego i2c, który MUSI być na portach PC4, PC5. A Ty korzystałeś z PC3, PC4. Po usunięciu linii, o których pisałeś, zacząłeś wykorzystywać programowe i2c, które może być na dowolnych portach. Gdybyś w helpie Bascoma poszukał frazy $lib "i2c_twi.lbx" to by Ci się wyjaśniło :). Spróbuj teraz to zrobić. Ale ładnie pokombinowałeś...
Procesory AVR są praktycznie kompatybilne w dół,wszystko co jest napisane na AtMega8 uruchomisz na 16 , im wyższy model procesora tym więcej pamięci RAM i Flash,czesto też jest o jeden licznik więcej lub więcej przerwań.
Najpierw włącz zezwolenie lokalne, potem dopiero globalne. Jak nie pomoże, skasuj flagę od przerwania w bodajże GIFRrze:)
Magiczne słowo static daje dokładnie to samo co zmienna globalna. Przekazywanie wyniku przez zmienne globalne owszem jest w niektórych przypadkach dobre lub jedyne możliwe (z przerwania do kodu), ale pomiędzy funkcjami - nigdy. Przyjmijmy, że mamy n funkcji, każda może zwrócić tablicę o rozmiarze m. Jeśli każda funkcja przydzieli sobie tą tablicę mającą...
Usuń całkowicie Waitms z pętli odbiornika a w nadajniku zwiększ wartość Waitms. Jak nie pomoże to zrób odbiór na przerwaniu od URXC.
Sprawdzałem Twój kod inicjalizacji timera + przerwanie -> wszystko jest ok. Musisz mieć błąd w zliczaniu sekund lub w wyświetlaniu. Tak na marginesie to po co ustawiasz bit OCF2 w TIFR? Nie korzystasz z porównania (compare match), więc nie potrzebnie robisz to ustawienie. Wystarczy TIFR=(1 << TOV2);
Mam nadzieję że inkrementujesz sobie jakąś zmienną która informuje o ilości włączeń wentylatora a potem ją resetujesz. Przerwanie od timera zakłóca ci odczyt z DS-a musisz sobie dodać flagę którą będziesz ustawiał lub resetował i będzie cię informować że właśnie zakończyło się przerwanie i masz jeszcze trochę czasu do następnego. W tym momencie musisz...
Oprzyj multipleksowanie o timery, a te niech wywołują przerwania.. Tworzysz sobie procedurę przerwania od timera. Następnie w tej procedurze realizujesz funkcję "przełączania" segmentów. Uruchamiasz timer z żądaną częstotliwością + odblokowujesz odpowiednie przerwanie.
Tylko dalej nie rozumiem w jaki sposób mi pomoże zewnętrzne przerwanie i w jakim celu mam w nim sprawdzać czy jest na nim stan niski? Bo nie wiesz co to jest przerwanie: http://pl.wikipedia.org/wiki/Przerwanie
przerwać bascom atmega8 atmega8 przerwać timer atmega8 timer0 przerwać
honda civic sterownik schemat szybkozłączka pneumatyczna podświetlenie łącznika
komunikacja radiowa satel galmet wyswietlacz
Schemat podłączenia sterownika Webasto SG1569 Moduł Bluetooth 8M5T-19C112-BT w Ford S-Max, Galaxy, Mondeo