W dalszym ciągu nie poprawiłeś WGM12. Jak wspominałem bit ten znajduje się w TCCR1B a nie w TCCR1A.
...Chyba ze powinienem zmienic sposob inicjowania PWM-a ? Powinieneś sprawdzić w dokumentacji, czy aby na pewno bit WGM13 , znajduje się w rejestrze TCCR1A .
Przy uruchamianiu timera zapal bit COM1A0 w rejestrze TCCR1A
czy nie jest uruchomiony dzielnik zegara przez 8. bo ma włączony bit CKDIV. Tylko od kiedy Atmega8 ma fusebit CKDIV8? TCCR1A |= (1<< WGM12); //tryb CTC WGM12 jest w rejestrze TCCR1B
Musisz się zapoznać z rejestrami jakie posiada Atmega8. Nie posiada np rejestru TCCR2A tylko TCCR1A, tak samo nie ma rejestru COM2B1 tylko jest COM1B1. Otwórz datasheet na stronie 96 i poczytaj. Lub spróbuj pozmieniać wszystkie cyfry '2' w nazwach rejestrów na '1' tak jak napisałem na początku.
Witaj. 1. WGM12 nie jest w TCCR1A. 2. Dlaczego nie stosujesz funkcji przerwania? EDIT: Oj, zostałem wyprzedzony przez kolegę wyżej :)
Co robię źle Noty katalogowe czytasz po łebkach, a zwłaszcza fragmenty dotyczące rejestrów. - W TCCR2 nie ma bitów WGM12/CS02/CS00. - W Timer1 oba rejestry TCCR1A/TCCR1B należy konfigurować no i w CTC tylko OCR1A ma znaczenie.
Na tej płycie masz LED-y. Sprawdź na nich. Sprawdziłem Twoje ustawienia -ale w Bascomie. Na takiej samej płytce. Wszystko chodzi. Wygląda to na układ a nie program. Poniżej program-napisałem w sposób zrozumiały dla C. $regfile = "M8def.dat" $crystal = 8000000 'Config Lcd = 20 * 2 'Config Lcdpin = Pin , Db7 = Portc.0 , Db6 = Portc.1 , Db5 =...
WGM11 i WGM10 razem z bitami WGM12 i WGM13 z rejestru TCCR1B ustalają własnie tryb pracy. Table 39 na stronie 99 Datasheeta ATMegi8 z 07/2007. Inne procesory to inne numery tabelki i strony w Datasheecie, ale opis prawie identyczny. Podałem przykład dla ATMega8 żebyś wiedział gdzie szukać.
Może zamiast kombinować dalej to przeczytaj sugestie kolegi? TCCR1A musi mieć ustawione zarówno COM1B1 jak i COM1A1. A ty w zależności od wywołanej komendy uruchamiasz tylko jeden lub drugi PWM, a nigdy obu jednocześnie. Czyli rozwiązanie to TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10);
Jaki procesor? Bo prawdopodobnie mylisz TCCR1A z TCCR1B Dla Atmega8 WGM13 i WGM12 są w TCCR1B.
Może to ci się przyda [syntax=c] /* PROGRAMIK PRZYKŁADOWY Wykorzystanie sprzętowego PWM AVR ATMEGA 8 (1MHz) */ #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> /* PROGRAM */ int main(void) { int i; // Konfiguracja portów we/wy DDRB = (1<<2)|(1<<1); // OC1A i OC1B wyjścia PWM /* Ustawienie sprzętowego PWM */...
Jeśli to np. timer1 to ustawiasz to bitami w rejestrze TCCR1A (przykład dla ATmega8): http://obrazki.elektroda.pl/3181773500_1... Przykład dla kanału A pin OC1A: [syntax=c]TCCR1A |= (1<<COM1A1) | (1<<COM1B1); //lub TCCR1A |= _BV(COM1A1) | _BV(COM1B1);[/syntax]
Użyłeś tej wersji która obecnie jest widoczna powyżej? Bo na początku wkleiłem z błędem. Jeśli tak, to spróbuj jeszcze tej: [syntax=c]Zero: 'zresetuj licznik Timer1 = 0 Tccr1b = &B00000000 'ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 Tccr1a = &B00100000 'COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 Tccr1a = &B00100100 'COM1A1 COM1A0 COM1B1 COM1B0...
Już działa, wybrałem tryb nr 5. Jedyny minus, przy pwm1a=0 są "szpilki". tccr1a=&B10000001 tccr1b=&B00001001
Kod kolegi zumek działa bez zarzutu Zrobiłem jeszcze opcje włączanie i wyłączania na dwóch przyciskach. [syntax=basic4gl]Debounce Pind.0 , 0 , Neg_com1a0 , Sub Debounce Pind.1 , 0 , Poz_com1a0 , Sub Loop Neg_com1a0: Set Tccr1a.6 Return Poz_com1a0: Reset Tccr1a.6 Return[/syntax]
Ok rozumiem. Spróbuj tego. Użyte przerwanie. Można też zrobić bez zależnie od potrzeb. $regfile = "m8def.dat" $crystal = 8000000 Dim Zmienna As Word Dim A As Bit Config Pinb.1 = Output Config Pind.2 = Input Set Portd.2 '============ definicje timera ================================ Config Timer1 = Timer , Compare A = Toggle , Compare B = Disconnect...
Zawsze możesz zwiększyć taktowanie do 16MHz - które ATMega8 bez L przyjmie. Możesz też zmniejszyć rozdzielczość do N bitów przez zmianę ustawień w TCCR1A, TCCR1B i CAPTURE1.
TCCR1A |= 0b00000000; A to co z twór :?: Zapomniałeś skonfigurować wyjścia OC1A(PINB1) Np. TCCR1A |= (1<<COM1A1);
Nie. Musisz jeszcze w TCCR1A skonfigurować wyjścia czyli COM1A
...Proszę o jakieś podpowiedzi bądź kawałek kodu co ma być dalej, żeby generować te nieszczęsne 40kHz ... To już wszystko :) Na pinie PB1 masz przecudne 40kHz , jeśli faktycznie procek jest popędzany 8MHz. W ramach testu , możesz w pętli głównej napisać: Do Set Tccr1a.com1a0 'dołącz oc1a do pinu Wait 5 'przez 5 sekund fala 40kHz Reset Tccr1a.com1a0...
Tu masz dzilajacy kod;) fast PWM na timerze1 rozdzielczosc 8 bit. .include "m8def.inc" .org 0x00 rjmp reset RESET: ldi R16,low(RAMEND) out SPL,R16 ldi R16,high(RAMEND) out SPH, R16 ldi r16,1<<WGM10|1<<COM1A1 out TCCR1A,r16 ldi r16,1<<WGM12|1<<CS10 out TCCR1B,r16 ldi r16,122 out OCR1AL,r16 ldi r16,0xFF...
Dobra wielkie dzięki już działa dokładnie jak mówiłeś TCCR1A=0xC a przerwanie na ISR(SIG_OUTPUT_COMPARE1A) lub TIMER1_COMPA_vect
Nienawidzę czytać datasheetów... Ooojo joj ... to będzie bolesna droga przez mękę ta nauka programowania :( W książce mam napisane że do TCCR1B jest przypisany OCR1B, ale jak widać niezbyt to działa... No to hmmm książek też nienawidzisz czytać ? tak by wynikało skoro piszesz, że ktoś tak napisał w książce. Coś chyba mało uważnie czytałeś. Nikt tak...
... Skoro się nie da w ten sposób wykonać generatora ... A kto powiedział , że sie nie da :?: Oczywiście , że się da ;) '... Set TCCR1B.WGM12 'Tryb CTC Set TCCR1A.COM1A0 'OCR1A- tryb toggle Set TCCR1A.COM1B0 'OCR1B- tryb toggle Set TCCR1A.FOC1A 'lub FOC1B '...
TCCR1A bity COM - od nich zalezy stan wyjscia...
To właśnie zostało uruchomione - musi działać. Pisane pod WinAVR [syntax=c] #define SET(port, bit) port|=(1<<bit) #define RESET(port, bit) port&=~(1<<bit) #define NOT(port, bit) port^=(1<<bit) //Przerwanie wywolywane 100 razy na sekunde ISR(TIMER1_COMPA_vect)// == SIG_OUTPUT_COMPARE1A { NOT(PORTD,PD6); } int main (void) { SET(DDRD,PD6);...
Timer1 ma dwa kanały, a Timer2 jeden kanał. Włączyłeś tylko jeden z dwóch kanałów w Timerze1 ustawiając bit COM1A1 w rejestrze TCCR1A, drugi włącza się analogicznie ustawiając bit COM1B1 w tym samym rejestrze. Wypełnieniem sterujesz przez odpowiednio rejestry OCR1A i OCR1B. Timer1 jest 16-bitowy, więc maksymalną wartością jest dla nich 65535, Timer2...
Do działania timera nie jest potrzebna nieskończona pętla while. Dobra praktyka wskazuję aby w całym programie znalazła się co najmniej jedna nieskończona pętla. Wartość OCR można wpisać na stałe skompilować i wgrać do procesora. Wypróbuj jeszcze ten tryb 14 z ICR1 na TOP wklejam działającą konfigurację pod Atmege 16(sprawdziłem rejestry i konfiguracja...
Zacznę od zamieszczenia kodu źródłowego i schematu: ' ########################################... ' # Control Programm for Trolling Motor Driver # ' # (C)2008 by Tomasz Orczyk # ' ########################################... $regfile = "m8def.dat" $crystal = 8000000 'CKSEL3..0=0100 - 8MHz Internal (PWM ~30kHz) 'SUT1..0=01...
Przykład: TCCR1A =(1<<COM1A0) | (1<<COM1A1) | (1<<WGM11) | (1<<WGM10); TCCR1B=0x01; OCR1A =wypełnienie;
No niestety, nie rozumiem jeszcze tego na tyle, żeby to zadziałało... Jak ustawiam TCCR1A = (0<<COM1A1) to mi nie działa... Spróbuję jeszcze później. Dziękuję za pomoc, ale tak jak powiedziałem, jeszcze się uczę i niektórych rzeczy nie rozumiem.
Wszystko jest w dokumętacji... http://www.atmel.com/dyn/resources/prod_... PDF strona 74 wszystko o 16-bit Timer... Poczytaj o dostępie do Rejestrów 16 bitowych... PDF str. 95 opis rejestrów... I tak na wszelki wypadek przykład konfiguracji PWM... volatile uint16_t pwm=10; void PWM_Init (void) { TCCR1A = 0b10110010;...
czyli będzie: [syntax=csharp] TCCR1A = ((0 << WGM11) | (0 << WGM10)); // ustawienie timer1 na CTC mode TCCR1B = ((0 << WGM13) | (1 << WGM12)); // ustawienie timer1 na CTC mode [/syntax] a jak reszta? już dokładam kwarc na stykówce i programuje :)
Witam. Chciałem skorzystać z Timera1 w procesorze Atmega8 w trybie fast PWM nastawiłem rejestry w nastepujący sposób: TCCR1A |= _BV(WGM11) | _BV(WGM10) | _BV(COM1A1) | _BV(COM1B1); TCCR1b |= _BV(WGM13) | _BV(WGM12) | _BV(CS10); DDRB = 0xFF; Oczywiście wszystsko się kompiluje itd. ale problem występuję gdy próbuję wpisać do OCR1A coś większego niż 0x03FF...
Wartość w rejestrze OCR1A jest wartością do której będzie zliczał tajmer wiec jak się steruje wypełnieniem. Wartość w OCR1A to wypełnienie. Zauważyłem także dziwne zachowanie po załadowaniu rejestru TCCR1A, zostaje wyzerowana młodsza cześć(High) bitu OCR1A w symulatorze AVRStudio4. Nie patrz na symulator tylko uruchom na sprzęcie.[quote]
jedno ogniwo zasila sam mikrokontroler - bateria 4,5V drugie zasila serwo - zasilacz od komputera +5V maja wspólną masę szperalem dosc dlugo az napotkalem na kod : /* Test serwo*/ /* Programik przykladowy */ /* typ uC: ATmega8 1MHz */ /* licznik/timer1 w trybie PWM */ /* Sygnal impulsowy (50Hz) na wyprowadzeniu PB1(OC1A) */ /* Przyciski...
(i nie piszcie mi o początkowym ustawieniu TCNT bo to jest wtedy niedokładne i było używane w średniowieczu). Nie opowiadaj bzdur. Jeżeli jest niedokładne, to zreferuj na ile jest to niedokładne i czym ta niedokładność jest powodowana. Czy w którejś metodzie/trybie pracy gubi się impulsy albo zabiera więcej czasu na ich zliczenie? A z tym 'średniowieczem'...
... TCCR1B |= ((0<< WGM11)|(0<< WGM10)); ... ORując z zerem, w zasadzie robi się nic. Równie dobrze wszystkie liczby można mnożyć przez 1 i dodawać do nich 0 Byłoby gorzej, gdyby faktycznie spróbować coś wpisać do bitów WGM11 i WGM10, które są przecież w TCCR1A, a nie w TCCR1B ;). niżej i tak je ustawia (CS11 i CS10)...
Udało mi się! 'Przykład generowania fali prostokątnej niezależnie od CPU 'procesor AT Mega8 'zegar wewnętrzny 1 MHz 'piezo pomiędzy PB.1 a +5V 'UWAGA!!!, ATMEGA8 ma domyślnie załączonego Wachdoga!!!. Trzeba wyłączyć bezpiecznik!!! $regfile = "m8def.dat" $crystal = 1000000 Dim I As Byte Ddrb.1 = 1 'port b.1 wyjściowy '---------------------------------------...
po ustawieniu rejestrów podanych wyzej nic sie nie zmienia [syntax=c]void timer_init() { TCCR1A |= (1 << WGM12)|(1 << CS12)|(1<<COM1A0);//CTC ,preskaler256 TCNT1 = 0; //wartosc poczatkowa timera TIMSK |= (1<<OCIE1A); // przerwanie Compare Match A OCR1A = 31250;//porównanie wartosci (około 1s) }[/syntax]
Nie jest poprawny. Przede wszystkim potrzebujesz tryb w którym wartość TOP można programować, np. na ICR1. To pozwoli ci ustalić częstotliwość. W tryba z korekcją warto pamiętać, że częstotliwość jest dwukrotnie niższa. Następnie przy pomocy OC1x można ustalić szerokość impulsu. Przy czym OC1x<TOP, w przeciwnym wypadku to nie zadziała. Aby zobaczyć...
[syntax=c]int main(void) { // ustawienie końcówki OC1A (PB1) sprzętowy PWM jako WYJŚCIE DDRB |= (1<<PB1) ; // ustawienia TIMER1 OCR1A = 499; //500 TCCR1A = (1<<COM1A0);//toggle TCCR1B = (1<<WGM12) | (1<<CS10); // tryb CTC + zegar 1MHz while(1); } [/syntax] Nie musisz uruchamiać przerwania bo licznik sam będzie machać nogą z częstotliwością...
Hej, Na przykład tak: #define AKU_PWM OCR1A // Wartość PWM dla Timera1 ............ .............. // Timer1 jako PWM TCCR1A = _BV(COM1A1) | _BV(WGM11) ; TCCR1B = _BV(WGM12) | _BV(CS10); // dziewięcibitowa PWM z Timer 1 OCR1AH = 0x01; OCR1AL = 0xFF; AKU_PWM = 10; // Pozdrowienia
Jeżeli nie używasz przerwań to ich nie włączasz. Wprawdzie nie włączasz głównego, ale włączasz od timera (TIMSK1), dlaczego? Wzór z dokumentacji dla CTC: F = Fclk / (2 * N * (1+OCR1A)) = 16000 / ( 2 * 8 * 2000 ) = 16000 / 32000 = 0.5Hz Sterowanie pinem OC1A dla CTC: [syntax=c]TCCR1A = 1<<COM1A0[/syntax] .
Dodać polecenie ustawiające wartość TOP (rozdzielczość) w rejestrze OCR1AH/1AL. Skonfigurować pin portu z wyjściem OC1B jako wyjście. W TCCR1A ustawić tryb pracy wyjścia PWM OC1B za pomocą bitów COM1B0/COM1B1. Wypełnienie wpisywać do OCR1BH/1BL, ale nie większe niż pozwala na to wartość z OCR1AH/1AL.
Ale czy to oznacza, że jeśli ustawie odpowiedni portB jako wyjście to będzie mi się zmieniał stan logiczny tak? Co do trybu PWM to znalazłem u siebie pewne niedopatrzenie zamiast: #define PWM_START TCCR1A|=(1<<WGM10); TCCR1A&=~(1<<WGM11); TCCR1B|=(1<<WGM12); TCCR1B&=~(1<<WGM13) powinno być: #define PWM_START TCCR1A&=~(1<<WGM10);...
Dzięki za porady. Problem rozwiązałem stosując tryb CTC. Nie wiem czemu te Fast PWM nie działało ale już trudno. CTC mi aktualnie wystarcza :) Aktualny kod mojej funkcji square_wave jeśli kogoś interesuje: [syntax=c]void square_wave(uint16_t freq, uint16_t duration){ TCCR1A = _BV(COM1A0); //OC1=!OC1 TCCR1B = _BV(WGM12) | _BV(CS10); //CTC + preskaler...
potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu. Moim licznikiem jest timer1 pracujący w trybie CTC. Nie analizowałem kodu, bo przekombinowałeś. Jak chcesz mieć zmienne wypełnienie to użyj trybu FastPWM (tryb 15 z wartością TOP w OCR1A), a nie CTC. W trybie tym częstotliwość zmieniasz za pomocą rejestru OCR1A, wypełnienie...
Regulacja częstotliwości? Sprzętowo? Owszem. Ale kosztem rozdzielczości PWM. Trzeba włączyć tryb z wartością TOP ładowaną do Capture1. Potem w programie: zmiana Capture1 daje zmianę częstotliwości, ale wymaga też przeliczenia wartości Pwm1a/1b. Samo wypełnienie zmienia się w Pwm1a/1b, ale trzeba zawsze brać pod uwagę wartość z Capture1 by nie wpisać...
Witam Mam drobny problem ze sterowaniem serwem ZS-F100 (Zebra) tak, aby wykonało ruch w zakresie +/- 90' (zależy mi na tym, aby było pełne 180' do mojej dyspozycji). Serwem steruje w zakresie 0.7-2.4ms (dobrany doświadczalnie). Program poniżej. Szukałem jakiegoś ds do tego serwa lecz nic nie znalazłem (nie jestem modelarzem - mam po prostu poprawnie...
Przy PWMie nie potrzeba procedury obslugi przerwania;> To powinno dzialac;) #include <avr/io.h> #include <avr/interrupt.h> int main(void) { DDRB = 0xFF; TCCR1A =_BV(COM1A1)|_BV(WGM11)|... TCCR1B =_BV(CS11)|_BV(WGM13); OCR1A=1500; ICR1=2000; sei(); while(1) {...
Dlaczego W rejestrze "TCCR1A" ustawiane są bity odpowiedzialne za wyjście OC1B ? Czy generalnie sterwowanie prędkością poprzez zmianę zmiennej OCR1x jest wogóle dobrym rozwiązaniem ? Bardzo proszę o odpowiedzi. Większośc timerów w AVR a szczególnie 16-bitowe posiadają dwa kanały nazwane A i B, które możesz wykorzystac do generowania 'odmiennych' fal...
już wszystko jasne, źle odczytałem z noty katalogowej i dziwiłem się czemu nie działa jak podaje na OCR1A/B=255, miałem na odwrót ustawione. teraz mam: TCCR1A = (1<<WGM10) | (1<<COM1A1) |(1<<COM1B1); //8bit PWM, phase correct TCCR1B = (1<<CS11) | (1<<WGM12) | (1<<CS10);...
#define F_CPU 8000000 #include <avr/io.h> #include <util/delay.h> #define PWMout OCR1A unsigned short int pwmVal; int main(void) { while(1) { TCCR1A=0xA3; TCCR1B=0x09; TCNT1=0x000; for(pwmVal=0; pwmVal<1023; pwmVal++); { _delay_ms(2); PWMout=pwmVal; } for(pwmVal=1023; pwmVal>0;...
. Zamierzam zrobić tak by mogli wprowadzić korektę (jeśli będzie potrzebna) i zapisać w eeprom. czy to dobry pomysł? Jakoś tak; $Crystal=12000000 Config Timer1 = Timer , Prescale = 8 On Timer1 Inter_1mS Inter_1mS: Counter1 = Counter1 + Licznik (64036 - wychodzi z obliczeń, że da to 1ms) /tu odliczę sobie 103/ Błednie to rozumujesz, albo błednie podałeś...
Hmmmm... Juz dziala.. Ale problem lezal w czym innym.. Natoimast nie wiem, dalczego dioda podlaczona pod PB1 miga, zamiast swiecic swiatlem ciaglym... Dodano po 27 Przejrzalem sobie dokumentacje ATMega8, ale nie moge rozszyfrowac takiego zapisu, jaki znalazlem w jednym z kodow w necie TCCR1A = (1<<WGM10) | (1<<COM1A1) | (1<<COM1A0)...
Twój pomysł wygląda ok, ale trzebaby jakoś wyeliminować ryzyko zgubienia jednego zbocza, bo wtedy komunikacja padnie. Próbowałem przy opadającym zboczu wejść do przerwania, uruchomić timer i wykonywać przerwanie aż do momentu gdy na linii będzie stan wysoki (za pomocą loop_until_bit_is_clear, a następnie przepisując stan licznika do nowej zmiennej),...
Witam, Robiłem to kilkanaście razy na innych procesorach, a nie mogę zrobić na ATmega88PA. link do DSa: http://www.atmel.com/images/Atmel-8271-8... opis rejestrów TIMER0 na stronie 105 Timer1 i Timer2 mam ustawione w trybie PWM i działają bez zarzutu. Walczę już...
Witam, potrzebuję wygenerować przerwanie analogicznie do stworzonego w atmega8. W Atmega8 użyłem Timer1 tryb CTC, teraz chcę osiągnąć podobny efekt na pic16f1716. Może ktoś pomóc? [syntax=c] void Init_Timer1A(void) { TCCR1A = 0x00; TCCR1B =(1<<CS11) | (1<<CS10) | (1 << WGM12); //tryb CTC (WGM12), Prescaler = 64 (CS11,cs10) clk = 8Mhz...
...Pokombinuj z innymi trybami pracy PWM jak doradzają inni, może Ci się uda sprzętowo zrobić 12 bitów rozdzielczości... Co znaczy "się uda" :?: Stoi jak byk w dokumentacji M8 , a dla niekumatych na str. 9 jest nawet tabelka , jak ustawić bity WGMxx dla dowolnego trybu parcy Timer1.Nawet jak ktoś nie zna zbyt dobrze angielskiego , ale mając pojęcie...
ok poradziłem sobie z nadawaniem: //init TCCR1A = (1<<COM1A0); TCCR1B = (1<<WGM12)|(1<<C... OCR1A = F_CPU/2/36000L; //RRR 14 bit code for (int i = 13; i >= 0; i--) { if (RRR & (1 << i)) { TCCR1A &= ~(1 << COM1A0); _delay_us(889); TCCR1A...
Podłączałem dwa różne serwa, już bez tranzystora (bo w sumie to tylko sygnał i coś mi się powaliło z tym tranzystorem ;) ), bezpośrednio na pinie PB0. Na oscyloskopie sygnał wygląda poprawnie, a serwa nie są w żaden sposób blokowane mechanicznie, więc nie wiem gdzie może leżeć przyczyna problemu. Tu jeszcze dorzucam kod na mikro: [code[syntax=c] #define...
Poszukałem informacji o timerze i napisałem taki program, czy będzie działać poprawnie? #define F_CPU 1000000L #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> SIGNAL (SIG_OVERFLOW1) { PORTD = 0x08; //Włącz PD.4 _delay_ms(10); //Opóźnienie PORTD = 0x04; //Włącz PD.3 _delay_ms(10);...
Skorzystałem z wzoru do obliczenia 50Hz dla trybu Fast PWM gdzie TOP to ICR1. Przekształcony wzór z dokumentacji Atmega88 na stronie 119. Czyli: 8 000 000 Hz/ Preskaler 8bit = 1 000 000 Hz 1 000 000 Hz / 50Hz = 20 000 -> wartość dla ICR1 Dalej ten prosty kod, żeby opanować na początek dość płynne regulowanie obrotami i kierunkiem [syntax=c] #define...
Cześć, napisałem program do obsługi serwa(jest to serwo Tower Pro),program działa, ale mam problem polegający na tym, że przy starcie zasilania serwo wykonuje szybki ruch z pozycji w której się znajduje (do góry) , i zaraz wraca do pozycji określonej przez OCR1A czyli do pozycji w której było przed włączeniem zasilania. Chciałbym wiedzieć czy mogę się...
Może takie ustawienia? TCCR1A = _BV(COM1A1)|_BV(COM1A0)|... // timer 1 fast PWM 8 bit TCCR1B = _BV(CS10); //no prescaling Wartością w rejestrze OCR1A sterujesz wypełnieniem przebiegu na nóżce PB1(OC1A). Dobierz sobie odpowiednią częstotliwość preskalera na podstawie datasheet'u.
Witam. Potrzebuję W tym liczniku obrotów: [syntax=c]#include <avr/io.h> #include <stdio.h> #include <avr/interrupt.h> #include <util/delay.h> #include "HD44780.h" //tutaj ustaw własne zasady pomiaru #define POMIAR_ILOSC_IMPULSOW_NA_OBROT 4 //ilość inpulsów na jeden obrót #define POMIAR_ILOSC_OBROTOW 10 //ile obrotów ma trwać...
Jeżeli chodzi o dokładność zegara to problem był jak używałem wewnętrznego z ATmegi ustawionego na 1MHz. Błąd to było ok 38 taktów (OCR1A) na sekundę przy ustawionym preskalerze na 64. Po ustawieniu fusebitów na zewnętrzny zegar 16M problem zniknął i po kilku godzinach brak jest widocznych odchyłek. Zainicjowałem zegar tak (16M): TCCR1B = (1 <<...
No przecież ustawiasz każdy bit z osobna. TCCR1A |= _BV(WGM10); tu ustawiasz jeden bit TCCR1B |= _BV(CS12) | _BV(CS10); a tu dwa bity zmienna_bajt|=(1<<pozycja_bitu... A tak ustawiasz bit w zmiennej.
witam, zamierzam, przy użyciu timera 1 wygenerować falę nośna 36kHz a następniej wysyłać kody RC5. zakładając, że: FCPU = 8MHz preskaler = 8 ze wzoru http://obrazki.elektroda.net/100_1247003... obliczyłem, że wartość OCRnA ~ 13. następnie ustawiam Timer: TCCR1A = 1<<COM1A0; // toggle OC1A on Compare Match TCCR1A = 1<<WGM12; // CTC mode...
Witam, Chciałem zrobić opóźnienia w programie dla Atmega8. Wykorzystałem przerwania, ale przy symulacji programu w AVR Studio okazuje się że program po około 260 mikro sekundach resetuje się(wraca do funkcji main() ). Nie jet to spowodowane raczej watchdogiem bo jest on wyłączony. Czy ktoś potrafi mi powiedzieć dlaczego tak się dzieje? Aha, oczywiście...
Timer1 ma opcje podwójnego PWMa, tzn. ustawia się dla dwóch kanałów tą samą częstotliwość, ale można niezależnie regulować wypełnienie. Za pomocą rejestru TCCR1A można dany kanał zanegować. Możesz z tego skorzystać, odpalić 2 PWMy, jeden zanegować. Teraz tylko wystarczy sterować wypełnieniem pamiętając o tym, aby dla tych dwóch kanałów ustwiać takie...
...Problem tkwi w tym, że ... ... Twoje założenia to jedno, a program, to zdecydowanie co innego. [syntax=c] TCCR1A |= (1<<WGM12); //tryb ctc TCCR1B |= (1<<CS12); // preskaler 1024 OCR1B = 10810 ; //rejestr porównawczy compare match [/syntax] a) Z trybem CTC związane są rejestry OCR1A lub ICR1. b) Bit WGM12 znajduje się w rejestrze TCCR1B....
Witam Od jakiegoś czasy chce zrobić zegarek na atmega8. Do odliczania sekund użyłem unsigned int i=0; void wait(long t) { long cnt = 0; TCCR1A = 0; TCCR1B = 3<<CS10; TCNT1 = 0; TIFR |= (1<<TOV1); while(cnt < t) { if(TIFR & (1<<TOV1)) { cnt += 65536; TIFR |= (1<<TOV1);...
Cześć jestem nowy na forum więc się przedstawię jestem Kamil mam 14 lat i od niedawna zajmuję się programowaniem. problem w tym że jestem początkujący i w sumie nie rozumiem kilku rzeczy . :| Dlatego proszę o wyrozumiałość. Moje pytanie dotyczy generatora 36 khz napisałem prosty program, ale oczywiście nie działa, ponieważ sedno problemu tkwi w tym...
Udało mi się między czasie rozwiązać samemu problem. 3 PWMy takie same potrzebne mi są do regulacji oświetlenia RGB. Oto funkcja inicjująca PWMy: [syntax=c]void PWM_Init(void) { _1(TCCR1A,COM1A1);//Clear OC1A on Compare Match, set OC1A at BOTTOM _1(TCCR1A,COM1B1);//Clear OC1B on Compare Match, set OC1B at BOTTOM _1(TCCR1A,WGM10);// _1(TCCR1B,WGM12);//Fast-PWM,...
Proszę uprzejmie oto najnowsza i aktualnie używana wersja kodu: [syntax=c] #include <avr/io.h> #include <stdlib.h> #include "HD44780.h" int main(void) { LCD_Initalize(); DDRD |= (1<<PD5); ADCSRA |= (1<<ADEN); //Inicjalizacja Timer1 (PWM) TCCR1A |= (1<<COM1A1) | (0<<COM1B1) | (1<<WGM11); //Tryb 14 (FAST PWM,...
Kod aktualnie jest taki: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> int on_time=0; int potA=0; int freq=0; int potB=1023; void timer_on(){ TCCR1A|=(1<<COM1B1) |(1<<WGM11) |(1<<WGM10); TCCR1B|=(1<<WGM13) |(1<<WGM12) |(1<<CS11); } void timer_off(){ TCCR1A&= (0<<COM1B1); } void init_adc(){...
Witam. Jak widać jest to mój pierwszy post na tym forum. Na wstępie chciałbym prosić o wyrozumiałość - jeżeli temat znalazł się w nieodpowiednim miejscu, popełniłem jakiś błąd w składni tytułu czy coś tego typy, prosiłbym moderatora o poprawkę i pouczenie jak w przyszłości uniknąć powielenia problemu. Jestem w trakcie pisania pracy inżynierskiej dotyczącej...
Potrzebuje zbudować urządzenie które bedzie zliczało czas do momentu gdy mierzone napięcie przekroczy napięcie odniesienia. Więc skorzystałem z Timera1 i oczywiście z komparatora. Otóż mój problem polega na tym że komparator nie działa(chyba). Próbowałem zrobić to na 2 sposoby za pomocą kontroli stanu wyjścia komparatora(wyjście ustawione 1 jeżeli napięcie...
Witam poniżej przedstawiam kod programu za srednikami jest poustawiany timer 16 bit który steruje serwomechanizmem z modeli RC i działa wszystko poprawnie (wyjscie OC1A do serwa) natomiast ja chcialbym to serwo wysterować 8 bitowym wyjscie (OC0/t0 pin1 do serwa) I niby wszytsko dobrze posutawialem ale serwo ani drgnie dlaczego? #include "avr.inc"...
Dzięki. Wczoraj problem się rozwiązał. Light-I Masz rację połowicznie. Samo wyzerowanie xxxxx000 w TCCR1B nie zwalnia portu z PWM. W moim wypadku powodowało to, że silnik dalej się kręcił tyle, że z max prędkością już. Musiałem zwolnić port żeby ustawić odpowiednie stany (TCCR1A = 0000xxxx). Wyszło na to, że muszę stosować oba rozwiązania opisane wyżej...
Witam. Mam Pewien problem odnośnie PWM w ATmega8. Oto fragment programu testowego #include "avr/io.h" int main() { OCR1B=120; OCR1A=50; DDRB=0xff; DDRC=0x00; PORTC=0xff; TCCR1A |=(1<<COM1A1) | (1<<COM1A0) |(1<<COM1B1) | (1<<COM1B0) |(1<<WGM10)|(1<<...
Witam szanownych forumowiczów. Wykonywany przeze mnie projekt to prosty sterownik lampek LED RGBW. Lampki sterowane są poprzez 4 kanały PWM, których współczynnik wypełnienia regulowany jest potencjometrami podłączonymi do 4 wejść ADC mikrokontrolera. Wyjścia PWM ustawione są w trybie fast PWM o częstotliwości 490Hz. No i poprawnie wykonana operacja...
Cześć! Przez nieuwagę upaliłem piny, na które wyprowadzone sa domyślnie timery, a potrzebuję PWMu. Wpadłem więc na pomysł, by użyć przerwań TIMERx_COMP. Niby przerwania są obsługiwane (jak dam głupotę w stylu {zapal_pin; czekaj; zgaś_pin; czekaj;}, to widać działanie), ale nie udało mi sie uzyskać PWMu, które mogłoby sterować ledem. Może miałby ktoś...
Witam. Napisalem posta w dziale mikrokontrolery ale nikt mi nie odpowiedzial wiec prosze teraz Was o pomoc. Otoz mam program w asemblerze do generwania przebiegu przez PWM za pomoca licznika1(16 bit) po uruchomieniu symulatora dziala wszystko i stany na wyjsciu OC1A sie zmieniaja, jednak juz po zgraniu programu do procka stan na pinie sie nie zmienia....
Dzień dobry, mam problem z uruchomieniem serwonapędu na ATmega8535, prosiłbym was o ustosunkowanie się do mojego kodu. Pisząc go posiłkowałem się stronami: #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <string.h> int main(void) { int p = 1500; //zmienna DDRA = 0x00; //przyciski PORTA...
Ogólnie nie pisze w bascomie. Rozumiem jak coś jest napisane, ale samemu raczej nic nie wymodzę. Załączyłem schemat z podstawowymi elementami każdego układu z mikrokontrolerem (kondensatory filtrujące, pull-up na resecie) http://obrazki.elektroda.net/10_12568564... Jedna dioda podpięta do wyjścia OC1A - wyjście PWM. Atmega8 ma jeszcze 2 takie...
A mogłes tak pomysleć bo nie dodałem że mruganie na timer robie a nie na delay ok. http://obrazki.elektroda.pl/4555804300_1... DDRB|=(1<<PORTB1); TCCR1A|=(1<<COM1A1)|(1<<COM1... // TCCR1B|=(1<<WGM13)|(1<<WGM12... //PRESCALER=1024 MODE 14(FAST PWM); ICR1=975;...
Kurde juz nie wiem? Mam licznik z CTC napisany w ten sposób: void SINGAL (SIG_OUTPUT_COMPARE1A) { PORTB^= _BV(PB1);//generacja fali nonej 36kHz //OCR1A = 2800; } a w main : TIMSK = (1<<OCIE1A); TCCR1A = (0<<COM1A0); TCCR1B = (1<<WGM12)|(1<<C... OCR1A = 13; // ms sei();...
Witam, mam kilka pytań dotyczących PWM-a w procku atmega8. Próbuję ustawić 8bit fast PWM-a na pinie OC1A takim kodem: ;... ldi r16,(1<<PB1) out DDRB, r16 ldi r16, (1<<WGM10|1<<COM1A1)... 5 (8bit fast pwm) out TCCR1A, r16 ldi r16, (1<<WGM12|1<<CS10) out TCCR1B, r16 ldi r16, 120;wypelnienie...
Witam kolegów, sprawdzałem na różne sposoby, int0 ma mi dodac do pozycja++; ale nie dodaje... prosze o oswiecenie ;) /* układ ATmega 1MHz */ /* servo by dex */ #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> unsigned int roznicapozycji; unsigned int wynik; unsigned int dolnyzakres; unsigned...
hym.. komendy jak sie zabrac, bedzie trudno. Napisz moze o jaki jezyk chodzi, jesli o c, to mozesz sobie psoterowac jasnoscia swiecenia: Ustawienia wieszosci w tym przykladzie nie sa jedyne mozliwe, zeby to rozszyfrowac najlepiej zajrzyj do datasheet od AtMega8. Oczywiscie zmiana wypelnienia odbywa sie na odpowiednim pinie- tutaj powiazanym z drugim...
Witajcie, Potrzebuję konfiguracji timera 1 dla atmega8 aby wykonywał funkcję z częstotliwością ~244Hz (zegar 16MHz i preskaler 2^16) . Chciałbym uniknąć używania dodatkowych bibliotek. Będę wdzięczny za przykładowy kod :) jakąś Przy okazji; jeśli użyję do tego celu timera 1, mogę równocześnie używać wyjść OC1A oraz OC1B jako zwykłe wyjścia I/O? Timer1...
Czy da to się wrzucić na ATMEGA8? Tak prosto to się nie da. Trzeba zmienić te linijki: (na podstawie noty katalogowej ATMEGA8) #define REDout OCR0A #define BLUEout OCR0B #define GREENout OCR1BL void PWMint(void) { DDRB |= 1<<PORTB2; DDRD |= 1<<PORTD5; DDRB |= 1<<PORTB4; TCCR0A = (1 << COM0B1)|(1 <<...
... RATUNKU!!! Kod programu: ... void PWM_Init(void) { TCCR1A = 0xa2; //0xb2; //0b10110010; TCCR1B = 0x1b; //0b00011011; ICR1H = 0x03; //0b00000011; ICR1L = 0xc0; //0b11000000; OCR1A = 0x00; //PRAWY DODATNI OCR1B = 0x00; //LEWY DODATNI sbi(PORTB,kierunekL);//nie zmieniaj kierunku sbi(PORTB,kierunekP); //Mistrzu !!! Gdzie...
No watchdog nie jest włączony więc nie powinien resetować procka:| Na wszelki wypadek spróbowałem go resetować w mainie czyli mam tak: Main: wdr ; jmp Main Ale to też nic nie wnosi (zgodnie zresztą z przewidywaniami:(. ) Zapomniałem dodać a to też może budzić pytania kość pracuje na 8MHz a preskaler ustawiam na 8 ldi R16, 0b00000000 ; tryb ctc czestotoliwosc...
Mam pewien problem. Pobrałem z internetu bibliotekę do LCD HD44780, działa ładnie ale pod m.in. ATMega32 a pod ATMega8 nie kompiluje się. Postanowiłem ją poprawić i jak łatwo się domyśleć nadal nie działa ;/ Kompiluje się teraz ale nie nic nie wyświetla. Powiedzcie gdzie popełniłem błąd? Kod po zmianie: #include "delay.h" volatile uint16_t...
Witam, ja mam pytanie odnośnie PWM na Timerze1: Phase and Frequency Correct (TOP OCR1A). Chciałem sobie sterować silniczkiem za pomocą właśnie tej opcji PWM na nóżce OC1A. Żeby nie wyszło, że jestem lese0r, nadmienię, że Fast PWM w trybie 10bitowym (tzn z określoną częstotliwościa) udało mi się uruchomić. Wówczas wypełnieniem PWM sterowałem za pomocą...
bascom tccr1a tccr1a atmega bascom tccr1a tccr1b
odświeżania pamięci amica wymiana pompy peugeot boxer kluczyk
liebherr zamrażalnik drukarka laserowa poziome paski
Wpływ switcha na ping latency w sieci Układ scalony DIL8 do generowania sygnału PWM