ADTS2:0 dla trzech 0 jest free running mode. Dodano po 2 Doczytałem, że konwersja jest wykonywana wtedy gdy jest odczytywany ADC. Dodałem zmienną volatile int w main i w pętli głównej zapisuję do niej rejestr ADC. Teraz zadziałało. Czy to jest dobre rozwiązanie? [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> #define LED1 PC0 int...
Robisz prosty błąd w składni. Poczytaj w helpie o Load. Nie tak: [syntax=basic4gl]Load Timer1 = jakas_wartosc[/syntax] tylko tak: [syntax=basic4gl]Load Timer1 , jakas_wartosc[/syntax] Z tego co pamiętam można również tak. przykładowo: [syntax=basic4gl]Timer0 = 249[/syntax] co jest równoważne: [syntax=basic4gl]Load Timer0 , 6[/syntax] Ale to sobie musisz...
Taki bubel całkowicie krzyżuje mi plany Masz rację, zrobiłeś bubel ;) który na szczęście można naprawić na kilka sposobów, z których najprostszy to wywołanie sei() w funkcji obsługującej przerwanie. Dlaczego tak się dzieje - po prostu dlatego, że na początku obsługi przerwania samo z siebie wywołuje się cli(). Najczęściej unika się tak długo trwających...
Zrobiłem jak mi proponowano, jednak bascom komunikował mi błędy. Dane te wpisałem w opcjach bascoma i nadal nic :/ Może ma ktoś jeszcze jakiś pomysł?
witam... mam problem z timerem1.... podczas pierwszego wykonania procedury "petla" jest wszystko ok (chyba bo licze czas rzędu kilkudziesięciu ms wiec mam problem to sprawdzić), ale podczas drugiego wywołania "petli"timer umiera i już w ogóle nie liczy nic.... zamieszczam fragment kodu (procedury bezpośrednio współpracujące z pętla) Sub Sprawdz_czy_dziala...
zumek, wartość którą wpisuje do OCR1A obliczyłem wykorzystując ten program... A ja Ci podałem wzór, który "stworzyłem" wykorzystując dokumentację ATMega8 :D 1+OCR2= \frac{F_CPU}{N*f}
//inicjalizacja licznika TCCR1B |= _BV(CS10); //clkIO/1 (No prescalling) TIMSK |= TOIE1; //włączenie przerania sei(); //glogalne zezwolenie na przerwania ISR(TIMER1_OVF_vect) { //funkcja obsługi przerwania kiedy licznik się przekręci } kiedy będziesz chciał zapamiętać aktualną wartosc licznika np w zniennej a typu unsigned int wystarczy a = TCNT1; ps....
Witam, mam problem z pwm, otóż niezależnie co wpiszę w OCR1A i OCR1B (wsp. wypełnienia) to i tak na wyjściu OC1B pojawia się to samo co na OC1A. Chyba że te dwa kanały nie są niezależne od siebie tylko działają równolegle. Kawałek kodu który steruje diodami [syntax=c]#include <avr/io.h> #include <avr/interrupt.h> #define F_CPU 1000000L int...
Tak jak myślałem. Za pierwszym razem ładujesz 65536-wartość jaką Timer ma zliczyć. A za drugim razem wartość jaką Timer ma zliczyć. W pierwszym przypadku wpisz: Load Timer1 = 49911 I będzie dobrze.
rzeczywiscie nie doczytałem, juz dziala i najpierw odczytuje TCNT1L , a pozniej TCNTH1, w odwrotnej kolejnosci zawsze 0 pokazuje
Programuję AVR'y od lat. Nigdy nie miałem potrzeby zagłębiać się w definicje zawarte w plikach .h pakietu gcc w taki sposób, jak Ty to robisz. Zadam Ci pytanie: Czy pisałeś już kiedyś jakiś program na uc? Czy potrafisz na avr zapalić i zgasić diody na którymś z portów? Wziąłem do ręki datasheet od Atmega16. Timer1 ma być taktowany z zewnętrznego źródła....
witam jest zrodełko w bascom z obsługą Timer1 ale niepotrzebuję aby timer1 obsługiwał mi port zewnetrzny T1 (portb.1) w atmega16 ,jak mozna wyłaczyć go z obsługi przez timer1 w Bascom ? poniewarz potrzebuję go do sterowania lcd i chce go z tego powodu wykluczyć :(
Nie istotne co program robi, wazne ze przerwanie mi nie dziala:) Program ma 400 lini i nie ma sensu go wklejac. ale można daodać jako załącznik jeśli się nie myle, ... mniejsza z tym, kolega poszuka wróżki :)
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...
Czas najwyższy na aktualizację posiadanego kompilatora.
Sygnał taktujący podawany jest na pin XTAL1 AT90CAN128. Generowany jest przez ATmega16 (TIMER1 wyjście OC1A) więc mogę go sobie zmienić. Myślałem że to przez ten sygnał komunikacja nie działa dlatego jest taka mała częstotliwość. Dodano po 1 Wróciłem do wcześniejszych ustawień: AT90CAN128: taktowany z wewnętrznego kwarcu 8MHz, BAUD = 600 ATmega16: taktowana...
2 serwa można zrobić całkowicie sprzętowo TCCR1A = _BV(WGM11); /* Fast PWM, ICR1 is top */ TCCR1B = _BV(WGM13) | _BV(WGM12) /* Fast PWM, ICR1 is top */ | _BV(CS11) /* div 8 clock prescaler */ ; OCR1A = 3000; // to jest chyba dla zegara 16 Mhz - to by odpowiadało impulsom 1.5 ms OCR1B = 3000; ICR1 = clockCyclesPerMicrosecond()*(...
TCCR1B |= ((1 << CS10) | (1 << CS11) | (1 << CS12)); /* ustawia timer na pracę z zew. kwarcem */ Nie z zewnętrznym kwarcem, a z zewnętrznym źródłem sygnału. Timer1 o ogóle nie może pracować z rezonatorem kwarcowym. Gdzie w takim razie go w ogóle podłączyłeś (rezonator)?
U mnie w ATMega16 wyglądało tak: Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down Oczywiście działa. Mam wersję Bascoma 1.11.7.7 Pozdrawiam.
Witam. Pierwszą instrukcją w podprogramie "Obr" powinno być zablokowanie przerwania od Timer1. A ostatnim poleceniem przed wyjściem z podprogramu to włączenie tego przerwania. Pozdrawiam
Zegar na Timer0 ruszył, natomiast PWM jest zrobione na Timer1. Przyczyną nie działania Timer0 to procedura RC5(!!??) Teraz tylko pozostało wyregulować odmierzanie czasu..
Ja proponowałem użycie sprzętowego PWM. 8 MHz / 256 preskaler / 2^16 da Ci w przybliżeniu 0.5 Hz. 16 bitowe PWM masz na Timer1, obliczenia dla trybu FAST PWM. W trybie normalnym (standardowe PWM) trzeba wynik podzielić jeszcze przez 2.
Witam, Opiszę może krótko sytuację: mam atmega16, na timer1 mam ustawiony tryb pracy pwm, używam kilku pinów na PORTD i PORTA do sterowania mostkamiH. Potrzebuję odmierzanie czasu 10ms i chciałem to zrealizować przy pomocy przepełnienie od timera0 lub timera2. Niestety kiedy chcę obsługiwać przerwanie od przepełnienia T0 lub T2, to całkowicie psuje...
Timer0 ma też tryb CTC i przy ustawieniu prescale 1024 i odpowiednim ustawieniu rejestru OCR0 da się z niego uzyskać 100Hz. Wtedy można użyć Timer1 do liczenia.
Stop timer nie zeruje automatycznie zawartości timera. Nie wiem jak jest z Start timer. A jaki prescale byś proponował ? dla timera 16bit i 8000000Hz, żeby mierzyć dość dokładnie w całym zakresie ? Z moich obliczeń wychodzi 8, wtedy przerwanie będzie co około 65ms. Jeszcze tak się zastanawiam w helpie jest napisane, że "Uwaga! Użycie parametru PRESCALE...
Mówisz masz na timerze. $regfile = "m16def.dat" $crystal = 1000000 $hwstack = 32 $swstack = 8 $framesize = 16 Config Timer1 = Timer , Prescale = 1024 Enable Interrupts Enable Timer1 Start Timer1 On Timer1 Odmierz_czas Const T = 6942 Config Portb.1 = Output : Portb.1 = 1 : Led Alias Portb.1 Config Portb.2 = Input : Portb.2 = 1 :...
Wiem że atmega16 ma tryb CTC który próbowałem bezskutecznie włączyć. Kolega Zumek napisał że bascom ma w tym miejscu błąd i nawet po zastosowaniu jego wskazówek nie mogłem tego trybu uruchomić a było by to najlepsze rozwiązanie. Męczę się już z tym przebiegiem strasznie i nic mi nie wychodzi. Może ktoś by mi napisał gotowca do bascoma jak skonfigurować...
PORTB |= 0x0F; w assemblerze wygląda to mniej więcej tak: in r16, PORTB ori r16, 0x0F out PORTB, r16 podobnie PORTB &= ~_BV(i); przy czym to drugie polecenie zajmuje kilka instrukcji i trwa zdecydowanie dłużej. Przerwanie może wystąpić w dowolnym momencie, nawet pomiędzy instrukcjami in i out. Jeżeli to się stanie, stan portu ustawiony...
A nie lepiej tak ? Przykładowa konfiguracja timera1 w trybie CTC i przebiegiem na OC1a [syntax=basic4gl]Config Timer1 = timer, Prescale = 256, CLEAR TIMER = 1, Compare A = toggle, Compare B = disconnect [/syntax] Potem tylko zmieniać wartość rejestru Compare1a jakimiś przyciskami, pilotem, enkoderem etc. ps. Jak nie zadziała to poustawiać bity w rejestrach...
Witam Przekopałem całe forum manuala i mam kłopot bo nie znalazłem odpowiedzi na moje pytania. Polecam Ci , jeszcze jeden manual : [url=http://pierwszeliceum.bedzin.pl/ftp... Opis i zasada działania TIMER1 w ATMega16 , rozpoczyna sie od strony 23.Jeśli zrozumiesz - a powinieneś...
Najprościej odpalić timer i w przerwaniu wystawiać dane i przełączać segmenty przykład: ISR(TIMER1_COMPA_vect) { switch(wysw) { case 0: PORTD = 0b1111110; PORTB=cyfra[jednosci]; wysw++; break; case 1: PORTD = 0b1111101; PORTB = cyfra[dziesiatki]; wysw++; break; case 2: PORTD = 0b1111011; PORTB =...
dzięki za odpowiedź, chcę uruchomić na początek timer2 i timer1 w trybie przepełnienia tylko że nie bardzo daję radę,
Powrócę jeszcze do tematu. Timery programowe to objaśnił Mirekk36 w swojej książce oraz artykułach i wideo poradnikach, bardzo dobrze je się stosuje. Jest to proste, wystarczy ustawić jakiś timer w tryb CTC i wywoływać przerwanie co jakiś zamierzony czas (stosuje około 10ms). F_CPU/Prescaler/100 Zaokrągloną wartość wpisujemy do rejestru OCRx. W przerwaniu...
No , tak z grubsza patrząc to nie pomyliło ci się coś w tym kodzie z ustawieniem preskalera ??? ;) TCCR1B = (1<<WGM12)| (1<<CS12)|(0<CS11)|(0<<CS... ; wg mnie to ustawiasz bity na wartość 111,... WRONG! Ja po prostu w całej swojej głupocie myślałem że jak (1<<BIT) wstawia 1 to (0<<BIT) wstawi 0 !!! I tak jest (0 <<...
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...
A wiec pwm masz na oc1a i oc1b to jest timer1 (jak sie nie myle). Poza tym masz 3 pwm oc2 na timerze2. Wiec jak bys chcial jeszcze czas liczyc lepiej uzyj jakis zew. ukladu, bo zostal ci tylko timer0, na ktorym bedzie ciezko to osiagnac. Na timerze1 i 2 mozesz zrobic sterowanie diodami rgb. Wlasnie widze ze ten czujnik wilgotnosci nie ma mozliwosci...
The Fuse Bits has nothing to do with a PWM. but in this page write Procesor taktowany jest kwarcem 16MHz. Odtwarzanie stereo obsługiwane jest za pomocą dwóch wyjść PWM od Timera1 czyli OC1A oraz OC1B. Na wyjściach pinów podłączyłem kondensatory 100uF. And whats meaning in this quote terms timer1 OC1A and OC1B, what is timer1 ?
a jesli powiem ze tak tez próbowałem tylko ze odczyt z kodów z rc5 trwa z przerwą 600ms która musi byc pomiedzy odczytem a konwersją temperatury z ds1820 :( Jakoś nie widzę problemu. Przecież Int0 ma wyższy priorytet niż DS. Jerśli istnieją jakieś konflikty to należy zablokować przerwanie Int0 na czas inicjacji DS'a i odczytu temperatury. W trakcie...
Nie tak nerwowo, na stronie 94 z ATmega16 jest fajny rysuneczek Timera1 z układem przechwytywania oraz co może być źródłem przechwytywania. Jak widać są dwa, jedno to komparator a drugie to wejście ICP. Co do wektora przerwania od przechwytywania to jest chyba adres $ooA a nie $00C ! Ten jest wektorem od układu porównania A z licznikiem Timer1
Tak jest to dość istotne... Do pomiaru używany jest 16-bit'owy timer 1 (atmega162 ma dwa ale po takim ogólnym rzucie okiem na pdf wygląda na to, że nie ma różnic w konfiguracji)... Co przy częstotliwości taktowania 8MHz prescalerze 8 daje max ~65,5ms przy dokładności do 1us... Poniżej fragment kodu który mierzy czas trwania stanu wysokiego... ... volatile...
Witam. W pewnym sofcie dla Atmega16 wykorzystałem już: - Timer1 (16 bit) do odliczania 0,0001s odcinków czasu - Timer2 (8 bit) jest wykorzystywany przez odbiornik podczerwieni (instrukcja getrc5) Timer 0 niby jest wolny, ale nie wiem / nie jestem pewien czy nie jest on wykorzystywany przez jakieś używane przeze mnie instrukcje (np. print dla sprzętowego...
Procesor to Atmega16. Zauważyłem, że przy włączeniu zasilania układu przerwanie zostaje wykonane 4 razy; po resecie tylko raz.
Przycisk powiadasz. Wg. mnie przyciski najlepiej obsługiwać w polling-u, załatwiając od razu kwestię eliminacji odbić styków. W tym, konkretnym przypadku, może w przerwaniu TIMER1 najpierw wykonywać rzeczy krytyczne czasowo, a potem sprawdzać przycisk?
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...
Podłączę się pod temat ponieważ mam podobny problem. W atmega8 mam prawie identyczny program do odmierzania 1s (przepisany z książki).Do uC mam dołączony kwarc 8MHz poprzez 2 x 30 pF, żadnych fusbitów nie ustawiałem, problem polega na tym, że 1s trwa około 10 sekund. Gdzie szukać problemu?? Jezeli nie zmieniales zadnych fuse bitow wiec pracujesz na...
Witam, 1. W postach używaj znaczników kodu tak aby kod był czytelny i wyróżniony 2. W programie brak inicjalizacji stosu. 3. Rozkaz skoku do obsługi przerwania od SPI masz pod złym adresem. Adresy wektorów przerwań są co 2 słowa (4 bajty), a rozkaz RJMP zajmuje tylko 1 słowo (2 bajty) tym samym RJMP SPIIntVecror znajduje się pod adresem 0x000A (0x0014...
Hm... dobry pomysł, niestety wszystkie piny mam już zajęte. Cały czas planowałem wykorzystać timer1 do tego celu ale niestety tylko on mógł zapewnić odpowiednie generowanie sygnału dla silnika krokowego.
A tak to by to zadziałało ?? Config Timer0 = Timer , Prescale = 64 Config Timer1 = Timer , Prescale = 64 Dim W As Byte W = 10 Do If P_gora = 0 Then Incr W End If If P_dol = 0 Then Decr W End If If Ped1 = 1 Then Start Timer0 Start Timer1 Set Silnik1 Set Silnik2 End If If Ped2 = 1 Then Set Silnik2 End If If Sens = 0 Then Reset Silnik1 End If If Kran1...
Musisz to tylko dopasować Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Down , Compare B Pwm = Disconnect , Prescale = 1
Na próbę zrób: [syntax=c] #define F_CPU 12000000UL #include <avr/io.h> #include <util/delay.h> int main (void) { DDRA |= 0xff; DDRD |= 0xff; TCCR1A |= 0x40; //włączenie przełączania portu OC1A TCCR1B |= 0x0A ; //włączenie trybu CTC, ustawienie preskalera na 8 OCR1A = 7499; while(1) { } }[/syntax] i sprawdź, czy są zmiany na pinie D5.
Witam, Pomysł dobry ale sypie się najprawdopodobniej z powodu zbyt dużej ilości przerwań. Proponuje projekt sterownika "równoległego", taki wykorzystałem w mojej pracy inżynierskiej. Wprawdzie korzystałem tylko z 8 serw ale 16 też obsłuży po drobnej modyfikacji. Program zabiera większość mocy procesora do obsługi przerwań ale tylko przez czas 2ms potem...
temat rozwiązałemprzy pomocy kolegi Dr_DEAD ,zastosowałem Timer1 do zliczania impulsów i wszystko chodzi jak nalezy, sprawdzałem do 1000obr, więc dzięki wszystkim za pomoc B.
timer1 atmegi16 jest 16bitowy i da sie podobno 2 pwmy zrobic na nim.. ktos mi podpowie? (avr-gcc)
Uporałem się w końcu z tym jakoś. Program jest bardzo stabilny nic się nie sypie. Zrezygnowałem całkiem z pomiaru tych pierwszych 10 odczytów. Wolę poczekać te 10 sekund i mam od razu uśredniony wynik, a na czas tych pierwszych wyświetlam po prostu --.-L i ---km. Później już odpowiednio 12.0L i 200km. Pojeździłem trochę i rozdzielczość jest wystarczająca,...
Na 16-bitowym nie robilem ale poczytaj tutaj o rejestrach: www.pg.gda.pl/~zbczaja/pdf/atmega16mmr.p... Co prawda to do Atmega16 ale po polsku Dla 16-bitowego zrobilbym to tak: COM1A1 >> 1; WGM10 >>1; WGM12 >>1; Preskaler jak chcesz bo nie wiem jaką masz częstotliwość. Wypełenienie podajesz do OCR1A. Nie sprawdzałem czy zadziała więc...
Możesz wykorzystać timer1 i trzy zmienne... sekundy, minuty, godziny... Przy częstotliwości 8MHz prescalerze 256 i warotści początkowej 34286 teoretycznie przepełenienie następuje dokładnie co sekundę...
PD6. Sorry . Już zmieniam więc. Generalnie najłatwiej by było gdyby licznik startował po otrzymaniu 1 impulsu z hallotronu i stopował się po otrzymaniu drugiego impulsu. Czas ktory by był zliczony oraz obwód koła po którym kręci się czujnik dałby mi prędkość obrotową.... Do tego służy ' Capture ' - np. Timer1. Sygnał Input do ICP1 e marcus
Napisz jakiego trybu PWM chcesz używać (8, 9 czy 10bit). Podpowiem, że jeżeli użyjesz 8-bit to będziesz zużywał mniej czasu procesora na ładowanie wartości do rejestrów OCR1x i ich obliczanie. Dodano po 9 DDRD = 0b00110000; //piny PWM jako wyjścia // TIMER1 8bit fast PWM 8-bit TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);...
OK, W razie problemów ze zrozumieniem tutaj znajdziesz datasheet po polsku dla ATMEGA16: http://www.pg.gda.pl/~zbczaja/pdf/atmega... Odpowiedzi na twoje 2 pytania: 1. Proponuję Timer1 + preskaler 2. Dokładnie tak Zobacz w datasheet (angielski dla Atmega8) schemat: Figure 31. Znajdziesz tam preskaler i sterjące nim CS10, CS11, CS12. Dodano po 4...
Witam Mam nadzieję że doświadczeni fachowcy pomogą. Potrzebuję zmierzyć ile impulsów z Timer1 mieści się w zewnętrznym impulsie. Doczytałem informacje że można to zrobić poprzez przechwycenie zawartości Compare1a po podaniu tego zewnętrznego impulsu na pin. ICP1. Pewno są na to też inne sposoby , o których nie pisze w pomocy i w googlach. Nie wiem od...
Dzięki za zainteresowanie moją sprawą. PD5 podłączyłem kontrolnie, aby sprawdzić, czy mój tok rozumowania jest poprawny i jak mogłeś się przekonać uruchamiając program u siebie, Timer1 działa znakomicie. Problem jest z Timerem0 i wyjściem OC0 (PB3). I tak planowałem kupić drugą Atmegę do innych celów, więc przy okazji sprawdziłem program na nowej i...
No teraz to już żadnych:) Wcześniej w jednej z wersji mi sie pojawiło coś takiego chyba. Bo nawet nie byłem pewny czy mi sie timer1 zatrzymuje w przerwaniu jak chciałem.. Generalnie różne miałem wątpliowści więc skończyłem na takiej wersji.. Teraz jak (prawie) znam przyczynę to mogę kod ładnie popoprawiać:)
Zrób tak żeby w przerwaniu zatrzymywało tylko licznik i startowało go na nowo i zapisywało to do jakiejś zmiennej. Potem w pętli głównej robisz obliczanie obrotów na bierząco = cały czas. do tego można użyć jeszcze tajmer0 aby co jakiś czas odświerzyć wynik na jakimś wyswietlaczu. W ten sposób procek cały czas będzie coś robił. A swoją drogą to chyba...
fakt, mój błąd, zatrzymałem się w liczeniu tylko na pierwszym obiegu licznika, w drugim będzie już tak jak piszecie...... To mój kod po modyfikacji [syntax=C] void Init_Timer1() { TCCR1B |= (1 << WGM12); // tryb CTC OCR1A=31250; // 1sek dla wew rezon 8Mhz / 256 OCR1B=(OCR1B+7812)%(OCR1A+1); // ok 4x /sek TCCR1B |= (1 << CS12); // preskaler...
$regfile = "M16def.DAT" $crystal = 8000000 $baud = 57600 Dim Czestotliwosc As Long Config Timer1 = Counter , Edge = Rising Print "Licznik" Enable Interrupts Enable Timer1 Do Start Timer1 Wait 1 Stop Timer1 Czestotliwosc = Counter1 Print "Freq: " ; Czestotliwosc Counter1 = 0 Loop Sygnał podaję na portb.1 i wszystko śmiga. Nie wiem tylko dlaczego nie...
Chodzi o coś takiego? [syntax=c] ISR ( TIMER1_OVF_vect); { CZUJNIK_WYSOKI; _delay_us(320); CZUJNIK_NISKI; _delay_us(10000); } [/syntax]
Zajmiemy się na początek faktem, że ATmega16 posiada trzy przerwania zewnętrzne. Na pinach: D2 - INTO 0 D3 - INTO 1 B2 - INTO 2 Więc Podłącz PCF pod pin B2. Natomiast Timer1 pozostaw do ciekawszych rozwiązań. Dokładniej do ominięcia Waitms. Podłącz PCF i się Odezwij, będziemy kontynuować.
Witam Mój problem to brak kompilacji przy konfiguracji Timer2 w tryb Counter Unknown CONFIG parameter Porblem polega na tym że w helpie BASCOM-AVR można konfigurować Timer 2 w tryb Counter. Wrzucam cały kod :[syntax=basic4gl] $regfile = "m16def.dat" $crystal = 16000000 Dim Freq As Long Const Licznik = 2789 Config Timer1 = Timer , Prescale = 256 Config...
Przedstawię Ci kolego przykład zastosowania Pulsein żebyś miał jaśniej. Myślę że będzie "rzeczowiej". To przykład dla dekodowania transmisji pilotów podczerwieni. Sygnał podłaczony jest do zewnetrznego przerwania INTx i w momencie zmiany na pinie program skacze do tej procedury. Mierzy impuls i poddaje rozwadze jego długość. [syntax=basic4gl]Int_1isr:...
Operuję na niskich częstotliwościach tj. ~~1-1000Hz. No właśnie. A odczyt ADC i zapis OCR1A "mielisz" w pętli, tak szybko jak się da. Zegar ADC: 1MHz/8= 125kHz / 25(cykli zegara na konwersję) . Czyli pomiar i zapis do OCR1A co około 5kHz. Timer głupieje. Dopisz w pętli chociaż jakiś _delay_ms(100); A jeszcze lepiej przepisywać nową wartość w przerwaniu:...
"Buforowany CTC" bo wartość OCR0 po zmianie nie daje efektu natychmiast (jak w normalnym CTC) ale czeka do końca cyklu. W efekcie nie powstaje zaburzenie (swing) przy zmianie wartości OCR0 (czyli czestotliwości). Z tego powodu ten tryb bardziej nadaje się do jakiś wobuloskopo podobnych zastosowań czy do sterowania np przetwornicy. Prawdę mówiąc nie...
Ja korzystałem z przerwania INT0 ( najczęsciej ) i nie miałem problemu Nie miałem też problemu z Timer0 i Timer1 . Procesor który programuje to ATmega16 (lubię go). A jeśli chodzi o TINY 24 to Port B jest 4-ro bitowy ale DATA REGISTER jest 8-mio bitowy. Bity 4...7 są podane jako tylko odczyt. Podstawiając wartość portu Pod zmienną typu BYTE ( bo mniejszej...
'Tak na szybko to zwróciłbym uwage na to że Twoje zmienne Timer1,2,3,4 nie ma wartości początkowych...
jedyne co mi przychodzi do głowy to jakaś "szpilka" w momencie konfliktu, gdy OCR0=0 I tak jest! Przy wartości 0 w rejestrze OCR0 odpowiedzialnym za wypełnienie sygnału PWM na wyjściu pojawia się szpilka -już nie pamiętam ile trwa w stosunku do wartości 1 w tymże rejestrze (ale dużo krócej-chyba około 1/5 czasu dla wartości 1 w OCR0). Problem jest...
(at)kindlar: Niestety nie mam już dostępu do laboratorium w którym cały projekt był przeprowadzany. Założenia projektu były takie, iż mamy zaprezentować wynik na 8 diodach, więc również i z tego powodu nie mogę dołożyć LCD. Zakres jest ograniczony przez ilosc diod i tak jak podałeś to 0-255. (at)el2010tmp: zmienna rpm jest adekwatna do swojej nazwy,...
Przecież masz 5 kanałów - wyjścia: OC1A, OC1B, OC2, OC3A, OC3B... Zmienne przedstawiają wartość modulacji w każdym z kanałów z osobna. Wszystkie PWMy są skonfigurowane jak 8 bitowe zatem zakres to 0..255. Ma tak być. Ponieważ nie ma aliasu (jeszcze) PWM2 dla zmiennej COMPARE2 (rejestr sprzętowy OCR2), BASCOM nie rozpoznaje nazwy PWM2. Jak zajrzysz w...
nie bardzo rozumiem:/ Chodziło o to że, poprzednio błędnie wstawiłem wykorzystanie OVF1. Jeżeli Timer1 pracuje w CTC mode, to wcześniej się wyzeruje przy Compare ustawionej wartości i nie dojdzie do OVF1. Odnośnie fragmentu codu: W jakim celu w ogóle zatrzymujesz licznik0 ? Zatrzymanie, odczytanie zawartości, zerowanie stanu i ponowne uruchomienie...
Dzięki Marcin za odpowiedź. W sobotę kupiłem TowerPro SG-5010, bo tamte, faktycznie za delikatne były, jak mi sprzedawca w sklepie pokazał (prawdziwe mini) ;-) Uruchomiłem serwo bez problemów. Sterowanie sygnałem z regulatora PI zbudowanego na Atmega16. Jedynie problem mam tego typu, że przy korzystaniu z drugiego timera Timer1 (Timer0 wykorzystuje...
Witam Chciałem zrealizować program do odmierzania czasu na kwarcu zegarowym. Podłączyłem go do pinów portu B (t1, t0). Program wyglada następująco: [syntax=basic4gl]$regfile = "m16def.dat" $crystal = 8000000 Config Timer1 = Timer 'Oscylator wewnętrzny Enable Interrupts Enable Timer1 Dim Czas As Byte 'On Timer1 Odmierz Do On Timer1 Odmierz Locate 1 ,...
Co do zliczania ilości przerwań w ciągu 1s, to zadeklaruj sobie jakąś zmienną globalną (+volatile) którą inkrementujesz przy wywołaniu przerwania INT, puszczasz timer i po przekroczeniu 1s odczytujesz tą zmienną i wiesz ile razy nastąpiło przerwanie INT, a następnie zerujesz tą zmienna itd. Adekwatnie tak _BV(1) itd. :) Biblioteka do LCD 4bit, też...
Witam Mam następujący problem, działający program obsługi jest taki: ISR(TIMER1_OVF_vect){ UDR0= Buff[rd]; rd = (rd + 1) % 256; UDR0= Buff[rd]; rd = (rd + 1) % 256; } program działa, ale jest za wolny, te kilka instrukcji kompilator zmienia na 122 linie w asm. Najlepiej byłoby napisać tę funkcję w asemblerze, niestety do tej pory pisaałem tylko w C....
Może coś takiego $crystal = 11059200 Dim Czestotliwosc As Long 'w twoim przypadku może być Byte Const Licznik = 22336 ' aby Timer1 przepelniał sie co sekundę Config Timer1 = Timer , Prescale = 256 Config Timer0 = Counter , Edge = Falling On Timer1 Czas 'On Timer0 Zlicz Enable Interrupts Enable Timer1 'Enable Timer0 'Pomiar czasu Counter1 = Licznik Cls...
Dokładniej chodzi mi o ATmega16(L) i ATmega32(L). Dam sobie radę ze skonfigurowaniem TCCR0. Chodzi mi tylko o zastąpienie wyjścia OCR1A wyjściem OC0 i zwolnienie Timera1 do innych zadań. Czy to zadziała?
Witam! Napisalem program do obslugi ściemniacza na atmega16. Korzystamy z portu d. PD5 to pin wyjściowy sterujący triakiem. Impuls podany na PD3 lub PD4 zwieksza lub zmniejsza wartość zmiennej 'sel' regulując sterowaniem fazowym. PD2(INT0) tu pojawia sie przerwanie zboczem opadajacym od ukladu detekcji zera. Program ten prawie w ogole nie dziala. Napisalem...
Korzystając z Waszych wskazówek przerobiłem program tak: Dim Test As Long ... Start Adc Do Wart_ac = Getadc(1) Cls Lcd Wart_ac ; Lowerline Lcd Test; 'poprawka Waitms 250 Loop End Czas: Stop Timer0 Stop Timer1 Czestotliwosc = Czestotliwosc * 64 Czestotliwosc = Czestotliwosc + Counter0 Test = Czestotliwosc 'poprawka Czestotliwosc = 0 Counter0...
Mikrokontroler ATMEGA16, oscylator wewnętrzny 8 MHz, wykorzystany timer1 (16 bit). Dzielę połówkę sinusoidy na 100 części. 10ms / 100 = 0,1 ms = 0,0001s. Odcinki czasu 0,1 ms generuje mi timer1 Takt zegarowy t = 1 / 8000000 Hz = 0,125 ms Dla uzyskania 0,0001s muszę zliczyć 800 taktów ( 800 x 0,125 us = 100 us = 0,1 ms = 0,0001 s ). Aby licznik się przepełnił...
No właśnie tylko u mnie dość cienko z programowaniem i obawiam się, że może mnie to przerosnąć. Do tej pory udało mi się odpalić wiele rzeczy, ale nie wiedziałem ze z tym będą takie problemy. Dobrze by było jakbyście rzucili też okiem na całość programu, czy jest jakoś w miarę poskładany. Edit: Znalazłem coś takiego: [syntax=vb] //Timer1 Capture //Timer1...
Witam, poniżej zamieszczam kod z Bascoma mojego sterownika BMS, w tej chwili kontroluje temperaturę, czas, Rs232, LCD 2x16. Obsługa z klawiatury lub pilota RC5, w obecnej chwili rozwiajm go o dostęp przez internet. zajmuje ok 8kb pamięci więc w A162 będziesz miał jeszcze drugie tyle pamięci. Ja kożystam z A32 Pozdrawiam. PS. daj znać jak zakończysz...
Do zrealizowania na zaliczenie kursu był program wykorzystujący timery i przerwania do pomiaru czasu. W skrócie wprowadzamy czas w void start(void)//rozpoczecie odliczania { sprintf(message,"Odliczanie "); message[15]=' '; LCD2x16_clear(); display(message, false); //konfiguracja timerow TCCR1B |=...
[syntax=c]#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #define D7 7 //dioda podłączone do pinów portu D unsigned int counter=10110; int main(void) { DDRD = (1 << D7); PORTD=(1 << D7); // tutaj sobie zaświecasz diodę, ale do pojedynczych bitów to używaj "|=" zamiast samego...
Kurcze nie wiedziałam, że tak nie można...:/ Poniżej wersja ostatnia schematu. http://obrazki.elektroda.pl/5617185100_1... Jeśli chodzi o program i tryb CTC, to trochę poczytałam i jak widać poniżej próbowałam zastosować. Mimo wszystko mam problem z tym programem. Okazuje się,że dioda wreszcie miga, ale nie w takim czasie którego oczekiwałam....
zmieniłem kod programu: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "hd44780.h" #include "stdlib.h" char Buffer[20]; int TCNT0_WART=0; volatile unsigned long imp_curr=0; volatile unsigned long imp_prev=0; uint32_t displ=0; int main(void) { //TCCR0 |=(1<<CS00)|(1<<CS01)|(1<...
.... po pierwsze ty chcesz mierzyć czasu rzędu ? kliku mikro-sekund??? tzn jakie bywają te różnice po wyzwoleniu ??? jakie masz założenie bo jeśli kilka us albo i mniej - to musisz mieć jakieś duże taktowanie procka co najmniej 16MHz najlepiej Tak, mam zegar 16MHz. Timer1 chodzi z prescalerem 8, czyli licznik cyka co 0,5µs. Opóżnienie impulsu...
pomyślałem że wykorzystam 2 przerwania, złączyłęm razem int0 i int1. jedno bedzie wykrywac opadajace zbocze a drugie rosnące. efektem miał być ciąg licz np "345,12,345,32,463,12" gdzie kazda liczba oznaczałą by długość kolejnego impulsu otrzymywanego z czujnika. napisałem kod: $regfile = "m16def.dat" $crystal = 16000000 Config Lcdpin = Pin...
Pozwalam sobie zamieścić 'żyjący' przykład korzystający z przerwań: Zakładam że zegar w mojej atmedze ma 16MHz :) Program na przerwaniach timera0 robi 'pracę' programu, konkretnie konwersję A/D z portu A0, i robi to około 60 razy na sekundę Na przerwaniach timer1 odświeżany jest ekran LCD (przerwanie wywoływane 30 razy na sekundę) Na porcie A znajduje...
A BTW, zamiast robic takie dziwne kombinacje nie lepiej ustawic prescaler timera tak, zeby timer sie nie przepelnial p Jeśli można by użyć Timer1 to oczywiście że tak, założyłem że jest do czegoś innego potrzebny. Odnośnie losowości - największy prescaler to 1024, co nawet przy prędkości 1Mhz daje maksymalny błąd 1ms. A resetowanie prescalera resetuje...
Witam, uczę się języka C na płytce kursu AVT3505 z atmegą162 i wyświetlaczem LED. Moim celem jest stworzenie programu który zlicza od pierwotnej wartości i do zera, a następnie przerywa program i zmienia stan czwartego pinu portu D na przeciwny. [syntax=c] #include <avr/io.h> #define F_CPU 8000000 #include <util/delay.h> #include <avr/interrupt.h>...
$regfile = "m16def.dat" $crystal = 8000000 Config Pinb.0 = Input Config Pinb.2 = Input P1 Alias Pinb.0 P2 Alias Pinb.2 Set Portb.0 Set Portb.2 Config Timer1 = Timer , Prescale = 256 On Timer1 1_sekunda Enable Timer1 Enable Interrupts Counter1 = 34286 Declare Sub Alarm Declare Sub Sys_off Dim Sekundy As Byte Dim Flaga1 As Bit Dim Flaga2 As...
$regfile = "m8def.dat" $crystal = 1400000 Config Pinb.1 = Output Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 1 Dim I As Byte Do For I = 1 To 50 Pwm1a = I Waitms 50 Next I For I = 50 To 1 Step -1 Pwm1a = I Waitms 50 Next I Loop
Cześć, dziękuję wszystkim za odpowiedzi. Generalnie problem rozwiązany, aczkolwiek muszę jeszcze zobaczyć do kodu asemblera bo wydaje mi się, że poprzedni kompilator coś nachrzanił i dlatego był taki cyrk, a w sumie ciekawy jestem. Korzystałem wcześniej z kompilatora dołączonego do CodeBlocks, jednak po tym co działo się w opisywanym wątku zmieniłem...
timer1 winavr timer1 odlicza timer1 zlicza
tranzystor bc337 obciążenie procesor laptop amilo instrukcja
fabia wspomaganie piaskownica windows
Obudowa pilota FAAC XT2 - wymiana i specyfikacja Aplikacja MusicCast nie widzi dysku komputera z muzyką - rozwiązania