Jakoś nie widzę żebyś tu korzystał z przerwania od Timera... Bo nie musisz ;p mogłbyś pokazać jakiś przykład obsługi przycisku w przerwaniu timera ? Nawet jakiś URL do innego projektu. Więc chyba oczywistym jest że ten fragment kodu należy umieścić w przerwaniu od Timera.
Zacznij od tego: funkcja wait i pokrewne PRZESTAŁY ISTNIEĆ. Do opóźnień i odmierzania czasu użyj timera i ogólnie poczytaj o timerach.
Nie ma problema. W przypadku kolejnych wątpliwości pytaj, ludzi życzliwych tu nie brakuje. PS Polecam na tym poziomie książkę: Marcin Wiązania "Programowanie mikrokontrolerów AVR w języku BASCOM" - dostępna w korporacji AVT. http://sklep.avt.com.pl/go/_info/?id=346...
Wklep na początku przerwania : Enable Interrupts Wywnioskowałem to z pomocy bascoma (polecenie on Interrupt)
Tak co jeden cykl. Prescale jest 64 wiec nie tu chyba problem. Nic sie nie dzieje na wyswietlaczu a w symulatorze tez nie pokazuje zmian zmiennych. To nie jest jeden cykl, ani też 64 jakby wynikało z podziału prescalera. Wszystko można odczytac w symulatorze, tylko musisz potrafic posługiwac się jego ustawieniami i funkcjami. Poniżej masz przykład...
Należało by jeszcze dodać iż nie wszystkie Timery są np 16 bitowe np. ATmega8535 ma 2 8 bitowe i jeden 16 bitowy. O tym ile i jakie Timery wyczytasz z noty katalogowej danego mikrokontrolera.
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...
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...
Pomysł jest straszny. Poczytaj o timerach.
A nie możesz wykorzystać zwykłego timera?
Jeśli wyeliminujesz drgania przycisku, to najprościej to zrealizować podając wyjście przycisku na wejście zegarowe jednego timera (bedzie on zliczał ilość wciśnięć), a drugi timer wykorzystać do odmierzania czasów 1s - dokładnie co 1 s należy kasować licznik pierwszego timera. Ot i wszystko.
Nie wiem jakiej wersji używasz. Poniższy kompiluje się na pewno w 2075 - specjalnie sprawdziłem :D [syntax=vbnet]$regfile = "m8def.dat" $crystal = 1000000 $hwstack = 40 $swstack = 16 $framesize = 32 '********* TUTAJ SOBIE USTAW JAK CI PASUJE ********** Pin_wyjsciowy Alias Portc.5 Przycisk Alias Pind.2 : Set Portd.2 Const 1_ilosc_minut_do_odliczenia...
Tyle że jak z bascoma jestem noga bo programuję pół roku i nie umiem skalibrować timera
Timer 0 w atmedze8 nie ma pwm. Powinieneś użyć Timera 2, czyli rejestrów TCCR2 i OCR2.
Doszedłem, że funkcja Getrtctime() resetuje mi układ. Wcześniej działała. Jaki może mieć związek z deklaracją timera?
Ten sposób już kiedyś sprawdzałem i działał. Pamiętam, że kod zwiększający/zmniejszający musiał być w podprogramach. Liczyłem, że da się to zrobić na flagach od Timer.
Timer0 w Atmega8 może pracować tylko w trybie OVERFLOW (przepełnienia).
Przykładów w necie jest od groma. Z częstotliwością co najmniej 50Hz musisz przełączać wyświetlacz i wartość podawana na niego. Najlepiej wykorzystać do tego przerwanie timera.
1) Portc.1 to jest wejście czy wyjście? Zdecyduj się w programie. 2) Gdzie w programie jest drugi pin wejściowy? 3) To co próbujesz zrobić z timerem nigdy nie zadziała prawidłowo. Nigdy IFem nie trafisz na odpowiednią wartośc timera
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.
A może na zakończenie przerwania załadować wartość do timera???
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.
Witam, przez 0.7 sekundy program nie widzi stanu pinów, wiec na nie nie reaguje. Proponuję dwa wyjścia 1) wstrzymanie również umieścić w warunku if pind.0=0 then portb.0=0 waitms 200 portb.0=1 endif 2) chyba lepsze: zastosować timer
Wystarczy jedno wejście I NTx , które będzie wykrywało ten impuls. Ale jeśli to będzie impuls "z ręki" jakiś klawisz to bez sensu - ze względu na drgania styków a potrzebny minimalny czas np 1ms. Jeśli to będzie impuls z jakiegoś wyjścia cyfrowego to ok. Założenia: - wykorzystamy tylko jedno wejście INTx - wykorzystamy tylko jeden Timer sprzętowy Przygotować...
Stosując polecenie Waitms nie moge uzyskać czasu opóźnienia mniejszego niz ok 10ms Więc go nie stosuj. Do tego są Timery.
Przepraszam że odkopuję ten temat ale chciałbym prosić o cały program do timera .
Mnie tak dokładniej chodzi o obsługę wartości wziętej z timera i odczytanie.
nic we fusebitach nie zmieniasz. Mozesz jedynie ustawic na wew. 8mhz. Moim zdaniem temat sie powtarza, wiec powinien wyladowac w koszu. Poszukaj w helpie config clock, albo jak chcesz sam ustaswiac timer to poczytaj o timerze 2 i jego trybie asynchronicznym (tez w helpie)
bascom
Sposobów znalazłoby się kilka, ale ja proponuję: Włączenie "generatora" [syntax=basic4gl]Config Timer1 = Timer , Prescale = 8 , Compare A = Toggle , Clear Timer = 1[/syntax] Wyłączenie "generatora", przez "odłączenie" wyjścia OC1A, od portu(pinu). [syntax=basic4gl]Config Timer1 = Timer , Prescale = 8 , Compare A = Disconnect , Clear Timer = 1 [/syntax]
Config Timer0 = Timer , Prescale = 64 On Timer0 Odmierz_1s 'podprogram wykonywany podczas wystapienia przerwania Dim Licz_8ms As Byte 'deklaracja zmiennej Enable Interrupts 'aktywacja globalnego systemu przerwan Enable Timer0 'aktywacja timera0 Counter0 = 131 'wpisanie wartosci początkowej do timera0 Dim Sek As Byte 'deklaracja zmienna zawierajaca...
64 takty to o połowę krócej. :) W każdym razie, rzeczywiście obsługa tego przerwania w asemblerze powinna się spokojnie zmieścić poniżej 2us. Ewentualnie można jeszcze dodać bramkę AND sterowaną z drugiego timera i załatwić to sprzętowo.
Po co to ? Config Rc5 = Pind.2 , Timer = 2
Czy to może być wina częstotliwości kwarcu ?. A gdzież tam kwarcu? :( ... tylko i wyłącznie programu. To może działać zupełnie swobodnie nawet bez kwarcu tylko na wewn. oscylatorze np 8MHz. Zobacz tutaj: http://mirekk36.blogspot.com/2011/09/fak... wprawdzie w nieco innym języku ale widać, że odczyt temperatury 1wire...
albo wykorzystaj timer uC zamiast przerw
Sprawdź na symulatorze w którym momencie się rozjeżdżają wartości badanej zmiennej i timera1 Możliwe, że ta pętla się wykonuje więcej razy, bo warunek stopu przeskakuje. Timer jest zwiększany asynchronicznie w stosunku do programu i program może przeoczyć moment gdy Timer=konkretna wartość, bo sprawdza Timer1 w przypadkowych momentach a nie po każdej...
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...
Z tego co porównuję z listingiem źródłowym z książki to masz kilka błędów: sprawdź: [syntax=basic4gl]Config Lcd = 16 * 2[/syntax] oraz umiejscowienie [syntax=basic4gl]Cls[/syntax] w pętli a u ciebie jest poza pętlą oraz wyrzuć konfigurację [syntax=basic4gl]Config Timer2 = Timer , Async = On , Prescale = 128[/syntax] sprawdź także ustawienia Fuse CKSEL3..0...
Jeszcze raz od nowa. Tym razem postaraj się bardziej. Ustaw wreszcie te przerwania INTx na jakieś zbocze, a nie poziom. Co z tego, że ustawiłeś Timer1 jako licznik jak nie ma to związku z resztą kodu. Timer sobie działa,a ja się pytam - i co z tego ? gdzie obsługa tego timera?
Zakładam, że będzie tylko wewnętrzny oscylator czyli 1MHz. Nie mieszam z fusami i zmianą częstotliwości bo nie mam o tym pojęcia. Powiedz mi jeszcze jak się liczy ten timer żeby liczył np. 5 sekund od jakiegoś zdarzenia np. pojawienia się stanu niskiego na pinie i po odliczeniu tych 5 sekund żeby wywołał jakieś inne zdarzenie np. włączenie led. Nie...
Osobiście wykorzystał bym nóżkę np. INT0. Wtedy wszystko dzieje się w przerwaniu, po za tym w zmiennej Counter1 masz twój wynik. Coś skąpą masz tę konfigurację timera :P
Nie przez 65536 tylko przez rozdzielczość timera np Pwm=10 wtedy f.procka/1024(rozdzielczosc pwm)/prescaler=f.PWM Przez 65536 dzielisz gdy obluiczas timer=timer a nie timer=pwm
uaktywnij przerwania i rozpocznij zliczanie timera i wyślij impuls na nadajnik, rozpocznij pętle i... koniec pętli. W obsłudze przerwania które wyzwoli powrót fali zrób takie coś, że ma zatrzymac timer sprawdzic jego stan, cos tam z tym stanem zrobic i wyzerowac timer. wysyłasz znowu impuls i rozpoczynasz timer i RETURN do loopa DO : LOOP i zmniejszyłbym...
Witam wszystkich znawców tematu oraz zainteresowanych. Ze jestem w sumie początkujący jeżeli chodzi o mikrokontrolery to prosze o nutę wyrozumiałości. Tworzę regulator ładowania akumulatorów z paneli fotowoltaicznych oraz w niedalekiej przyszlości innych źródeł... To w sumie już nie istotne jakiekolwiek bedzie to źródło ale tak czy siak spotykamy się...
Co jest nie tak ? Delikatnie mówiąc wszystko. 1 Timer nie wiem co liczy, cały jest źle napisany i nie powinien działać, bo np: przerwanie od timera powinno być zadeklarowane przed pętlą główną i nie w warunku. Zmienna Reload nie jest zerowana i zwiększa się do maximum typu Word Zmienna M (w zamierzeniu chyba od minut) też się zwiększa do 255 Zmienna...
W jaki języku poszukujesz, bascom czy C?
Szukałem tak jak mówiłeś ale timery ciężko jest zrozumieć, nie mam żadnej książki a kurs internetowy z którego się uczyłem programować był krótki i nie zawierał timerów :( . Może znasz jakiś artykuł o timerach dobry dla początkującego.
No tak, nie sprecyzowalem. Na razie efekt miał być taki że switch (PD.0) miał włączać timer. Docelowo będą dwa switche, jeden włącza (PD.0) a drugi wyłącza (PD. 1) timer.
delay w przerwaniu?! Nie przesadzasz? Dlaczego 2 razy ustawiasz TOIE2? Po co zerujesz TCNT2? Po co ustawiasz TOV2? Spróbuj najpierw sprawdzić ten kod z taktowaniem timera z podstawowego zegara, nie z kwarcu zegarkowego. Wtedy będziesz wiedział, czy problem leży w oprogramowaniu, czy w braku oscylacji.
Uruchomiłeś Timer, zapisałeś do TCNT2 i OCR2 jakieś wartości i tyle. Timer i tak zmieni wartość TCNT2. A wartość OCR2 jest mu obojętna. Nic dziwnego że nie widać żadnych zmian po modyfikacji tych wartości. Zrób tak jak radzi kolega wyżej.
Może tak: $regfile = "m8def.dat" $crystal = 8000000 Dim Czas As Word Config Portd = Output Config Pinb.0 = Input Portd = &B00000000 Set Portb.0 Do Incr Czas Waitms 1 If Pinb.0 = 0 Then Portd.0 = 1 Czas = 0 End If If Czas >= 30000 Then Portd.0 = 0 Czas = 30000 End If Loop End A może użyć timer.
A czy twój procek ATmega8 posiada tylko jeden timer ?
czyli jak w programie zmienie multipleks na timer 1 to bedzie działało?
Timer w przerwaniu obsługuje wyświetlacz LED i inkrementuje zmienną byte, która w pętli głównej w instrukcji Case wybiera konkretne funkcjonalne fragmenty programu do wykonania, których wykonanie czasowo mieści się pomiędzy przerwaniami od timera. W przerwaniu od timera ustawia się także flaga przerwania, która uruchamia za pomocą If Then instrukcję...
Nie musisz czekać. Musisz zacząć trochę inaczej myśleć niż "linijka po linijce" Wykonaj konwersję i wystartuj timer. Pozwól programowi biec dalej. Odczytaj temperaturę, gdy timer odliczy te 800 ms. Pamiętaj, że program główny to zazwyczaj pętla. Niech nawet sobie bezproduktywnie biega w koło do czasu zanim nie będzie można odczytać temperatury. Później...
Widzę że muszę trochę sprostować. 1. Nawet kosmicznie często wywoływane przerwanie zdąży się wykonać choć by nie wiem jak długo ono trwało, bo przerwania po wejściu w obsługę jakiegoś przerwania są blokowane i odblokowywane są dopiero po zakończeniu się obsługi tego przerwania. Więc twierdzenie że przerwanie nie zdąży się wykonać w ciągu 128us bo samo...
Co zrealizować? Programowe zliczanie impulsów? Ustawiasz timer tak, żeby generował przerwanie co 100 us, sprawdzasz stan portu, robisz xor z poprzednim stanem i testujesz, które bity są ustawione - ustawiony, znaczy zaszła zmiana stanu, czyli inkrementujesz odpowiednią zmienną.
Ten kod nie wykonuje modulacji. Żeby ją wykonać musisz zatrzymać timer/odłączyć jego wyjście do pinu.
Ok to jak ustawić mam ten Timer?
........, a podpowiedzcie mi jak mogę obsłuzyc Rc5,serwo i pwm? Pozdraiwam Dla obsługi RC5 i kontroli serva użyłeś w sumie 2-ch timerów... ATMega8 posiada wbudowane 3 timery , zastosuj więc ten trzeci do 'produkcji' PWM''. Jeżeli ten ostatni (dotychczas wolny) jest Timer1, to ma on dwa kanały dla PWM, na których możesz generowac praktycznie dwie różne...
Ja wiem ze nie kazdy musi sie uczyc angielskiego ale moze by tak kolega przeczytal chociaz jaka jest poprwana pisownia komend w jezyku Bascom zamiast narzekac na brak pomocy ja rozumiem ze w obecnych czasach ludziom sie niechce czytac wola sie pytac od razu na forum ale zeby nie bylo ze nikt nie pomaga to ci napisze NIE MA TAKIEJ KOMENDY JAK WEIT JEST...
kurcze mi nie wychodzi :| timer chodzi co 1s ale reszta do kitu Dodano po 25 program chodzi :) oczywiscie musisz go przerobic na wlasne potrzeby dodac tyle ile chcesz przekaznikow i zmienic czasy w programie bo tam jest 10s i 40s ten program jest przygotowany pod ATmega8 i kwarc 8MHz $regfile = "m8def.dat" $crystal = 8000000 Config Pind.0...
A stan Timera0 się zmienia? Ja też mam problemy z tym. Ale pod pojęciem "tym" kryje się nie Timer, lecz BASCOM. W BASCOMie niektóre rzeczy nie działają z niektórymi procesorami (np. Timery w ATMEBA88 nie działają, w ATMEGA8 już tak. BASCOM ma źle przypisane adresy rejestrów IO).
Brzęczące serwo świadczy o 2 rzeczach: -albo jest kiepski i najzwyklej w świecie drży, -albo zrób to ręcznie na timerach, bo bascom i servo to tandeta
Wg. mnie powinno tam być timer1 czyli np. Config Timer1 = Timer , Prescale = 128
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...
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...
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...
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.
Niestety nic się nie da zrobić (poza extrzemalnym skróceniu czasu wykonywania się przerwania od Timera1 albo zrobieniem generowania dźwięku na Timerze).
Tak, jest wyzerowany Dodano po 3 Zmiana Timera też nie pomogła
Ja wolę przerwania: Dim Sekunda as byte Config Timer1 = Timer , Prescale = 256 On Timer1 Odmierz_1s Enable Interrupts Enable Timer1 do loop end Odmierz_1s: Counter1 = Counter1 + 34286 Incr Sekunda Return Podałem ci "szkielet" programu do odmierzania 1 sekundy za pomocą timera1. Pamiętaj że procek musi go posiadać i musi być taktowany przez oscylator...
Czas wciśnięcia nie jest istotny bo załatwia się to programowo tzn. jak załatwić to programowo poprzez zastosowanie opóźnienia? A ten Timer to mam wykorzystać jako licznik wchodzących osób na schody czy do odmierzenia czasu jako timer?
Było by super, ale jak to zrobić żeby się nie rozjechało? Jak zrobić aby ten trzeci PWM chodził zgodnie z pierwszym? To jest inny TIMER jest jakiś fixpatent żeby to chodziło "synchronicznie"?
Tyle dowaliłeś programu w przerwaniu , że chyba będzie ślimaczył i timera w takim układzie się raczej nie wyłącza .
CONFIG RC5 = pin [,TIMER=2]
Gate i Mode w konfiguracji timera nie występuje w bascomie na AVR. Prawdopodobnie może to być sposób wyzwalania/ zliczania timera (wewnętrzne lub zewnętrzne) plus jakieś inne tryby pracy.
Oj kolego jak Ty chcesz mierzyć coś używając Waitms w programie ?. W obsłudze przerwania od cewki startuj timer, a w drugim przerwaniu go zatrzymuj.
A czy aby ten mikrokontroler nie ma wewnętrznego oscylatora ustawionego na 1MHz.
Kolega emarcus ma rację, przesadziłem ze skrótem myślowym i wyszła mi nieprawda. W zależności od częstotliwości kwarcu pojemność Timera 1 starcza na kilka do kilkudziesięciu sekund.
ten timer włączyłeś? W bascomie uzyles pewnie config clock=soft Więc jesli z punktu widzenia konfiguracji timera i procesora jest wszystko ok, to przyczyna moze byc jedna: kwarc nie oscyluje. Spróbuj podotykać np. pęsetą (trzymając ją mocno w ręku) pinów kwarca. Jesli zaczną przeskakiwać sekundy to błąd jest w kwarcu == wymień kwarc. Ta sytuacja tez...
Witam, chciałbym przy użyciu Atmega8 i zewnętrznego kwarcu odmierzać i zliczać setne części sekund, sekundę mogę łatwo wyłapać z timera1 według przykładowych obliczeń 4000000MHz / 256 = 15625 65536 - 15625 = 49911 lub 8000000Mhz / 256 = 31250 65536 - 31250 = 34286 Nie mam jednak pomysłu jak....... Z góry dziękuję za pomocne wypowiedzi. Aby odmierzac...
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...
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...
to zatrzymanie timera przed załadowaniem wartości jakby pomogło (przynajmniej nie zachowuje się dziwnie) teraz miga w równych odstępach ... Home Lcd "P=" ; P ; "us" Lowerline Lcd "I=" ; I ; "us " ; Licznik If Licznik = P Then Portd.2 = 0 End If If Licznik >= C Then Portd.2 = 1 Licznik = 0 End If ... Dobra odczepiam się od portów :) I już mówię dlaczego...
z tego co wiem to delay to komenda to odliczania czasu w mikrosekundach, a do dokładnego odliczania czasu należy używać funkcji Timer.
Chcę napisac własny program z wykorzystaniem Timerów. Na początek proszę o wytłumaczenie dlaczego w poniższym programie: 1. wykorzystano podzial częstotliwości zegara (po preskalerze 256) 250/125 zamiast wykonac jedno dzialanie? 2. uzyto wartość początkową Timera0 = 250 przed Petlą do Loop End . O ile wyjaśnienie podane przez Tomq jest błędne(!) Load...
Sorry, Wiesz ja to sie z tym bawie tylko i program pisze w bascomie metoda prob i bledow. Nie ma większego znaczenia w jakim środowisku programujesz (Basic albo C). Istotny jest koncept projektu i sposób rachunkowy, reszta to tylko inna forma zapisu programu. Wybrałeś za narzędzia: Timer1 i jeden z interruptów zewnętrznych. Zatem jest tez bez znaczenia...
No, tak dobrze to nie jest. AVR-y (a w nich timery) nie mogą poprawnie zliczać impulsów o częstotliwości większej niż połowa częstotliwości zegara zakladając na wejsciu wypełnienie przebiegu 50%. Niezbędne będzie zatem zastosowanie preskalera. Proponowałbym ATMEGA8 z kwarcem 16MHz i z prescalerem /4 zbudowanym np z cyfrówki 74F74. Mamy zatem poniżej...
Skąd te obliczenia? Poniżej masz kalkulator do timerów. Policz i się nie dziw. Load timer = ... nie jest równy Timer = ... http://www.elektroda.pl/rtvforum/viewtop...
W konfiguracji Timera dodaj Mode=1. Teraz chyba pracuje jako 8 bitowy.
Z tego co widze problem jest chyba w tym ze w przypadku 8 kompilator sam mi ustawial rejestr assr i bity exclk i as2 a w tym 168 tego nie robi. tylko jak na razie z racji mojej niklej wiedzy musze dojść jak to zrobić ręcznie. Widzę że problem już rozwiązany, ale dodam że dokładnie tak jest. U mnie w BASCOMie nie działa konfiguracja Timerów, Przerwań...
Ogólnie kwarce o wysokich częstotliwościach są niezbyt dokładne - zwykle +-100ppm w dobrym układzie. Na pewno jednak kwarc jest lepszy niż wewnętrzny RC. Robiłem kiedyś testy i na kwarcu 16MHz bez kalibracji udało się osiągnąć dokładność o ile pamiętam 1-2s na godzinę. Ale jak napisał Ci (może nie do końca) przedmówca (at)Milek7: Najlepiej wtedy w przypadku...
Musisz jeszcze ustawić drugi timer.
Witam, cieszy mnie ta odpowiedź, oczywiście że procki już zamówiłem i będę ćwiczył ten problem, ale w międzyczasie chciałem zasięgnąć opinii u kogoś, kto być może coś podobnego robił. Ponieważ timery bedę używał, to może poproszę o cos więcej w sprawie problemów z timerami w bascomie? Pozdrawiam
Witam. Najpierw wysyłasz rozkaz pomiaru temperatury, później z pomocą timera lub nawet zmiennej zwiększanej w pętli odliczasz czas pomiaru lub większy (mikroprocesor w międzyczasie normalnie wykonuje program). Po tym odczytujesz wynik pomiaru z DS1820, co nie trwa zbyt długo. Pozdrawiam. EDIT: Uzupełniłem posta
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....
W helpie BASCOMA jest wyraźnie napisane, że funkcja GETRC5 korzysta z TIMERA 0, wiec odliczanie czasu zrealizuj na innym timerze, tak najprościej i najszybciej.
Dziękuję za szybką odpowiedź jednak program do obsługi jednego przycisku działa dobrze, bardziej chodzi mi o rozróżnianie który spośród ośmiu przycisków został naciśnięty krótko ponieważ w mojej wersji programu tylko ta funkcja nie działa, a zapisana jest pod etykietą "Krotkie:". W jaki sposób mogę to napisać aby zadziałało? O timerach wiem, pomijam...
Kolego, bez timera się nie obędzie. Musisz nauczyć się ich używać zamiast poleceń typu Wait.
atmega8 bascom timer atmega8 timer bascom timer atmega8
instrukcja falownika plastikowy zaślepka koszt roboczogodzina
canon ir2520 matryca telewizor dziwne kolory
Ekspres Bistro – zerowe ciśnienie na manometrze: przyczyny, diagnostyka, naprawa Ekspres do kawy Bistro – brak ciśnienia i nie grzeje wody, diagnostyka i naprawa