Koledzy dzięki za odpowiedz. Zdecydowałem się na programowy PWM i teraz mam jeszcze jedno pytanko. Timera0 używam do generowania przerwań typu 100ms ,500ms,1s itp Oraz wykorzystuje timer1 do PWM. Jeśli instrukcję od programowego PWM wrzucę do Timera0 to wydaje mi się że rozsypią czasy przerwań czy dobrze myślę? Więc jedyna najsensowniejsza opcja to...
Witam. Problem raczej jest w obsłudze przerwania. Są za szybkie. Przerwania nakładają sie na siebie czyli zanim zakończy sie obsługa, timer wywołuje ponownie. Najlepiej w podprogramie obsługi przerwania na początku zatrzymaj przerwania a na końcu podprogramu wznów przerwania. Krzysztof
- czy praca równoległych timerów nie będzie jakoś na siebie wpływać (program przerywa pracę na skutek działania timera1 by precyzyjnie wyznaczyć czas, a tu w tym samym momencie dochodzi kolejne przerwanie od innego timera, i co wtedy) Timery działają niezależnie, ponieważ realizowane są sprzętowo. Nie będą na siebie wpływać. Program niestety (w tym...
Musisz zaznaczyć cały tekst który chcesz pokazać jako kod, a następnie zaznaczyć napis Code $regfile = "attiny2313.dat" $crystal = 8000000 'kwarc 1MHz $prog &HFC , &HE4 , &H9F , &H00 ' generated. Take care that the chip supports all fuse bytes. Config Timer1 = Timer , Prescale = 64 'timer1 jako licznik 15536 Config Int0 = Rising 'detetor zera...
Kuniarz , Jeszcze tylko spytam - czemu w obsłudze przerwania włączasz przerwanie timera i zaraz potem znów je wyłączasz? Nie lepiej wyłączyć na samym początku i włączyć na samym końcu?
albo wykorzystaj timer uC zamiast przerw
Do drasmen: jeżeli chcesz aby układ zadziałał musisz przestawić fuse bity na wew. generator np. 8MHz a do pinów gdzie podłączasz kwarc musisz wpiąć kwarc zegarkowy 32.768kHz. Program dla autora tematu: 'Program wykorzystujący przerwanie od timera0(8 bitowego) generowane co 8ms 'jeżeli przerwanie zostanie wywołane 125 razy, otrzymamy 1 sekundę...
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...
Hehe... no to następny pomysł - a jak szybko obraca się pętla główna programu? Nie wiem jak masz skonstruowany program, czy w ogóle jest? Dużej precyzji czasów chyba nie potrzeba, nie ma różnicy, moim zdaniem, czy przytrzyma się przycisk 1s czy 1,1s, więc może ten pomysł wsadzić do pętli głównej i bez przerwań. Wtedy w zależności od szybkości pętli...
Oto prosty przykład: $regfile = "m8def.dat" $crystal = 4000000 Config Timer1 = Pwm , Prescale = 1 , Compare A = Disconnect Compare1a = 32768 On Compare1a Oc1a_int Enable Compare1a Enable Interrupts Do nop nop nop nop Loop Oc1a_int: nop nop nop Return Reszta opisana w Helpie :wink: Piotrek
Wklep na początku przerwania : Enable Interrupts Wywnioskowałem to z pomocy bascoma (polecenie on Interrupt)
Program się zawiesi bo na czas zapisu program jest zatrzymywany w pętli oczekującej na zakończenie zapisu (tak robi BASCOM a domyślam się że mówisz o BASCOMowej funkcji zapisującej a nie jakiejś własnej). Kolejne przerwania od Timera będą wywoływane tuż po poprzednim a więc program główny będzie praktycznie stał w miejscu. O zajeżdżaniu pamięci EEPROM...
Tak po pierwsze to przerwanie masz domyślnie wzbudzane stanem niskim, czyli przerwanie wywołuje się W KÓŁKO dopóki na pinie panuje stan niski. Musisz je ustawić tak, by reagowało na zbocze (w Twoim przypadku opadające). Poza tym jak pisał (at)emarcus - cały program jest pisany bez zastosowania się do jakichkolwiek dobrych nawyków, a i jak widzę wiedza...
Ale która konkretnie, czy Enable interrupts, czy Enable Timer0, czy oba na raz? Moim zdaniem to kolejny bug bascoma, znów może jakieś pokręcone rejestry, itp. Dokładnie problemu zidentyfikować nie mogę, bo takich procesorków nie mam, ani czasu tez zabardzo na takie badania. Jedyne co mogę doradzić to: a) zrobienie własnoręcznie przejściówki m8515/m32...
Najpierw dajesz Config INT0=Falling Wprowadzasz zmienną opisującą wybrane zbocze wyzwalające przerwanie (Edge_) i w procedurze obsługi tego przerwania: If Edge_ =0 Then Start Timer1 Config INT0=Rising Else Stop Timer1 Config INT0=Falling End If Niektóre AVR'y umożliwiają konfigurację typu Config INT0= Change Wtedy przerwanie wywoływane będzie po stwierdzeniu...
Ten sam kod, który zaprezentowałem w pierwszym poście , natomiast przerwanie wywołane już na nodze portb.0 i działa zmienna nie jest nadpisywana. Cała reszta kodu bez zmian poza zmianą przerwania. Przerwania skonfigurowane prawidłowo. Moze przerwania masz skonfigurowane prawidlowo... ale..... Czy mozesz wyjasnic w jakim celu, w obsludze przerwania...
Nie wiem jaki jest twój kod w bascomie ale timer i uart to są sprzętowe zasoby specjalnie wydzielone do swoich celów więc nie powinny się zakłócać. Pytanie co masz w przerwaniu timera?
Po Config Timer0 wpisz dodatkowo TCCR0 = 4 Config Timer0 = Timer , Prescale = 256 Tccr0 = 4 Tylko musisz coś zrobić z START TIMER0 i STOP TIMER0 bo one przywrócą wartość po CONFIGu i program dalej nie będzie działał. Najprościej będzie usunąć te instrukcje. dodano 20 Sie 2008 08:05 Mail z opisem błędu poszedł już do MCS Electronics. Zbaczymy jaka będzie...
Akurat ważniejszy jest mały spadek napięcia, żeby stan niski pozostawał niskim również za diodą. Zrobiłem szkic pokazujący o co chodzi w tym różniczkowaniu i ANDowaniu: http://obrazki.elektroda.pl/7732349900_1... Przy zwykłym różniczkowaniu widać, że brakuje szpilki wskazującej początek impulsu pierwszego kanału. Można ją odtworzyć...
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...
Witam. Zapis (składnia) Load Timer1 jest zły. Sprawdź w pomocy Bascoma.
Wyrzuć obsługę LCD z przerwania, wyświetlanie wykonuj tylko w pętli głównej. W przerwaniu zmieniaj dane, które mają się wyświetlać i ewentualnie ustawiaj jakąś flagę, która da informację w pętli, że trzeba wyświetlić nowe dane. Przerwania powinny trwać jak najkrócej, wstawianie tam wyświetlania LCD, waitów itp. jest złym pomysłem.
Zadeklarowałeś "Zmianna" a przypisujesz "Zmienna". :) Edit: Wyjście z procedury obsługi przerwania wykonuje się za pomocą Return a nie Goto Glowny ! Resztę błędów znajdziesz sam. :)
... Co jest nie tak? Grzech stary jak AVR-y :D Zmień w kodzie Pinb.1 na Portb.1 i pomyśl ;) Piotrek
Kolego patrzę na ten kod ze zgrozą, ale załadowałem do swojego Bascoma i trochę więcej zrozumiałem bo mozna sprawdzać referencje i skakać po kodzie. W przerwaniu co osiem taktów (nierealne) timer ma zliczać te twoje "niby" OCR. (Incr Licz_timera1 : If Licz_timera1 >= Ooo Then) Te OCR jest ładowane z tabeli gdzie najmniejsza wartość to 127 a najwieksza...
Spróbuj skompilować ten programik pod konkretny mikrokontroler. W Bascomie domyślenie masz ustawione AT90S2313. Użyj dyrektywy: $regfile = "m8def.dat" - dla ATMega8, $regfile = "2313def.dat" - dla AT90S2313, Może pomoże :)
dobrze, a nie lepiej w przerwaniu napisać warunek, że jeśli zmienna bitowa równa się jeden to robi to a jeśli nie to tamto końćząc podprogram1 zrobisz SET tej zmiennej a kończąc podprogram2 RESET :D
trochę mały ten preskaler.
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ź.
OPIS FUNKCJI LOAD Action Load specified TIMER with a reload value. . . . It will do the calculation. (256-value) So LOAD TIMER0, 10 will load the TIMER0 with a value of 246 so that it will overflow after 10 ticks. TIMER1 is a 16 bit counter so it will be loaded with the value of 65536-value. Czyli u ciebie ładuje 65536 - 65436 = 100 Przepełnienie właśnie...
Nic nie trzeba informować kompilatora - Bascom ładnie przyjmuje wprost rozkazy asemblera ale w zasadzie atom1477 zrobił to nawet bez asemblera - sorki - po prostu "ręcznie" odwołał się do rejestrów i wpisał do nich odpowiednie wartości tzn poustawiał bity tak żeby coś tam działało w tym przypadku co ja ci podałem trza by to było mniej więcej zrobić...
...Dlatego myślałem że mam gdzieś błąd w programie. pozdrawiam Nie zdawaj się nigdy na symulator Bascoma , bo on często fiksuje :) Steruj silnikiem w przerwaniu Timer0 , a problemy z szarpaniem znikną. Również przerwanie Timer2 , jest zbyt częste i zabiera procowi gro czasu. Piotrek
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...
Zliczaj przerwania timera co odpowiedni odstęp czasu. Po 59 zliczeniu przerwij generowanie i wyzeruj timer. pozdrawiam
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...
tzn że jak licznik się "przerwie" to załaduje w siebie zero i napewno nie będzie to chodziło jak ma tj co 1 sekunde. ZbeeGin napisał o czym zapomniałeś.
Emarcus on liczy przepełnienia timera, który generuje przerwania, co 4ms i coś tam robi w przerwaniu. Ostatnia linijka postu, który cytujesz.
Zakres liczenia 16-bitowego timera przy zegarze 16MHz i prescalerze=1 to nieco ponad 4ms. Jak chcesz tym zmierzyć czas, który przy 5000obr/min wynosi ok. 12ms.?
Ż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...
Buforuj otrzymane znaki i przetwarzaj w procedurze pętli głównej programu. Oczywiście wiąże się to z wywaleniem wszelkiej maści form kodu blokującego procesor i oparciem odliczania czasu o Timer.
Dla kwarcu 4MHz jest to prescaler 64 i początkowa wartość licznika: 193 Dla kwarcu 8MHz prescaler to: 64 i początkowa wartość licznika: 131 To pokazuje kalkulator. Chciałoby się zakrzyknąć : a nie mówiłem :-P Aby wpisać do Timer2 początkową wartość, to używamy poleceń: TCNT2=początkowa_wartosc Timer2= początkowa_wartosc Counter2=początkowa_wartosc...
Ja bym zrobił na timerach, no bo po co zajmować procesor zapętlonym zadaniem. Ideą wielozadaniowości jest taka konstrukcja programu, tak by nie pracował w bezsensownych pętlach, kiedy może tylko sprawdzić czy wystąpiło zdarzenie (event) i przejść do następnego zadania.
Tak, będziesz mógł. Jeśli chcesz liczyć w czasie (a nie chcesz) to mierzony przebieg doprowadzasz do wejścia zegarowego timera, w efekcie każdy impuls powoduje zwiększenie wartości licznika o jeden. Skoro chcesz mierzyć szerokość impulsu to wykorzystujesz wejście ICP timera - timer taktujesz z maksymalną częstotliwością, z kolei impulsy z obrotomierza...
wynik końcowy faktycznie za każdym razem jest inny. (at) emarcus możesz podpowiedzieć jak powinien wyglądać serwis int1? Popatrzyłem troche bliżej na twoj kod. Z jakiego powodu potrzebujesz otrzymać wynik ("Czas_2") z dokładnocią aż do 9 miejsc decimal? Jeżeli jeden z czynników iloczynu (rozdzielczość timera) jest liczbą wymierną z dokładnościa do...
A gdybym tak zrobił te piknięcia i przerwy między nimi za pomocą tych zwykłych waitmsów, tak aby było mega prosto a stan przycisków odczytywał po prostu w przerwaniu od timer-a czy dało by radę takie rozwiązanie?
Załóżmy że chcesz uzyskać 100Hz. Procesor kreci się na przykład 8MHz. Timer napędzany jest sygnałem takim jak procesor, ale można ten sygnał podzielić tak żeby, na przykład co 1024 takty procesora do Timera trafiał jeden takt. Taki podział uzyskuje się za pomoca preskalera. Teraz wiadomo że Timer jest już taktowany wolniej bo co 1024 takty z 8MHz, ale...
Mnie uczono, że w przerwaniach najlepiej umieszczać jedynie ustawianie flagi, a jego obsługę w pętli głównej (pracującej z max. częstotliwością). Może spróbuj takiego rozwiązania, bo bez kodu źródłowego ciężko coś więcej doradzać.
Nie wiem czy chcesz się nauczyć czy potrzebujesz program. Na początek te uwagi: 1. Nie wiem co tam robi dyrektywa $eeprom. Jest niepotrzebna w tym kodzie 2. Zmienna Ds jest zwiększana w przerwaniu niezależnie od tego czy jesteś w Menu czy nie. Tak więc po powrocie z Menu już na pewno nie zdążysz załapać się na warunek If Ds = 2 i wyzerować jej wartość....
A może wyłumaczyć mi ktoś tak jaśniej niż whelpie bascoma ;) co to jest ten prescaler i co on dzieli. Może tak po kolei jak twój program widnieje: 1. Jeżeli PORTB jest przeznaczony do obsługi LCD to nie konfiguruj go w ogóle w stylu jaki podałeś w pierwszym poście. Config Portb = &B11111111 : Portb = &B11111111 ===> źle!!! Może to powodowac zakłócenia...
Mam problem jestem początkujący napisałem program który ma za zadanie regulować włączanie wiatraka i czas z jakim ma dmuchać , jednocześnie mierzy temperaturę i nie działa tak jak powinno : Temperatura pokazuję co jakiś czas błędny pomiar np 124 , 32 , 98 procek się resetuje chińskie znaki raz na jakiś czas w programie można było ręcznie zmieniać czas...
A niby czemu ma program skakać do procedury obsługi przerwania od przepełnienia? Przecież on się nie przepełnia, tylko po doliczeniu do wartości OCR lub ICR , natychmiast się zeruję ( przy okazji może ,ale nie musi zmieniać stan pinu OC). Musisz uruchomić przerwanie od tego właśnie porównania - czyli od Compare, tak jak wspomniał kolega wyżej. Tylko...
Przerwanie miałbyś z częstotliwością 32000Hz(8000000/250), gdybyś tylko przeładowywał Timer w przerwaniu. [syntax=basic4gl] Prztimer1: Load Timer1, 250 '<----- w tym miejscu na przyklad Incr Licznik If Licznik > 100 Then Licznik = 0 End If[/syntax]
W obsłudze przerwanie Timer1 zrób tylko ustawianie flagi, a załączanie i całą resztę przenieś do pętli głównej, właśnie tu sprawdzające stan tej flagi. Zamiast grzebać programowo W Timer1, wykorzystaj możliwości Timer1 compare, np w trybie PWM, bez używania przerwania. Ogólnie polecam : http://www.easy-soft.tsnet.pl/modules.ph...
Jeszcze po odblokowaniu przerwań dopisz Start Timer0 .
dlaczego nie działa pod bascom avr????? $crystal = 16000000 Config Timer0 = Timer , Prescale = 8 Load Timer0 5 On Ovf0 Przerwa Dim G As Integer Enable Timer0 Enable Interrupts Start Timer0 G = 0 Do Loop Przerwa: Load Timer0 5 Incr G Print "przerwa" Print G Return
Instrukcja Wait nie stopuje procesora. Procesor odlicza czas poprzez zmianę wartości rejestrów a więc działa. A skoro działa to powinien także odczytać informację, że nastąpiła sygnalizacja od przepełnienia Timera. Spróbuj zastosować tą instrukcję. Tylko nie wywołuj jej w obsłudze przerwania a w pętli głównej. Bo gdybyś wywołał jej obsługę w przerwaniu...
rozne serwa roznie moga dzialac. Nigdzie nie widzialem, zeby ktos okreslil dokladna czestotliwosc z jaka to ma byc robione.. zazwyczaj jest ok. 50Hz. Drobne roznice typu kilka Hz (czyli kilka ms wywolywanie przerwania) nie powinny miec zadnego wplywu na serwo. Problem moze sie zaczac jak bedziesz mial dlugie funkcje wywolywane przerwaniami... ale na...
Należy: - zadeklarować zmienną globalną np. LICZNIK i nadać jej wartość zera, - włączyć przerwania od przepełnienia Timer0, - w funkcji przerwania należy zwiększać wartość zmiennej LICZNIK o jeden Aby poznać liczbę impulsów wystarczy pomnożyć LICZNIK*256 i dodać do niego aktualną wartość rejestru licznika timera, czyli jak sądzę counter0 (nie znam BASCOM).
Generalnie, W Bascomie obsługa RC5 pozostawia wiele do życzenia dlatego też Mark w najnowszej wersji ma wprowadzić obsługę RC5 na przerwaniu ICP ("prawdziwie" w tle) według poniższego kodu, który udostępniam i polecam: [syntax=basic4gl] $regfile = "m8def.dat" $crystal = 8000000 Config Timer1 = Timer , Capture Edge = Falling , Prescale = 8 '1 tick= 1...
Może: Licz: If Co_robic = 0 Then 'Odliczanie przerwy Incr Licz_przerwe If Licz_przerwe > 1000 then Licz_przerwe = 0 Co_robic = 1 End If Else Incr Licz_impulsy If Licz_impulsy > 4 Then 'Odliczanie okresu przebiegu (4 - okres = czas 4 przerwań Timera) Toggle PortD.4 Incr Licz_przerwe 'Odliczanie ilości impulsów (10/2 = 5 impuslów)...
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 >...
No przecież prosto. Konfigurujesz timer1 do pracy w normalnym ale nie robisz start timer. robisz przerwanie dzialajace na zbocze np. narastające-> Dalej : robisz zmienną flaga w przerwaniu robisz if flaga=1 then start timer1 flaga=0 else stop timer1 w rej od timera masz czas... kopiujesz gdzie Ci tam pasuje flaga=1 zerujesz licznik endif I tyle, oczywiście...
Ok, Rozumiem, ale po pierwsze: polecenie bitwait musi być aby zmierzyć szerokość impulsu. Po drugie: działało bezproblemowo gdy był tylko jeden licznik (jedno przerwanie). Program wpadał w jeden z dwóch stanów, gdy X2>1,5ms lub gdy X2<1,5ms. Co jest nie tak, co źle napisałem ?
Proponuję następujące zmiany: Dla zegara 8MHz Config Timer0 = Timer , Prescale = 8 wtedy jeden cykl = 1us - łatwo się liczy. Następnie w przerwaniu: Przerwanie: Timer0 = Timer0 + 213 If Flaga = 1 Then Toggle Portc.7 Else Portc.7 = 0 End If Return Dalej w podprogramie "Send_transmit" zamiast: Portc.7 = 1 napisz: Flaga = 1 a zamiast: Portc.7 = 0 napisz:...
Witam potrzebuje zrobic program ktory bedzie w odpowiednich odstepach czasu wywolywal przerwanie i w tym przerwaniu bede sobie mogl wykonywac dalsze funkcje problem w tym ze nie dizala mi taki najbardziej podstawowy program Symuluje to w proteusie i nie chce zapalac pinub.1 chodzi mi o taki test powinna sie pojawic 1 na pb.1 przy wywolaniu przerwania...
Zrób to tak: [syntax=basic4gl] $regfile = "m8def.dat" $crystal = 4000000 Config Timer0 = Timer , Prescale = 256 'onfiguracja timera, przescaler 256 On Timer0 Odmierz_1s 'włączamy timer0 Dim Licz_8ms As Byte 'definiujemy zmienną pomocniczą Dim Sekundy As Byte Enable Interrupts 'włączamy zezwolenie na przerwanie Enable Timer0 Load Timer0 = 125 'ładujemy...
w przypadku nadajnika nie mogę wykorzystywać WAITów bo wtedy będzie przerwa w programie i stanie wyświetlacz na którym jest widoczna aktualna temperatura. Z tego też powodu wykorzystuję timer.
Zapalasz: „Set Led” Gasisz: „Reset Led” Cała linia odnośnie przerywania i PWM też jest nie potrzebna (Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down). Złap jakąś książkę z BASCOM-em naprawdę się przydaje, albo przynajmniej jakiś porządny kurs będziesz łykał co do czego ;)...
Ja się tam na BASCOMie nie znam, ale ten program to wyglada mi na generator liczb pseudolosowych ;) Weź się skup i zastanów co chcesz uzyskać. Kompletnie nie rozumiem, co Ty robisz z tym T. Co to ma reprezentować? Podpowiem, że jeżeli chcesz wyświetlić liczbę X z zakresu 0..99 na swoim wyświetlaczu, to byłoby to chyba coś takiego (zakładając, że wyświetlacz...
Sygnał o którym napisałeś można generować nie tylko korzystając z timera . Można również zrobić to programowo. Z tego co napisałeś jest to sygnał sterujący do serwomechanizmów modelarskich Od 1 do 2 ms i przerwa 20 ms . Bascom z tego co pamiętam ma coś gotowego w stylu config servo ... Jeśli chcesz zrobić to za pomocą timera lepszym rozwiązaniem jest...
Prawie wszystko jest nie tak - oczekiwanie w przerwaniu, brak eliminacji drgań. To nie tak się robi - potrzebujesz przerwania timera zgłaszanego ze stałą częstotliwością, np. 100 Hz, i w nim robisz wszystko - sprawdzasz stan przycisku i odmierzasz czasy impulsów.
W trybie 1 jest 16-bitowy, liczy od zadanej mu wartości do 65536, następuje przerwanie od przepełnienia licznika, coś wtedy może zrobić w obsłudze tego przerwania i ponownie zaczyna zliczać od zadanej mu wartości lub od zera jak mu nie zadasz.
hmmm Przede wszystkim: Enable Interrupts On Timer0 Przerwanie Stop Watchdog Config Timer0 = Timer , Prescale = 1024 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 256 'PWM=250Hz Load Timer0 = 195 To włączenie przerwania jest wstrętne w tym miejscu:P Co do wniosków... może spróbuj zwiększyć stos o...
Ha ! no to przynajmniej wiemy, że to nie jest bug Atmela. A było takie podejrzenie? Nono Ja uważam, że należy obsługiwać ADC w przerwaniu ADC w takim przypadku. Czytanie odpalaj konwersję w przerwaniu timera ale czytaj w przerwaiu adc.
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...
Witam. Mam problem z zawieszaniem się programu po kilku kilkunastu sekundach i nie wiem o co chodzi. $regfile = "m32def.dat".dat " $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config 1wire = Porta.4 Config Portc = Output Deflcdchar...
Nie napisałeś , że ten pilot nie pracuje w kodzie RC5 , ale też nie napisałeś , że w tym kodzie pracuje :wink: Inna wersja Twojego programu: $regfile = "m32def.dat" $crystal = 8000000 '11059200 Dim Adress As Byte , Command As Byte , X As Byte , Tmpcode As Word Dim Odebrano As Bit , Flaga As Byte Config Pind.2 = Input : Portd.2 = 1 Config...
Witam. Apropo 3. żeby TSOP działał poprawnie, sygnał nadawany w podczerwieni musi mieć przerwy, np. 10 impulsów, przerwa o długości 10 impulsów (10 to minimum). jak to zrobić programowo? po przez timer ctc sie nie da przerwan zrobic. Tylko w czsie przerwy nie moze sie zaswieca dioda
Nie bardzo mam teraz ochotę zgłębiać kod ponownie, ale pamiętam że w Twojej wersji Timer odmierzał czas 20s i kiedy nadszedł czas to w przerwaniu mierzył temperaturę Dallasem DS18B20 i w dodatku pisał od razu po wyświetlaczu :D Dlatego jedną ze zmian było to, że Timer tylko ustawia flagę by dokonać pomiaru i go wyświetlić. Tak więc dopóki nie jesteś...
Jak użyć timera (tzn. jak wyciągnąć z niego np zmienną dodawaną, lub resetowaną co określony czas?) Boję się jeszcze TIMERów :) Nie ma się czego bać. Oto prosty programik, który na pewno pomoże. 796182 Jednak dziwię się dlaczego nie używasz sprzętowego PWM. Attiny 2313 posiada ich cztery. Na każdym z timerów po dwa. [syntax=vbnet]Dim R As Integer Dim...
Można toggleować ale nie skrócisz cyklu timera do tych 4ms, to musi być wykonane poprzez ocr2a, ewentualnie zerujesz programowo w przerwaniu od ocr2b. To z tym read only musi być błędem, w datasheetach też się takowe zdarzają
Zawsze jak wchodzisz w przerwanie np.On Timer lub w podprogram sub procesor odkłada zawartość pewnych rejestrów na stos (co zajmuje mu ileś us) a po przerwaniu (lub sub-ie) zdejmuje ze stosu (co znowu zajmuje czas). Rachunkowo wygląda wszystko dobrze w programie-ale tylko gdy procesor chodzi z nieskończoną prędkością. A chodzi ze skończoną. A-w tych...
Wejdż na www.elportal.pl >bascom a tam jest znakomity help w naszym rodzimym języku w którym to zagadnienie jest opisane . Polecam również kalkulator do obliczania czasu pomiędzy przerwaniami - do pobrania w/w linku. Pozdrawiam. Waldek.
napisałem program do obslugi klawiatury i cos mi nie chce działac nie wiem dlaczego wyglada to mniej wiecej tak: dim zmienna as byte config portd.0 = input set portd.0 'wlaczenie podciagania config timer0 = timer, prescale = 1024 on timer0 klawiatura enable interrupts enable timer0 do (program glowny) loop klawiatura: if portd.0 = 1 then incr zmienna...
Tak poza tematem, czy to sie nie pisze "Load Timer0, 100" ? i zrob timer0=cos na starcie i w przerwaniu.
waitms zdaje się korzysta właśnie z tego timera więc dlatego może masz ten problem. Spróbuj sobie wrzucić obsługę wyświetlacza w timer1 i wtedy waitms będzie może działał dobrze pozdrówka Robię to na Attiny 26L, wg pdfa on ma dwa timery. Być może ten drugi jest jakiś specjalny, póki co w programie po prostu pozmieniałem "timer0" na "timer1" i niestety...
Proszę bardzo. Napisany w 20 minut więc błąd mógł się wkraść. Timer co minutę daje znać i wtedy odliczane są minuty do włączenia bądź wyłączenia wentylatora. Przyciski są dwa. Kiedy naciśniesz jeden z nich to od razu powinien włączyć się wentylator (można w ten sposób zawsze wymusić start wentylatora). W programie u góry podaje się czasy wyrażone w...
Przeglądając Twój program mam takie małe spostrzeżenie, a mianowicie w pętli głównej masz wywołaną procedurę Gettime - ' Call Gettime' - która działa na I2C. Co się stanie gdy podczas wykonywania procedury Gettime zostanie zgłoszone przerwanie od Timer'a?? Program przerywa wykonywanie procedury Gettime i skacze do obsługi Timera a tam jest wywoływana...
Aby w programie zdeklarować rezonator na początku kodu wpisz np. $crystal = 1000000 ( dla 1Mega)
To nie Bascom jest przyczyną tylko źle napisany program ;). 1. odczyt timera1 16bit odbywa się po przez rejestr pomocniczy TEMP, ten rejestr jest też używany przez inne procedury i funkcje i jeśli jest użyty to właśnie niszczona jest wartość High timer1 bo ona tam jest wpisana gdy używasz komendy. wpisując tak timer1 do tablicy możesz gubić High timer1....
Witam, pozwoliłem sobie na drobną modyfikacje Twojego kodu. Dobrze się przyglądnij, porównaj działanie w symulatorze a zobaczysz gdzie jest błąd. Powodzenia!!! $regfile = "m8def.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5 Config...
Przerwanie jest 4 razy na sekundę W ciągu 7 minut jest 420 sekund czyli w sumie 1680 przerwań Zmienna jest typu bajt także przepełni się 6 razy Zostaje od 1680-1530=150
Witam ! Obliczenia źle oraz pewnie źle ustawione fusebity (pewnie default - 1Mhz internal rc). Instrukcja Load jako parametr ma po ilu impulsach ma wystąpić przerwanie, więc powinno być 625, ale że pojedyńcza połówka przebiegu sieci trwa nie 20ms a tylko 10ms więc powinno być 312,5 :D. Więc lepiej chyba prescale = 64 i load timer1, 1250. Pozdrawiam...
Tlumaczylem, ze restart bedzie tylko raz mozliwy, w petli programu. Nie napisales jasno, ze ma byc w kazdej chwili. Moze jutro ci wlepie kawalek kodu. ________________________________________... CONFIG INTx = LOW LEVEL On Intx Przerwanie Enable Interrupts do loop:end Przerwanie: disable intx '.... tu reset '.... enable intx Return...
ok. już kumam. ale mam problem. nie wiem jak ustawic licznik 16bit. chcę mierzyc czas miedzy przerwaniami ale timer dochodzi do 255 i sie zeruje i zaczyna od nowa.
Witam. Mam nastepujacy problem... napisalem programik generujacy przerwania od przepelnienia licznika. $crystal = 16000000 $regfile "m8def.dat" Config Portd.5 = Output Config Timer0 = Timer , Prescale = 8 On Timer0 Intr Enable Interrupts Enable Timer0 Portd.5 = 0 Do Loop End Intr: Load Counter0 = 5 Toggle Portd.5 Return Problem w tym ze...
Dawno Bascoma nie używałem ale to będzie coś takiego: On int0 czas 'przerwanie zewnetrze (wejście impulsów) do czestotliwosc=1/czas 'obliczenie czestotliwosci z czasu pomiedzy impulasmi loop czas: stop timer0 'zatrzymaj timer czas=timer0 'odczyt z timera timer0=0 'wyzerowanie timera start timer0 'ponowne uruchomienie timera return Oczywiście...
"Czy ktoś wie żeby przerwanie mogło zakłucać pracę 1wire?" Oczywiście że może jeśli wypadnie podczas transmisji danych z DS'a Przed każdą komunikacją z DS'em zablokuj przerwania. Np: Disable Timer1 a po komunikacji odblokuj Enable Timer1.
Nie jestem pewny czy procesor zdąży wykonać to co masz w tym przerwaniu , zanim przyjdzie następne (mam na myśli wszystko ).Program w przerwaniu ma być krótki , chyba że pierwsza linijka jest taka " Disable timer0 " , ale w twoim programie taka instrukcja raczej odpada. I jeszcze jedno , co się dzieje jeżeli podczas transmisji po i2c lub 1Wire przyjdzie...
Jestem nowy i nie wiem czy dobrze myśle (BASCOM8051)Rezonator standardowy 11Mhz konfig T0 ,włączenie przerwań itp.., a następnie on timer0 40khz load timer0 , 23 do loop 40khz: p3.0 = not p3.0 Dobrze czy zle ,pomóżcie :))
timer przerwa bascom bascom timer przerwa przerwa timer bascom
naprawa gniazdo procesor honda civic civic hatchback antena offsetowa paraboliczna
zasilanie condor unitra regulowane obciążenie
Mercedes E-Klasa Coupe C238 – lokalizacja i rodzaje akumulatora pomocniczego, superkondensator Sagem DS86 stuck at BOOT: Power supply, NAND flash, or hardware fault?