Przeczytaj sobie w datasheecie czy dzielisz zegar przez 8 czy przez 4 ;) Nie wiem co koledzy z tym fuse bitem ckdiv8, atmega8 nie ma takiego ;) Vectra96 sciagnij tez sobie program avrcalc i tam szybko bedziesz mogl wyznaczyc konfiguracje timerow :)
$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 .
"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.
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"...
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) ; ;)
Udało mi się odpalić program z książki Pana Wiązani, ale tam timet odmierza 1s Jak to przeliczyć? Jest jakiś na to wzór? Rzeczywiście musiało się 'udac odpalić' bo ten program nie jest pozbawiony błędów (!) \ A jak zrobić żeby odmierzał np 10 sekund? Zmiana preskalera wydłużyła max do 2sekund czas. Aby timer1 odmierzył inne/dowolne interwały czasu,...
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 :)
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.
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...
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.
Zatem zapisy sa równoważne. Istotne to może być przy preskalerze = 1.
A może by tak: //ustaw pin dźwięku PINB |= (1<<PB0); N. W ATmega8 ta opcja nie działa. Dodano po 4 return(0); a nie? return 0; chiciaz nie powinno to mieć znaczenia...
no raczej działa nawet w następnych cyklach. sprawdz jeszcze to $regfile = "m8def.dat" Config Pinb.1 = Output $crystal = 1000000 Config Timer1 = Timer , Prescale = 64 Config Timer0 = Counter , Edge = Rising On Timer1 Odmierz_1s Dim Licz As Byte , I As Byte Enable Interrupts Enable Timer1 Start Timer1 Timer1 = 65535 - 15625 Do Loop End Odmierz_1s:...
Timer0 w Atmega8 może pracować tylko w trybie OVERFLOW (przepełnienia).
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?
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...
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.
A gdzie jest umieszczony główny program? Musi być po instrukcjach Enable Timer0 i Enable Interrupts.
tylko że do PC.4 nie możesz. Musi być pod PD.4. Bo to jest wejście impulsów zewnętrznych dla Timer0
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...
Przede wszystkim zmień Load Timer 0 ; 125 na Load Timer0 , 125 a zaraz po Loop powinno być End a nie End if.
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ć...
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!!
] 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...
Witam. Zaczynam dopiero zabawe z mikrokontrolerami i mam juz pierwszy problem. Otóż nie działa timer0. Wszystko sprawdzałem pare razy i nie wiem co zle zrobiłem. [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define LED1 PB1 #define LED2 PB0 int main(void) { TCCR0 |= (1<<CS02) | (1<<CS00); // preskaler 1024 TIMSK...
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...
Moim celem było aby mikrokontroler odliczał w górę co sekundę i wynik pokazywał na wyświetlaczu - pierwsze podejście do timer0. Początkowo sam obliczyłem wartości preskalera dla 8MHz, jednak na wyświetlaczu liczby pojawiały się ok 100 razy za szybko. Zastąpiłem swoje obliczenia tymi z tej strony: http://www.robotyka.net.pl/mikrokontrole...
Witam ogarnąłem już dużo na temat programowania w bascom, tylko mam kolejny problem, mianowicie chciałbym zaprogramować obsługę serwa pilotem nadającym w RC5 lecz gdy połączę obsługę rc5 i serwa mam takie błędy i nic nie działa: ........ Pojedynczo programy działają ok. ................. Rc5+ servo (nie działa) Pozdrawiam. Zauważ że zarówno 'Config...
timer2 w ciągu 10 minut późni się o jakieś 12 sekund, a timer0 zdaje się nie reagować na wartość początkową wpisaną do rejestru TCNT0 Z zegarem wewnętrznym 12/600 = 2% porównaj z DS. A timer 0 reaguje, tylko Ty nie dostrzegasz różnicy 131 cykli na 10 minut -) Tą wartość to jakby nie tylko raz trzeba było wpisać. Albert
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)|...
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...
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...
Hej. Po pierwsze Timer0 w atmedze8 nie ma PWM A więc do PWM możesz korzystać tylko z Timera 1 oraz Timera 2. Po drugie twój problem leży w nazwach poszczególnych rejestrów konfiguracyjnych atmegi 8 sprawdź w dokumentacji atmegi8 jak w rzeczywistości nazywają się rejestry TCCR0A, TCCR0B, OCR0A bo tego dotyczy komunikat błedu. Poza tym pamiętaj że port...
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
Witam. .............. Program testowy ma działać tak, na początku na sekundę wyświetla 36 na wyświetlaczach (i to zawsze się dzieje), później ma liczyć od 00 do 99, i tak w kółko. Pozdrawiam Zmieniłem trochę twój code. -Nie testowany.... (tylko symulator)........ [code][syntax=basic4gl] ' Example for 2 digit LCD display (Common Anode) ' Anodes are...
Wielkie dzięki ;) Rezystor całkowicie rozwiązał problem. Moze i rozwiazal jeden z problemow i to nie calkowicie. Popatrz na swoj kod: Licz: Incr Przerw0 If Przerw0 = 3125 Then Incr Setne Czy na pewno beda to setne sekundy? Druga sprawa to jest bledem umieszczenie startu STOPERA w "Do ... loop, uzaleznione od stanu pinu. Od momentu nacisniecia przycisku...
regfile = "2313def.DAT" $crystal = 11059200 Config Lcd = 16 * 2 Config Lcdpin = Pin , Db4 = Portb.5 , Db5 = Portb.4 , Db6 = Portb.3 , Db7 = Portb.2 , E = Portb.6 , Rs = Portb.7 'Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.1 , Db6 = Portb.0 , Db7 = Portd.6 , E = Portb.3 , Rs = Portb.4 Cursor Off Config Pind.6 = 1 Config Pind.0 = 0 Portd.0...
Ale litości. Wstaw ATTiny2313. Po co aż ATMega32? ATMega8 to by było przegięcie a co dopiero 32. $crystal = 4000000 Config Lcd = 16 * 1a Cursor Off Config Timer0 = Timer , Prescale = 1024 Config Timer1 = Counter Dim Temp As Byte Dim R As Byte Dim Freq_compare As Word Dim Metal_type As Bit Dim Freq As Word Dim Dif As Word Dim Temp2 As Byte Dim Prescale...
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;...
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...
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...
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.
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...
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...
while(1) { AD(); //obsluga ADC if(ADC>630) { PORTC=0X00; //wlacza,wylacza diode TIMSK |=1<<TOIE2; //ZEZWOLANIE NA PRZERWANIE OD T0 } } } Moze tak?
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)
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...
Czym to kompilowałeś ?
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...
To jeszcze schemat poproszę :D
timer0 atmega8 atmega8 timer0 przerwać atmega8 timer0 przerwanie
trawienia stali nierdzewnej amica arcelik centrala telefoniczny analogowy
naprawa udaru makita problemy diagbox
Viessmann Vitodens kod 68 – fałszywy sygnał płomienia, diagnostyka, elektroda jonizacyjna Fiat Punto – słabe hamulce, przyczyny, naprawa, serwo, ABS, przewody, klocki