[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.
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.
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?
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...
Można, ale nie jak masz włączone przerwanie sprzętowe które ją skasuje... (SEI)
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..
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ł.
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...
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).
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...
I dla tego właśnie ja nie podalem tego z przerwaniem :]
Kwarc 16.384MHz i do tego timer z preksalerem 1024 w trycie CTC z przerwaniem co 16.
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...
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;...
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.
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?...
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...?.?.?
Po pierwsze to wypadałoby napisać jaką częstotliwością taktujesz procka m8 na którym chcesz to zrobić i czy na pewno poprawnie ustawiłeś w nim fusebity po drugie, czy przypadkiem nie mylą ci się totalnie nazwy bitów bo w przykładach wyżej używasz np bitów CS02 i CS00 dla Timera1 (teoretycznie mogą akurat pasować ich pozycje ale jeśli takich literówek...
NIe możesz tak manewrować ciągle rejestrem UDR. Skopij UDR w przerwaniu raz do jakiejś zmiennej , a potem używaj już tylko tej zmiennej.
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...
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...
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=...
Stąd, że porty D2 i D3 są portami dedykowanymi do wprowadzenia zewnętrznych przerwań. Spójrz datasheeta megi8.
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...
Tak poza tematem, czy to sie nie pisze "Load Timer0, 100" ? i zrob timer0=cos na starcie i w przerwaniu.
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.
Na przykładzie timera0 ;wektory przerwań .org 0x00 rjmp reset .org 0x09 rjmp przerwanie_timer0 reset: .def acc = r16 .def maska = r17 ;### START TIMER0 in acc, TCCR0 ldi maska, 0b00000111 ; 3 ostatnie bity to ustawienie preskalera or acc, maska out TCCR0, acc in acc, TIMSK ldi maska, 0b01000001 or acc, maska out TIMSK, acc ; odblokowanie przerwania...
[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.
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...
"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) ; ;)
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.
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...
Co wywołuje fizycznie przerwanie?
Ja bym zrobił na przerwaniu + timer.
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ń.
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...
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ś...
a jak dziala w "realu"? a powiedz mi jeszcze skad wiesz ze on wywoluje przerwanie co 1s?
Problem dla mnie pojawił się ze zrozumieniem wektorów przerwań które obsługują timer1. W dokumentacji jest tabela na stronie 46 W czym problem? Jak korzystasz z przerwania np. Timer/Counter1 Compare Match A czyli przerwanie w momencie gdy zawartość licznika (TCNT1) zgadza się z tym co wpisałeś do OCR1A to jeśli wcześniej w TIMSK ustawisz odpowiedzialny...
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ć...
Włączyłeś przerwanie od "Timer Compare" (OCIE1A) które nie jest obsłużone.
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ć...
http://www.edw.com.pl/ftp/kalkavr.zip
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...
Coś ze stosem może masz zamieszne.
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.
zobacz tu: http://mikrokontrolery.net/avr_c_06.htm
W takim przypadku serwa wyłączają się w odpowiednim momencie, ale problem jest gdy maja zostać uruchomione. Często udaje się to dopiero przy trzeciej, czy czwartej próbie Zatem kolega ma jeszcze jakieś błędy w pozostałej części programu. Zmiana stanu zmiennej jazda dokonuje się w jednym miejscu: jazda ^= 1; Brak przesłanek by zmiana 1->0 była dokonywana...
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...
Te 960 taktów nie musi być zmarnowane. Równie dobrze możesz ustawić timer i dalszą transmisję inicjuje jego przerwanie. Co do glitcha to też nie wiem jak AVR sobie poradzi. PIC łykał bez problemu. Trzeciego zarzutu nie rozumiem. On nie ma nic wspólnego z proponowaną metodą Zwróć uwagę, że ja także podaję to jako alternatywę nie krytykując Twojego rozwiązania....
Jeszcze trzeba wykonać sei(), aby odblokować globalną flagę zezwolenia na przerwania - bez tego twój ISR się nie wykonuje.
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...
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ę...
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?
Nie to przerwanie. Zobacz na mój post wyżej. Ma być przerwanie overflow a nie compare A.
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?
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...
Dokladnie, musisz ustawic stos. U mnie struktura wygladala tak .include "m8def.inc" .org 0x00 rjmp reset RESET: ldi R16,low(RAMEND) out SPL,R16 ldi R16,high(RAMEND) out SPH, R16 main: rjmp main
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.
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);
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...
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 >...
To co napisał kol. Krauser jest bardzo istotne, ponieważ włączasz przerwanie od porównania (1<<OCIE1B), a nie masz funkcji jego obsługi, co de facto powoduje skok do adresu 0000h, czyli rozpoczęcie działania programu od początku.. Drobna uwaga do komentarza: [syntax=c]TCCR1B |= (1<<CS12)|(1<<WGM12) ; // prescaler 512[/syntax] W Atmega8...
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 -...
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...
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.
.... problem wynika z tego, że pin powinieneś podciągać do vcc, inaczej cały czas masz stany nieustalone czyli dodaj do inicjalizacji: DDRD &= ~(1<<PD3);//pin jako wejście PORTD |= (1<<PD3);//podciąganie wewnętrzne
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...
Wojtek - wchodzisz tutaj: [url=http://www.frank-zhao.com/cache/avr... z kalkulatorem 16MHZ z preskalerem 1024 oznacza że: - 1 sekunda nastąpi po 15625 cyknięciach timera - przerwanie następuje przy przepełnieniu jeśli wybierzesz OVERFLOW, ale może tez nastąpić przy COMPARE, od tego zależy jaką wartość wpiszesz do timera (czy odejmiesz...
Czy przy kwarcu masz prawidłowo kondensatory do masy? Czy w ogóle masa nie jest w którymś miejscu przerwana?
Odnalazłem problem a powód był taki iż nie wyzerowałem flagi INTF0 od int0 Nie wystarczy wyłączyć przerwanie.
http://www.nongnu.org/avr-libc/user-manu... O to chodzilo ?
Na przerwaniu zewnetrznym!
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.
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...
strstr poda ci wskaźnik na pierwszą pozycję RING. Jeżeli chcesz dalej przeszukiwć to robisz buffor+offset i daje szukasz. Jak znajdziesz to znowu zwiększasz offset. Np: char *s; char offset; offset=0; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; offset=pozycja; s = strstr(bufor+offset, szukany_łańcuch); pozycja=s-bufor; itd :) Dodano...
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...
...Symulator pokazuje 1us a mi sie wydaje ze 10us. W tym wypadku , uwierz symulatorowi ;) Piotrek
Przy puszczeniu raczej o drgania nie musisz się martwić jedynie przy naciskaniu. Możesz np takie coś dodać: http://obrazki.elektroda.pl/6737702800_1... I wtedy masz sygnał wciśnięcia klawisza (któregokolwiek) i odpada skanowanie cały czas (wykrywasz zbocze opadające na tym pinie czekasz 20ms jeśli dalej jest 0 to sprawdzasz który klawisz...
Raczej jednak w przerwaniu bo zabezpiecza to przed zgubieniem impulsów. Dodano po 1 W przerwaniu od jakiegoś licznika oczywiście
atmega8 przerwanie bascom atmega8 timer0 przerwanie atmega8 przerwanie timer
skuter bassa potencjometr liniowy logarytmiczny zasilacz anteny televes
kamera cofania alternator rozładowuje akumulator
Whirlpool ADG875 - Błąd F6 E4 - Przyczyny i Naprawa Silnik i bateria do hulajnogi elektrycznej 50 km/h