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=...
Uruchomić timer w trybie CTC. Tryb CTC [syntax=vbnet]CONFIG TIMER1 = ..... CLEAR TIMER = 1[/syntax]
To co piszesz jest słuszne i mądre, widzisz, jest tylko jeden problem - soft jest skomplikowany bardziej niż by się wydawało, atmega8 ma tylko 8kb flash a wszystkie przerwania Atmega8 są zajęte (w tym timer1 do zliczania pojedynczych sekund, int1 i timer2 wykorzystywany przez getrc5). Oczywiście zawsze można skonfigurować bufor wejściowy, np. gdy spodziewamy...
Niestety nadal w programie jest błąd. Ta moja wersja z krótszym buforem też się zawiesza. Jak bufor był krótszy i zaczynał się od 0 i szedł do 31 to zawieszanie następowało tak jak normalnie. U mnie po 67 sekundach. Czyli ta BASCOMowa zmienna siedzi gdzieś na początku bufora. Przesunąłem wykorzystywaną cześć bufora do indexów 128…159 i zawieszanie...
Co to za przerwanie? Od porównania? Przepełnienia? Czy może od przechwycenia - co sugerują komentarze. Nie używasz innych przerwań? Załącz cały program.
dokładnie tak jak mówisz. A wytłumacz mi jeszcze od czego jest przerwanie c1?
Że jak? Do Loop Load Timer1 , 5 Return Czy to co powyżej (do,loop) to przemyślane działanie czy jakaś opcja debug'ujaca? A - i jak wywnioskowałeś, że nie działa przerwanie?
Start timer1 jest zapomniałem o tym w poście pierwszym dopisać. Tylko dlaczego ten sam kod ale przerwanie wywołane na nodze Portb.0 działa?
Emarus, dokładnie jak pisze Wojtek. Przerwanie leci co 4ms W podprogramie przerwania zliczam je 25 razy aż osiągnę 100ms i wtedy wystawiam sobie flagę irq100ms
... i tej wersji będę się trzymał wysoki sądzie ;-) I bardzo dobrze :-P Zadeklarowałeś przerwanie od porównania, a włączyłeś od przepełnienia więc Ci nie działa. Włącz właściwe przerwanie i będzie git.
witam wszystkich mam problem z niedziałającymi przerwaniami napisałem program który dobrze funkcjonował pod wersją bascoma 1.11.7.1 . ściągnołem najnowszą 1.11.8.3 bo w tej poprzedniej nie mogłem wysterować LCD w trybie 8 bitów . okazało się że programy wykorzystujące timery nie działają . co się zmieniło w obsłudze timerów ? może podeśle ktoś działający...
Witam Mam takie pytanie.. Czy Bascom potrafi symulować przerwania od Tmerów?? Chodzi mi o to ze gdy napiszę taki program : Config Lcd = 20 * 2 Config Timer0 = Timer , Prescale = 64 Enable Interrupts Enable Timer0 Start Timer0 On Timer0 Etyk Do Loop Etyk: 'tu program obsługi przerwania return To sam nie wchodzi do obsługi przerwania. Zrobi to jedynie...
Witam. CZy jest ktos kto jest dobrze obeznany w obsludze przerwan z poziomu BASCOMA. Procek Atmega8 Otoz moj problem polega na konflikcie tych dwoch przerwan. Timer1 obsluguje mi odliczanie czasu np 100ms. tzn po nastawionym czasie zalacza sie przekaznik poprzez podanie syg wysokiego na tranzystor.i ustawiana jest flaga zalczenia Timer0 sluzy do podawania...
Witam. Mam problem z obsługą Timera0 w ATmedze 8, otóż próbuję go uruchomić i zatrzymać za pomocą switchy. Problem w tym że mi to nie za bardzo wychodzi. [syntax=basic4gl]$regfile = "m8def.dat" $crystal = 8000000 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portd.7 , Rs = Portb.0 Config...
Mam problem z włanczaniem i wyłanczaniem przerwań w ATmega 8535. potrzebuje odczytywać dane z RS(5 bajtów )i meć włonczony zegar RTC, któty by rejestrował czas pojawienia się w buforze znaku. Bascomowa instrukcja inkey() użyta przeze mnie powoduje ze zegar stoi w miejscu. Jak napisać procedure przerwania ??????? Pomuzcie adelmus12
Wie ktos cos moze na temat prawidłowego odmierzania czasu w ATMega8L, jak skonfigurować jeden z wewnętrznych Timerów i jaki oscylator zastosować by uzyskać przerwanie dokładnie co 1s ? Gdzie w programie zadeklarować wybrany rezonator?
Właśnie cały problem w tym, że program główny ma co robić i nie jest pustą pętlą.. Temperatura musi być stale kontrolowana choćby dlatego aby włączać wentylatory (jest to wzmacniacz) lub reagować np wyłączaniem zasilania.. Dlatego zależy mi aby działało to poza programem głównym.. I pomijając estetykę programu... Czemu to nie chce działać? Co ma odczyt...
Witam Jak zatrzymać pętlę naliczania timer0, gdy na wyświetlaczu 7-seg. wyświetli się oczekiwana liczba nap.; 99min i 99sek, Czemu te polecenie nie działa? Dim R As Byte , S As Byte , T As Byte R = Jedsek + Dziesek S = Jedmin + Dziemin T = R + S If T > 36 Then stop timer0 End If
Mam taki fragment kodu: Config Portb = Output Portb.0 = 1 Config Portd = Output Config Portc = Output Config Porta = Input Declare Sub Kolor 'podprogram - nazwa Enable Interrupts ' zezwolenie na obsługę przerwań Config Timer0 = Timer , Prescale = 1024 Enable Timer0 On Timer0 Kolor Timer0 = 1 Do 'program Loop Kolor: 'poczatek podprogramu If Portb.0...
Jak zaprogramowac timer w bascomie 8051 aby generowal przerwanie po 1s, w jakim trybie powninien pracowac timer(y) i czy trzeba tworzyc jakies petle czasowe? Za pomoc z gory dziekuje :D
Hej! Czy ktoś wie jak wykorzystać timer atmegi 8, który w danym momencie programu zacznie odmierzać czas powiedzmy 3minuty (bez wpływu na program główny) i po upływie tego czasu skoczy do jakiegoś podprogramu? Szukam i szukam w necie i próbuję i nic z tego. Wydaje mi się, że można wykorzystać w Bascomie polecenie ON TIMER (liczba sekund) GOSUB (procedura...
Witam! Program pisany w Bascomie, jest to prosty programik ktory pokazuje temperature w aucie, przejechany dystans itd. Timer0 wykorzystywany jest jako licznik (zlicza impulsy drogi), przy przepelnieniu licznika wywolywane jest przerwanie. Timer1 wykorzystywany jest jako timer, odmierzam nim 1ms, czyli co 1ms wywolywane jest przerwanie. Problem polega...
Koledzy znając życie to pewnie problem wynika z mojej niewiedzy. Mam podprogram Który ma mi zliczyć czasu załączenia pompy. W tym celu wykorzystałem sobie przerwanie które generuje mi przepełnienie co 500ms. W warunku Flagi 500ms jest zmienna (kala(n))która jest zwiększana co 500ms jeśli pompa jest załączona. Załączam sobie pompę np na 3,5s czyli zmienna...
Witam Chcialbym miec mozliwosc wygenerowania 2 przerwan, Jedno na oko co minute , a drugie srednio co godzine. Jak sie do tego dobrac w baskomie, Moze ktos ma gotowy kod Pozdrawiam
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...
Sorry że post pod postem, ale teraz to już sprawa życia (prace dyplomową muszę oddać do 30 III 05) Jak zrobić w BASCOM AVR żeby Timer1 kiedy osiągnie zadaną wartość wygenerował przerwanie (nie przez przepełnienie) PROSZĘ O POMOC!
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]
Dzieki, takiej odpowiedzi potrzebowałem, wykorzystam przerwanie. :) Pozdrawiam...
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...
Z listingu programu nie mozna doszukac sie jaka metode przyjmujesz w pomiarze RPM. Ja jakoś się doszukałem. A nie, sory. Nawet doszukiwać się nie musiałem. Liczy okres pomiędzy impulsami. Ale przerwanie to powinno wyglądać tak: Przerwanie: Zmienna = Timer1 Timer1 = 0 Wynik = 7500000 / Zmienna Return Preskaler Timera ustaw na 64. A: Capture Edge...
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...
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...
Ok rozumiem. Spróbuj tego. Użyte przerwanie. Można też zrobić bez zależnie od potrzeb. $regfile = "m8def.dat" $crystal = 8000000 Dim Zmienna As Word Dim A As Bit Config Pinb.1 = Output Config Pind.2 = Input Set Portd.2 '============ definicje timera ================================ Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect...
Sprobuj jeszcze od timera0 obsluge przerwania w petli glownej, a Krotki kod generujacy tego prostokata, mozesz zorbic: -przeliczajac ile z danym kwarcem wynosi okres danej czestotliwosci wpisac do licznika timera1 polowe tej wartosci, aby co pol okresu zmienial stan wyjscia na przeciwnym, przerwanie od Timera1 oczywsice ze wzgledu na prostote zrob w...
Program w tej formie jaką zamieściłeś zaraz po zainicjowaniu zmiennych i sprzętu wchodzi w warunek "If Timer1" nawet bez wywołania przerwaniem. Później zdejmie coś ze stosu, albo przeleci się po pustym flash`u i zacznie od początku. Żeby w ogóle to zaczęło coś robić to powinieneś po Start Timer dodać, jakąś pustą nawet, pętlę "Do : Loop" Wtedy w pętli...
Witam sprawdź ten kod co prawda są inne numery portów i inny procek ale jak zmienisz powinno działać. Problem jest jeden w momencie jak naciskasz przycisk i zmieniasz końcówkę na WYJŚCIE to stan tego pinu Musi być (0) Niski , żeby nie zrobić zwarcia. '$sim $regfile = "attiny2313.dat" $crystal = 11059200 $baud = 9600 enable interrupts 'włącz...
To może zamiast wyłaczać przerwanie od timer1 trzebaby pomysleć od odblokowaniu niektórych przerwań w przerwaniu.
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...
. Zamierzam zrobić tak by mogli wprowadzić korektę (jeśli będzie potrzebna) i zapisać w eeprom. czy to dobry pomysł? Jakoś tak; $Crystal=12000000 Config Timer1 = Timer , Prescale = 8 On Timer1 Inter_1mS Inter_1mS: Counter1 = Counter1 + Licznik (64036 - wychodzi z obliczeń, że da to 1ms) /tu odliczę sobie 103/ Błednie to rozumujesz, albo błednie podałeś...
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...
Jak sinus ma przejść pełen to przerwanie wyłączaj i podawaj statyczny stan ciągle na triaka.
coś takiego: Przerwanie_timer1: 'przerwanie co 0,0015625 sekundy (640Hz) Ie = &B00000000 'wylacz przerwania Th1 = &HFC : Tl1 = &H00 P3.7 = 1 : P1.0 = 1 : P1.1 = 1 : P1.6 = 1 : P1.7 = 1 Incr Wyswietlacz_licznik If Wyswietlacz_licznik = 5 Then Wyswietlacz_licznik = 0 Wyswietlacz_dane = Poczatek_wyswietlacz_cyfra_kopia...
tak za bardzo przywyczaileś się do priorytetów przerwań z '51nki - i dlatego coś ciężko na razie ci załapać jak poruszać się z tym na zwykłych AVRkach. I stąd twoje kombinacje troszkę niepotrzebne albo założenia, że np przerwanie USART trwałoby kilka sekund ! ;)
juz to robie w inny sposob, ale teraz mecze sie nad czyms innym... chce zrobic licznik impulsow zewnetrznych, na timerze 1 ale nie za bardzo chce mi to wyjsc... po prostu program nie chce wejsc mi w przerwanie :( czy moglby mi ktos napisac co powinienem ustawic poza: config Timer1 = timer, prescale = 1 set (pin tam gdzie jest t1) (pin gdfzie...
Dim Licznik As Byte Enable Interrupts 'Przerwania odblokowane '---------------------------------KONFIG... TIMER 0---------------------------------------... Config Timer1 = Timer , Prescale = 1 Counter1 = 59536 'Wywołąnie co 1ms Enable Timer1 'Odblokowane przerwanie TIMER 1 On Timer1 Procedura_w_przerwaniu_timer1 Procedura_w_przerwaniu_timer1:...
Jeśli pomiędzy przerwaniem od timera a wpisaniem do niego nowej wartości upływa zbyt "długi" czas to może się okazać, że timer zgłosił przerwanie w międzyczasie, które zostanie uwzględnione jeśli zapiszemy Timer1 = Timer1+wartość, a utracone jeśli zastosujemy Timer1 = wartość.
Komenda RC5Send jest napisana na podstawie tej noty aplikacyjnej [url=http://www.mcselec.com/index.php?op... #105 - Sending RC5 and SONY IR codes . Timer jest skonfigurowany chyba jako CTC, jeżeli procek posiada drugi kanał dla timera1 to mógłbyś wykorzystać przerwanie TIMER1_COMPB. Można też próbować zmodyfikować...
Jakie są założenia co do rozdzielczości oraz stabilności generowanej częstotliwości (jitter) ? Generacje częstotliwości kHz na AVR najlepiej zrobić przez zastosowanie DDS. jeden timer w ctc generuje przerwanie w równych odstępach, resztę załatwia się w przerwaniu (trochę tylko kiepsko bo bascom zmarnotrawi dużo czasu- najlepiej tę część napisać w asm).
Jest możliwe aby przy kwarcu 16Mghz i prescaler1 Timer1wysyłał na portd.0 impulsy o szerokości 100us ? Timer1 nie wyśle żadnych impulsów na pin PD0. Można natomiast tak ustawić timer, by generował przerwanie co określony czas, a w nim odpowiednio sterować pinem PD0. I pytanie: Od kiedy programujesz w BASCOM?
Witam, Mam mały problem z pomiarem prędkości za pomocą Timer'a (Bascom). Może napisze krótki opis problemu: Na początku wyznaczyłem sobie ile impulsów na metr daje auto, wyszło 5,15. postanowiłem więc mierzyć w stałym czasie te impulsy i przeliczać na km. Jak się okazało takie podejście jest ok ale skoki prędkości są o kilka km np: 22, 25, 29 km/h ......
Ja robiłem to tak. $map $regfile = "ATtiny2313.dat" $crystal = 1000000 Dim ... Config Timer1 = Timer , Prescale = 8 ' ustawienie przerwań Enable Interrupts Enable Timer1 On Timer1 Przerwanie Do program glowny Loop '*********************************** Przerwanie: Timer1 = 64287 ' okolo 1 setna program przerwania Return W przerwaniu musisz...
Program zajmuje 50%. Może i jest źle napisany ale działa.. Ja bym to stwirdzenie troche skorygował; Program działa tak jak jest napisany!... bo - "Jest jeszcze jeden problem." Co jakiś czas temperatura podskakuje o 10 stopni a czasami nawet do 200 podskoczyło co spowodowało zbędne załączenie przekaźnika. Z czym jest problem? Popatrz na pracę timera0,...
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...
rozumiem... (programuje tylko w c# na PC) bo mi się wydaje.. że jak mam getrc5 w głównej pętli programu to przerwanie Timer1 przerywa mi działanie tej funkcji i nie pobiera do konca kodu IR... (czytalem ze getrc5 wykorzystuje timer0)
To będzie jakoś tak ?? $crystal = 12000000 Config Timer1 = Timer Gate = Internal Mode = 2 Enable Timer1 Enable Interrupts Dim P1 As Byte Dim P2 As Byte P1 = 1 Load Timer1 , 100 Start Timer1 On Timer1 Przerwanie If P1 < P2 Then P1.4 = 1 Else P1.4 = 0 Przerwanie: Incr Pwm1 Nie wiem czy przypadkiem gdzieś nie powinna być pętla, bo po zakończeniu...
Robi się to prosto na wejściu ICP Atmegi, mierzysz czas pomiędzy kolejnymi zboczami, raz jest opadające, raz narastające itd.. potem to tylko interpretacja wyników, liczenie bitów i po odliczeniu 64 bitów z transmitowanych 66, bo dwa ostatnie dla uproszczenia procedury pomijasz. wyświetlasz na LCD lub wysyłasz po RS232 do komputera, a tam wyświetlasz...
jezeli chodzi o czasy zegara to nie sa az tak bardzo tragiczne (od 60 do 100 us) wiec chyba Bascom sobie z tym poradzi, w moim programie mam generator na timer1 ktory dla kwarcu 8MHz (prescaler = 64)i wartosci w rejestrze licznika 65530 daje mi przerwanie co 40us... moze juz ktos napisal taka komunikacje i moze sie podzielic doswiadczeniami ?? Pozdrawiam
nie znam bascoma, ale sprobuj tak: Przeint0: If Flaga_int0 = 1 Then Start Timer1 Flaga_int0 = 0 'Timer1 = 0 Else Stop Timer1 Wynikczas = Timer1 Timer1 = 0 Flaga_int0 = 1 End If Może kawałek kodu z C coś ci pomoże: // timer tryb cnt, przerwanie co 50us ASSR=0x00; TCCR2=0x0a; TCNT2=0x00; OCR2=0x31; interrupt [TIM2_COMP] void timer2_comp_isr(void) { ++czas;...
Włączając przerwanie od Timera który robi PWM (czyli Timer1) i pomiar ADC robiąc w tym przerwaniu (w każdym razie wyzwalając go w tym przerwaniu). PWM trzeba ustawić w tryb Phase Correct. Wtedy pomiar będzie dokładnie w środku przebiegu (w niczym to nie przeszkadza, nie musi być na końcu).
A ja z kolei znalazłem gdzieś taki programik: Enable Interrupts Config Timer0 = Timer , Prescale = 64 On Timer0 Tim Enable Timer0 Dim M As Byte Do Loop End Tim: Timer0 = 6 Incr M Return Jeśli dobrze licze, to przy kwarcu 4MHz przerwanie będzie wywołane co 4ms, zgadza się? Jak to wszystko przeliczać na Hz? Pozdrawiam
Witam Napisałem taki oto programik w bascomie, chce aby przerwanie bylo co 10ms. Mam jednak pewne zastrzeżenia do Bascom'u i nie jestem pewien czy w praktyce te 10ms bedzie dokładne ?? ile taktów zegara potrzeba na wpisanie wartosci dla timera oraz jego wystartowanie ?? gdzies wyczytalem ze 54 takty, ale nie jestem pewien tego. $crystal = 12000000 $large...
"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.
witam INT0przerwanie zewnętrzne końcówka INT0 INT1przerwanie zewnętrzne końcówka INT1 TIMER0przerwanie przepełnienia licznika TIMER0 TIMER1przerwanie przepełnienia licznika TIMER1 Gdy używane są przerwania INT0 lub INT1, można określić warunek zgłoszenia tego przerwania. Należy w tym celu użyć instrukcji SET / RESET i ustawić odpowiednie bity w rejestrze...
timer1 przerwać timer1 bascom bascom timer1
mrugać lampa fabia kierunkowskazy zawartości pamięci eprom
Unitra Diora DSS 201: Wzmacniacz działa, radio nie Maksymalny prąd bazy tranzystora BD281 - szczegóły i obliczenia