Nie chce mi się tego testować, ale powinno działać.. // prędkość zegara w hercach #define F_CPU 16000000UL #include <avr/io.h> #include <avr/interrupt.h> typedef unsigned char u8; u8 led_ZmianDoKonca; SIGNAL(SIG_OUTPUT_COMPARE1A) { // czy trzeba dokonać aktualizacji stanu wyjść diod? if(led_ZmianDoKonca != 0) {...
Tutorial do avr taki znalazłem: http://avr.elektroda.eu/?q=node/8 Jak byś czegoś w sieci szukał, to raczej unikaj tutoriala z patron.net, uczy złych nawyków i jest nieco nie na czasie. Pomiar częstotliwośći na AVR realizuje się w miarę łatwo, przy wykorzystaniu timerów, jeden timer pracuje jako licznik impulsów z zewnątrz, a drugi odmierza czas, mozna...
Momentami odnoszę wrażenie, że nie wiesz co piszesz. Do pomiaru długości nie potrzebujesz dodatkowego timera oprócz tego t0. Wystarczy, że będziesz sprawdzał co określony czas, jeśli na wejściu będzie ten sam stan co poprzednio, to będziesz zwiększał pomocniczą zmienną. Jeśli stan się zmieni, to dopiero zapiszesz wartość do np.tablicy, żeby później...
Zastanów się co będzie w rejestrze TIMSK po wykonaniu tych dwóch linii Twojego programu: [syntax=c]TIMSK = (1<<TOIE0); //przerwanie na przepełnienie ... TIMSK = (1<<TOIE1); //przerwanie na przepełnienie [/syntax] Nie definiuj F_CPU w kodzie z tych powodów: http://mikrokontrolery.blogspot.com/2011...
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...
Cześć, uczę się wykorzystania timerów w mikrokontrolerze Atmega8A. Chcę aby dioda migała co sekundę. Wykorzystuję do tego 8 bityowy timer0. Taktowanie ustawione mam na 8000000Hz, a preskaler na 1024. Chcę, żeby przepełnienie występowało co sekundę czyli żeby dioda migała co sekundę, ale tak się nie dzieje. Zmieniam wartość TCNT0 na 30, bo taka wychodzi...
Możecie rzucić okiem na ten kod: [syntax=c] include <stdlib.h> #include <avr/io.h> #include <util/delay.h> # include <math.h> #include <avr/interrupt.h> #include "HD44780.h" int a; ISR(TIMER1_OVF_vect) { PORTB|=(1<<PB1); // podciągnięcie do VCC } int main(void) { TCCR1A |= (1<<COM1A1)|(1<<WGM11)|(1<...
Cześć, mam kłopot z którym nie mogę sobie poradzić. Próbowałem zrobić Timeout do obsługi odbieranych danych z UARTa. Ustawiłem Timer0 na przepełnienie i przerwanie co około 1ms (nie jest ważna super precyzja). Program wygląda tak [syntax=c]volatile uint8_t TimerProg; //F_cpu=8MHz //Timer 0 8 bit init TIMSK |= 1<<TOIE0; //zezwolenie na przewanie...
Masz w nim błąd polegający na tym, że używasz Timer2, a włączasz przerwania od przepełnienia Timer 0: Zmieniłem na: Podobnie z wektorem przerwań - używasz wektora z Timer0: Zmieniłem na: W jakim celu ustawiasz: Kwarc 16MHz Prescaler 64 Timer2 8 bitów= 256, zaczynam liczyć od 6 aby otrzymać 250 kroków Częstotliwość przepełnienia= Częstotliwość Kwarcu...
Rejestr TIMSK to rejestr ,który jedynie informuje mikrokontroler ,które przerwania mają być włączone i obsługiwane. TIFR to rejestr w którym zapisywana jest flaga zgłoszenia obsługi danego przerwania . Każdy układ licznikowy może mieć kilka flag o róznych nazwach związane z różnymi sytuacjami np zgodne porównanie , przepełnienie itp. Jeśli kursy na...
[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...
Witam, Symulacja przesyłania/odbioru przez SPI działa w debugerze AVR Studio 4 gdy nie jest czynna obsługa przerwania przepełnienia licznika1 ISR(TIMER1_COMPA_vect), ale po przepełnieniu licznika zerują się wszystkie zmienne. Jeżeli obsługa przerwania jest aktywna (nawet pusta) to symulacja interface SPI nie działa. Brak wtedy sygnału zegarowego na...
Witam! Napisałem program w C do mierzenia napięcia przez ADC w ATmega8, odczytuję z przetwornika wartość bitową od 0 do 1023. I dotąd jest wszystko ok, ale chcę sterować diodą na innym pinie(np PB1) w ten sposób, że gdy wartość odczytana będzie mniejsza od 500 to dioda ma nie świecić, a gdy przekroczy 500 ma świecić. Problem w tym, że gdy włączę układ...
napisałeś, że nie korzystasz z przerwań - tzn nigdzie w programie nie masz na pewno polecenia sei(); ??? po drugie po co włączasz w ogóle zezwolenie na przerwanie Timera 0 lub 2 bitami TOIE0 lub 2 w TIMSK ???? skoro właśnie nie używasz przerwań przecież jeśli tylko programowo chcesz używać odmierzania czasu Timerem to bez zezwolenia na przerwanie powinieneś...
Witam. chce zbudować urządzenie które będzie mierzyło prędkość obrotową turbiny i kilka innych rzeczy jak na razie utknąłem z pomiarem prędkości. układ opieram na scalaku Atmega32 do pomiaru prędkości wykorzystuje czujnik hala i magnes zamontowany na wałku (aktualnie wiatraczku komputerowym do testów) Program wygląda w ten sposób że chciałem mierzyć...
Wiem co robi przerwanie, problem w tym że nie potrafię określić jednoznacznie gdzie ono się rozpoczyna, gdzie zostaje zainicjowane. Czy przerwanie rozpoczyna się zaraz po zezwoleniu sei(); ? Mechanizm inicjowania przerwań jest z jednej strony relatywnie prosty, lecz dostatecznie zabezpieczony przed przypadkowym jego uruchomieniem. Aby uruchomic jakikolwiek...
To przerwanie nie działa mi jak należy :| Albo ja znowu robię coś źle. Jak zrobię bez przerwań np tak: overflowT3 = 0; // czas = 0 (zero przekręceń licznika) //ETIMSK |= _BV(TOIE3); // zezwolenie na przerwania dla T3 TIMSK |= _BV(TOIE0); // zezwolenie na przerwania dla T0 TCNT0 = 240; // ustawienie wartości (max-16),...
Witajcie, mam problem z odczytem wartości z 2 kanałów ADC. Procesor to atmega32. Używam Timer0 żeby przełączać kanały, a na wyświetlaczu wyświeltane są 2 wartości, ale obydwie pokazują to samo- odczytywany jest tylko jeden kanał Inicjalizacja ADC [syntax=c]void ADC_init() { // ADC ADCSRA = (1<<ADEN) |(1<<ADPS0) | (1<<ADPS2) | (1<<ADSC);...
Tak:) Zrobiłem:) Dzięki za pomoc!! Jeżeli TCNT1 doliczy się do OCR1 na skutek pracy CTC, to nie wywoła tego TCNT1, tylko rejestr OCR1 czyli przerwanie aktywowane bitem OCIE1A w rejestrze TIMSK (str. 112). Właśnie tam w przerwaniu z obsługi flagi OCF1A zostanie wygenerowane przerwanie, bo w końcu ustawiam WGM12 na taki tryb pracy timera. Gdyby był zwykły...
Witam Kod pilota z lirc : # brand: Cambridge Audio # model no. of remote control: RC-540R V2.0 # devices being controlled by this remote: AV Receiver : AZUR 540R V2.0 # begin remote name Cambridge_Audio_RC-540R_V2.0 bits 16->długość ramki flags SPACE_ENC|CONST_LENGTH|REPEAT_HEADER eps 30 aeps 100---> współczynnik wypełnienia nośnej 30/100 header...
Hej. Zbudowałem sobie wyświetlacz widmowy, tylko po wgraniu właściwego programu nie działa jak należy. Ale gdy wrzucę do procka coś prostego np. żeby mrugał naprzemiennie diodami to wszystko działa jak należy i zero mrugania wiec wnioskuję że prędkość obrotowa jest wystarczająca. Mój procesor to Atmega 8, wyświetlacz ma 8 diod 6 diod jest podłączonych...
Czesc, No niestety nie hula... probowałem tego. Myśle ze atmega jest zryta jakos... Mimo tego, ze mam obsługe przerwań i tak, wiem ze to musi działać bo skopiowałem to z mojego poprzedniego projektu, to mi się restartuje atmega. Zwrać na płytce nie ma. [syntax=c] #include <avr/io.h> // Załaduj bibliotekę input/output #include <avr/interrupt.h>...
Witam Jestem w trakcie budowania małego projektu, mam z nim niestety mały problem z którym nie mogę sobie poradzić wygląda to tak że chce odczytywać wartość portów PC0...PC5 i w zależności od tego czy jest tam stan wysoki czy niski zmieniać stany na portach PD0,PD1,PD4,PD5,PD6,PD7. Gdy odczytuje piny PC0 i PC1 jest ok, ale gdy chce odczytać stany z...
dondu Przerobiłem kod według twoich porad. Teraz mam przerwanie od Timera0. [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdlib.h> #define LED1 PD0 //definicja LED1 (do którego pinu podłączony LED1) #define LED2 PD1 //definicja LED2 (do którego pinu podłączony LED2) #define wejsc_1...
Moje pytanie brzmi czy "właściwy program" będzie wykonywany co 20ms?? Nie. Będzie wykonywany najszybciej jak się da. Wprawdzie ustawiłeś timer na jego przepełnienie co 20ms, ale nie korzystasz z niego do uruchamiania "właściwego programu". Aby to zrobić powinieneś: 0. zdefiniować zmienną globalną np.: volatile char WYKONAJ_PROGRAM; 1. włączyć przerwania...
Witam, mam chyba dość banalny problem z timerem T1 w ATtiny45. Otóż celem jest generowanie przerwania co około 40 ms - czyli zadanie wydaje się praktycznie śmiesznie proste. Proste było w 8051, ale AVR mi się stawia. Do tego celu zaprzągnąłem timer T1 w konfiguracji „match compare”. Przy kwarcu 8 MHz, preskalerze 2048 oraz wartości OCR1A...
Absolutnie nie mam pojęcia co chcesz zrobić. Program który wstawiłeś jest kiepski: 1) Nie baw się w takie skomplikowane ładowanie danych ldi r17, 1<<CS02 out TCCR0, r17 in r16, TIMSK //tryb normalny sbr r16, 1<<TOIE0 out TIMSK, r16 //przerwanie od przepełnienia Tylko zrób to na brutala, bo tutaj niczym to nie grozi: ldi r16, (1<<TOIE0)...
Witam... To będzie sporo pisania więc trzymajcie się... ;) #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <inttypes.h> #include <stdlib.h> #define F_CPU 8000000 //wewnętrzny generato na 8Mhz #define PARITY_NONE 0 #define PARITY_EVEN (1<<UPM1) #define PARITY_ODD ((1<<UPM1)|(1<&...
Tak wiem jestem okropny w te klocki. Więc tak, teraz używam timera do przerwania. Mógłbyś mi wytłumaczyć czemu mam nie używać free runu? Floaty zastąpiłem intigerami. Efekty: piksele wyświetlają się na określonych poziomach. Niestety są między nimy spore odstępy. Poza tym gdy są przesuwane w lewo(aby był efekt zmieniającego się przebiegu) nie są aktualizowane...
Witam, mam problem ze sterowanie sygnałem PWM. Program służy do zaczytywania wartości częstotliwości z czujnika TCS3200 . W zależności od koloru jaki wykryje czujnik ma nastąpić zmiana wartości wypełnienia PWMa. W tym momencie dioda, którą mam podłączona pod wyjście OC2 cały czas świeci tak samo, niezależnie od wartości OCR2 . Próbowałem na różne sposoby...
Witam... Bawie się troche z silnikami BLDC (przeróbki na 3f)... W związku z tym potrzebowałem obrotomierz... A do rzeczy wziąłem się tak... Mam w rurce zamontowaną żarówkę przed nią osłąnięte fotoogniwo z kalkulatora... Pomiędzy żarówką a ogniwem wiruje śmigło... Sygnał z ogniwa wzmacniam w dwóch stopniach na tranzystorach a potem podaje na inwerter...
#include <avr/io.h> #include <avr/interrupt.h> #defineDOWOLNY_DDR DDRD #defineDOWOLNY_PORTPORTD #define DOWOLNY_PIN 7 volatile uint8_t pwm=0; int main(void) { DOWOLNY_DDR |= 1<< DOWOLNY_PIN;// ustaw jako wyjscie DOWOLNY_PORT &= ~(1<<DOWOLNY_PIN);// zero TCCR2 = 1<<CS22 | 1<<CS20;// Normalny...
zrobiłem pomiar ADC na 2 kanałach a wynik wyświetlam na LCD mam ale problem z tym że adc jest 10 bitowy i gdy chce wyświetlić wynik licząć na to że bedzie od 0 do 1023 okazuje sie że wyświetlą jakies brednie powyżej 4200 ... nie rozumie czemu. jezeli wyswietle sobie wynik tylko z ADCH ( rejest 8 bitowy 0-255) to pokazuje poprawie od 0 do 255 na lcd...
Więc mój program wygląda mniej więcej tak: [syntax=c]#define wej_1 PA2 #define wej_2 PA3 #define wej_3 PA4 #define wej_4 PA5 #define VREF 5.0 volatile uint8_t adc1;//zmienna do pomiaru ADC wej_1 volatile uint8_t adc2;//zmienna do pomiaru ADC wej_2 volatile uint8_t adc3;//zmienna do pomiaru ADC wej_3 volatile uint8_t adc4;//zmienna do pomiaru ADC wej_4...
Witam, opiszę Wam mój problem. Próbuję odczytać atmegą 16 częstotliwości w zakresie [0-1MHz] . Pod kontroler podłączony jest wyświetlacz, który co jakiś czas ma pokazać wartość ICR1. Powoli przesiadam się na język C i jest on dużo wygodniejszy ponieważ dużo problemów można rozwiązać samemu z pomocą DataSheet-a. Tak więc z niego wyczytałem co muszę wpisać...
Program jest dość obszerny więc postaram się przedstawić wszystko co jest potrzebne do przeanalizowania. Więc tak: PROGRAM GŁÓWNY: PRZERWANIA TIMERY [syntax=c] /*Definicja funkcji odnoszacych sie do Timera 1*/ #define Timer1_ON TCCR1B |= (1<<CS12) /*Preskaler = 256 */ #define Timer1_OFF TCCR1B &= ~(1<<CS12) void Timer1_Init(void) //Funkcja...
Witam, Postanowiłem tutaj napisać, ponieważ mam problem z timerem1. Napisałem program zgodny z algorytmem, który umieściłem poniżej (układ ma zliczać impulsy na wejściu, następnie je uśredniać, a wynik wyświetlać). Póki co testuje go na ISISie i jedyne co pojawia mi się na wirtualnym wyświetlaczu to wynik -1. Tak jak wspomniałem w pierwszym zdaniu,...
Przyznam że niezbyt zrozumiały jest dla mnie ten program z obsługą enkodera, ciężko mi to ogarnąć wszystko po prostu. O co chodzi tak w skrócie z tym przerwaniem timera? Dodano po 3 Czytam teraz ciekawy artykuł o timerze 0, pisze że jego zadaniem jest zliczanie przychodzących do niego impulsów, jeśli to tak działa, to myślę że idealne rozwiązanie. Dodano...
Dobra pierwsze podejście do kodu: Atmega8 ustawiona fusami na 8Mhz Najpierw dobór preskalera. Jak już wcześniej pisałem pomiar jest od 1,2-1,9ms więc zliczanie czasu moim zdaniem powinno być mniejsze od 0,05ms. Dobrałem preskaler 64 po czasie 524.288ms następuje przepełnienie T1 dla 0xFFFF, a więc jeden takt zliczania ma 524.288/65535 czyli 0,008ms...
Najtrudniej analizuje się własny kod, bo zawsze patrzy się przez pryzmat wiedzy o tym co on powinien robić i nie dostrzega się drobnych błędów :) Zgadzam się z tym w 100%. Przy Bascomie rzadko sięgałem do PDF'ów kontrolerów, przy C nie da się bez tego wszystkiego zrobić. Bez tych 500 "przekręceń" licznika nawet w Bascom by nie poszło, jak zwykle zbyt...
Witam Robie PWM ( tryb 14 -atmega8) jego sterowanie odbywa sie za pomocą 16 bitowego rejestru ICR1 który to odpowiada za uzyskaną częstotliwość na wyjściu OCR1A (PB1) . Jezeli do rejestru ICR1 przypisuje stała wartość to wszystko jest ok, dioda poprawnie swieci, wynik na lcd jest OK. W momencie kiedy rejestr ICR1 zależy od adc1 to wtedy wyswietlacz...
załączam program, ale to nie jest problem napewno tego.: spark2_nowy.h ioinit.h enkoder.h spi.c [syntax=c] static inline void SPI_SET_SS() { PORTB|=(1<<PB2); } static inline void SPI_RESET_SS() { PORTB&=~(1<<PB2);// SS -> PB2 } void SPI_master_init() { SPI_SET_SS(); SPCR = _BV(SPE) | _BV(MSTR) | _BV(SPI2X);// (SPE) SPI Enable, (MSTR)Master...
Witam. Nie mam już pomysłu na rozwiązanie mojego problemu. Program działa, ale przy przesuwaniu tekstu w tablicy do prawej AVR GCC generuje dużo mniejszy kod (1002 bajty) niż jeśli zakomentuję tę część pętli głównej programu (1366 bajtów). Kompilacja przechodzi bez warningów w obu wypadkach. Dodatkowo po zaprogramowaniu układu program nie wraca do głównej...
Dodano po 1 Cytat: Gdzie timer realizuje zliczanie ? Timer zlicza automatycznie zwiększając wartość rejestru TCCR0. W tym przypadku TCCR0 jest zwiększany od zera do 255. Gdy nastąpi przepełnienie czyli przejście z 255 na 0 następuje wywołanie procedury przerwania. Cytat: Widać też lekkie miganie wyświetlaczy... Najwyraźniej częstotliwość 'przełączania'...
Witam, na wstępie dodam że jestem bardzo początkujący w programowaniu. Staram się stworzyć program który by włączał i wyłączał funkcję RGB, poprzez pilot RC5. Staram się to zrobić po kolei i najpierw próbuję gasić i zapalać pilotem diodę. Problemem jest to, że program reaguje na każdy przycisk a nie na konkretny - zaprogramowany. Chce sterować klawiszem...
Witam, Coś ostatnio mało ludzi odpowiada mi na pytania w Bascomie, więc postarałem się napisać swój program w C. Liczę więc na pomoc specjalistów od GCC ;) chciałbym zrobić pilot IR do mojego aparatu fotograficznego Olympus. Ze stronki lirc sprawdziłem sobie co i jak ma być dla pilota RM-1. Powiem nawet że chyba rok temu zrobiłem to w assemblerze i...
Witam! Skonstruowałem sobie urządzenie, które ma służyć do optymalnego ustawienia sterownika kotła. Mierzy temperatury na zewnątrz i wewnątrz, liczy ich średnie, minima i maksima, jest podłączone do sterownika kotła pod przekaźnik (przez transoptor) i zlicza ilość załączeń podajnika w różnych trybach pracy i sumaryczny czas. Od dłuższego czasu walczę...
ISR(TIMER1_OVF_vect) A wystąpi przepełnienie w trybie CTC?? Nie chciałeś przypadkiem włączyć innego przerwania : TIMSK|=(1<<OCIE1A); i później: ISR(TIMER1_COMPA_vect) { //... }
Tu uruchamiasz timer0 z preskalerem ... [syntax=c] //######## konfiguracja timera1 ############## TIMSK |= (1<<TOIE0); //Przerwanie overflow (przepełnienie timera) TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024 TCNT0 = timer_start;// //Początkowa wartość licznika //######################################... [/syntax]...
Opisujesz kod inny niż wkleiłeś: [syntax=c]int main(void) { DDRD = 0xFF;//diody DDRC = 0xff;//przyciski //######## konfiguracja timera ############## TCCR0 |= (1<<CS02) | (1<<CS00); // źródłem CLK, preskaler 1024 TIMSK |= (1<<TOIE0); //Przerwanie overflow (przepełnienie timera) sei(); //Globalne uruchomienie przerwań while(1) { //...
timsk przepełnić timsk overflow amica przepełnienie
junkers smart vestel 17mb171 telewizor tracić kolor
panasonic parowy wymiana gniazda procesora
Opel Vectra B 2.2 DTI - jakie paliwo stosować? Jak połączyć generator FY6900, oscyloskop XY i generator znaczników częstotliwości?