Demo program. http://extremeelectronics.co.in/avr-tuto... brak TCNT0=0; Zobacz tez TCCR0.
Witam! Mam problem z uzyskaniem przerwania od licznika 8-bitowego. Piszę w C i w żaden sposób nie mogę się doczytać jak skonfigurować rejestr TCCR0. Przerwanie potrzebne jest mi do całkowania numerycznego metodą trapezów sygnału z żyroskopu. Doczytałem się, że trzeba coś ustawić w rejestrze SREG, ale mało mi zostało czasu, a potrzebuję tego do pracy...
Coś namieszałeś... Jeżeli chcesz ustawić licznik w trybie CTC to musisz: -włączyć tryb: TCCR0 |= (1<<WGM01); -wybrać preskaler w rejestrze TCCR0 -podział w rejestrze OCR0
Config Pinb.3 = Output 'Config Timer0 = Pwm , Prescale = 1 , Compare Pwm = Clear Down Set Tccr0.pwm0 Set Tccr0.com00 Set Tccr0.com01 Set Tccr0.cs00 Ocr0 = 127 'T2 już normalnie ;) Config Timer2 = Pwm , Prescale = 1 , Compare Pwm = Clear Down Ocr2 = 127
Tutaj druga instrukcja anuluje pierwszą. Zrób to w jednej instrukcji lub w drugiej użyj operatora |= Poza tym nie ma bitow CS02 i CS00 w rejestrze TCCR1B. Wprawdzie są w rejestrze TCCR0 i mają takie same pozycje, więc kod ma szansę działać, ale jakoś źle się na to patrzy :) To jest zezwolenie na przerwanie od timer overflow. Zezwolenie na przerwanie...
[syntax=asm] .device ATmega32 .include "m32def.inc" .def temp= r16 .def counter= r17 .org 0 RJMP start .org $016 ;wektor przerwania dla przepełnienia timera RJMP przerwanie start: ldi temp, high(RAMEND) out SPH, temp ldi temp, (1<<CS00) | (1<<CS02) ;konfiguracja preskalera i zegara out TCCR0, temp ;w rejestrze TCCR0 (ustawienia główne timera)...
Dokładniej chodzi mi o ATmega16(L) i ATmega32(L). Dam sobie radę ze skonfigurowaniem TCCR0. Chodzi mi tylko o zastąpienie wyjścia OCR1A wyjściem OC0 i zwolnienie Timera1 do innych zadań. Czy to zadziała?
Teraz jest dużo lepiej. Wypada jednak, abyś uruchomił ADC po skonfigurowaniu wszystkich opcji odpowiedzialnych za przetwornik. Czyli bit ADEN powinien być ustawiany na samym końcu ADC_ini. To samo dotyczy timera, przy czym za start timera odpowiada ustawienie jego preskalera. Moim zdaniem zerowanie preskalera i tak jest jednorazowe, więc traktuje je...
Bity CS00 i CS02 od preskalera są w rejestrze TCCR0B, a nie TCCR0A. Masz preskaler na 0 więc timer nie zlicza.
Chcialbym napisac najprostrzy program aby sprawdzic czy progra mi wogole wchodzi w przerwanie czyli czy zapali diode. Ale zupelnie nic sie nie dzieje. Zarówno symulacja programowa w AVR Studio, jak i program uruchomiony na realnym sprzęcie działa poprawnie. Albo się pomyliłeś co do podłączenia diody, albo procesor jest uszkodzony. Po drobnej zmianie...
Twoje obliczenia są (z grubsza) OK, jednak w mikrokontrolerze ATmega328 rejestr TCCR0A nie posiada bitów CS00 oraz CS02. Bity te znajdują się w rejestrze TCCR0B. Notabene, bitów WGM0n nie musisz zerować. W trakcie Power on Reset zostają one ustawione na wartość 0. Zerowanie może być konieczne tylko wtedy, kiedy wcześniej sam ustawisz je na wartość...
Po niewielkich zmianach powinno działać też na Attiny85. Wrzucam kod dla Attiny85 (nie testowany; nie mam jak): [syntax=c]//############################... // SPWM implementation for Attiny85 // Clock frequency 8MHz internal clock oscillator // High Fuse: 0xFF, Low Fuse: 0xE2 // // Signals generated: // - SPWM...
Zamieszczam przyklad programu napisanego na kolanie, zmienia stan lini PC3 co okolo (LicznikMax*10ms ) - wychodzi co ok. 100 ms Gdybyś miał wątpliwości to podniosłem moje kości z krzesła przed komputerem po płytkę z AtMega32 i sprawdziłem w ukladzie - DZIAŁA! Kompilowany pod ICC626, polecam "Wizarda" ,pomaga w minute ustawić co potrzeba bez sięgania...
Witam W dokumentacji napisane jest, że preskaler dla TIMER0 i TIMER1 jest wspólny. Ustala się go w TCCR0 (TIMER0) albo TCCR1B (TIMER1). Nie mogę znaleźć informacji z którego rejestru ustawianie ma wyższy priorytet (jest ważniejszy) czy TCCR0 czy też TCCR1A. Sprawdziłem, że kolejność ustawiania rejestrów nie ma znaczenia. Może ktoś wie jak to działa??
(at)stozek - normalnie w Bascom nie jest potrzebna komenda Start Timer0 bo jest on uruchamiany od razu podczas konfiguracji. Używa się tej komendy tylko jeśli poprzednio zatrzymałeś Timer poprzez Stop Timer0. Rozumiem, że zatrzymujesz timer. Tak więc zatrzymywanie timera to zabranie mu źródła taktowania. Bascomowe komendy moża wiec rozumieć tak: Start...
Musiałbyś dodać zmienną, która będzie służyła do odmierzania czasu bez impulsów, tzw. "timeout". Jeśli przez okres ponad 10 s nie przyjdzie żaden impuls, to n=0. Wbrew pozorom, liczenie timeoutów najłatwiej zrealizować w przerwaniu :) Dodano po 1 fragmenty kodu: inicjalizacja przerwań (akurat dla Atmega32) [syntax=c] TCCR0 |= (1 << CS02); TIMSK...
Dane zamiast do switcha pakujesz do tablicy np. uint8_t cyfry[]={0x81,0xF3,.....}; i potem wywołujesz: PORTC=cyfry[liczba_do_wyswietlenia]; A co do zapisów szesnastkowych, to na prawdę się łatwiej Ci czyta? To jakie bity ustawiam(ustalić w czasie <= 2s): TCCR0=0x67; Za pomocą przesunięć możesz też segmenty zapisywać, np. (1<<SEG_A)
OCR0=0x20; /// podobno mozna zjechac do 0 i otrzymac fck/2 Zjechać może i można, ale chyba tylko do sprzętowego przełączania pinu. bo obsługa przerwania w 1 cyklu jest niemożliwa. void timer0_comp_isr(void) { PORTC ^= BIT(0); } Wrzuć co kompilator wyrzuca do assemblera do kompilacji. W sumie na obsługe jest 32 takty razem...
Serdecznie dziękuję za pomoc - aktualnie udało mi się opanować czujnik w taki sposób, że oscyloskop pokazuje jego prawidłowe działanie na pinach echo i trigger, a zakomentowana funkcja na dole powoduje zaświecenie lampki na - powiedzmy - 50% jej mocy. Próbuję dojść do tego, jak połączyć działanie funkcji PWM wraz z funkcją od Timer0, ponieważ w obu...
Witam :) Próbuje odpalić tryb CTC na Atmega8-przerwanie co 5ms i nie mogę sobie poradzić pomimo czytania PDF.Mało rzeczy robiłem na przerwaniach a jeśli już to na Atmega32 gdzie korzystałem z tego: Przerwanie co 5ms więc mam 1 sekundę. ATMEGA32: [syntax=c] TCCR0 |= (1<<WGM01); tryb CTC TCCR0 |= (1<<CS02)|(1<<CS00); preskaler = 1024...
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Preskaler jest w innym rejestrze - patrz TCCR0A i TCCR0B w dokumentacji. Porównaj także tabelki timera0 "Waveform Generation Mode Bit Description" w obu dokumentach. Można dwa kanały.
[syntax=cpp] #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define wys1 PORTA = 0b11111110 #define wys2 PORTA = 0b11111101 #define wyl PORTA = 0xFF; int cyfra(int _cyfra); char licznik = 0; int w1, w2, i; SIGNAL(SIG_OVERFLOW0) { if (i==1 ) { wyl; PORTB=cyfra(w1); wys1; i=0; } else {...
Coś takiego znalazłem. Co prawda na Atiny ale można przerobić. [syntax=c]// // Talking to ultrasonic sensor HC-SR04 with an ATtiny84, and // sending distance data using serial communications. // // electronut.in // #include <avr/io.h> #include <string.h> #include <util/delay.h> #include <avr/interrupt.h> #define F_CPU 8000000...
Witam. Chciałbym prosić o pomoc. Czy ten kod jest poprawny. Program działa bez zarzutów. Natomiast, gdy włączę przerwanie"sei". Układ się zawiesza. [syntax=c]void init_Ex1() { // Timer clock = I/O clock / 1024 TCCR0 |= (1<<CS02)|(1<<CS00); // Clear overflow flag TIFR |= (1<<TOV0); // Enable Overflow Interrupt TIMSK |= (1<<TOIE0);...
Więc jeszcze do zrozumienia timerów w atmega32 do przykładu i analizowania przebiegów na oscyloskopie dorzucę Timer0 8bit i kilka zrzutów. Zrobiłem taką konfigurację: DDRB |= (1<<PB3); TCCR0 |= (1<<WGM01) | (1<<WGM00) | (1<<COM01) | (1<<CS02); OCR0 = 104; Preskaler 256, częstotliwość Fast PWM jaką chcę uzyskać to 300Hz....
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]...
Program prawie gotowy, tylko mam kilka pytań: 1. Jak zrobić, żeby przerwanie zostało uruchamiane po otrzymaniu pewnego sygnału, a w przypadku jego braku zostało wyłączone (dla przykładu podaję sygnał na port atmegi, zostaje włączony timer który naliczy ileś tam impulsów, w przypadku zabrania sygnału timer przechodzi do stanu początkowego bez względu...
Może spróbuj sterowania w inny sposób - za pomocą przerwania INT2 (wywoływanego przyciskiem) uruchamiaj i zatrzymuj licznik TC0 (parametry PWM są ustawione u Ciebie poprawnie) tzn ustawiaj bity TCCR0|=(1<<CS00)|(1<<CS01) kiedy chcesz uruchomić licznik i zeruj je jeżeli chcesz zatrzymać. Samo ustawianie wartości wypełnienia czyli rejestr...
Czemu służą te komplikacje z tymi __init*? Przecież jeżeli chcesz używać przerwań, to po prostu na początek nie usuwaj tablicy wektorów i całej reszty z której rezygnujesz przy opcji -nostartfiles. Wtedy kod będzie wyglądał tak:[syntax=c] #include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER0_OVF_vect) { PORTB ^= (1 << PB0); } int...
Taka skromna mała propozycja, zrobione najprościej jak to możliwe - i chyba jasno - działa - przetestowane: #include <avr/io.h> #include <avr/interrupt.h> void led_toggle(); ISR (TIMER0_OVF_vect) { led_toggle(); } int main (void) { DDRA = 255; TCCR0 = 0x01; TIMSK = 0x01; PORTA=0xFF; sei();...
Dobra światełka w końcu działają po 2 wybuchach złości na biurko, na razie tylko 2 tryby i bez generatora liczb losowych, ale raczej to rozwinę... po jakimś czasie: Kod bez błędów: [syntax=c]/* * main.c * * Created on: 14 wrz 2023 * Author: Dzieci */ unsigned char jasnosc = 32; //określa jasnośc diod #include <avr/io.h> #include <util/delay.h>...
Pierwsze pytanie - czy w inny sposób udaje ci się coś wyświetlić na LCD? I drugie - tam jest funkcja dodająca transakcje, która przy okazji włącza timer. Poprawiłeś ją? Chodzi o tą: [syntax=c] bool LCD_PutText_B(uint8_t x, uint8_t y, char *txt, LCD_trans *buf, bool autodel) { buf->cmd=LCD_Text; buf->Ready=false; buf->SelfDel=autodel; //Czy zwolnić pamięć...
Narazie chciałbym obsłużyć serva tylko na Atmega32 później ewentualnie dodać to co ma się dziać na timerze ICP i wybrać odpowiedniego procka. Ale chciałem zapytać tylko o timer ICP, ponieważ nie chcę zakładać oddzielnego tematu w którym będzie jedno pytanie i odpowiedzi tak lub nie. Dodano po 20 Sprawdziłem mój kod na wewnętrznym oscylatorze 8MHZ i...
Podłącze się do tematu gdyż nie chcę zakładać nowego wątku. Mam timer (ATMEGA32) ustawiony w taki sposób [syntax=c]TCCR0 |= (1<<WGM01); TCCR0 |= (1<<CS02) ; OCR0 |=38; TIMSK |= (1<<OCIE0);[/syntax] Procedura obsługi przerwania zawiera funkcje komunikacyjne i zwiększa licznik. Problem polega na tym, że z wzoru podanego w nocie katalogowej...
Dokładnie tak cyber90 Poniżej konfiguracja timer0 w trybie fast PWM dla Atmega 644p [syntax=C] void timer0_conf(void) { //konfiguracja timera0 - pin PWM PB3-OC0A TCCR0A = ( (1<<WGM00) | (1<<WGM01) | (1<<COM0A1)); // tryb fast PWM TCCR0B= (1<<CS02) | (1<<CS00); // preskaler =1024 dla 16MHz daje ok. 60 Hz DDRB=(1<<PORTB3);...
pisze program w assemblerze i nie moge skonfigurawac timera0 do pracy w trybie CTC robie tak: -mam w wektorze przerwan instrukcje skoku do procedury -mam dzialajaca procedure -ustawiam stos -ustawiam wartosc TCNT0 -ustawiam wartosc OCR0 -wpisuje do TCCR0 wartosc 0x0D ( ctc + prescaler 1024) -ustawiam TIMSK na 0x02 -odblokowuje przerwania poleceniem...
Niestety to nie jest wina prescalerów i taktowania, próbowałem już w każdej kombinacji . Żadnej różnicy nie zauważyłem, a napięcie przy wyjściu pwm się nie zmienia. Z tego co wiem ,to może być to wina złej kompilacji, dlatego przy wyjściu oc1a(Pin D5) od pwma muszę odwoływać się do poszczególnych rejestrów coś na wzór tego: [syntax=vbnet]Config Pinb.3...
Witam Układ jak w opisie, a mam parobem ze zrozumieniem jaka jest częstotliwość przed preskanem, z lektur wynika że to częstotliwość zegara procka (czyli w tym wypadku 16M). Natomiast po: [syntax=c]TCCR0 |= (1<<COM00); //Toggle OC0 on compare match TCCR0 |= ((1<<CS00) | (1<<CS02)); //clkI/O/1024 (From prescaler)[/syntax] Otrzymuję...
W takim razie to problem polityczny. Pokaż aktualny kod i napisz czego od niego oczekujesz. Problem był chyba w za małym prescalerze. Zwiększyłem go zmienijąc kod w ten sposób TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02)...
Takie coś jest poprawne? Przykład dla Atmega32 i 8MHz Nie za bardzo rozumiem o co chodzi z tym ATOMIC_BLCOK [syntax=c]#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> unsigned long milisekundy; int main(void) { TCCR0 |= (1<<WGM01); TCCR0 |= (1<<CS01)|(1<<CS00); OCR0 = 124; TIMSK |= (1<<OCIE0);...
Witam ponownie :) Niestety taka ilość kodu do zanalizowania jest ponad moje siły ;). Poza tym bez urządzenia dla którego piszesz ten kod też niewiele ci pomogę. Jednak w związku z tym iż piszesz że wyświetlacz nic ci nie wyświetla nasuwa się wniosek że masz coś pokićkane z czasami. A więc jak mi się wydaje w/w kod był pisany dla mikrokontrolera taktowanego...
#define PORTD2 2 Po co ta definicja, jeżeli później jej i tak nie wykorzystujesz. Tym bardziej, że wg. mnie jest błędnie zapisana. TCCR0 |= (1<<=CS01) |1<<(CS00); //preskaler 64 Przesunięcie bitowe powinno wyglądać tak: TCCR0 |= (1<<CS01) | (1<<CS00); + brak ustawienia odpowiedniego trybu przerwań, w tym przypadku pewnie musiałby...
http://obrazki.elektroda.pl/3012076100_1... Założeniem projektu było stworzenie uniwersalnego sterownika współpracującego z mikro-kontrolerem w celu sterowania dwóch silników DC o prądzie nie przekraczającym 2A na silnik. Bądź jednego bipolarnego silnika krokowego o prądzie nie przekraczający 2A faza. http://obrazki.elektroda.pl/9999098200_1...
Zamierzam użyć pilota do dekodera philips PVR 7201/91 jako nadajnika podczerwieni. Odbiornik TSOP 1136 (lub 38, czy to coś zmienia??). Aby wiedzieć co dokładnie jest odbierane przez odbiornik przy naciśnięciu poszczególnych przycisków, napisałem program, którego efektem ma być wyświetlenie elementów tablicy, której elementy są czasami trwania kolejnych...
#include <avr/io.h> #include <compat/deprecated.h> #define SPP cbi(PORTA,PA3);sbi(PORTA,PA2... #define SPM cbi(PORTA,PA2);sbi(PORTA,PA3... #define SPOFF cbi(PORTA,PA2);cbi(PORTA,PA3... #define LED1_ON sbi(PORTA,PA0) #define LED1_OFF cbi(PORTA,PA0) #define LED2_ON sbi(PORTA,PA1)...
arrevalk wykorzystałem twój pomysł na sterowanie. Jednak po podłączeniu pod SD pwm uC nic się nie dzieje. Sam wybór kierunku wydaje się być w porządku, dopóki SD podłączone jest do masy. Pierwszy raz wykorzystuje pwm, więc być może popełniłem jakiś błąd w kodzie (wykorzystany uC to atmega32) sbi DDRB, DDB3 ldi r18, (1<<WGM01)|(1<<WGM00)|(1<...
Przykładowy program który wyświetla jakąś liczbę: [syntax=c]volatile uint16_t disp=0; uint8_t buff[]={0b11000000, 0b11111001, 0b10100100, 0b10110000, 0b10011001, 0b10010010, 0b10000010, 0b11111000, 0b10000000, 0b10010000, 0b10001000, 0b10000011, 0b11000110, 0b10100001, 0b10000110, 0b10001110}; ISR(TIMER0_OVF_vect) { static uint8_t dig=0; static uint16_t...
Ja osobiście jak narazie pisze w Bascomie. W Bascomie wygląda to tak: Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1 ' Konfiguracja Timera1 dla Pwm1a i Pwm1b Config Timer2 = Pwm , Async = Off , Pwm = On , Compare Pwm = Clear Down , Prescale = 1 ' Konfiguracja Timera2 dla Ocr2 Config Pinb.3 = Output...
Witam. Przy 4 Mhz ustawiasz dzilnik do licznika na 256 w rejestrze TCCR0. Następnie ustawiasz 125 w OCR0. To jest górna granica licznika, która go resetuje i jednocześnie wystawia przerwanie. Teraz licznik liczy do 125 i generuje przerwanie OCF0 - Output Compare Flag 0 w rejestrze TIFR. Wtedy przerwanie generowane jest co 32000 taktów zegara, czyli...
...Pojawił mi się problem który nawet trudno wytłumaczyć. Faktycznie trudno , bo z tego co napisłeś , niewiele można wywnioskować :( ...Napisałem program z wykorzystaniem Timera T0 - odmierza zadany czas i zapala diodę po czym przy następnym przerwaniu gasi ją i tak w kółko. Może zdradź tajemnicę i napisz , w którym trybie pracuje T0. Dokonuję zmiany...
Problem polega na tym , że zmienna nrzn działa poprawnie tylko w ciele funkcji przerwania, w pętli programu już nie. Jej wartość wynosi 0 poza przerwaniem. //Biblioteki #include <avr\io.h> #include <util/delay.h> #include <avr\pgmspace.h> #include <avr/signal.h> #include <avr/interrupt.h> //Zmienne unsigned char znak [10]...
Tak, dokładnie o tego typu efekt chodzi, jednak chciałbym do tego jeszcze mieć możliwość cyklicznego załączania sygnału wyjściowego coś na wzór funkcji delay_ms(), w celu opóźnionego załączenia i wyłączenia sygnału wyjściowego. Aktualnie mój kod to tylko sama konfiguracja, dodatkowo przerzuciłem się na ATMega328P ze względu na jeden dodatkowy Timer....
Rozumiem, że ustawiam Timer0 na Fast PWM, a wartość OCR0 podstawiam z wyliczeń na podstawie czasu trwania impulsu wejściowego sygnału RC. [syntax=c]TCCR0 |= (1 << WGM00) | (1 << WGM01); // tryb PWM , prescaler = 8 TCCR0 |= (1 << COM01) | (1 << COM00); TCCR0 |= (1 << CS01); OCR0 = // wartość podstawiana z wyliczenia;[/syntax]...
Też nic nie daje. Testowałem z takim programem, zmieniającym dodatkowo jasność co określony czas: [syntax=basic4gl]Cls Config Portb.3 = Output Tccr0 = &B01101001 Ocr0 = 250 Cursor Off Cls Do Locate 1 , 1 Lcd "Test1" Ocr0 = 220 Wait 2 Locate 1 , 1 Lcd "Test2" Ocr0 = 235 Wait 3 Locate 1 , 1 Lcd "Test3" Ocr0 = 250 Wait 4 Loop End[/syntax] Jasność zmienia...
Witam jestem nowy na forum i w mikrokontrolerach. Po wielu godzinach doszedłem do tego, że aby instrukcja zawarta w ISR została wykonana muszę dorzucić pewną ilość cykli zegarowych w postaci np. pętli "for". Czy ktoś może mi pomóc zrozumieć dlaczego tak się dzieje ? Niezrozumiałe jest także to, dlaczego w pliku "*.lss" po funkcji "main" jest polecenie...
Z jednej strony masz rację, a z drugiej nie... Mianowicie masz rację pisząc, że większość budowanych amatorskich konstrukcji da się zastąpić chińskimi odpowiednikami za niewielką cenę, natomiast budując układ samemu można nauczyć się wiele. Dla mnie budowa tego układu pomogła nauczyć się zasady działania kodu RC5 (bo kod pisałem w pełni samodzielnie...
Zrobiłem coś takiego. Dodano po 14 O to efekt.
Witam, Używam sterownika do silnika DC. Sterowanie polega na podanie odpowiedniego wypelnienia PWM na wejscia AIN1 AIN2. Wejscia AIN odpowiadaja za obroty w lewo/prawo. Uzywam atmegi328p. http://www.atmel.com/Images/doc8161.pdf Zasada dzialania (obroty w prawo/lewo): [syntax=c]OCR0A = 255; //PD6 // hamulec/start OCR0B = 0; //speed //zmiana kierunku...
Miałeś źle wybrany preskaler ( nie chodzi o liczbę). Po za tym T0 jest 8 - bitowy. /* Przyciski sterujace szerokoscia impulsu przylaczone miedzy PD0 i mase oraz PD1 i mase */ #define F_CPU 8000000L #include <avr/io.h> int main(void) { int p = 0; DDRD =0x00; PORTD=0x03; DDRB |=_BV(3);//pin OC0 połaczony z diodą TCNT0 =255;...
Witam i proszę o wyjaśnienie, dlaczego jeśli zmienna x w funkcji main jest typu long int to po zakończeniu pętli while ma ona wartość mniejszą (66) niż jeśli jest typu int (86). Dzięki. [syntax=c] volatile uint8_t timer1; ISR (TIMER0_COMPA_vect){ uint8_t x = timer1; if (x) timer1 = --x; } int main (void) { TCCR0A |= (1<<WGM01);//tryb CTC TCCR0B...
Witam! Mam mały problem z licznikami w Atmedze32. Na początek kod: void IR_Generuj() { //TUTAJ WŁĄCZAM TIMER KLUCZUJĄCY SYGNAŁ// TIMSK|=1<<OCIE2; OCR2=75; TCCR2 = 1<<WGM21 | 1<<CS21; //PRESK 8 |TRYB CTC //TUTAJ GENERUJE SYGNAŁ 36kHz// OCR0=13; //(int)(1000000*(1/76000... TCCR0 = 1<<CS00|1<<COM00|...
Próbowałem już wszystkiego, pisząc przy tym chyba z 20 wersji programu. Niestety nic nie pomogło. Siedzę nad tym już kilka dni, dlatego zwracam się z ogromną prośbą o pomoc. Kwestia wygląda tak: Układ mam zbudowany na bazie http://www.is.strefa.pl/dimmer.jpg (układ detekcji zera+sterowanie z triaka - ten schemat zdaje się został wzięty z elektrody właśnie,...
Niestety laborki te mamy w asemblerze...przynajmniej ich początek. W języku C będziemy pisać niebawem na co ze zniecierpliwieniem czekam. Co do Twojej podpowiedzi, rozumiem, że cała operacja odbywała by się tak jak powiedziałem, czyli dwa przyciski wielokrotne klikanie jednego np zwiększa prędkość ? A w łopatologiczny sposób na delayach, jak wykonać...
Mógłbym prosić o szersze wyjąśnienie? W którym przerwaniu? Czy chodziło mniej wiecej o coś takiego? [syntax=c] #define F_CPU 1000000L #define czas_przerwania_T2 10 #include <avr/io.h> #include <avr/interrupt.h> volatile uint8_t wzor = 0; volatile uint8_t stan_portu= 0; ISR(TIMER0_COMP_vect) { TCCR0 &= ~( (1<<CS02 ) | (1<<CS01)...
Witam, chciałbym za pomocą timera0 pracującego w trybie CTC wywoływać przerwania z określoną częstotliwością by np migać diodą. Czy poniższe ustawienie timera jest poprawne i czego jeszcze brakuje? Jak za pomocą preskalera być w stanie ustawiać częstotliwości między 1Hz-50kHz? [syntax=c] #include<avr/io.h> #include<avr/interrupt.h> void...
Witam, Pracuje na zestawie ZL3AVR [Atmega32 + kwarc 16 MHz]do którego są podłączone dwa układy LED driverów. Układy posiadają 16 wyjść. Pracuję nad tym już od kilku dni, ale nie wiem dlaczego gdy wysyłam mniejszą daną np. 1 lub 2 (dla zmiennych inf1, inf2, inf3, inf4) to jest ok. Gdy wysyłam np. 250 (dla zmiennych inf1, inf2, inf3, inf4) to diody podłączone...
Witam Po paru projektach, wszystkich na atmega8 z przyzwyczajenia i wystarczających zasobów, do zastosowań potrzebowałem coś z sześcioma kanałami PWM. Projekt i PCB zrobione i złożone i na starcie w programowaniu mam problem nie do pokonania dla mnie. Zacząłem od konfiguracji Timer0 i nie mogę zmusić drugiego kanału (OCR0B) do wysterowania wyjścia....
Witam, Posiadam czujnik odległości HC-SR04. Mam problem z obsługą tego czujnika na atmedze32. Napisałem bardzo prosty program który powinien moim zdaniem działać ale nie działa :) Siedzę na nim już 3h i nic... Wszystkie kabelki są dobrze podłączone (sprawdzone 5 razy), czujnik jest dobry bo sprawdziłem go programem z bascoma znalezionego na forum [url=http://www.elektroda.pl/rtvforum/to...
A jak to zapisać w C? Czy poprostu jak mam funkcje main i w niej deklaruje tak: int main(void) { TIMSK=1<<TOIE0; //w rejestrze maskowania przerwań(TIMSK) wpisz 1 na miejsce bitu TOIE0 (zezwolenie na przerwanie od układu timera0 spowodowane przepełnieniem) TCNT0=9; //wpisz wartośc poszątkową do licznika timera0 TCCR0=2;...
Ok już trochę bardziej to rozumiem, tylko w tym kodzie: // program to change brightness of an LED // demonstration of PWM #include <avr/io.h> #include <util/delay.h> // initialize PWM void pwm_init() { // initialize timer0 in PWM mode TCCR0 |= (1<<WGM00)|(1<<C...
analogicznego uzywam i w innych programach... i dziala... no ale na innych procesorach :/... void Timer_Init() { OCR0 = 150; USART_Transmit('^'); TCCR0 = (1<<CS02)|(0<<CS... TIMSK |= OCIE0; } ISR(TIMER0_COMP_vect) { USART_Transmit('*'); OCR0 += 150; }...
Samo zapalanie i gaszenie diody można zrobić w przerwaniu, pętla główna może być pusta, np. (tu akurat przerwanie overflow): [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> int a; ISR(TIMER0_OVF_vect) //a tu definiujemy to co bedzie sie dzialo, gdy wywolamy przerwanie. { a++; if (a>4)// co czwarte przerwanie { PORTB ^= 0x02;...
witam mam problem z wywolaniem przerwania od timer1 - od zdarzenia typu CTC, program ma wygrywac melodyjke na buzzerku, przerwanie od timer0 smiga - jest odpowiedzialne za generowanie sygnalu na wyjsciu OC0, a timer1 ma zmieniac nutki - podmieciac liczbe w OCR0 liczba z tablicy melodia... ale nie zmienia i nie moge znalezc przyczyny :/ wydaje mi sie...
Poprawiłem mój program tak, że działa teraz jak powinien. I nie korzystałem z porad userów bo znalazłem drobny błąd związany z brakiem kontroli nad licznikami :) Diodka pięknie (jak dla mnie) teraz rozbłyskuje :P Zamieszczę program, bo może komuś na elektrodzie się przydać :) a nie jedna osoba pewnie szukała podobnego problemu. [syntax=c]#include <avr/io.h>...
Witajcie, próbuję wyrzucać wartość z regulatora pid (avr221) do wypełnienia pwm na timerze0. Poczyniłem następujące kroki: [syntax=c] #define PWMH ((PINB)&(1<<PB3)) ... struct GLOBAL_FLAGS { //! True when PID control loop should run one time uint8_t pidTimer:1; uint8_t dummy:7; } gFlags = {0, 0}; struct PID_DATA pidData; #define TIME_INTERVAL...
Ok., zrobiłem. Mam trzy 8-bitowe PWMy. int setup_t1(){ TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10) ; TCCR1B = _BV(CS11); OCR1A = 25; OCR1B = 230; } void setup_t0(){ TCCR0 = _BV(COM00) | _BV(CS01); //powinien być ustawiony bit COM01 a nie COM00 OCR0 = 128; } Nieaktualne:...
z jakiegoś swojego starego projektu zerknąłem na ustawienia i mam tccr0a=a3, tccr0b=2 tccr1a=a1, tccr1b=2 tccr2a=a1, tccr2b=2 przy nich na 16MHz pwm'y chodzą 4kHz (możliwe ze jeden z nich na 8Khz)
Zacznę od końca (przejrzałem oryginalne źródła): 3. put_char() by wysłać znak czeka, aż flag_tx_ready będzie inne od 0 (FALSE) Akurat odwrotnie. Czeka, aż flaga stanie się FALSE, czyli aż zakończy się bieżąca transmisja. Przy okazji. W deklaracjach zmiennych współużywanych przez program główny i przerwania (jak np. ta flaga) w oryginalnym kodzie brak...
Witam, Wiem, że RC5 ten wątek był poruszany wiele razy na forum, ale chcę sie nauczyć programować w C, wiec chciałem wykorzystać odbiornik podczerwieni z mojego zestawu(ZL3AVR) i napisać protokół do RC5 Pracuje na kwarcu 16MHz i ATmega32. Odbiornik podczerwieni podłaczylem do PD3 #include <avr/io.h> // dostęp do rejestrów #include <avr/interrupt.h>...
Poszedłem za wskazówkami i wykorzystałem zliczanie czasu poprzez Timer0 w mikrokontrolerze atmega32. Ogólnym założeniem projektu jest podlewanie zależne od czasu ustawionego z klawiatury 4x4. Lecz tutaj pojawia się moje pytanie: W jaki sposób mogę sterować timerem tak, żebym mógł wydłużać czas działania timera w zależności jaką liczbę zapiszę do zmiennej...
Cześć, Próbuję zaadaptować przerwania do swoich potrzeb z pomocą datasheet atmegi328p i strony [url=http://mikrokontrolery.blogspot.com ]Link Niestety napotkałem pewien problem z którym nie umiem sobie poradzić. Za pomocą przerwań chciałbym odczytywać stany z dwóch podłączonych potencjometrów. Reprezentuję ich wartości na LCD leczy w zakresie 0-255....
Witam, Czy ktoś może mi zmodyfikować tak mój program aby działał mi wyświetlacz LCD ? Chodzi tutaj o to że mam podłączony mały silnik krokowy oraz potencjometr a do tego jeszcze przyciski "start, stop, zmień kierunek obrotu". Wszystkie przyciski działają, potencjometr również, a teraz chciałbym aby zakres mojego potencjometru był wyświetlany na LCD...
Wpisywanie $CRYSTAL bez rzeczywistej zmiany taktowania procesora będzie powodować, że wszelkie opóźnienia i obliczenia kompilatora dotyczące liczników nie będą zgodne ze stanem faktycznym. GETRC5() korzysta aktywnie z licznika TIMER0. Tak manewruje wartością wpisaną do rejestru licznika oraz preskalerem by otrzymać jednakowe odcinki czasu zliczane później...
Walcze z licznikiem na Atmega 32 inicjacja wyglada tak : DDRB = 0xff; // DDRB jako wyjscie // t0 JAKO LICZNIK PORTB |= _BV(0); // BEZ PODCIAGNIECIA NIE CHCE LICZYC TCCR0 = _BV(CS01)|_BV(CS02); //_BV(CS00)| cs0 rosnace/~opadajace zbocze TCNT0 = 200; TIMSK |= _BV(TOIE0); // T0 wywoluje przerwanie Caly problem polega...
Cześć, Napisałem program, który miał odtwarzać utwór z karty SD o nazwie o.wav . Program poprawie otwiera plik, jednak ze słuchawka nie wydaje dźwięku... Czy mógłby ktoś sprawdzić mój kod czy nie ma tam żadnego błędu ? Myślałem że same wyprowadzenie odczytanych wartości hex z pliku muzycznego i "wypuszczenie" ich na PWM w zupełności wystarczy, ale widocznie...
witam, czy moglby mi ktos pomoc w przerobieniu tego kodu tak aby mozna bylo sterowac serwami. Nie wiem jak osiagnac czestotliwosc 50Hz [syntax=c]#include <stdint.h> #include <avr/io.h> #include <avr/interrupt.h> #define GSCLK_DDR DDRB #define GSCLK_PORT PORTB #define GSCLK_PIN PB0 #define SIN_DDR DDRB #define SIN_PORT PORTB #define...
Witam Chcąc budować układ przetwornika cyfrowo-analogowego. Zbudowałem układ zaprezentowany na schemacie ideowym. https://obrazki.elektroda.pl/5046839200_... Wyjście przetwornika zostało podłączone dla napięcia 5V. Zaprogramowałem mikrokontroler AVR ATmegę 32 z zewnętrznym rezonatorem kwarcowym wynoszącym 11,0952 MHz. Wykorzystałem...
Zmodyfikowaliśmy program: #include <avr/io.h> #include <avr/interrupt.h> //Prescaller jest ustawiony na 256 przy 16MHz //2.5ms - 0x3E //polozenie poczatkowe - 0x20 - 0d32 - 0.528ms //polozenie koncowe - 0x94 - 0d148 - 2.38ms unsigned char volatile p1[8] = {0x90,0x90,0x90,0x90,0x30,0x30,0x30... unsigned char volatile...
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);...
Wiem ze mam załączyć Timer1, tylko w którym miejscu to zrobić, tak aby to było zsynchronizowane z liczeniem ? Jakby ktoś narysował mi strzałkę w poniższym kodzie byłbym wdzięczny :) #define F_CPU 1000000L #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #include <inttypes.h> #include...
Witam, co robię źle. Chcę ustawić timer0 w tryb CTC, zgodnie z tabelką trzeba ustawić bit WGM01 w rejestrze TCCR0A. http://obrazki.elektroda.pl/2422465900_1... Czemu w symulatorze AVR-Studio wogóle nie ma aktywnego bitu WGM01 tylko WGM0 ? http://obrazki.elektroda.pl/4086649500_1...
Dobra. Kod prezentuje się następująco: to jest program w którym wszystko działa jak potrzeba: [syntax=cpp]//Data utworzenie: 20-09-2014 #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/pgmspace.h> #include "MYUART/myuart.h" #include "MK_TERMINAL/mk_term.h" #define REF_256 (1<<REFS1)|(1<<REFS0)...
Witam serdecznie. Rozpocząłem jakiś czas temu zabawę z mikrokontrolerem ATmega. Posiadam model ATmega32-16PU. Buduję zegar czasu rzeczywistego. Chciałem do tego wykorzystać przerwania z wbudowanego timera (przepełnienie). Po wielu nieudanych próbach synchronizacji ATmegi z rzeczywistym czasem postanowiłem policzyć taktowanie swojego mikrokontrolera....
Mam takie pytanie. Bo jak sobie pisałem funkcje do obsługi wyświetlacza 7_segmentowego to tablice z segmentami dla liczb zapisałem w pamięci flash, możliwe że ta temperatura skacze mi dlatego że, z pamięci flash jest wolniejszy odczyt...?? To jest kod obsługi tego przerwania: #ifndef WYS_7_H_ #define WYS_7_H_ //definition ports #define anody_port PORTD...
Wiec sprawa wygląda tak, dane na wyjściu rejestru powinny wyglądac następująco: Q0=1 Q1=1 Q2=1 Q3=0 Q4=1 Q5=0 Q6=1 Q7=0 pierwsza próba: TCCR0 = (1 << CS01) | (1 << CS00); TIMSK |= (1 << TOIE0); PORTD &= ~_BV(6) | ~_BV(2); do{}while(clk<16); TCCR0 = 0; clk = 0; PORTD &=...
Witam. Mam problem z wyświetlaniem cyfr przy użyciu atmegi32, która steruje trzema wyświetlaczami LED w trybie multipleksalnym. Otóż, gdy na wyświetlacz podaję te same znaki (cyfry) to wszystko jest dobrze. Natomiast, gdy wysyłam różne cyfry to pojawiają się błędy. Poniżej zamieszczam kod z przykładami. Ponieważ katody podłączone są do PORTC, więc żeby...
Witam Mam problem z uruchomieniem watchdog'a w atmedze324. Procesor nie uruchamia resetu. Ten program powinien wypisywać cyfry przez około 2 sekundy potem powinien się zresetować. Proszę o pomoc. [syntax=jezyk_programowania] #include <mega324.h> #include <stdio.h> #include <delay.h> #include <stdlib.h> #include <string.h>...
Udało mi się odtworzyć .wav 22050Hz. Jest bardzo fajnie, muzyczka gra w bardzo fajnej jakości, ALE... słyszę cały czas szum(pierdzenie), który jest jakby nałożony dodatkowo w muzyczce, taki odrębny szum. Jak go wyeliminować? Aktualnie kod odpowiedzialny za odtwarzanie przedstawia się tak: [syntax=c] // Konifguracja muzyczki void Music_Init() { DDRB...
Napisałem sobie coś takiego w trybie CTC, z włączeniem nóżki OC0 generującej prostokąt. Generuje sobie jakiś dany ton zmieniając wartość rejestru OCR0. Teraz akurat jest bardzo duża częstotliwość dająca wysoki ton. Pytanie mam takie: jak zrobić aby zmieniać cyklicznie wartość OCR0 ? Aby zagrać jakąś melodie, np 1s jeden ton, potem 2s drugi ton, 0,5s...
tccr0 atmega tccr0 atmega128 atmega8 tccr0
wymiana pierścień tłokowy stabilizator lt1083 polaryzacja anteny
mikrofala usterki mikrofala usterki
Piszczenie sterownika Perfekt Zębca - przyczyny i diagnostyka Opel Kadett D 1.3S - Specyfikacja i Problemy Techniczne