Czyli: jeżeli mam ustawioną reakcje na zbocze narastające, TIMER1 w trybie normal, i preskaler ustawiony na 1, to licznik TCNT1 cały czas się zwiększa, w momencie wystąpienia zbocza narastającego na ICP1 rartoś jaka była w liczniku jest przepisywana do ICR1 którą przypisuję do zmiennej. W momencie wystąpienia kolejnego zbocza narastającego wartość...
Rzeczywiście to pomogło. Zastanawia mnie, dlaczego jak licznik był w trybie normalnym wywoływane było przerwanie... Bo przerwanie jest od porównania. Gdy TCNT1 = OCRA1 to jest wywoływane przerwanie. A wytłumaczysz mi dlaczego OCR1AL ma wynosić 124, a nie 125? Bo tak jest napisane w datasheet. Zresztą zauważ że taka sytuacja jest sensowna. Zwróć uwagę...
Pierwszy i bardzo poważny problem zauważyłem w funkcji TIMER1_COMPA, jest nim linijka rjmp uspij. Gdy się wykona, to przerwania pozostaną zablokowane, oraz kilka bajtów na stosie zostanie uwięzionych - głównie adres powrotu z przerwania. Można temu zaradzić poprzez wstawienie pop + pop + sei przed rjmp. Drugi problem, to karygodna pętla główna - dławienie...
Wyprowadzając clk z portc można zyskać 1 cykl ( 15 cykli zamiast 16) przy okazji nie wyprowadzając zbędnej części bajtu na pozostałe piny. ld r17.50 lot: ld r16, x+ mov r18, r16 andi r16, 0x0F out PORTC, r16 ori r16, _BV(clk) out PORTC, r16 swap r18 andi r18, 0x0F out PORTC, r18 ori r18, _BV(clk) out PORTC, r18 dec r17 brne lot andi...
http://obrazki.elektroda.pl/7995180000_1... Witam! Jakiś czas temu rozpocząłem naukę pisania programów na mikrokontrolery AVR w języku C++. Przeczytałem wiele tutoriali, poradników, itp., aż w końcu doszedłem do pisania własnych, prostych programów. Po kilku takich „pseudoprogramach” zdecydowałem, że teraz czas napisać coś...
To tak, mam ustawioną wartosc max ICR1 = 1000, i wartosc min OCRIB = 800; Z dokumentacji widzę ze licznik TCNT1 zlicza impulsy i porównuje z OCRIB. Z dokumentacji - licznik TCNT1 zlicza impulsy i porównuje z ICR1(TOP) - następuje zapis nowej wartości OCR1A/B i zeruje(BOTTOM) TCNT1(licznik). PWM 50% to OCR1n = 1/2 ICR1.
Udało mnie się zastosować kod zaproponowany przez (at)efi222, natomiast w funkcji void Cyfry musiałem zmienić typ argumentów na int8_t żeby objąć też liczbę -1 po ostatniej dekrementacji. Przy przenoszeniu kodu posiłkowałem się też innym tematem na elektrodzie https://www.elektroda.pl/rtvforum/topic3... gdyż dotychczas stosowałem tylko timery...
Najpierw uruchomiłeś licznik a dopiero później ustaliłeś zawartość OCR1B. Czyli: - uruchamiasz licznik: TCNT1 = 0, OCR1B =0 - następuje porównanie: TCNT1 = OCR1B - zgadza się. Licznik robi to o co go poprosiłeś czyli ustawia PB2 w stanie wysokim - zmieniasz zawartość OCR1B ale to już nie ma znaczenia. Pin PB2 został ustawiony.
https://obrazki.elektroda.pl/5690923100_... Jest to prosty grupowy regulator mocy z odmierzaniem czasu, wykonany na prezent do kontrolowania piekarnika elektrycznego. Osobiście wolę proste w konstrukcji prostokątne piekarniki z wbudowaną mechaniczną regulacją czasu i temperatury, jednak każdy ma swoje przyzwyczajenia i niektórzy wolą...
Przerobiłem licznik na timer: [syntax=c]while(1){ //---------------------- Krok 1 impuls światła ---------------------------------- licznik = 0; PORTD |= (1<<LED); _delay_ms(100); //mignięcie diody 50ms PORTD &= ~(1<<LED); //_delay_ms(22); //---------------------- Krok 2 pomiar czasu odpowiedzi ------------------------- if (!(PINB &...
Panowie, na szybko zapytałme chatGPT, o kod do obslugi enkodera i zapalenie diody na 1 sekunde ale żeby nie gubic liczenia impulsow. Czy taki kod jest prawidlowy: // Deklaracje zmiennych volatile int impulsy = 0; // Licznik impulsów const int enkoderPinA = 2; // Pin A enkodera podłączony do pinu 2 na Arduino Nano const int enkoderPinB = 3; // Pin B...
przebieg pwm(nieodwrocony) generowany jest tak, ze licznik TCNT1 jest inkrementowany do czasu wystapienia rownosci pomiedzy TCNT1 i OCR1A wtedy nastepuje zerowanie wyjscia, licznik TCNT1 jest inkrementowany dalej, az osiagnie wartosc TOP, potem nastepuje dekrementacja az znowu wystapi rownosc i wtedy jest ustawiany bit wyjscia. A mi chodzi o to ze w...
... ale zaraz, zaraz ;-). Zdarzenie ICP przepisze zawartość TCNT1 do ICR1. OK. Ale licznik TCNT1 wyzeruje się dopiero wtedy, gdy osiągnie wartość nowego ICR1, a więc nie od razu? Przecież może być "daleko" od ICR1...robiw Dodano po 8 ... a przy okazji zmniejszyć może znacznie (poprzez ustawienie nowego ICR1) wartość do jakiej zlicza Timer1 a co za tym...
Na poczekaniu zrobiłem podobny projekt sterujący serwomechanizmami poprzez przycisk, wykorzystujący przerwanie zewnętrzne na zboczu narastającym. Wszystko działało bez zarzutu. Tutaj, po przyjrzeniu się raz jeszcze temu, co naskrobałem widzę, że owszem, program działa. Wchodzi w pętlę while(1) i liczy. Ale najwidoczniej przepełnienie nie następuje,...
A skąd wiesz że jest to naprawdę taki czas jak zakładasz? Może to dalej jest ponad 1.5ms? Zainstalowałeś ten pseudooscyloskop? No bo mi się widzi tak- TCNT1 już osiągnął 20000. Zanim sprawdzisz warunek to program coś robi. A licznik dalej liczy. TCNT1 już przekroczył 20000. No i warunek nigdy nie jest spełniony.
To chyba nie kwestia wyważenia, tylko tego, że jest tak solidnie zamocowane, no i w końcu silnik od HDD jest dość mocny. Jest w tym sporo prawdy. Śmigło jest przykręcone w kilku miejscach a dodatkowo silnik ten ma tak zwartą konstrukcję, że mam wrażenie, że samochód mógłby po nim przejechać. Mimo to projektując płytkę starałem się rozmieścić elementy...
Staram się zoptymalizować kod. W tym celu chcę sprawdzić jak szybko zostaje wykonana instrukcja wysłania 16 bitowego słowa po sprzętowej szynie SPI. W tym celu zeruje i włączam timer1 (BEZ preskalera) na początku wysyłania i zatrzymuje na końcu. Zawartość licznika TCNT1 wysyłam po UARTcie. Wynik jaki otrzymuje to zawsze 278 cykli zegara (16MHz). Ciekawi...
W końcu znalazłem przyczynę problemów - dzięki sugestii Andrzej__S zweryfikowałem jeszcze raz układ by się na 100% upewnić czy mam wszystko dobrze podłączone i wszystko było OK tylko ja zapomniałem o jednej oczywistej rzeczy - sterowanie oświetleniem odbywa się za pomocą TRIAKA :) Gdy załączałem triaka w obsłudze przerwania z timera to jego wyłączenie...
Analizując pobieżnie Twój program - manipulowanie przerwaniami wygląda OK. Niestety coś w kodzie nie trybi ponieważ dioda informująca o dokonanym pomiarze się nie zapala. Wniosek nieuprawniony, ponieważ w pokazanym wyżej programie nie migasz diodą w przerwaniu, ani w części kodu sprawdzającej stan zmiennej end_echo_flag, a jedynie: - zieloną, gdy pomiar...
Nie chciałbym zakładać nowego wątku także, opiszę kolejny problem jaki na potkałem przy budowie tego sterownika w tym temacie. Poniżej zamieszczam testowy kod do sterowania silnikiem lewo prawo. http://obrazki.elektroda.pl/6448390600_1... Przykładowo po pierwszym wysterowania śruba przemieszcza się z punktu 1 do punktu 2, przy kolejnym...
Nie chce zakładać nowego posta więc zapytam tutaj, szczególnie, że problem w sumie jest związany z wątkiem główny tego tematu:-) Napisałem coś takiego: volatile int licznik = 0; void main() { DDRB |= _BV(0);// wyjście DDRB |= _BV(1);// wyjście PORTB &= ~_BV(0);// zero PORTB &= ~_BV(1);// zero DDRD...
Witam. Próbuję napisać program odpowiedzialny za pomiar odcinków czasowych pomiędzy impulsami sygnału S1 i S2 (zgodnie z załącznikiem). Proszę o prześledzenie kodu, wszelkie uwagi i sugestie mile widziane. Nie mam pewności co do poprawności pobierania wartości licznika TIMER1 za pomocą TCNT1. 'program do pomiaru okresu sygnałów podpiętych do PD.2(INT0)...
Celem jest zrobienie funkcji zliczającej czas między przerwaniami generowanymi przez zewnętrzny generator (docelowo będzie to obrotomierz). Generator jest precyzyjny, AD9850. Na wejście zapodaje prostokąt o różnym od 50% stopniu wypełnienia ale to właśnie nie powinno mieć znaczenia. Wyjaśniam. W poniższym kodzie korzystam z funkcji micros która mierzy...
Witam serdecznie. Niestety po wielu bataliach poległem z tematem jakże prostym. Posiadam enkoder optyczny o dokładności 2000 impulsów na obrót. postanowiłem podpiąć go do mikokontrolera aby zacząć liczyć jego impulsy (kierunek obrotu tutaj jest nieistotny) impulsy liczy jednakże liczy je bardzo niedokładnie - szukając nie bardzo mogłem natrafić na szybki...
Zmodyfikowałem przerwanie do takiej postaci: ISR(INT1_vect) //przerwanie od złącza PD3 (INT1) { if( ((PIND&0x08)==0)&... ) //jeśli został zwarty pin... { TCCR1B |= _BV(CS10); //start timera (przerwanie przez zrównanie) znacznik=1; //oznacz że rozpoczeło się liczenie...
Niestety kod po waszych uwagach nadal nie działa:( Podłączenie GND do minusa odbiornika nie wpływa na działanie układu, podłączone nie było, ale po podłączeniu nic się nie ruszyło:( janbernat: zastosowałem się chyba do wszystkich uwag(chociaż nie rozumiem co one mają poprawić) i nadal nic... krru: fakt, mój błąd, ale po poprawieniu nadal nie działa:(...
Natrafiłem na kolejny problem w mojej walce z licznikami. Mój plan jest taki: - licz 18ms - uruchom przerwanie od OCR1A - zmień stan portu D na wysoki - ustaw teraz przerwanie od OCR1B - licz 512 razy po 62 takty (tak mi wyszło z obliczeń przy zegarze 16MHz bez preskalera) - ustaw PORT D na stan niski kiedy wartość licznika będzie się równała 255+polozenie...
Napisałem taki kod... Sygnał wyjściowy chce mieć na PD5, resztę widać chyba w komentarzach, nie wiem jak takie coś z testować, poza tym brakuje tego całego porównania licznika z wartością gdyż nie wiem jak to zrobić za bardzo... Oraz czy dobrze i wystarczająco skonfigurowałem rejestry mi potrzebne do sterowania częstotliwością sygnału prostokątnego...
Może stąd że nie czyścisz wyświetlacza przed wyświetleniem nowej wartości. To było przyczyną, sądziłem że funkcja itoa konwertując liczbę jedno czy dwucyfrową na tablicę znaków char (kilkuelementową) puste pola wypełni białymi znakami. Nie dzieje się tak, to co wydawało się być skonwertowaną liczbą w rzeczywistości zawierało śmieci z poprzedniej liczby...
Może niech kolega spróbuje tak zmienić obsługę przerwania: Dodano po 16 Warto też upewnić się, że przerwanie od timera 0 jest maksymalnie zoptymalizowane. Jeśli wykonują się w nim obliczenia pochłaniające kilkaset cykli zegara, to mogą one opóźnić zresetowanie punktu startowego o ten czas, a przy maksymalnych obrotach podczas 400 cykli zegara wskazówka...
Koledzy mam małą zagwostkę. Potrzebuje rozkodować 2 sygnały ppm - sygnały pochodzące z odbiornika RC do serwa. Sygnał ma taka postać: Poniżej zrzuty z oscyloskopu: Długość impulsu 1.2ms serwo wychylone na maxa w lewo http://obrazki.elektroda.pl/5131828000_1... Długość impulsu 1.9ms serwo wychylone na maxa w prawo http://obrazki.elektroda.pl/6968753000_1...
A czy mógł bym prosić o fragment kodu abym mógł to jakoś załapać bo nie wiem jak to za bardzo to napisać? Dostałeś przecież ode mnie link, a w nim dokładnie opisany przykład: http://www.elektroda.pl/rtvforum/viewtop... Czytam to co jest tam napisane, analizuje i kombinuje na kodzie ale nie mam pojęcia jak za pomocą Timera zdefiniować...
Coś takiego ? [syntax=c] TCCR1B = 0; // wyłącz odliczanie SFIOR &= ~_BV(PSR10);// czyści oba TIMER'y (resztki wartości) ----------------------------------------... zmiana TCNT1 = 0x00; // ----------------------------------------... zmiana [/syntax]
Multipleksowanie jakoś działa, nie mam pomysłu jak można by to było zrobić lepiej. Gdzie umieścić pobieranie TCNT1 też nie za bardzo mam pomysłu...będę kombinował.
Napisałem coś takiego (kod poniżej) i prawie działa. Problem był w deklaracji: volatile int LICZNIK (miałem double zamiast int i nie chciało działać). Jak przepisać cały licznik do zmiennej (jaką zmienną zadeklarować)? #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> //Definicje i markodeklaracje //Definicje do...
Witam! Napisałem program, który ma liczyć ile czasu trwał impuls i jaki jest odstęp między nimi. Problem wygląda tak, że mocno przekłamuje, ponad 2x i nie wiem z czego to wynika. Pomysł był taki, aby za pomocą przerwania od zrównania licznika uzyskiwać czas, czyli jedno przerwanie to u mnie 10µs. Gdy pojawia się impuls, ogólny czas między impulsami...
Jeśli mam być szczery to potrafię korzystać z google i zależało mi na szybkim i prostym wytłumaczeniu, jakie timery jak zdefiniować odpowiednio czasy i jak obsłużyć te przerwania. W C robiłem głównie aplikacje konsolowe i znam konstrukcje pętli, umiem korzystać z instrukcji warunkowych i ogólne podstawy. Niestety przy uC zabija mnie tempo prowadzonych...
Witam. Tworzę mały projekcik i natrafiłem na pewną zagwózdkę. Na początku wprowadzenie co układ ma robić i jak działać. Układ składa się z części analogowej, tzn. dwóch detektorów tonu (LM567) odpowiedzialnych za detekcję "bitów" łącza fizycznego. Chodzi o to, że rozpoznają "swoją" częstotliwość i gdy stwierdzą zgodność z obwodem czasowym, na swoim...
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...
Mam pewny problem i nie umiem tego policzyć bo mi coś źle wychodzi Tak mam ustawiony timer1 16bit [syntax=bash] cli(); TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; TCCR1A = (1<<COM1A1) | (1<<WGM11); TCCR1B = (1<<WGM13) | (1<<CS11); // preskaler 8 ICR1 = 19999; sei(); [/syntax] 1<<COM1A1 - generuje PWM na pinie 9 początek stan wysoki,...
(at)excray No nie za bardzo robi się to tak jak pokazałeś. Przeanalizuj dokładniej pokazany kod a zauważysz, że nie działa prawidłowo. Np. TCNT1 ma 0xFFFF, ina ma więc 0xFFFF. Odmierzasz np. 10 taktów. 0xffff-0x0009 i warunek zakończenia pętli nie jest spełniony... [syntax=c]void delay_us(uint16_t time) { uint16_t ina, inb; ina = TCNT1; do { inb =...
Witam serdecznie! Chciałabym na wstępnie nadmienić,że dopiero zaczynam przygodę z elektroniką. W związku z tym z góry proszę o wybaczenie, jeśli mój kod to masa banialuków. Próbuję zaprogramować uC ATmega168. Chciałabym nauczyć się poprawnej obsługi timerów. W związku z tym próbowałam napisać program dzięki, któremu dioda migałaby dokładnie co 1s. Korzystam...
Witam. Mam pytanie bo nie wiem czy dobrze zrozumiałem działanie fast pwm dla atmegi. Kicznik zlicza od 0 do max. Wartość max jak w nocie pisze uzależniona jest od rozdzielczości (8,9,10 bitów). Ale jest też mowa że można uzyskać rozdzielczość od 2 do 16 bitów w zależności od ustawienia OCR1A). Mi chodzi o rozdzielczość 8 bitów. Ustawiam WGM odpowiednio...
A sprawdziłeś to chociaż? Czy tylko teoretyzujesz? Bo jeśli to pierwsze to coś robisz źle, a jeśli to drugie to weź procesor i.sprawdź. Bo działa to.inaczej niż piszesz. 1. Mamy początkowo stan H 2. Ocr ustawiony na 1000 3. Licznik zlicza do 1000 i zmienia na L 4. Licznik zlicza do 65535, następuje przepelnienie i mamy w Tcnt1 0. Jednocześnie, o tym...
2 impulsy na obrót. (magnes neodymowy i czujnik halla) Nie zależy mi na super dokładności. Coś takiego skleiłem Dodano po 7 Dodam że mój program w innych linijkach kodu dokonuje pomiarów z innych czujników więc nie może być zapętlony i stawać w tej pętli . W pętli głównej while 1 jest parę delayów bo niektóre czujniki potrzebują czasu na pomiar
Witam, Mam którkie pytanko: Powedzmy, że do wyprowadźeń uP IPC doprowadzam sygnał prostokątny i chce wiedzieć jakie czasy mają poszczegółne impulsy. W tym celu konfiguruje Timer1. Mając skonfigurowany Timer1, mogę się spodziewać, że w momencie wykrycia zbocza narastającego (lub opadającego) na wejsciu ICP, aktualna wartość Timera1, rejestr TCNT1 jest...
Dzięki ale dalej nic to niedało. Tak wygląda program po zmianach rozumiem ,że licznik zlicza od wartości z TCNT1 do 65535 więc poodejmowałem za jedną z rad, wartość TCNT1 od wyników ale dalej klapa wyświetla mi jakieś liczby w zmiennej " o " przekraczające czasem grubo ponad 10 000 a z mojch obliczeń 65535-34286 wynika że max to 29714 prosze mnie poprawić...
A ja dzisiaj nie byłem w pracy. Wziąłem zaległy urlop z 2007r. I oto co zrobiłem 'program do pomiaru czasu wciśnięcia przycisku podpiętego do PD.2(INT0) i PD.3(INT1) przez układ RC tłumiący drgania przycisku. 'Przy tych ustawieniach Timer1 zwiększa się co 128us a licznik przepełnia się co 8.389s 'Program sprawdzony i działa. 'W celu...
Moim celem jest regulowanie prędkości obrotowej wiatraczków podłączonych do wyjść PB1 i PB2 za pomocą trybu PWM. Napisałem taki kod jednak coś nie gra. #include <avr\io.h> #include <avr\interrupt.h> #include <avr\signal.h> //ustawienie pinow na wyjscia wiatraczkow #define SET_FAN_OUTPUTDDRB|=(1<<PB1)|(1<... //wlaczenie...
Witam Po krotce omówię problemik z jakim się borykam: Uczę się oczywiście programowania AVR w C, napisałem prosty programik, który ma spełniać role BARDZO UBOGIEGO zegarka. problem polega na tym, ze nie wiem dokładnie jaka wartością mam nadpisać rejestr TCNT1 aby przerwanie wystąpiło dokładnie co 0.1s. Powinienem uwzględnić czasy wykonywania kodu zawartego...
tcnt1 compare brother licznik licznik licznik yaris licznik
dodge światła wymiana grzałki połączenie kabel puszek schemat
hulajnoga frugal problemy odpowietrzyć układ chłodzenia peugeot
Moduł ABS/ESP Bosch 8.1/9.0 Peugeot 5008 2012 – lokalizacja, oznaczenia, diagnostyka Lodówka po doładowaniu gazu za mocno chłodzi - przyczyny i rozwiązania