"Tą" liczbę masz zapisaną w zmiennej Liczba_przerwan_tim0 a nie w ośmiobitowym (czego się chyba obawiałeś) rejestrze timera0 - więc nie ma problemu.
Co do problemu nr 2 to nigdzie nie uruchamiasz Timer 0, zarówno na poczatku programu jak i w procedurze przerwania (tam masz tylko Stop Timer0).
Jaki masz programator? Ściągnij sobie lepiej MkAvrCalculator. Jest to naprawdę bardzo przyjemny programik i nie ma możliwości abyś źle ustawił fusebitów i zablokował procka. W bascomie ustawianie fusebitów jest dość trudne i może przysporzyć sporo kłopotów. Pozdrawiam.
No to od razu bez szczegółowego liczenia powinieneś zrobić tak: Tak naprawdę powinieneś wykorzystać Timer2 w trybie asynchronicznym z kwarc 32,768kHz na pinach TOSC1 i TOSC2, a mikrokontroler popędzać wewnętrznym 1MHz. Innymi słowy Twój mikrokontroler będzie prawie 100% czasu spał: - w czasie zamkniętych drzwi w trybie Power Down, - w czasie odliczania...
Timer0 w Atmega8 może pracować tylko w trybie OVERFLOW (przepełnienia).
while(1) { AD(); //obsluga ADC if(ADC>630) { PORTC=0X00; //wlacza,wylacza diode TIMSK |=1<<TOIE2; //ZEZWOLANIE NA PRZERWANIE OD T0 } } } Moze tak?
No a co to jest jak nie pętla for(;;); ? +0000007F: CFFF RJMP PC-0x0000 Relative jump
$regfile = "m8def.dat" $crystal = 8000000 Config Timer1 = Pwm , Pwm = 8 , Compare B Pwm = Clear Down , Prescale = 1 Config Portb = 255 Config Portc = 255 Config Portd = 255 Portb = 0 Dim A As Byte 'Czerwony Dim B As Byte 'Zielony Dim C As Byte 'Niebieski Dim D As Byte 'Czas A = 0 B = 255 C = 255 D = 4 Zolty: Do Pwm1b = A Set Portb.4 Waitms...
Skoro 122 wywołuje zmianę stanu diody co sekundę, to gdy doliczysz do 0.244 to będziesz miał przerwanie co 2ms :D Pojedyncze przerwanie jest wołane co 8 milisekund. Albo zmień preskaler albo użyj innego timera i po ludzki włącz ctc
Zmienna licznik powinna być przy inicjalizacji poprzedzona słowem: volatile .
Jezeli dasz prescaller 256 to musisz zliczyc 31250 impulsow aby odmierzyc sekunde.
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"...
Pierwsze pytanie - czy w inny sposób udaje ci się coś wyświetlić na LCD? I drugie - tam jest funkcja dodająca transakcje, która przy okazji włącza timer. Poprawiłeś ją? Chodzi o tą: [syntax=c] bool LCD_PutText_B(uint8_t x, uint8_t y, char *txt, LCD_trans *buf, bool autodel) { buf->cmd=LCD_Text; buf->Ready=false; buf->SelfDel=autodel; //Czy zwolnić pamięć...
A nie łatwiej jest policzyć DO ilu ma liczyć a nie OD ilu? :) i robić przerwania COMP a nie OVF? Ja tak robię i na kwarcu 4MHz timer1 odlicza sekundy bardzo ładnie. Ale u Ciebie timer1 wydaje się mieć dobrze ustawianą wartość. Przy prescalerze 256 musisz mieć 15625 taktów zegara, aby osiągnąć sekundę. W drugim coś mi nie gra. Odliczasz od 0x0F czyli...
TCCR0 = _BV(x<<CS00); Źle użyłeś makra _BV. _BV(x) jest równoznaczne z ( 1 << x ), czyli w Twoim przypadku próbujesz wykonać podwójnie przesunięcie bitowe. Jeżeli x = 3 (CS00=0): _BV(3<<CS00) = _BV(3) = (1<<3) = 0b00001000 czyli TCCR0 będzie równe 0b00001000 . Innymi słowy, próbujesz ustawić bit tylko do odczytu, zamiast...
Tak poza tematem, czy to sie nie pisze "Load Timer0, 100" ? i zrob timer0=cos na starcie i w przerwaniu.
1. Do tego co napisał Fredy wyżej: http://mikrokontrolery.blogspot.com/2011... 2. Zmienną akt_wyswietlacz zdefiniuj sobie jako lokalną statyczną w funkcji przerwania. 3. F_CPU definiuj w opcjach, a nie w kodzie: http://mikrokontrolery.blogspot.com/2011... 4. W jakim celu zerujesz TCNT2 w przerwaniu...
No jest kretyński :) TIMSK = _BV(TOIE1); // wlacz obsluge przerwan T/C1 TIMSK = _BV(TOIE0); //jw dla T/C2 TIMSK = _BV(TOIE1) ; // wlacz obsluge przerwan T/C1 TIMSK |= _BV(TOIE0); //jw dla T/C2 albo TIMSK = _BV(TOIE1) | _BV(TOIE0) ; ;)
To co dawid512 napisał jest najprawdopodobniej na atmega32. Musisz poczytać dokumentację i zmienić ten kod, gdyż timer0 na atmega8 ma trochę mniejsze możliwości. [dodano] Można też skorzystać z timer2, jego obsługa będzie łatwiejsza.
Nie chcę grać roli lokalnego guru (zwłaszcza korzystającego z cudzych stron WWW), ale widzę następujące błędy: F_CPU nie defniuje się w kodzie -> http://mikrokontrolery.blogspot.com/2011... Twoje zmienne używane w przerwaniu powinny być volatile -> http://mikrokontrolery.blogspot.com/2011... Nie...
Nie bardzo jest co komentować, bo najważniejszej procedury (ISR) nie pokazałeś. Jedno jest pewne: Taka konstrukcja i wywołanie procedury 800_ms zakończy się opóźnieniem programu głównego o parę mikrosekund i tyle. Zmienna Licz_8ms będzie się inkrementować tzw. "sobie a muzom". Co więcej, nawet jakbyś poprawnie skonstruował tą procedurę to dalej zamiana...
Poczytaj sobie dokładniej o różnych trybach oszczędzania enegii. W niektórych mogą być timery włączone a w niektórych nie. W PDF'ie masz dokładną tabelkę, która pokazuje co działa a co nie w każdym z trybów. Więc nawet angielskiego nie trzeba znać żeby się tego dowiedzieć z PDF'a.
Wyłącz preskaler, bit CKDIV8
[syntax=basic4gl]$regfile = "m8def.dat" $crystal = 10000000 Config Timer0 = Timer , Prescale = 128 Load Timer0, 5 On Timer0 czas Enable Interrupts Enable Timer0 Do If Pinc.0 = 1 Then Start Timer0 end if If Pinc.0 = 0 Then reset portd.1 end if Loop czas: set portd.1 stop Timer0 return [/syntax] Tak na szybko,... nie testowany. Zrobić możesz wszystko,...
Jeszcze po odblokowaniu przerwań dopisz Start Timer0 .
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 :)
Przede wszystkim to zastanów się dlaczego do generowania nośnej usilnie chcesz pisać jakiś kod programu i obciążać tym program główny procesora, skoro można to zrobić CZYSTO sprzętowo za pomocą timera. Tylko nie Timera0 bo ATmega8 jest biedna w porównaniu do ATmegai88 gdyż timer0 nie posiada w niej trybu CTC. Tymczasem masz jeszcze timer2 i wystarczy...
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...
A gdzie masz polecenie Start Timer0?
Witaj migot. Już byłem na tej stronce, i jest fajna. Jednak nie opisuje ona sposobu wyliczenia częstotliwości na timerze. Znalazłem fajny program tj. kalkulatorAVR i porównując przykład z innego programu doszedłem jaką podać wartość aby uzyskać przepełnienie co daną ilość mikrosekund. Dzięki za zainteresowanie. Nadmieniam, że kożystam z CodeVisionAVR...
A co jeśli do pierwotnego kodu dodasz: [syntax=c]ISR(TIMER1_COMPB_vect) { }[/syntax]
0vf0 jest to przerwanie od licznika Timer0 po jego przepełnieniu- można napisać Timer0.
A gdzie jest umieszczony główny program? Musi być po instrukcjach Enable Timer0 i Enable Interrupts.
a jak ustawić ten timer bo tu mowa chyba o timer0
ad 1. Dla timer 0 nie jest źle, bo masz preskaler i licznik jest 16-bitowy, więc wystarczy odpowiednio to skonfigurować i te 5 Hz uzyskasz. Timer 2 ijest tylko 8-bitowy, więc 5 Hz nie uzyskasz (chyba, że zwolnisz taktowanie MCU). ad 2. Zainteresuj się bitami COM, które definiują zachowanie wyjścia timera.
Spróbuj jej na początku dać disable timer0 , a na końcu enable timer0.
Mirek o ile się nie mylę użył timer0.
tylko że do PC.4 nie możesz. Musi być pod PD.4. Bo to jest wejście impulsów zewnętrznych dla Timer0
Przecież w Normal Mode też można używać rejestrów OCRx. Na przykład do generowania 2 przebiegów 50% przesuniętych względem siebie o dowolną fazę regulowaną właśnie przez OCRx. Czy w Atmega8 i Timer0 też można?
Szukałem odpowiedzi na to pytanie, lecz nie znalazłem, wiec postanowiłem rozpocząć nowy temat. Otóż mam problem z liczeniem kanałów DMX, a dokładnie z timerem0 którego używam w tym celu. Mikrokontroler to jak w temacie ATmega8, częstotliwość taktowania 8 MHz, ustawienia sprzętowego UART 250 000 baud. Według specyfikacji DMX najpewniej rozpoznać nowy...
Niestety ledwo w bascomie się orientuje a w C to niestety... A jak to w bascom'ie miałoby to wyglądać. Rozumiem, że ma to być oparte o Timer0?
Enable Timer0 , On Timer0 Przerwanie Zamiast przecinka ma być chyba dwukropek. Albo przenieść do następnej linii.
Czym to kompilowałeś ?
ok problem rozwiązany, musiałem dodatkowo urychomićprzez enable, timer0 i 2
a to O nie ma być przypadkiem 0 (zerem) ?
Witam. Mam pytanie. Jak odmierzyć 1 sekundę przez Timer0 dla określonego kwarcu (np. 18,432 MHz)? Znalazłem pewien temat na elektrodzie ale tam jest opisane odmierzanie 1 sekundy dla Timera1 a o Timer0 jest tylko wspomniane i nic z tego nie rozumiem. Oto ten temat: http://www.elektroda.pl/rtvforum/topic14... Byłbym wdzięczny za pomoc jak to się...
ATmwga 8 ma 3 timery... 2x 8-bit i 1x 16bit... Timer2 może pracować z kwarcem zegarkowym... Timer1 jako PWM... A timer0 jako licznik...
Witam, próbuje wykonać prosty odtwarzacz midi w oparciu o mikrokontroler atmega8535. Bazując na przykładach z internetu udało mi się temat jakoś wstępnie ogarnąć. Niestety na atmedze nie uruchamia mi się zegar o który oparte mają być programy. Wszystko jakby "wisi". Dodam że programuję w C w środowisku Code Vision AVR. W celu zlokalizowania problemu...
Config Timer0 = Timer , Prescale = 32 Enable Interrupts Enable Int0 On Int0 Przerwanie1 Nosave Cls 'tutaj wysyłasz impuls pierwszy start timer0 Do : Loop Przerwanie1: stop timer0 'tutaj co ci sie podoba lcd "odleglosc:" ; wynik 'co tam jeszcze chcesz 'wysyłasz impuls start timer0 return End
Witam Potrzebuje aby co 15 minut była wykonana pewna operacja. Wykorzystałem do tego timer0 dim Liczba8ms as integer Config Timer0 = Timer , Prescale = 256 On Timer0 Pomiar_paliwa On Interrupts Enable Timer0 Load Timer0 = 250 '****PROGRAM GŁÓWNY END Pomiar_paliwa: Load Timer0 = 250 incr liczba8ms If Liczba8ms = 112500 Then '*****jakies dzialanie'...
Przebiegi wygladaja na wyjściu falownika tak: http://img51.imageshack.us/img51/1482/un... dokładnie widać gdzie jest początek tablicy. Te przebiegi to już po przerobieniu delay'a na wybieranie kolejnych elementów tablicy za pomocą Timer0.
TCCR0=0x04; TCNT0=0x05; I w przerwaniu na początku musisz mieć: TCNT0=0x05; I zliczać równo 125 przerwań - odliczysz doładnie 1s. ok ....tylko jak np. chcę żeby po tych 125 przerwaniach nastąpiła zniana stanu portu ?? to jak to ując w pętli głównej ??
Load Timer0 = 100 Niewłaściwa składnia. Ma być: Load Timer0 , 100 albo Timer0 = 155
Dołacz do wyjscia Timera rezystor 3k3 do masy, powinno pomóc,smieci zostaną "odfiltrowane" do masy. Zmniejsz tez napiecie z 5,6V do poziomy TTL, dając jakiś bufor przed. Napięcie wejśwciowe nei powinno przekraczać napiecia zasilania uC a pewnie z 5V jest zasilany. Pozdrawiam
Raz jeszcze: Load timer służy owszem do załadowania wartości początkowej ale w postaci- "load timer0,250" wtedy odlicza on 250 cykli,ze znakiem równości używasz tylko jeśli dajesz polecenie "counter0=250" i wtedy w tajmer0 zostaje umieszczona wartość początkowa=250 czyli odliczy tylko 6 cykli do przepełnienia.
Pewnie że tak.
pewnie wspaniala komenda $crystal, czy jakkolwiek to tam sie pisze... 'no przeciez zadeklarowalem czestotliwosc kwarcu,,, czemu mi nie dziala...??????!!!!!1111 jeden jeden !!!111???/// ' 4\/3!!
witam! mam taki problem: chcę zliczać zewnętrzne impulsy, timer mam skonfigurowany w taki sposób: config Timer0 = counter, edge = falling, noice cancel = 1, na portd.4 mam ustawiny wewnętrzny pull-up i dodatkowo zewnętrzny rezystor podciągający 4,7k.do masy kondensatorek 100 nF. Licznik oczywiście mi liczy ale zlicza też przypadkowe impulsy. widać to...
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.
Nie sprawdzilem dokladnie calego kodu, ale w oczy rzucilo mi sie to dziwne cos :) : char licznik=3200; ?????????? Nie mozesz do zmiennej typu char zaladowac wartosc 3200 bo jest to liczba 16-to bitowa! A zmienna char jest tylko 8 bitowa ( maks 256) . Poza tym jesli jest ona ze znakiem ( bez unsigned) to od -127 do 128. Powinienes zapisac unsigned int=3200;...
Oczywiście Timer0 zlicza. Przerwania włączone.
Nie widzę u Ciebie nigdzie polecenia START Timer0, spróbuj to dodać zaraz po Enable Timer0 :D
A może byś kod pokazał? Przeciez napsal ze ma bledny kod .... Load Timer0 = 144 co winno byc: Load Timer0 , 144 albo jezeli preferuje zapis ze znakiem rownosci to: Timer0 = 112 ' gdzie dzialanie (256-144=112) wykona Bascom. e marcus
... ale niestety mądrala nie przytoczył jak powinno się to zapisywać... ) Oj, uważaj bo ktoś może poczuć się urażony i raportować post :) Na temat F_CPU w sieci można znaleźć wiele: F_CPU – gdzie definiować? Chciałbym dowiedzieć się co znaczą te TCCR2, OCR2, TIMSK, jak liczyć te przerwania i dlaczego timer po skopiowaniu tego kodu nie liczy faktycznie...
ach... tak ze sklepu nowy.. dzięki, spróbuję..
Tamten program napisałem z pamięci,bo korzystałem z komputera na którym nie mam bascoma. $regfile = "m8def.dat" $crystal = 8000000 Config Portd.0 = Output Config Timer0 = Timer , Prescale = 1 Enable Interrupts Enable Timer0 Start Timer0 On Timer0 Nosna Do Loop Nosna: Counter0 = 255 Portd.0 = Not Portd.0 Return Fusbity ok ,praca na kwarcu...
Witam Ten program został napisany na MCU - AT89C2051 ! A nie na AVR Atmega8, dlatego Bascom avr ma problem. Aby go skompilować Musisz to zrobić w Bascom 8051. Ps. przymierzam się do zrobienia tego detektora od roku, ale jakoś czasu nie mam...
Przede wszystkim zmień Load Timer 0 ; 125 na Load Timer0 , 125 a zaraz po Loop powinno być End a nie End if.
Wykorzystaj licznik 8-mio bitowy i w przerwaniu zwiększaj o 1 zmienną i jednocześnie sprawdzaj czy ta zmienna osiągnęła jakąś wyliczoną wartość - powiedzmy 1000. Jeśli nie to wychodzisz z przerwania a jeśli tak to wykonujesz kod który ma być wykonany w przerwaniu. W ten sposób zwiększysz programowo rozdzielczość licznika. [syntax=c]ISR(TIMER0_OVF_vect)...
(at)seba_x:A co to za bzdura?:> • Peripheral Features – Two 8-bit Timer/Counters with Separate Prescaler, one Compare Mode – One 16-bit Timer/Counter with Separate Prescaler, Compare Mode, and Capture Mode A co do pytania autora, nie, zliczanie umożliwiają tylko dwa pierwsze timery. Trzeciego można używać jako wewnętrznego. Nie tylko...
Zegarek oprócz funkcji wyświetlania czasu ma pokazywać temperaturę i mieć możliwość sterowania z pilota (RC5). Normalnie (by default) Bascom używa Timer0 dla RC5. Jeżeli Timer0 masz zajęty do inego celu, więc potrzebujesz skonfigurować Timer2 dla RC5. e marcus
http://mikrokontrolery.blogspot.com/2011... Jest to ten artykuł. Cały kod? On ma ponad 700 linii. Czy oszczędzić czasu i wyciąć konkretne fragmenty i je wrzucić te które mogą zawinić. Typu inicjalizacja timerów itp. Dodano po 3 Ok problem rozwiązany [syntax=cpp]ISR(TIMER0_OVF_vect) { sei(); static uint8_t stan_przyciskow_najstarszy,...
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...
Zaglądając do dokumentacji mikrokontrolera i wybierając jedną z dwóch możliwości: 1. preskaler timera - jedno z ustawień preskalera powoduje zatrzymanie timera czyli "No clock source (Timer/Counter stopped)." 2. zerując bit TOIE0 (jeśli użyjesz timer0), czyli Timer/Counter0 Overflow Interrupt Enable
zmniejsz tą wartość Load Timer0 = 250
No nie tyle "sztywne", co ich po prostu nie ma ;) - kto pierwszy ten lepszy Można napisać soft przydzielający priorytety, ale jest to dość skoplikowane i nie zawsze się opłaca (w sensie czasu potrzebnego do określenia źródła przerwania, określenia priorytetu, adresu procedury itp. - robi się z tego prawdziwy OS)
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...
Poczytaj sobie ten watek : http://www.elektroda.pl/rtvforum/timer0-...
Która atmega? W atmega8 możesz użyć: Timer0 - odmierzanie czasu Timer1 - zliczanie impulsów Timer2 - PWM
OK, uzywam juz w tym celu timera... Tylko nie do konca orientuje sie z preskalerem i czestotliwoscia.. Tzn, jak uzykac jakies w miare dokladne wartosci...? Mam uC pracujacy na wew. oscylatorze 1MHz [ATMega8, Timer0]... Chcialbym, zeby przerwanie wywolywalo sie co 1 albo 10ms, jak dobrac preskaler i wartosc poczatkowa timera [8bitowego]?
Skopiowałem, skompilowałem, wgrałem. Reasumpcja przedwczesna. Co w zasadzie ma wyzwolić to opóźnienie? Co za pomysł konfigurować zezwolenie na obsługę przerwania od przepełnienia Timer0 w pętli głównej?
Kod się nie wykonuje.
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ć...
W atmega8 timer0 nie ma trybu CTC, ale już w atmega88 taki tryb jest. Rejestr TCNT0 to rejest przechowujący aktualną wartość licznika timera0. Skoro nie ma trybu CTC to w normalnym trybie przerwanie będzie występowało co 100 cykli jeśli na początku programu i w obsłudze przerwania wpiszesz do tego rejestru taką wartość aby do przepełnienia (zmiany z...
Witam. Tak na szybko analizując kod: Dla Timer0 włączasz dwa przerwania od porównania: http://obrazki.elektroda.pl/6165324400_1...
volatile to zmienne globalne, których używasz jednocześnie w programie głównym i procedurach przerwań. Inne zmienne powinny być deklarowane w poszczególnych procedurach w tym w main jako zmienne lokalne. Oczywiście w miarę możliwości bo nie jest to sztywna zasada. Oszczędzasz dzięki temu zasoby. Wydaje mi się, że powinieneś do tematu podejść bardziej...
Co do atmeg to teraz faktycznie nie widzę sensu kupowania standardowej ósemki(tamte układy są lepsze, a w podobnej cenie). Przede wszystkim dużo nowsze układy a jak dodać taką jedną z dużych zalet że timer0 nie jest już "goły" ja w Atmega8 tylko ma kilka trybów w tym zawsze i wszędzie przydatny CTC - to już ogromna zaleta ;) .... ale jak piszesz jest...
Już kiedyś się na tym złapałem przy pomiarach oscyloskopem :) Teraz będę chciał te 22kHz załączać na czas 0,5ms a następnie przerwa 1ms czy do tego mogę użyć przerwania od Timer0 ?? dzięki za wcześniejszą pomoc
Błędy masz jak na dłoni, ATmega8 nie ma portu A, Timer0 ATmegi 8 nie ma w podanych rejestrach wskazanych bitów. Przestudiuj datasheety ATmegi 8 i 32, to wszystko stanie ci się jasne.
Nie sprawdzałem wcześniej bo uwierzyłem ci na słowo, że sprawdziłeś rejestry ATMega8. W rejestrze TIMSK przerwanie overflow dla timera0 to TOIE0 ale jest to bit 0 a nie 1. W związku z tym inicjacja powinna wyglądać tak: TIMSK=0x01 lub jak wspomniałem wcześniej zdefiniować bit TOIE0: #define TOIE0 0 wtedy zadziała TIMSK=(1<<TOIE0) Bardzo polecam...
Ja osobiście nie mam problemów z przenaszalnością kodu w firmowym asemblerze Atmela, nawet pomiędzy różnymi wersjami rdzenia, gdyż są w nim wbudowane definicje pozwalającej na asemblację warunkową. Przykład - instrukcja lpm , zamiast której używam następujące makro: .macro LpmPlus #if ((__CORE_VERSION__==V2E)|...
Doczytalem na internecie ze ta biblioteka nie działa na Atmega8 bo korzysta ż Timer0 który fizycznie nie istnieje w tej Atmedze. Wiec zostaje mi napisanie wszystkiego od nowa lub kupno innej atmegi :P
A kto powiedział że musisz go wyłączać? Istnieje lepszy sposób: robisz sobie flagę którą resetujesz w pzrerwaniu od timera. Potem wystarczy dodać coś takiego: Set Flaga : While Flaga = 1 : Wend Takie coś wstawiasz tam gdzie wcześniej musialeś wyłączać przerwania. Działa to tak że uc czeka aż wykona się przerwanie i dzięki temu wiemy że miało...
Witam. Na forum jestem nowy, ale Atmege8 gryzę już od roku:). Zakładam że czytałeś datasheet'a od Atmega8 i niestety nie udało Ci się zrozumieć.Jeżeli tak to Ci pomogę. Po pierwsze w Atmega8 masz trzy timery/countery: -Timer0 8bit -Timer1 16bit -Timer2 8bit Timer1 i Timer2 możesz wykorzystać jako PWM,gdyż mają wbudowaną taką funkcje. Wiadomo że 16bitowy...
] Gdybym chciał jednak mierzyć załóżmy do 1kHz to wymaga aby zliczać przepełnienia? Dlatego napisałem..."Nie znaczy to jednak..." w złym obliczeniu 1 sek wartość wynosiła 61630, przy prawidłowym obliczeniu wynosi 34 286 uwzględniając czas 1sek, częstotliwość taktowania 8MHz i prescaler 256. Przecież czas (1 sec.) odmierzasz timerem0, który jest 8-bitowy...
Racja ! [syntax=c] SFIOR |= _BV(PSR10);// czyści oba TIMER'y (resztki wartości) ---------> zmiana TCNT1 = 0x00; // ---------> zmiana TCCR0 = 0; // Wyłącz preskaler TIMER0 8bit [/syntax]
Zobacz tu: http://mikrokontrolery.blogspot.com/2011... jeszcze świeże :) Może coś ci to pomoże. Użyj wektora TIMER0_OVF_vect.
Odkopię temat bo mam problem też z Attiny13. Problem jest następujący: po skonfigurowaniu timera0 jaki licznik zaczyna on zliczać kolejne takty procesora z określonym preskalerem ale w momencie użycia procedur waitms lub if timer0 zatrzymuje się. Dzieje się tak podczas sprawdzania na sprzęcie jak i na symulatorze. Program powinien działać poprawnie,...
Przy takim kwarcu i preskalerze przewranie będzie na mój gust co 12ms a nie co 262ms??
Tylko jak teraz dopisać tą konfiguracje led? Tak jak chcaiłem z rgb zrobić
atmega8 timer0 atmega8 timer0 przerwać atmega8 timer0 przerwanie
komputer audio synchronizacja czujnik biegu wstecznego yamaha laser kupić
mikroinwerter hoymiles rower elektryczny
Nieregularne działanie ciepłej wody po wymianie zaworu i pompki Czy kierownica z Seata Leona II pasuje do Seata Altea 2005?