[syntax=c] #define RELOAD_VAL 131 int main (void) { TCCR0=0x8B; TCNT0 = RELOAD_VAL; TIMSK=(1<<TOIE0); sei(); while(1) { } } SIGNAL( SIG_OVERFLOW0 ) // 1 ms { TCNT0 = RELOAD_VAL; } [/syntax]
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.
Konfiguracja prescalera jest w TCCR0 B a nie TCCR0A.
Uruchom tryb 3 licznika. W trybie 7 PWM może się generować co najwyżej na OC0B, a tego nie skonfigurowałeś jako wyjście (PG5). Dodano po 53 TCCR0A |= (1<<COM0A0) OCR0A jest zresztą też źle skonfigurowane. Co prawda w tym trybie nie ma to znaczenia, ale weź poprawkę na to. Powinno być tak: https://obrazki.elektroda.pl/5291109500_...
Wrzucam kod dla Attiny13A: ilość próbek częstotliwość wyjściowa 356 49.3 355 49.4 354 49.65 353 49.8 352 50 Wygenerowane przebiegi na oscyloskopie: https://obrazki.elektroda.pl/4382277800_... na skraju cykli https://obrazki.elektroda.pl/4450814000_... Zbliżenie sygnałów 50Hz (brak kolizji, czyli obu sygnałów w stanie...
:)... no wlasnie.... Ale w tym sek, ze raczej nic tam w programie nie powinno przeszkadzac. void inicjuj_USART_TIMER(unsigned char tim, unsigned char szybk) { TCCR0 = 0b00000001; TCNT0 = 5; TIMSK |= 0b00000001; //////////////////////////// UBRRH = 0; UBRRL = (unsigned char)(szybk); UCSRB = 0b11011000; UCSRC = 0b10000011; SREG |= 0b10000000; } void zapisz(void)...
Po Config Timer0 wpisz dodatkowo TCCR0 = 4 Config Timer0 = Timer , Prescale = 256 Tccr0 = 4 Tylko musisz coś zrobić z START TIMER0 i STOP TIMER0 bo one przywrócą wartość po CONFIGu i program dalej nie będzie działał. Najprościej będzie usunąć te instrukcje. dodano 20 Sie 2008 08:05 Mail z opisem błędu poszedł już do MCS Electronics. Zbaczymy jaka będzie...
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ęć...
DDRD|=(_BV(PB5) | _BV(PB6) | _BV(PB7)); DDRD|=(_BV(PE3) | _BV(PE4) | _BV(PE5)); Widzisz tu subtelną różnicę...? Działające wstawki dla pwm na Tim1 i Tim2: [syntax=c]void Timer0Init(void) { DDRB|=(1<<4); TCCR0 |= (1<<WGM01)|(1<<WGM00)|(1<... OCR0=0; } void Timer2Init(void) {...
Nie bardzo mi się chce wnikać w przyczyny , więc wrzucę Twój zmodyfikowany kod: #include <avr/io.h> #include <avr/interrupt.h> #define PWM_out(value) OCR0 = value void delay(void){ volatile unsigned int i; for(i=5000;i;i--); } unsigned char pwm=127; int main(void) { DDRD = 0x00; PORTD = 0xFF;...
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ść...
#define TIMER_ON_64() TCCR0A|=(1<<CS00)|(1<<CS01); Bity CS00, 01, 02 są w TCCR0B. WGM02 też jest w TCCR0B a WGM00 i 01 w TCCR0A. P.S. W ATmedze88
Przykładowy program realizujący przedstawiony przeze mnie sposób. [syntax=c]#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "LCD.h" volatile unsigned int adcon = 0; ISR(TIMER0_OVF_vect) { static char st; if((st++)%2) { PORTB |= 1<<0; //pb0=0 PORTB &= ~(1<<1); //pb1=1 adcon = ADC; //odczyt...
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);...
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?
Wg. mnie te 4 takty obejmują również czas wykonania przerywanego rozkazu. Przynajmniej tak pokazuje symulator w AVR Studio. Oczywiście jeżeli przerywamy rozkaz dwucyklowy (np SBI) to opóźnienie wyniesie 5 taktów. Jeszcze dla pełnej poprawności to piszesz o ATEMGA16 i ATMEGA644P więc Twój przykładowy program zawiera błędy: - dla ATMEGA rejestry Timera...
Bity CS00 i CS02 od preskalera są w rejestrze TCCR0B, a nie TCCR0A. Masz preskaler na 0 więc timer nie zlicza.
TCCR0=0x07; // port G jako wejście Że co? int main(void) { char digit } Funkcja main obejmuje nawiasem kilka funkcji przerwań. To się w ogóle kompiluje? Pół biedy że funkcja main. Pętla while(1) to obejmuje! Po za tym to SIGNAL pozamieniaj na ISR. ISR jest nowsze i przez to zalecane (choć w sumie kodu wynikowego pewnie to nie zmieni). I przy okazji...
Najprościej to chyba tak: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #define TIMERSTART 6 volatile uint8_t FLAGA_50 = 0; volatile uint8_t FLAGA_1000 = 0; // funkcja obslugi przerwania TIMER0_OVF 8MHz / 64 * 250 wychodzi co 2ms // dla innego taktowania nalezy ustawic inny preskaler i/lub inne liczniki stawiania flag ISR(TIMER0_OVF_vect)...
Rejestr SREG zawiera podstawowe flagi mówiące o stanie procesora potrzebne do kontroli wykonywania programu (warunki, skoki itd.) Na czas obsługi przerwania należy zapamiętać te flagi gdyż kod w przerwaniu je oczywiscie może zmienić. Po powrocie z przerwania procesor podejmuje program w miejscu wystąpienia przerwania i musi wiedzieć co sie działo wcześniej....
Kod piszę "na sucho", więc lepiej sprawdź czy działa.[syntax=c] #include <avr/interrupts.h> void timer0_init(void){ TCCR0 = _BV(CS02); //Mode 0, normal operation, prescaler 64 TIMSK |= _BV(TOIE0); //Timer/Counter0 Overflow Interrupt Enable } volatile unsigned long millis=0; volatile unsigned int okresy_migania_ledow[4] = {100,200,300,400}; ISR(TIMER0_OVF_vect)...
Str. 100 i 101. Rejestr TCCR0, bity COM00 i COM01.
Ojj widze ze chyba chcesz za duzo na raz zrobic... TCCR0 = _BV(CS02) | _BV(CS02) ; Ani w jednej ani w drugiej atmedze nie jest to dzielnik przez 32. Nawet jak by tak bylo, to i tak masz gdzies to co pisalem wczesniej. Zostalo by ci 150 taktow zegara na wyjscie z przerwania i wykonanie maina, czy jest wystarczajaco byc moze, ale nie sadze...
Witam... Generalnie rzecz biorąc procedury opóźnienia czasowego nie nadają się do modulowania diody IR... Częstotliwość nie jest zbyt stabilna to raz... Dwa nie uzyskasz 36kHz musisz skorzystać z dobrodziejstw timera... Np. tak... #include<avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <inttypes.h> int...
Mam problem z uruchomieniem przerwania, kombinowałem wiele razy z różnymi ustawieniami jednak nie obserwuję zmian na porcie PD7, PWM na porcie PB3 działa (przebiegi obserwowane na oscyloskopie). Mikroprocesor to ATmega 16 taktowana z kwarcu 16 MHz. Może ktoś zerknie świeżym okiem i doradzi. #define F_CPU 16000000 #include #include #include #include...
...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...
Wg http://www.nongnu.org/avr-libc/user-manu... musisz zmienić nazwę wektora przerwań na TIM0_OVF_vect Porównaj sobie datasheet attiny13 z datasheetem atmegi8 żeby skonfigurować timery. Do skonfigurowania timera w attiny służą rejestry TCCR0A i TCCR0B, w atmedze8 jest tylko TCCR0 http://www.atmel.com/images/doc2535.pdf http://www.atmel.com/Images/Atmel-2486-8...
To jest przyklad tego jak mozna obsluzyc DS1820 przez mega 8 ale jest tam tez obsluga wyswietlacza w C.Moze sie pryda.Sam to dostalem od jednego kolegi z forum:-) wiec mam nadzieje ze sie nie obrazi...mnie interesowal DS. Pozdrawiam Maciek! #include <avr/io.h> #include <avr/pgmspace.h> #include <stdlib.h> #include <ctype.h> #include...
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...
Witam. Pewnie zabrzmi to głupio aczkolwiek lubię się upewnić czy pewne rzeczy robię dobrze czy też źle. Jako iż nie dysponuję w tym momencie pod ręką programatorem to nawet nie mogę sprawdzić czy dobrze piszę czy nie. Rozchodzi się o zmianę programu napisanego na Atmegę16 tak aby pasował do Atmegi8. Jest to nadajnik podczerwieni o określonej częstotliwości...
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...
C:\Devel\elektro\AVR-gcc\keytest/tes... undefined reference to `low' Linia 38 : TCNT0=low(T0div); - czyli tylko, jeśli jest to zaszyte w jakiejś bibliotece, bo spotkałem się tylko z odmianą lo8() i hi8(), ale w asemblerze od avr-gcc, w projekcie minidds . Tym niemniej, tak jak Andrzej_17 poradził - zadziałało z dopisaniem do...
No faktycznie zapomniałem tego ora. -Atmega 32 Dodano po 4 Nie działa Dodano po 2 Nie rozumiem twojego punktu że procesor się zresetuje
Powrócę jeszcze do tematu. Timery programowe to objaśnił Mirekk36 w swojej książce oraz artykułach i wideo poradnikach, bardzo dobrze je się stosuje. Jest to proste, wystarczy ustawić jakiś timer w tryb CTC i wywoływać przerwanie co jakiś zamierzony czas (stosuje około 10ms). F_CPU/Prescaler/100 Zaokrągloną wartość wpisujemy do rejestru OCRx. W przerwaniu...
Jako ze nie przepadam za pisaniem na maile, to odpowiem tutaj... Musisz skonfigurowac odpowiedni timer i przy przerwaniu, jakie generuje int czas=0; int timer0=131; SIGNAL (SIG_OVERFLOW0) { czas++; if (czas==5000) BUUM(); //jezeli czas osiagnal 5000ms, to wywolaj funkcje BUUM(); TCNT0 = timer0; // zaladowanie do...
Ty czy Kardaś? No ta w zasadzie popodmieniałem nazwy komend w przypadku mastera, ale w tym przykładzie nie ma dużo więcej do roboty, jak uda się stworzyć własną apkę na kompa to trochę pozmieniam (dodam więcej case'ów xd). Dużym problemem było to, że nie zaznaczyłem zapisu eepromu w eclipse, ale nadal są błędy teraz już chyba tylko po stronie slave'a:...
[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)...
Hej. Po pierwsze Timer0 w atmedze8 nie ma PWM A więc do PWM możesz korzystać tylko z Timera 1 oraz Timera 2. Po drugie twój problem leży w nazwach poszczególnych rejestrów konfiguracyjnych atmegi 8 sprawdź w dokumentacji atmegi8 jak w rzeczywistości nazywają się rejestry TCCR0A, TCCR0B, OCR0A bo tego dotyczy komunikat błedu. Poza tym pamiętaj że port...
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Witam Serdecznie Na początek kod: [syntax=c]#define F_CPU 4000000UL #include <avr/io.h> #include <avr/iom128.h> #include <util/delay.h> #include <avr/interrupt.h> volatile uint8_t i=0; int main(void) { DDRA = 0xFF; ASSR &= ~(1<<AS0); TCCR0 |= (1<<CS01) | (1<<CS02); TIMSK |= (1<<TOIE0); TCNT0 = 131;...
Jeżeli dobrze patrzę w DS, to tryb CTC jest ustawiany bitem WGM02=1 (WGM00=0 i WGM01=0, WGM03=0) w rejestrze TCCR0B a nie WGM01=1 w rejestrze TCCR0A.
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...
Po 2 teraz juz sam nie wiem :| bo przeciez co ma dorzeczy to ze u mnie zmienna "licznik" ma wartosc 4000? Przeciez to jest zmienna wewnetrzna w porgramie.Bo jesli chodzi o wartosc zliczana przez licznik to wynosi ona L=250, czyli aby uzuskac 1 sek to: 1s=250x4000; gdzie TCCR0=2 (CK/8) bo kwant czasu wynosi 1us. Nie wiem moze sie myle.... Pozdarwiam...
Dzięki za odpowiedzi. Zasilacz mam 7.5V 4A od jakiejś drukarki lub skanera. Napisałem prosty program do testów i wyniki mnie zadziwiły. Program najpierw wysyła na wyświetlacz napis "reset" który świeci się przez 1 sek, a potem program wykonywany jest dalej. Zamiast silnika zamocowałem żaróweczkę, aby pobór prądu był mniejszy. Jeżeli zamieszczę:[syntax=cpp]PORTD...
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...
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...
Nic nie trzeba informować kompilatora - Bascom ładnie przyjmuje wprost rozkazy asemblera ale w zasadzie atom1477 zrobił to nawet bez asemblera - sorki - po prostu "ręcznie" odwołał się do rejestrów i wpisał do nich odpowiednie wartości tzn poustawiał bity tak żeby coś tam działało w tym przypadku co ja ci podałem trza by to było mniej więcej zrobić...
Dzięki wielkie- ale to nie do mnie pisałeś. O Atomic_Block dowiedziałem się w czwartek- sprawdziłem- od czwartku jest to pierwsza wiadomość na ten temat. A wracając do tematu Fir3man- wymyśliłem taki schemat programu: #include <stdint.h> #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> volatile uint8_t dol;...
Zakładam że kompilujesz w takim GCC jak ja. Spróbuj tego: #include <avr/io.h> //#include <stdio.h> niepotrzebne, bez tego też działa #include <avr/interrupt.h> //#include <avr/signal.h> tej biblioteki się nie stosuje - patrz gcc-libc ISR(TIMER0_OVF_vect) //po co tam miałeś INT0_vect? { PORTD ^= 0xFF; //będziemy mieli...
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...
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...
Kod obsługi przerwania Timera jest w pliku Atmela. Po przeróbce na AVR GCC: Obsługa przerwania: [syntax=c]ISR(TIMER0_OVF_vect) { static uint16_t i = 0; if(i < TIME_INTERVAL) i++; else { gFlags.pidTimer = TRUE; i = 0; } }[/syntax] Ustawienia Timera: [syntax=c]TCCR0 = 1<<CS00; TIMSK = 1<<TOIE0; TCNT0 = 0; #define TIME_INTERVAL 10000//TIME_INTERVAL...
Jest komentarzem ponieważ w tym przykładzie nie używam przerwań. sprawdzam czy licznik w ogóle ruszył: if (TCNT2 > 100) PORTC &= ~_BV(PC2); Nie spodziewałem się, że w tak krytycznej sekcji datasheetu może być błąd. W mojej wersji noty katalogowej (pobranej ze strony atmela, jako najnowsza) najpierw jest opisany licznik TIMER2(8bit),...
--> kolejne PWMy znajdują się z tego co pamiętam na PD7 i PB3. Proszę o odzew i dziękuję za ew. pomoc. Podobnie jak te na T1 tylko dotyczą odpowiednio T2 i T0 A to przykładowe inicjacje /******************************** Init timer T2 */ void InitT2 (void) { TCCR2 = (0<<FOC2) | //forsowanie (0<<WGM21)|(1<<W...
[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 {...
Hej :) Chcę podłączyć 3 czujniki odległości do kanałów ADC (porty PA1, PA2, PA3) i odczytywać z nich pomiary przez cały czas. Ponieważ po przetestowaniu czujników doszłam do wniosku że pewne czynniki wpływają na niestabilność pomiaru, chcę jako ostateczny wynik wziąć średnią arytmetyczną z 8 pomiarów przeprowadzonych w trakcie jednego cyklu pomarowego...
Atmega jest taktowana zewnętrznym kwarcem 12MHz, żeby jeden tick timera trwał ~1us. 1. Czy timer 8-bitowy przyjmujący zewnętrzne impulsy, może je przyjmować w takich samych odstępach czasowych jak 16-bitowy? Niestety na etapie projektowania nie zauważyłem, że żeby użyć 16-bit timera do przyjmowania impulsów zewnętrznych należy użyć nóżki T1, a nie T0,...
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...
Kod który zamieściłem jest na ATTiny2313 więc nie powinno być problemu z przeniesieniem na ATMega8 - wystarczy sprawdzić i ew. zmienić nazwy rejestrów. Mam nadzieję że Ci się przyda. void PWMint(void) { DDRB |= (1 << PORTB2); DDRD |= (1 << PORTD5); // jako wyjscia DDRB |= (1 << PORTB4); TCCR0A =...
Dzięki, już działa. Wiedziałem, że mogę liczyć na forumowiczów :] ... Chociaż może nie do końca, bo teraz tylko timer 2 działa ;/ a 0 stoi. [syntax=c]void Timer0Init(void) { TCCR0 = 1<<CS01|1<<CS00; // Prescaler 64 TCNT0 = 128; // ~ 1.0 ms TIMSK |= 1<<TOIE0; // odblokowanie przerwania od licznika } void Timer2Init(void) { TCCR2 = 1;...
Witam, Pomysł dobry ale sypie się najprawdopodobniej z powodu zbyt dużej ilości przerwań. Proponuje projekt sterownika "równoległego", taki wykorzystałem w mojej pracy inżynierskiej. Wprawdzie korzystałem tylko z 8 serw ale 16 też obsłuży po drobnej modyfikacji. Program zabiera większość mocy procesora do obsługi przerwań ale tylko przez czas 2ms potem...
Zamiast tego całego config timer0 itd. wpisz sobie: TCCR0A=&b00100001 TCCR0B=&b00000011 i póżniej wszędzie gdzie masz pwm0b wpisz OCR0B. powyższego nie sprawdzałem - na żywca z dokumentacji. Za ok. 2h sprawdzę to coś ci napiszę :D Dodano po 2 Wygląda na to, że ten kod zaczął ci działać :D . To, że żarówka ci od razu się zapala i gaśnie to nic dziwnego....
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...
Witam Mam problem z wykorzystaniem regulatora PWM wbudowanego w atmega. Zbudowany układ wykonawczy pracuje prawidłowo i wykonany jest następująco: http://obrazki.elektroda.pl/4062235800_1... Elementy: MOC3042 BTA136 2x rezystor 330R Układ wykonawczy działa i podanie wysokiego stanu zapala żarówkę, zadanie niskiego ją gasi. Jako obciążenie...
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...
Tutaj zmieniasz rejestr licznika T0 a poniżej już T1 TCCR0A |= (1<<COM1A1)|(0<<COM1A0); //Clear OC0A on Compare Match, set OC0A at BOTTOM Ponadto włączasz przerwania a nigdzie nie masz do nich obsługi. Poza tym przerwania do PWM nie są potrzebne. Ponadto nigdzie nie skonfigurowałaś że pin OC1A czyli PD5 ma być wyjściem.
Witam! Chcąc dodać zegar do mojego projektu musiałem wygenerować przerwanie, które dodawałoby 1 do zmiennej co 1s. napisałem programik jak poniżej, lecz niestety zliczając późni się o około 1/1,5s na minute... ktos wie gdzie robię błąd? gdzieś się pomyliłem? http://obrazki.elektroda.pl/9649052700_1... Preskaler ustawiony na 64, czyli...
Możesz nieco rozwinąć temat? Na początku próbowałem w programie zliczać stany na pinach procka, ale to była zupełna klapa, bo gubił kroki niemiłosiernie. Rozumiem, że proponujesz aby licznik sprzętowo zliczał zmiany na określonym pinie. Nie bardzo rozumiem "użyj jednego, np. 800 Hz - co 80 przerwań masz odliczony odcinek 100 ms" Ja muszę dokładnie ustalić,...
A moje pytanie, czy przy takim algorytmie, pomimo tego że nie wykorzystuje przerwań a na pinie mam częstotliwość którą chciałem procesor będzie miał jeszcze "czas" na po prostu realizację programu ? Czy tak skonfigurowany timer wykorzystuje procesor ? Widzę że timery to twoja słaba strona, więc napiszę ci troche ... Wszystkie timery w AVR mają możliwośc...
#include <mega128.h> #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<OVR) #define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)...
Witam. Walczę z tym już od dłuższego czasu. z serią At90S nie miałem żadnych problemów, a jak AtMegi i AtTiny zastąpiły tą serie to przestałem czaić o co chodzi. Mianowicie: Atmegę 8535 taktuję zewnętrznym kwarcem 16MHz. do tego 2 kondensatory 22pF. Fusy ustawione tak: CKSEL0...3=0 - odhaczone CKOPT=0 - zaznaczone Napisałem prosty programik, który po...
Wybacz, ale nie rozumiem współpracy tych linii kodu. Zastanów się nad użyciem [syntax=c]ISR(TIMER0_OVF_vect) { timer0_licz--;[/syntax] i dalej, cała funkcja [syntax=c]void delay_500ms(void) { ATOMIC_BLOCK(ATOMIC_FORCEON) { TIFR |= _BV(TOV0); //zerowanie flagi przerwania (zapis 1) TIMSK |= _BV(TOIE0); //aktywacja przerwania od przepełnienia TIMER0 (OVF)...
O, widzę, że ktoś oprócz mnie również ma ten problem :D Przede wszystkim musisz uwzględnić ten pin SS, o którym wspomniałeś, bez tego ani rusz. Za każdym razem gdy coś wysyłasz po SPI musisz ustawiać SS na zero, a po wysłaniu SS na 1. Warto również zajrzeć do bibliotek, które udostępnia Atmel, jest to nota AVR319, do pobrania stąd [url=http://www.atmel.com/devices/ATTINY...
Witam, Chciałem napisać program do liczenia 'sekund'. Jest to początek mojej drogi do zrobienia zegara. Problem jest taki, że po 5 minutach zegar spieszy już o 3 sekundy. Gdzie popełniłem błąd? Prescaler ustawiony na 1024, atmega na 8MHz na kwarcu wewnętrznym(może tutaj jest problem?), według informacji które posiadam przerwanie powinno być generowane...
Udało mi się skonfigurować tak jak chciałem, Więc zostawiam kod dla innych: void Init_Timer(){ count=1;//Reset ounter TCNT0 = 0;// Reset timer TCCR0 |= (1<<CS02) | (1<<CS00) | (1<<WGM01);// Set prescaler 1024, Set CTC Mode TIMSK |= (1<<OCIE0);// Enable Compare interrupt OCR0=100; //Set...
nie wiem czy po "fachowemu" ale działa :) dzięki wielkie [syntax=c][/syntax] #include <avr/io.h> #include <util/delay.h> int main(void) { DDRB |= (1<<PB3); //kierunrk pinu PB3 - wyjście (dioda1) DDRD |= (1<<PD7); //kierunrk pinu PD7 - wyjście (dioda2) TCCR0 |= (1<<WGM01)|(1<<WGM00); //tryb Fast PWM TCCR0 |= (1<<COM01);...
[syntax=basic4gl] $regfile = "m8515.dat" $crystal = 8000000 Config Portb.1 = Output 'RW LCD Portb.1 = 0 Config LCD = 16*2 Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Portc.7 , Rs = Portc.6 cls lcd "test" wait 1 cls Config Timer0 = Timer , Prescale = 1024 Tccr0 = 4 On timer0 Multi_kl Enable Timer0 Enable...
Witam, Próbuję uruchomić przerwanie timera 0 w ATMega8583 i jakoś nie mogę. W założeniu ma być to tryb pracy normalnej - licznik krąży i jak się przepełni to następuje przerwanie. Pewnie robię coś nie tak, tylko nie wiem co. Próbuję tak (to tylko fragmenty kodu dotyczące przerwania): .CSEG .ORG 0x0000 rjmp reset .ORG OVF0addr rjmp timer_0 reset:...
A czego miałem szukać w nocie katalogowej? Ewentualnych odpowiedzi na ewentualne pytania dotyczące kodu... U mnie CALL oznacza rcall. OK, ale i tak bez ustawienia wskaźnika stosu się nie obędzie. Oto poprawna i sprawdzona wersja na timerze : #define F_CPU1000000 .nolist #include <m8515def.inc> ; Prohibits use of non-implemented instructions (ATmega8515)...
Witam poniżej przedstawiam kod programu za srednikami jest poustawiany timer 16 bit który steruje serwomechanizmem z modeli RC i działa wszystko poprawnie (wyjscie OC1A do serwa) natomiast ja chcialbym to serwo wysterować 8 bitowym wyjscie (OC0/t0 pin1 do serwa) I niby wszytsko dobrze posutawialem ale serwo ani drgnie dlaczego? #include "avr.inc"...
Podłaczenie to: Atmega128L, port PB6-rezystorek-dioda(katoda w stronę procka-zasilanko 5V int main(void) { // konfiguracja portów we/wy DDRE=0xFF; PORTE=0xFF; DDRB=1<<PB6; TCCR1A|=1<<COM1A1|1<<WGM10; TCCR1B|=1<<WGM12|1<<CS0; TIMSK=1; TCCR0=7; sei(); // inicjalizacja LCD lcd_init(); LCDclr();...
Cześć Ten kod mi nie działa.Czy moglibyście rzucić na niego okiem. Ten kod poprostu ma za zadanie nadawać w standardzie space.Ladnie pokazuje adres ale nie działa komenda pokazuje same zera. [syntax=c_mac] //Załączanie plików nagłówkowych #include<avr/io.h> #include<util/delay.h> //Czasy dla nagłówka #define first_header 9460 #define second_header...
teraz działa poprawnie [syntax=c] int main( void ){ // *******************RTC******************... TIMSK &=~((1<<TOIE0)|(1<<OCIE0... ASSR |= (1<<AS0); TCNT0 = 0x00; TCCR0 = 0x05; while(ASSR&0x07); TIMSK |= (1<<TOIE0); __enable_interrupt(); //sei while(1) { MCUCR = 0x38; __sleep(); TCCR0=0x05; while(ASSR&0x07); } }...
Hej. Od jakiegos czasu mecze sie z SPI. Napisalem program dla Mastera i dziala. Problem tkwi w Slave. Gdy puszczam symulacje w AVR Studio nie chce mi sie ustawic bitu USISIF w rejestrze USISR. Robie to tak: USISR|=(1<<USISIF); Master - Atmega8515 Slave - Attiny26 Attiny26 nie ma SlaveSelect wiec musialem je zrealizowac programowo. Zastosowalem...
TCCR0 = _BV(x<<CS00); Źle użyłeś makra _BV. _BV(x) jest równoznaczne z ( 1 << x ), czyli w Twoim przypadku próbujesz wykonać podwójnie przesunięcie bitowe. Jeżeli x = 3 (CS00=0): _BV(3<<CS00) = _BV(3) = (1<<3) = 0b00001000 czyli TCCR0 będzie równe 0b00001000 . Innymi słowy, próbujesz ustawić bit tylko do odczytu, zamiast...
Witajcie, Problem powinien być trywialny a nie jest. Dotychczas stosowałem auto trigger ADC na ATtiny13 i działało to przewidywalnie według datasheeta, ale kod przeniosłem na ATmege168 i działać przestało, mimo że wszystko ustawione według dokumentacji. Po krótce: - uruchamiam timer0 w trybie CTC by zdarzenie Compare Match A zachodziło co 250us (4kHz),...
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. Posiadam program do zegara VFD, lecz posiada tak zwane duchy. Po zastosowaniu większego rezystora ograniczającego prąd siatki też można ten efekt zniwelować ale czy można byłoby zrobić to w programie? Btw czy można przerobić program dodatkowo na to żeby pokazywał datę? Wrzucam program: [syntax=C] ////////////////////////////////////////...
Chciałbym użyć wewnetrzny czasomierz do obliczenia sekundy. Przeglądałęm już forum i dowiedziałem się, że nie ma mowy o dokładym czasie ale chociaz w celach edukacyjnych chętnie bym poznał jak to się robi. Swoją drogą z czego ta niedokłądność wynika? Czy chodzi o to, że między taktami kontrollera występują różnicę czasowe wynikające z czynników zewnętrznych?...
Witam wszystkich. Podczas dzisiejszej zabawy z Atmegą32a napotkałem 2 problemy. Jeden, to dziwnie działający UART: Przy takim kodzie: [syntax=c]#include <avr/io.h> #include <util/delay.h> #define PWM_A (1<<PD4) #define PWM_B (1<<PD5) int a = 0; #define USART_BAUDRATE 9600 #define BAUD_PRESCALE (((8000000UL / (USART_BAUDRATE *...
Ta linijka w sumie nie ma potrzeby istnieć. Według mnie wystarczy wywołać: Timer0_Init()' i potem Timer0_RegisterCallbackFunction( jakaś funkcja ) i powinno chodzić. Jednak nic się nie dzieje. Samo Timer0_Init wygląda tak: void Timer0_Init(void) { //mt char i; uint8_t i; // Initialize array of callback functions for (i=0; i<TIMER0_NUM_CALLBACKS;...
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)...
Witam szanownych forumowiczów. Wykonywany przeze mnie projekt to prosty sterownik lampek LED RGBW. Lampki sterowane są poprzez 4 kanały PWM, których współczynnik wypełnienia regulowany jest potencjometrami podłączonymi do 4 wejść ADC mikrokontrolera. Wyjścia PWM ustawione są w trybie fast PWM o częstotliwości 490Hz. No i poprawnie wykonana operacja...
Witam Mam dziwny problem z konfiguracją timer1 w atmedze644pa w trybie CTC. Kod jest następujący: [syntax=c] #define TIMER1_OCR 10801//10799//10800 // 1 sekunda void timer_init(void) { TCCR0A=(1<<WGM01); TCCR0B=(1<<CS02)|(1<<CS00); OCR0A=TIMER0_OCR; TIMSK0=(1<<OCIE0A); TCCR1B=(1<<CS12)|(1<<CS10)|(...
Robię PWM na porcie 8-bitowym OC0 i czy w takim wypadku do deaktywacji PWM'a wystarczy wpisać TCCR0 = 0x00?
Dzieki, bardzo użyteczny sposób, którego nie znałem. Ostatecznie wyglada to tak var.h: #ifndef F_CPU #define F_CPU 8000000 #endif #define LCD PORTC #define LCDE PC6 #define LCDRS PC7 #define D7 PC2 #define D6 PC3 #define D5 PC4 #define D4 PC5 #define LCDREG DDRC #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #define...
Witam serdecznie Ostatnio zacząłem zabawę z programowaniem kontrolerów i od razu natrafiłem na dość dziwny (przynajmniej dla mnie) błąd. Mianowicie zauważyłem, że nie są przyjmowane przerwania od timera 0... Oczywiście na starcie programu wykonałem instrukcję odblokowującą globalne przerwania (asemblerowskie sei() ) ale nie dało to żadnego rezultatu,...
Może ktoś pomoże, dlaczego usart atmega 128 nie wysyła nic na wyjście RS TxD. Uart jest ustawiony, po wpisie do UDR0 nie wychodzi nic na wyjście TxD, nie wchodzi również w obsługę przerwania od nadajnika. SP. oto program: [syntax[syntax=asm] .nolist .include"m128def.inc" .list .defAL = r24 .defAH = r25 ;akumulator .equ SYS_FREQ_HZ = 8000000 .equ RS232_BAUD_RATE...
Witam, z niewyjaśnionych dla mnie przyczyn program napisany pot atmegę 8535 nie chce uruchamiać przerwań wywoływanych przez zegar. Posiadam taki następujący kod który powinien co przerwanie zmieniać stan portu B. [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> void system_init() { TCCR0 = 0x00; // Wylaczenie Timera 0 TCNT0 = 0x00;...
Witam, próbuję wykonać vu meter na 32 diodach RGB. Aktualnie mam problem z samym sterowaniem wszystkich LEDów. Do zbudowania urządzenia użyłem atmegi 169p. Posiadam diody ze wspólna anodą. Są one podłączone jak na schemacie, czyli wszystkie katody danego koloru połączone są ze sobą i przez rezystor do mikrokontrolera do portów PWM, natomiast anody podłączone...
tccr0 atmega32 tccr0 atmega128 atmega8 tccr0
prędkość znamionowa niebieska lampka amilo wymiana dysku
mikrofala usterki mikrofala usterki
Klapa bagażnika Opel Insignia otwiera się, ale nie zamyka pilotem Tryb serwisowy w suszarkach Beko - diagnostyka i testy