Witam. Trochę inny procek ATmega644 [syntax=c] TCCR1B |= (1 << WGM12); // Mode 4, CTC on OCR1A TIMSK1 |= (1 << OCIE1A); //Set interrupt on compare match TCCR1B |= (1 << CS12) | (1 << CS10); // set prescaler to 1024 and start the timer| (1 << CS11);// OCR1A = 976*8; //wartość do której zlicza licznik [/syntax]
vector timer0 w atega8 jest pod adresem 0x0009 a nie 0x001C mysle ze to wlasnie to
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.
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ź.
Kolega nas zwiódł tym wpisem, że zawsze mu się udawało skonfigurować Timer. ...a to był chyba zawsze "Zufal" :D CTC to skrót od Clear Timer on Compare - czyść/zeruj Timer kiedy jego licznik wynosi tyle co OCR0A. Kiedy więc OCR0A ustawisz na 100, a OCR0B na 200 to Timer doliczy do 100 i się wyzeruje. Nigdy nie dojedzie do 200 bo to CTC Teraz pomyśl co...
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...
...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
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
Absolutnie żadne Start Timer0 nie jest tu potrzebne. Wystarczy, że tak będzie skonfigurowane przerwanie: [syntax=basic4gl]Config Timer0 = Timer , Prescale = 256 On Timer0 Sekunda Const Przerwanie = 131 Counter0=Przerwanie Enable Timer0 Enable Interrupts . . . end Sekunda: Counter0=Counter0+131 . . . Return [/syntax] ...i unikaj jak ognia "drukowania"...
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...
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 :)
Wpisać magiczne "volatile" volatile int sekunda=0;
$regfile "attiny2313.dat" $crystal = 1000000 Config Portb.4 = Output Dim I As Byte Config Timer0 = Timer , Prescale = 1024 On Timer0 Przerwanie 'Start Timer0' nie potrzebne Enable Timer0' zezwolenie na przerwanie timera Enable Interrupts Do Loop Przerwanie: Incr I If I > 10 Then Toggle Portb.4 I = 0 End If Return
Program nie tyle idzie w krzaki, ale po prostu warunek nie ma szans się spełnić. Program idzie w krzaki, tylko nie z powodu "wadliwego" kodu, a z powodu złego ustawienia fusebitów, a w zasadzie jednego fusebitu - M103C I tak to jest, jak się nie zagląda do PDF-ka :D
VICVectCntl0 = (1<<4)|(1<<5); Czy w LPC23xx jest w ogóle taki rejestr? Wg mnie takowego rejestru w LPC23xx i LPC24xx NIE MA. Moduł VIC jest generalnie zupełnie różny w LPC21xx/LPC22xx i w nowszych układach - w tym Twoim. W "nowych" rejestry są przypisane na sztywno - Timer0 ma na sztywno kanał 4, a więc i rejestr adresu musi być 4 itd....
trochę mały ten preskaler.
Jeżeli masz nowe AS6, to musisz przeinstalować do starszej wersji albo poczekać na kolejną. Niestety, powrócił stary błąd i symulator blokuje wykonywanie przerwań w trybie krokowym. Jak puścisz program z ustawionym breakpointem w przerwaniu, to wtedy będzie działać. To samo dotyczy pracy z żywym kontrolerem. Edit: Cofam co powiedziałem powyżej. [url=http://www.elektroda.pl/rtvforum/to...
Problem rozwiązany, wystarczyło stworzyć plik całkiem na nowo....
Nie. Bo to po ustawieniu fuse jest właśnie wraz z wewnętrzną logiką generator sygnału bazowego całego proca (w tym timerów).
A może wykorzystać Timer0 i ustawić odpowiednio rejestr SFIOR? Wtedy przerwanie od Timer0 compare wyzwala ADC. A pojawienie się flagi moźna sprawdzać w pętli głównej albo w przerwaniu od ADC.
[syntax=c]ISR(TIMER0_COMPA_vect){}[/synt...
Witam. Mam problem z obsługa przerwań w PICu. Napisałem program który za zadanie miał mrugać diodą, ale niestety do sprawdzenia jego mam tylko symulator graficzny i nie jestem pewien czy to wina działania symulatora czy jakiś błąd po mojej stronie. W symulatorze tym widać, że timer działa ale nie zostaje wywołane przerwanie. Jeżeli ktoś mógłby na to...
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) ; ;)
Witam! Z pewnością chcesz wykorzystać mechanizm "polling" :) jak to się ładnie nazywa w dokumentacjach. Po pierwsze w ATmega8 nie ma flagi Tirf.0, jest natomiast flaga Tifr.0 o którą zapewne Ci chodzi, dlatego pewnie nie do końca che działać. ;) Pozatym aby używać przerwań w ATmega8 musisz też odblokować globalny system przerwań, ponieważ po starcie...
Nie wiem nic na ten temat. Na tą chwilę wydaje się że funkcja ustaw_timer() powoduje problemy, bo po jej wykonaniu układ nie reaguje na przychodzące dane. Dodano po 2 Po usunięciu z programu funkcji przelicz i ustaw timer i utawianiu timera na sztywno problem wciąż ten sam. Po inicjalizacji timera i rozpoczęciu transmisji zgodnie z przerwaniem TIMER0_COMP_vect...
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..
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Jeżeli piszesz w C i używasz avr-libc, to przerwania "nieblokujące" (takie które mogą być przerwane przez inne przerwanie (lub nawet same przez siebie, trzeba uważać)) deklaruje się tak (przykład dla INT0): ISR(INT0_vect, ISR_NOBLOCK) { jakiś kod } Dzięki temu sei() zostanie wywołane prędzej, niż zrobiłbyś to wewnątrz procedury sam.
Proszę bardzo, przykładzik jest lekką modyfikacją liczenia czasu w przerwaniu z książki Wiązani. [syntax=basic4gl] $regfile = "m8def.dat" $crystal = 8000000 Config Timer0 = Timer , Prescale = 256 On Timer0 Przerwanie Dim Licznik8ms As Word Dim Flaga As Bit '1 juz czas, 0 jeszcze nie Enable Interrupts Enable Timer0 Load Timer0 = 250 Do 'wyslanie komendy...
No niestety chodzi za mną ten asembler im szybsze układy chce robić to tym bardziej chodzi :) , ale w życiu bym się nie spodziewał że bascom tak zwalnia. Jesli o chodzi o hierarchie szybkosći to czy wyglada ona tak - ASM -C -BAscom , czy jednak dobrze skompilowane C jest równe ASM ?
a to studio AVR to jaki jecyk, czy czasem nie C?
A Enable Timer0 , to pewnie koza zjadła ;) Nie ma pozwolenia na wykonywanie przerwań Timer0. Piotrek
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:...
A gdzie masz polecenie Start Timer0?
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...
Mnie wychodzi, że to nie jest tryb CTC tylko normalny. Po drugie na przerwanie compare trzeba zezwolić w rejestrze TIMSK - bit OCIE0 - masz < zamiast << stąd problem. Jak masz jakieś wątpliwości co do konfiguracji, to użyj symulatora AVR Studio. Można sobie w nim też ustawić tryb pracy i odczytać wartości rejestrów kontrolnych dla niego i potem...
Witam Kontynuuję zabawę z przerwaniami (Attiny13). Jednak mam pewne wątpliwości... Czy procedura jest ok? ISR(TIMER0_COMPA_vect)//chyba ok, ewentualnie: _COMPB { } Linkier daje ostrzeżenie... 'TIMER0_COMPA_vect' appears to be a misspelled signal handler Nie widzę błędu... ;\ Podczas symulacji dostaje błąd: AVR Simulator: Stack...
Dzięki wielkie- ale to nie do mnie pisałeś. O Atomic_Block dowiedziałem się w czwartek- sprawdziłem- od czwartku jest to pierwsza wiadomość na ten temat. A wracając do tematu Fir3man- wymyśliłem taki schemat programu: #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> volatile uint8_t dol;...
Witam Pytanie 1: Zrobiłem coś takiego że jeśli odebrano znak to jest wygenerowane przerwanie Urxc następnie przed instrukcją INPUTBIN uruchamiam przerwanie Timer0 jako licznik czasu który chcę wykorzystać do przeterminowania czasu odebranego znaku. bo INPUTBIN B(1), 6 oczekuje na 6 bajtów. Jak wysyłam całe 6bajtów to działa poprawnie, a jeśli bym wysłał...
w LPC23xx źródła przerwań są na stałe przypięte pod konkretne kanały. W LPC21xx sam ustawiałeś przyporządkowanie źródło - kanał VIC. Tak więc tutaj musisz przerwanie od Timer0 obsługiwać przez VICVectAddr4, VICVectPriority4 itd., a ustawienie wartosci 4 (numer kanalu dla Timer0) w VICVectPriorty0 po prostu ustawia priorytet przerwania WDT (to jest na...
Może być Timer0 inaczej skonfigórowany np: 8000000/256 = 31250Hz Load Timer0, 250 'zapis w Bascom ' TCNT0 = 6 'doliczy 250 31250/250 = 125Hz = 8ms ' występuje przerwanie Timer0 jest ośmio bitowy, więc może zliczyć od 0 do 255 czyli 256 impulsów. W przerwaniu wpisujesz to co ma być wykonane. 256 - prescaler 250 - dodatkowe zliczanie wyprzedził mnie bart-projects
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...
Timer jest niczym innym jak licznikiem, który zlicza impulsy zegara wejściowego, niezależnie od tego, czy procesor aktualnie wykonuje program główny, czy przerwanie. Odpowiadając na twoje pytanie: program skacze do obsługi przerwania, a timer liczy dalej.
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...
Ja to lubię tak: Zmienić ATmega8 na 88- ta sama cena. Potem w rejestrze ADCSRB ustwić ADTS0...2 tak jak potrzeba- np. przerwanie od Timer0 Compare Match A. Timer0 ustawić tak aby i tak go wykorzystać jako timer systemowy- oba przerwania wykorzystać albo tylko żadanie obsługi przerwania. A reszta w głównej pętli. Ale to jest co ja lubię- wykorzystać...
Programuję w ASM ale tylko Atmega8/16 więc wklejam ci taki przykład: [syntax=asm] .CSEG .org 0x0000 //poczatek deklaracji skokow dla przerwan rjmp _poczatek reti reti reti reti reti reti reti reti rjmp _150_timer0 //przerwanie overflow timer0 reti reti reti reti reti reti reti reti reti _poczatek: in r16, TIMSK//timer0 overflow interrupt enable ori...
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.
Komentarze do kodu sam pisałeś? Błąd kompilatora: w AIC_Configure_IRQ pierwszy argument to jak napisałeś "numer urządzenia peryferyjnego" a ty podałeś w kodzie wskaźnik do PITC. PIT to nie peryferium tylko część kontrolera systemowego i jego przerwanie jest obsługiwane po SYSTEM_ID. Poza tym w AIC_Configure_IRQ AIC->AIC_IECR = mask;// !!! tutaj powinieneś...
Spróbuj tego: $regfile "attiny2313.dat" $crystal = 4000000 Config Portd = &B11111100 Portd = &B00000011 Config Lcd = 16 * 2 Config Lcdpin = Pin , E = Portb.1 , Rs = Portb.2 , Db7 = Portb.7 , Db6 = Portb.6 , Db5 = Portb.5 , Db4 = Portb.4 Config Timer0 = Timer , Prescale = 8 Enable Interrupts Enable Timer0 On Timer0 Przerwanie Dim Czas_cyklu...
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...
Ustawiasz timer0 a oczekujesz przerwania z timera 1 Interesujace.
[syntax=basic4gl]Config Timer0 = Timer , Prescale = 1024 Enable Timer0 : On Timer0 Przerwanie0 Dim Tmp As Word Tmp = 0 Dim Ptimer1 As Word Ptimer1 = 0 Do If Klawisz = 0 Then If Ptimer1 = 0 Then Ptimer1 = 100 End If If Ptimer1 < 95 And Klawisz = 0 Then Tmp = 1 End If End If If Tmp = 1 And Ptimer1 < 85 And Ptimer1 > 70 Then If Klawisz = 1 Then...
Witam! Programuję w BascomieAVR układ ATmega32 do obsługi węwnętrznego zegara RTC oraz miltipleksacji sześciu wyświetlaczy. Chciałem się zapytać czy dokładność wewnętrznego zegara RTC (kwarc 32.768kHz), który uruchamiam komendą: Config Clock = Soft, zależy od przerwań TIMER0, które odpowiedzialne są za multipleksację wyświetlaczy?? Rozumiem, że jeżeli...
( void INT(void) interrupt 0 { instrukcje } To akurat przerwanie dotyczy INT0 a to: // Przekroczenie T0 void Timer_0 (void) interrupt 1 właśnie dotyczy T0 Kolejne numerki za słowem interrupt oznaczają wektory przerwań w '51 Tak przynajmniej jest w kompilatorze Raisonance.
Musisz też załadować nową wartość do licznika timera. Jak już pisałem, bez fragmentu kodu odpowiadającego za pobranie czasu przerwania dziaął poprawnie, więc nie w tym problem.
1. T0 w M16 ma tryb CTC. Skorzystaj z niego. 2. Jak już prawie nic nie robisz w przerwaniu to może warto uruchomić je w trybie NAKED i samemu zadbać o jego obsługę i powrót. Skróci to takie przerwanie.
Co prawda uczę się ale dlaczego taki program nie działa poprawnie, co robię źle? [syntax=basic4gl]$regfile = "m32def.dat" $crystal = 16000000 Config Portd.0 = Output Config Timer0 = Timer , Prescale = 8 On Timer0 Przerwanie Load Timer0 , 200 Enable Timer0 Enable Interrupts Do Loop Przerwanie: Toggle Portd.0 Return End[/syntax]
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...
no wykonuje ci się wszystko bardzo wolno - ponieważ w procedury obsługi przerwań pakujesz sobie czaso-żerne procedury w tym te najgorsze czyli opóźniające. popatrz ile np u mnie zajmuje kod przerwania od zegarka PCF // przerwanie INT1 generowane jest przez PCF8583 co 1 sekundę // ustawiana jest flaga od której zależy wyświetlanie // czasu, daty, temperatury...
No to kawa na ławę. Instrukcja Getrc5 w czasie działania używa jest licznika TIMER0 i związanego z nim przerwania. Licznik ten jest służy do generacji wymaganych opóźnień podczas próbkowania sygnału. TIMER0 może być dalej używany przez program, lecz należy się liczyć z wynikłymi opóźnieniami, gdy wykonywana będzie funkcja GETRC5(). Jest tylko jeden...
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. :)
no to tak: Przerwanie od timer0 jest wywoływane zbyt często- podaj jaki jest zegar. W przerwaniu robisz tak- incr temp_0. I tylko to- nic więcej. A w pętli głównej: if temp_0>=x then 'tak aby było > niż 750ms temperatura=funkcja() temp_0=0 end if
Na przykładzie Timer0: Ponieważ używasz priorytetów, to musisz zadbać o to aby sprawdzić czy używane przez Ciebie peryferia, mają możliwość przypisania przerwania do LOW lub HIGH priorytetu. W przypadku Timer0 odpowiada za to INTCON2.TMR0IP. Ponieważ ustawiasz: http://obrazki.elektroda.pl/2728693600_1... ... a obsługę tego przerwania...
Zamiast Bitwait Pinc.3 , Set wpisz: Blad=0 Do If Timer0 > 200 Then Blad=1 Exit Do End If Loop Until Pinc.3=1 Wyskok z petli nastepuje kiedy warunek Pinc.3=1 albo kiedy Timer0 > 200. Wartosc 200 to oczywiscie przyklad :-) Drugie pytanie. Mozna dokladniej zmierzyc, choc to jest Timer0 8-bitowy. Robisz nastepujacy prosty trick: 1. deklarujesz zmienna...
Jeżeli ustalisz tryby pracy na ADC Noise Reduction i NIE włączysz przerwania od końca konwersji ADC, to możesz spokojnie zrobić obsługę tego w przerwaniu. Wpisanie, sleep, i pobranie - nie ma żadnej filozofii. Jak włączysz sleep w obsłudze przerwania, to inne przerwanie nie zostanie wywołane, a tylko może procek wybudzić, i w związku z tym ja bym na...
Chcialbym napisac najprostrzy program aby sprawdzic czy progra mi wogole wchodzi w przerwanie czyli czy zapali diode. Ale zupelnie nic sie nie dzieje. Zarówno symulacja programowa w AVR Studio, jak i program uruchomiony na realnym sprzęcie działa poprawnie. Albo się pomyliłeś co do podłączenia diody, albo procesor jest uszkodzony. Po drobnej zmianie...
Tak poza tematem, czy to sie nie pisze "Load Timer0, 100" ? i zrob timer0=cos na starcie i w przerwaniu.
Witam, Przy budowie układu opartego o µP ATMega32 mam pewną niedogodność, która powstaje z niewiadomych przyczyn albo z mojej niewiedzy. Mianowicie do µP mam podłączony czujnik DS1820 poprzez magistralę 1W. Temperatura odczytuje się w pętli głównej programu co 10 sekund. Natomiast wyświetlana jest na dwóch wyświetlaczach 7seg Sterowanych...
jak w sposób dokładny odmmierać (przerwanie timer0) czas w at2313 przy kwarcu 4MHz? jaki jest przelicznik częstotliwości kwarcu na "krok" timera???
W miejscach krytycznych korzystaj z sei() i cli(), aby blokować i zezwalać na globalne przerwania.
Tak przerwanie od Timer0 jest co 400 us. Wg mnie co 260 us przychodzi kolejny znak na USART, więc przerwanie od Timer0 nie powinno być wykonane dopóki przychodzą kolejne znaki.
Witam Temat dekodowania RC5 był już poruszany http://www.elektroda.pl/rtvforum/atmega-... , bardzo fajnie opisane są kody w różnych standardach (m.in. RC5) na stronce http://www.xs4all.nl/~sbp/knowledge/ir/r... i jeszcze na http://www.ustr.net/infrared/index.shtml Sam sobie też...
Na procu jest uruchomiony miernik częstotliwości (stacjonarny). Wykorzystane są dwa 16bitowe timery, uruchomiona jest komunikacja po rs232, zegar czasu na PCF8583 z podtrzymywaniem bateryjnym. Nie bardzo wiem jak to wszystko przełożyć na BASCOM AVR. Na początek spróbuj uruchomić przerwania oraz timer0 w trybie normalnego licznika - tak aby liczył z...
W przerwaniu od timera masz tylko ładować na zmianę do TH0 czasy trwania stanu L i H w zależności od stanu wyjścia. Jeśli nie pomyliłem się w mnemonikach 8051 to kod ma tak wyglądać. Wartości czasów TIM_L i TIM_H musisz sobie policzyć taka by spełniały założenia. ORG 0 ; wektor zerowania JMP MAIN ; bezwarunkowo skocz poza obszar wektorów przerwań ORG...
#include <avr/io.h> #include <avr/interrupt.h> // funkcje sei(), cli() #include <stdlib.h> volatile int a=0; ISR(TIMER0_OVF_vect) { a+=1; } int main( void ) { //rejestry od timera 0 TCCR0 = _BV(CS02)|_BV(CS00);//pr... 1024 TIMSK = _BV(OCIE0); //włącza przerwanie...
mozesz zamiescic zamiescic ten programik... przynajmniej ta czesc ktora ci nie dziala... bo ja nie rozumiem co chcesz owiedziec przez: "dubluję tą procedurę wewnętrz procedury" - tzn ktora?? "odwołuję się do innej zadeklarowanej wcześniej"-to do jakiej sie odwolujesz... i kiedy jest dobrze a kiedy nie ps: przepelnienie stosu moze wystopic gd uzywasz...
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.
Pytasz o docelowy PIC16F84? Maksymalna częstotliwośc przerwań z Timer0: 20MHz / 4 / 256 = 19531,25 Hz 8MHz / 4 / 256 = 7812,5 Hz Według mnie spokojnie 8MHz wystarczy.
Tutaj masz hex'a z tego programu, skompilowanego przez avr-gcc dla atmega32 1Mhz. Zobacz czy zadziała, a ja sprawdzę makefile.
Witam Przerobiłem twój kod pod keila i działa. Pod CrossStudio nigdy nie robiłem więc mam tylko takie sugestie: - pod keilem przerwanie powinno wyglądać tak __irq void Przerwanie() { } bez prefixu są problemy, może pod CrossStudio jest tak samo. - może zamiast: TC0_CMR = (1<<TC0_CMR_CPCTRG_BIT); powinno być: TC0_CMR = TC0_CMR_CPCTRG_BIT; - sprawdź...
No to jeszcze raz (o co Wam chodzi?) ‘TO TRWA 6 CYKLI ZEGAROWYCH Config Timer0 = Timer , Gate = Internal , Mode = 1 On Timer0 Timer0_init Enable Timer0 Enable Interrupts Start Timer0 ‘A TO 51 CYKLI Timer0_init: Counter0 = 4150 Start Timer0
Podczas odbioru danych z pinu PD2 ( funkcja zgłoszenie ) występuje błąd tylko wtedy gdy przerwanie z timera 0 jest aktywne. Gdy na czas odbioru danych zablokuję to przerwanie procesor ładnie odbiera wysyłane do niego dane. I moje pytanie brzmi: Co jest nie tak z przerwaniem? Konkretnie to, co wskazał albertb: ... jeśli masz włączone przerwanie to jego...
Tak, tak wiem, ja tylko zasugerowałem robienie zegara na timerach ponieważ bodajże w EDW podczas omawiania timerów autor przytoczył myśl że można w łatwy sposób zrobić zegar stosując timer i przerwanie. Więc pomyślałem że wiedział co mówi i liczył się z taką sytuacjom jaka ma miejsce u mnie i w jakiś sposób potrafił ją ominąć A ja nie buduje Zegara...
while(1) { AD(); //obsluga ADC if(ADC>630) { PORTC=0X00; //wlacza,wylacza diode TIMSK |=1<<TOIE2; //ZEZWOLANIE NA PRZERWANIE OD T0 } } } Moze tak?
Niestety nie pomaga, jeśli tylko fragment procedury przechodzi z włączonym przerwaniem już się dzieją cuda,a wszystko wraca do normy gdy wyłączę przerwanie na czas wykonania całej procedury.Ale co mi z takiego timera gdzie większość czasu będzie wyłączony
Witam. Mam znowu problem z odmierzaniem czasu. A właściwie z jego pomiarem za pomocą symulatora. Napisalem programik, gdzie przerwanie od timera0 ma być co 20ms. Timer1 steruje multipleksowo wyswietlaczami. Ustawiłem wstepnie timer0 aby zliczal te 20ms, poprawilem dzięki symulatorowi i było świetnie. Ale gdy program zaczął się wydłużać czas ten wzrósł...
Jak napisac funkcje w AVR dla ATMEGA32 w jezyku C, aby mozliwe było przechwycenie przerwania spowodowanego impulsem zewnetrznym w liczniku TIMER0?? Gdyż dla TIMER 1 ustawia sie bit TICIE1 w rejestrze TIMSK, a dla TIMER0 nie ma tam żadnego takiego bitu?? Jak to zrobić?? A drugie pytanko, czy jest mozliwość uzyskania 1 sekundy na TIMER0??? Dzieki za pomoc!!
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).
Nie znam Arm7, ale wieszanie Twojego programu tłumaczę sobie tak: Wystąpiło przerwanie EINT1_IRQ i uc skoczył do jego obsługi odkładając pewnie na stos zawartość pewnych rejestrów, trwa jego obsługa i nadchodzi przerwanie TIMER0_IRQ należy ponownie na stos odłożyć kolejne dane i może kolejne przerwanie RTC_IRQ i ponownie zrzucić dane na stos i w tym...
Witam. [syntax=basic4gl]Ustaw F_CPU na 8000000 Hz 'Declarujemy zmienną np.Licz Dim Licz As Byte Config timer0 = Timer , Prescale = 256 Enable Interrupts Load Timer0 , 250 '--przerwanie będzie co 8ms On Timer0 Przerwanie 'W przerwaniu: Przerwanie: Load Timer0 , 250 Incr Licz If licz = 125 Then Licz = 0 Toggle Portb.6 '--- zmiana stanu co 1sek End If...
8MHz. Procesor zawsze jest taktowany przez CPU clock, zobacz diagramy w nocie procesora. To co zmieniasz to taktowanie poszczególnych komponentów.
ARM7 używałem wieki temu, jednak widzę dwie różnice między Twoim a moim kodem. 1. Przerwanie powinno mieć atrybut, np.: void __attribute__ ((interrupt("IRQ"&... IntTimer0(void) { ... } Bez tego prawdopodobne jest zawieszenie całości. No chyba że za zabawy stosem odpowiada Twój plik z wektorami i startupem,...
Drogi kolego , popełniłeś szkolny błąd :D W procedurze obsługi przerwania Timer0 masz ... SIGNAL(SIG_OVERFLOW0) //obsługa multipleksowania wyswietlaczy { //extern unsigned char wyswietl[7]; unsigned char licznik;//<-- ********** błąd !!!!!!!!!!! ... zmienną licznik , tyle że jest to zmienna lokalna , czyli istnieje w pamięci...
Witam Przyznam szczerze, że właściwie nie miałem problemów z timerami w Bascomie (większych) jednak w zamieszczonym programie nie podoba mi się sposób deklaracji zmiennych. Dlaczego tego nie porozbijać na osobne linijki ? W dodatku pomieszane typy zmiennych... -- pozdrawiam
Witam! Mam taki dość nietypowy problem. Kontroler ma reagować na jedno z trzech przerwań: TIMERa 0 i dwóch zewnętrznych (czujki ruchu). Te przerwania zewnętrzne zliczają liczbę reakcji czujek, natomiast TIMER 0 ma odmierzać czas i dzięki niemu co kilka sekund mają być wyświetlane statystyki. Bez TIMERa 0 wszystko działa ok, ale statystyki lecą cały...
da się, da. choć na AT89C2051 to nie najlepiej działa (i zresztą wszystkich 51 bez PWM), ale ja (kiedyś) napisałem procedurki które pozwalają na płynną regulację silnika SPS: W C: unsigned char licz,predkosc; #define silnikP10 #define wlacz 1 #define wylacz 0 void pwm (void) interrupt 1 { if (licz<predkosc) silnik=wlacz; else silnik=wylacz; if (++licz>64)...
Wracajac do tematu czy moglbym prosic przynajmniej o pseudo kod obslugi przykladowo drgania w przyciskach , wysterowania przekaznika np przez 2s oraz komunikacji 1wire jednym timerem (atmega8 ma az 2 timery wiec pewnie szybko skoncza sie jego mozliwosci chcac napisac kod bez zatrzymywania) Cały dowcip polega na tym że z tego 8 bitowego timera możesz...
Po pierwsze, timer liczy od 0 do 255, ale to oznacza 256 impulsów pomiędzy przepełnieniami, czyli powinno być 256, a nie 255 * 128us. Po drugie zaokrągliłeś wynik z 32.64 do 32 przed dzieleniem, co w efekcie dało niedokładny wynik ilości przepełnień. W rzeczywistości częstotliwość przerwań można obliczyć dużo prościej: ( 8000000 / 1024 ) / 256 = ok. 30,5176.....
juz to ustawilem i jest ok, ale i tak nie jest to dokładny stoper. Dzięki za rady :D
Witam, nie mogę sobie proradzić z obsługą timer0 w przerwaniu. Zamiast wł/wył port po początkowym opóźnieniu co 0,5s ustawia się w stan wysoki i tak sobie świeci w nieskończoność. Co jest nie tak? Kod poniżej: $prog &HFF , &H73 , &HFF , &H00 $regfile = "ATtiny13.DAT" $crystal = 128000 Wyj Alias Pinb.1 'wyjście Config Wyj = Output 'ustawienie...
timer0 przerwanie przerwanie timer0 atmega attiny2313 przerwanie timer0
sprawdzić wtryski benzyna mazda naprawa tylnej belki zablokować moduł sterować silnik
Numer 1021410244 na głowicy Mercedes W124 2.3 Pralka wyświetla program, ale nie startuje - przyczyny i rozwiązania