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...
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ść...
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.
Tak rzeczywiście PWM chodzi jak powinien zeruje sie przy przejściu przez MAX tylko symulator szwankuje sprawdziłem to dając w głównej pętli while warunek while(1){ if(bit_is_set(PIND,PD5)) { licznik[0]=TCNT1; delayus(205); licznik[1]=TCNT1; delayus(1); licznik[2]=TCNT1; delayus(5);...
Ustaliłem na początku wartość początkową licznika TCNT1=0; Mogę wykorzystać ICP ale nie wiem jak to zakodować.
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.
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...
Problem dla mnie pojawił się ze zrozumieniem wektorów przerwań które obsługują timer1. W dokumentacji jest tabela na stronie 46 W czym problem? Jak korzystasz z przerwania np. Timer/Counter1 Compare Match A czyli przerwanie w momencie gdy zawartość licznika (TCNT1) zgadza się z tym co wpisałeś do OCR1A to jeśli wcześniej w TIMSK ustawisz odpowiedzialny...
A sprobuj zerowac licznik takim czyms: TCNT1 = 0x0000; zamiast TCNT1H = 0x00;//zerujemy timer 1 TCNT1L = 0x00;
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 &...
...przy 10000HZ na LCD wyświetla 0666... No to prawie jak liczba szatana :) if(licznik==4) { T1=TCNT1; utoa( T1, bufor1, 10 ); lcd_gotoxy(3,0); lcd_puts(bufor1); TCNT1=0; } Widzę, że dodałeś pozycjonowanie kursora, żeby wynik za każdym razem był wyświetlany w tym samym miejscu wyświetlacza. Trzeba by jeszcze...
Sądzę że to niemożliwe do policzenia podczas kompilacji ponieważ w programie może być pętla, a kompilator nie wie ile razy zostanie wykonana. W moim kodzie akurat w tym miejscu nie ma pętli ale są 3 warunki czyli co najmniej 2 bliskie skoki. Czyli też nei wiadomo ile czasu się bedzie wykonywać, bo skok to 3 cykle, a brak skoku to dwa cykle. Może są...
Zawartość licznika jest w TCNT1, a gotowa funkcja to: a=TCNT1; gdzie a to zmienna typu unsigned int ;)
... 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...
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),...
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,...
Witam, Próbuje zrobić częstotliwościomierz i napisałem taki programik: #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #include "lcd.h" float f,licznik; int t; char bufor1[10],bufor2[10]; SIGNAL (SIG_INPUT_CAPTURE1) { licznik=TCNT1; } SIGNAL...
Dzieki za szczegolowy opis, wczesniej zbyt szybko pospieszylem sie z odpowiedzia :) . Jeszcze raz przyjzalem sie programowi i mam watpliwosc co do odczytu z 16b. rejestru TCNT1. O ile zapis jest zgodny ze specyfikacja atmela (zobacz strona 83 pdf-u Tiny2313) najpierw wpis to bajtu starszego a pozniej mlodszego to odczyt powinien byc w kolejnosci odwrotnej....
Dobrze się kolega domyśla to ATtiny26. TCNT0 to 8 bitowy rejestr licznika tak jak TCNT1 - czy mam go deklarować ? i jako volatile ?
Odpowiedź jest prosta i można ją wyczytać nawet z tabelki ustawień WGM1x: Tryb CTC wykorzystuje m.in. OCR1A do ustalenia wartości TOP licznika TCNT1, czego OCR1B nie potrafi zrobić samodzielnie. Jeśli chcesz skorzystać z obu przerwań OCR w wybranym przez Ciebie trybie CTC, to OCR1A i tak musisz ustawić tak jak obecnie by "skrócić" licznik. Natomiast...
Witam! Z tego co zauważyłem, a to: '-------------------------obsługa przerwań--------------------------------... '''''''''''''''''''''''sekunda - przerwanie od zegara'''''''''''''''''''''''''' Calasekunda: Cala_sekunda = 1 Stop Timer0 Impp = Tcnt0 Tcnt0 = 0 Start Timer0 Liczba_taktow = Capture1 Capture1 = 0 Return wg. mnie powinno być: '-------------------------obsługa...
Przepraszam ze nie odpisałem ale nie miałem zupełnie czasu. Wymyśliłem coś takiego (program ma dzialac na Atmega99PA czestotliwość zegara to ok 100kHz: [syntax=c] #include <avr/interrupt.h> . . . /*przerwania*/ volatile unsigned int licznik=0; uint8_t przerwanie=1; ISR (INT0_vect) { if (przerwanie==1) { TCNT1=0; EICRA=_BV(ISC01)|_BV(ISC00); /*Reakcja...
Na pewno nie wystarczy zmienić INT2 na ICP1. Czytałem jakiegoś manuala i zrozumiałem to tak. ICP służy do zapisu sygnałów wchodzących na procesor oraz odmierza ich czas trwania bądź momentu w którym wystąpiły. Działa to tak, że Timer1 (16 bitowy) liczy sobie z taką prędkością jaką zadaje mu preskaler. W chwili gdy na wejściu ICP pojawia się zbocze sygnału...
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.
Zobacz co się dzieje: TCNT1 ma wartość 65535 i za chwilę nastąpi przerwanie, wykonywana jest instrukcja timer1_=TCNT1 i w tym momencie następuje przerwanie. TCNT1 po powrocie ma mniejszą wartość ale jest już po herbacie - licznik==1 warunek po if jest spełniony PORTB=0 i czekamy na następne przerwanie. Dlaczego 20 cykli jest dobrze? Bo przerwanie musi...
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...
koniecznie zmień kolejność (manual str 88 ) TCNT1L = 0xDC; TCNT1H = 0x0B; na TCNT1H = 0x0B; TCNT1L = 0xDC; albo lepiej w C TCNT1=0x0BDC napisz co wyszło abstrahując od wszystkiego zmieniłbym algorytm tzn: wprowadziłbym dodatkowe zmienne licznika, i umieścił wszystko na jednym przerwaniu. Na pierwszy rzut oka to komplikacja, jednak w rzeczywistości przesuwasz...
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...
Zrobiłem sobie prosty wyświetlacz widmowy. Jednak gdy próbuję coś na nim wyświetlać to obraz mi się podwaja (chcę wyświetlić literę F a uzyskuję FF). Z czego może to wynikać? Dołączamy kod (na razie bardzo ubogi). Pomóżcie. [syntax=c]#include <util/delay.h> #include <avr/io.h> #include <avr/interrupt.h> volatile char licznik = 0; char...
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...
Dzięki BlueDraco za Twoją cierpliwość. Jaką wartość ma przerwa, jeśli nie wszedłeś pod pierwszy if()? przerwa ma wartość =1 (warunek zanegowany - nie wchodzi do pierwszej lini) Wchodzi do drugiej lini bo przerwa=1 a warunek=TRUE Czemu służy drugi if()? wejdzie do pierwsz linia if() po wystąpieniu (pierwszego) przerwania od INT0. -uruchamiany jest TIMER1...
A change of the COM1x1:0 bits state will have effect at the first compare match after the bits are written. For non-PWM modes, the action can be forced to have immediate effect by using the FOC1x strobe bits. Być może w tym jest problem. OC1A jest prawdopodobnie inicjowane z wartością 0 do momentu wystąpienia pierwszego "compare match". W trybach "set...
Sprawdzam wartość rejestru TCNT1. Być może jest bug. mumin_80
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...
Witam, Napisałem taki oto programik który ma za zadanie zmieniac stan diody co około jedną sekunde (odrazu dodam że nie chodziło mi o odmierzenie dokładnej sekundy tylko o opóźnienie). Wyliczyłem że przy preskalerze 256 timer1 musi zliczyć do 31250 żeby odczekał sekunde (taktowanie 8Mhz). Ustawiłem też bit WGM12 dzięki czemu Zawartość licznika TCNT1...
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:(...
#include <avr/io.h> // dostęp do rejestrów #include <avr/interrupt.h> // funkcje sei(), cli() #include <avr/delay.h> ISR(TIMER1_OVF_vect) { TCNT1=50; } ISR(TIMER2_OVF_vect) { TCNT2=0x50; } int main() { // Ustawienie licznika 2 TCCR2=_BV(CS20); // Ustawienie licznika...
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ć...
Witam! Głowie się z tym nie wiem którą godzinę i nie mogę dojść czemu tak się dzieje. Mam tego typu program: #include <avr/io.h> #include <avr/interrupt.h> float m_sekundy_wtrysk=0, m_sekundy_obr=0, wynik2=0; uint8_t i=0, k=0, znacznik=0; float wynik=0; ISR(INT1_vect){ //przerwanie od złącza PD3 (INT1) TCCR1B |= _BV(CS10);...
#include <inttypes.h> #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> #include "lcd.c" #define LED_ON (PORTB|=(1<<4)) #define LED_OFF (PORTB&=~(1<<4)... #define LCD_LIGHT_ON PORTB|=_BV(6) #define LCD_LIGHT_OFF PORTB&=~_BV(6) #define...
Jeśli jeszcze aktualne :) W ten sposób to obliczasz częstotliwość sygnału, a nie wypełnienie. Powinno być raczej: ts zawiera (bez konieczności przeliczania) czas trwania impulsu w mikrosekundach.
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...
Użyj licznika T1, a zamiast zmiennej uSeconds wykorzystaj zawartość rejestru TCNT1.
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<...
Chodzi o to, że po pierwszym przerwaniu TCNT1 będzie miał wartość 0, czyli zliczy potem 65536 impulsów. Zaś do generowania, jak Ty chcesz, przerwań co określony odcinek czasu służy tryb CTC. Wtedy w rejestrze OCR ustawiasz ilość impulsów, które chcesz zliczyć, i wygenerować odpowiednie przerwanie.
//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....
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...
Co jest źle, czego brak ? Wymagany sygnał: PWM -|________|-----|________|----| SD ---|______|--------|_______|------| (SD przed TOP) sygnały wyprowadzone na LEDy. Problem: Brak sygnału PWM. (na pinie 3.3V non-stop) !!!!! - pin SD działa prawidłowo. - ATmega 16 -nie uszkodzona. - Płytka PROPOXu sprawna. Tu wycinki z programu. [syntax=c] #define PORT_PWMPORTD...
Sygnał podpinasz pod PD6, inicjalizujesz licznik: [syntax=c]void Init_Timer1() { TCCR1B = (1<<CS12) | (1<<CS11); TCNT1 = 0; }[/syntax] a w programie jako wartość enkodera czytasz TCNT1.
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...
Więc tak, napisałem program od nowa, zliczając tym razem przerwania INT1 i wywołując funkcję write_text_RAM() (wysyłającą dane po rs232) w przerwaniu TIMER1_OVF z odpowiednią wartością wpisaną do TCNT1. Okazało się, że jednak przerwania INT1 występują prawidłowo, co 0.01 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h>...
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...
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...
http://obrazki.elektroda.pl/4678713800_1... Prezentowane w temacie urządzenie jest funkcjonalnym licznikiem przeznaczonym dla graczy starochińskiej gry GO. Sam nie jestem zapaleńcem GO, urządzenie zrobiłem bratu, pogrywamy wspólnie od czasu do czasu. Aby licznik zrobić bardziej uniwersalnym dodałem możliwość dowolnego ustawiania czasu...
OCR1A rozumiem, ale TCNT1 po zapisaniu jakąkolwiek wartością powinien ją zmieniać, jako że jest licznikiem impulsów; a skoro piszesz, że ten rejestr pamięta wartość wypełnienia, to musi być jakiś bufor sprzętowy przed nim lub zrobione odświeżanie TCNT1 w przerwaniu od niego. Nie omieszkam sprawdzić niebawem jak to działa :)
Witam !!! ISR(TIMER1_COMPA_vect) // przerwanie dla porownania { PORTC ^= 0x01; // zapalic/zgasic diode ICR1=28798; } int main(void) { DDRC |= 0x01; // INICJALIZACJA LICZNIKA 1 TCNT1 = 0x0000; // wartosc poczatkowa TCCR1A = 0x0000; // OC1A/OC1B odlaczone // zwykly tryb pracy //TCCR1A |= (1 << COM1A0); TCCR1B...
Mam ustawiony timer na 4kHz [syntax=csharp]cli(); TCNT1 = 0; TCCR1 = 0; OCR1C = 249; // 4000 Hz (16000000/((249+1)*16)) OCR1A = OCR1C; TCCR1 |= (1 << CTC1); TCCR1 |= (1 << CS12) | (1 << CS10); TIMSK |= (1 << OCIE1A); sei();[/syntax] W przerwaniu timera machałem pinem [syntax=csharp]ISR(TIMER1_COMPA_vect) { //licznik timer1 przepełnienie...
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ę...
Witam nie mogę rozkminić jak działa przeliczenie opóznienia z kodu poniżej [syntax=c] void Wait_for(uint16_t delay) //Realizuje opóźnienie o zadanym czasie liczonym { //w odcinkach co 100 us TCCR1B=(1<<CS12) | (1<<CS10); //Preskaler timera 1024 TCNT1=0; //Pobierz aktualny stan licznika timera uint16_t val=delay*(F_CPU/10000UL)/1024; //Przelicz...
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ł.
W AVR Studio Version 4.14 korzystam z Debugera jesli o to Ci chodzi. Sprawdzam wartosci w I/O View, a konkretnie przygladam sie TCNT1 czyli wartosci licznika Timera1. Oprocz tego sprawdzam tam czy przypisane sa odpowiednie wartosci do ICR1 i OCR1A (wszystko sie zgadza). Sugerujesz, ze ten Debuger moze w tej kwesti klamac? Zaraz pojde sprawdzic w ukladzie...
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...
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]
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...
Do ustawiania jego parametrów służą dwa rejestry TCCR1A i TCCR1B, jeżeli ma chodzić jako zwykły tradycyjny timer to powinieneś tylko ustawić preskaler w rejestrze TCCR1B, w momencie ustawienia preskalera timer jest odpalany. W TCNT1 jest aktualna wartość licznika. Jeśli chcesz przerwanie od timera to w rejestrze TIMSK ustawiasz bit TOIE1(overflow),...
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...
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...
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! Wielkie dzięki kolego atom1477 za wytłumaczenie mi dlaczego tak się dzieje i innym dlaczego tak zrobiłem, oszczędziło mi to pisania;) . Zrobiłem tak: mark[0]=TCNT1; PORTD&=~(1<<2);// Wyzwolenie przerwania opadającym zboczem _delay_ms(500); LCD_GoTo(0,0); LCD_liczba16(mark[1]-mark ...
Dziękuje bardzo za pomoc, jak tylko przyjadę z pracy poprawie kod i dam znać czy i jak wprowadzone zmiany wpłyną na działanie programu. przetestowane - jedna uwaga zapis [syntax=c]TCNT1 = 0xFFFF - 100/7372800[/syntax] daje wpis o wartości ok 65534,99999 - obliczone na szybko w calc. potrzebną wartość jeśli się nie mylę uzyskam po wprowadzeniu: [syntax=c]...
Witam, mam problem ze stworzeniem w języku C generatora, który będzie mi zmieniał stan niski na wysoki (stan niski 10ms, stan wysoki 0.32ms) przez czały czas działania programu niezależnie od pętli głównej programu. Czy jest to wogóle możliwe? Liczę na pomoc w dojściu do rozwiązania tego zagadnienia. ATmega 168 taktowana wewnętrzym oscylatorem 8MHz....
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...
Witam !!! Założę nowy temat z tego względu, że problem jest już trochę inny, niż ten poruszany w " ustawienie rejestrow w timerze 1" ISR(TIMER1_COMPA_vect) // przerwanie dla porownania { PORTC ^= 0x01; // zapalic/zgasic diode OCR1A=1440; //OCR1A=14745000/(512*(0.0185*AD... + 0.9814)); } int main(void) { DDRC...
Przyczyna jest banalna. To nie moze dzialac bo takie jest zalozenie producenta. A wystarczy napisac while(TCNT1<100); Nie nie to nie pomyjka ten rejest jest z zalozenia 16 bitowy i porownuje caly licznik T1 a nie tylko jeden bajt.
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...
\ 1. Rozumiem, że ustawienie odpowiedniej częstotliwości da mi czas, który jest mi potrzebny? Tak, program z tego postu demonstruje rejestry i bity których odpowiednie ustawienie spowoduje daną częstotliwość przerwać timerów, a w konsekwencji odpowiednią częstotliwość wysyłania tekstu / migania diodą, jednak obecny ustawiony czas jest przykładowy, nawet...
flaga==0; cóż to za cudo? Wykorzystujesz przerwanie TIMER1_OFV_vect a licznik ustawiasz w tryb CTC z wykorzystaniem COMPA. nic dziwnego ze nie działa. 2 sprawdzenie czy wciśnięto klawisz zbyteczne. if(flaga==1) { TCNT1=0x00; nie tylko zeruj licznik ale i włącz go, bo TCNT1=0X00; tylko zeruje licznik a nie zatrzymuje Dodano po 4 Ma byc...
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)...
Żeby zrobić pomiar czasu w sek, potrzebuję wykorzystać drugi timer (TCNT1), on jest 16 bitowy. Kiedyś dla 8bitowego zrobiłem kalkulator w Excelu, za pomocą którego mogłem łatwo znaleźć czas, dopasowując częstotliwość, wartości w liczniku itd. Zamieszczam ten kalkulator, oraz program. Zrobiłem to samo dla 16 bitowego licznika. Ale nie umiem tego opanować,...
Witam wszystkich! Mam taki problem.... 'C026a.bas Zmiana jasności diody LED Config Timer1 = Pwm , Pwm = 8 , Prescale = 1 , Compare A Pwm = Clear Down Cls 'czyść ekran Lcd "EdW" 'wyślij napis Lowerline 'kursor do dolnej linii LCD Lcd "Cwiczenie 26a" 'wyślij napis 'czekaj 3 sekundy Do 'pętla nieskończona Incr Pwm1a 'zwiększ zawartość rejestru OCR1 If...
Witam ponownie. Poniżej zamieszczam źródło mojego programu. Ma on działać następująco: Po wykryciu zbocza narastającego na INT0 resetuje zmienną x, włącza timer i obsługę INT1, którego przerwania cyklicznie inkrementują zmienną x. Po wykryciu zbocza narastającego na INT1, ma zatrzymać timer i włączyć obsługę INT0. Jednocześnie pętla główna cyklicznie...
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ć...
trochę się doczepię: Teraz jest ustawiony na pojawienie się przerwania od przepełnienia TIMER1 Nie da się ustawić wyzwalania przetwornika od pojawienia się przerwania. Przetwornik może być wyzwalany przepełnieniem się timera. Zamiast uruchamiać przerwania tegóż licznika i wpisywać pustą obsługę przerwania, lepiej w przerwaniu od przetwornika dopisać:...
Co prawda nie zliczam czasu tylko cykle zegara ale można z tego bez problemu wyliczyć czas. Umieszczam ten kod dla innych którzy będą czegoś takiego potrzebowali. Efekt końcowy tematu. [syntax=c] // Atmega1284P #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include "uart0.h" volatile...
Cześć, Napisałem program, który uruchamia 16-bitowy Timer (TCNT1 w ATmedze 128). W moim programie Timer zlicza przez 128ms (dolicza w tym czasie do wartości 1000). Następnie wyświetla młodszy i starszy bajt Timera na wyświetlaczu alfanumerycznym (odpowiednio wartości dziesiętne 232 oraz 3). Do tej pory wszystko działa, ale gdy chcę wysłać odczyt każdego...
AD2. Hmm, ale myslalem ze tylko OCR1A moze robić jako TOP value w w TCNT1. Jeśli chce mieć te 12800 albo 14400, to musze ograniczać licznik a OCR1B chyba nie może tego robić. No chyba, że nie zauwazyłem jakiejś kombinacji prescaler/count number, która pozwolić działać na pełnym obrocie licznika. Jeszcze tego nie widze do konca, ale moze juz wkrotce...
Witaj Twoje obliczenia wyglądają na poprawne jednak wydaje mi się, że to cli() jest w złym miejscu. Z ustawień timera widze, że mierzysz "powolne" sygnały. Zatem twój program może nie zdążyć złapać przerwania od INT lub złapie tylko zbocze opadające, ale narastającego już nie, bo zostanie wyłączone globalne przerwanie. Poniżej przedstawiam mój kod który...
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...
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...
Witam, mam problem z uruchomieniem programu do zliczania impulsów na T1 przez 1 sekundę. Wyświetla mi ciągle zero. Co źle ustawiłem z Timerami ?? Atmega 32 [syntax=c] #define F_CPU 1000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <hd44780.h> volatile unsigned char licznik = 0; //liczba...
Pusty blok jest dlatego, że utknąłem na konfiguracji Timer0. Jeśli chodzi o rejestry, to podejrzewałem, że jest tak, jak Kolega pisze. Wartość TCNT0 = 6; trzeba będzie wpisać do przerwania Timera Przy ustawieniach: [syntax=c] TCCR0A = (1 << CS01)|(CS00); // źródłem CLK, preskaler 64 TIMSK = (1<<TOIE0); //Przerwanie overflow (przepełnienie...
Witam, dziękuję bardzo za cenne wskazówki jak rozwiązać mój problem. Stworzyłem kod i proszę o sprawdzenie czy takie coś ma szansę zadziałać. Pozdrawiam serdecznie #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER1_COMPA_vect) { ///dowolna akcja } int main (void) { TCCR1B |= (1 << WGM12);...
Jak na załączonym obrazku, wskazówka i pozostałe elementy obrazu "migają", tak jakby nie zapalały się po każdym obrocie. http://youtu.be/SMU5YG3xl9k W czym tkwi problem? W kodzie prawie nic nie ma. Jeśli każę się zapalić wskazówce w przerwaniu to pięknie chodzi. PS: Wiem że zegar chodzi za szybko i w drugą stronę narazie tylko do testów :D. Przerwanie...
Rejestry sterujące TCCR0A / TCCR0B , TCCR1A / TCCR1B - ustawianie trybu pracy. Rejestr licznika TCNT0 , TCNT1 (nic nie zmieniasz, ale jest wykorzystywany) - zliczanie. Rejestry porównania OCR0A / OCR0B , OCR1A / OCR1B - sterowanie wypełnieniem. A w liczniku Timer1 także GTCCR (dodatkowe tryby pracy) i OCR1C (dzielnik PWM).
Okazało się ze atmega chodziła na 1MHz...wewnętrznym oscylatorze... Ale teraz mam kolejny problem Dodano po 16 Więc jest tak, dzięki odpowiedniemu ustawieniu Fusebitów ustawiłem Atmegę na 8Mhz. Przeliczyłem tablicę stałych dla 8Mhz. I teraz mam pytanko: Uruchamiając ten program widać jak diody migają.. #define F_CPU 800000L #include <avr/io.h>...
Poczytaj o tym, bo warto od razu przejść na taki "wyższy poziom" niż brnąć w ślepą uliczkę z blokowaniem programu przez zbędne delaye. W sumie czy aby przypadkiem migająca dioda w tempie 1s ze zmiennym wypełnieniem na jakimkolwiek timer to nie jest program z tych w rodzaju "Hello AVR!" :D Brakuje mi ewidentnie tutaj jakiegokolwiek ISR'a ;) // Clock...
Witam pisze program do obsługi 2 silników dc poprzez avr atmega16 + rs232, mam pytanie odnośnie tego programu mianowicie: Przy obsłudze rs232 poprzez uarta 1. Linie portu RXD (PD0) ustawiamy jako wejście w jakim stanie wysokim czy niskim ? 2. Linie portu TXD (PD1) ustawiamy jako wyjście w jakim stanie wysokim czy niskim ? Czy modulacja pwm jest dobrze...
Polecam sprawdzone rozwiązanie od co najmniej 30 lat na elementach dyskretnych. Układ posiada detekcję fazy. Żarówkę, lub silnik włączamy szeregowo z siecią AC. http://obrazki.elektroda.pl/2745125700_1... A ja nie polecam. Przy większych przesunięciach fazy ten układ jest bardzo niestabilny. Na ATiny2313 zrobiłem swojego czasu 4 kanałowy...
Kod skompilował się po dodaniu komendy Dim a as byte i wygląda to tak: [syntax=basic4gl]$crystal = 8000000 'Deklaracja częstotliwości kwarcu $regfile "attiny2313.dat" 'deklaracja modelu procesora Declare Sub Zwieksz 'Deklaracja procedury zwiększającej stan rejestru porównania Declare Sub Zmniejsz 'Deklaracja procedury zmniejszającej stan rejestru porównania...
Mam nadzieję że zadziała: [syntax=c]#include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #define KEY1 (1<<PA0) // definicja przycików #define KEY2 (1<<PA1) #define KEY3 (1<<PA3) #define KEY1_DOWN ( !(PINA & KEY1) )// definicja wciśniętego przycisku #define KEY2_DOWN...
tcnt1 compare brother licznik licznik zerowa licznik licznik
zakładanie nowych tematów różnice attiny atmega różnić tranzystor
mikrokomputer cobra1 silnik napędu bramy
VW LT 2.5 TDI - Zacinający się czujnik ciśnienia doładowania a problemy z odpalaniem Czy płytka powerbanku działa bez czujnika temperatury?