Nawet z uwzględnieniem zmniejszenia dokładności (które przy wykorzystaniu aktualnej wersji avr-gcc przy typowych opcjach kompilacji nie występuje – patrz fragment If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long) support w dokumentacji) te funkcje (jako same w sobie) są całkiem niezłe. W praktycznych zastosowaniach ich niedokładność...
sama pętla for dodaje jeszcze 3 cykle zegarowe, popatrz na liczbę wykonań pętli dla 8MHz zegara pierwsza to 70*3/8000ms + 70*1ms = 26,25µs + 70 ms druga 70000*3/8000ms + 70ms = 26.25ms + 70ms różnica jest ogromna...
Witam, Używanie funkcji _delay_ms(); ze zmienną nie jest dobrym pomysłem. Taka implementacja zajmuje bardzo dużo pamięci. Lepiej zadeklarować funkcję np. _delay_ms(1); i wykonywać ją w pętli tyle razy ile potrzeba. Liczbę wykonań pobieramy z tablicy.Taki sposób jest zdecydowanie mniej pamięciożerny. Pozdrawiam, Marcin
Jaka jest aktualna częstotliwość zegara? Jak często uruchamiane jest przerwanie? Ile trwa naciśnięcie przycisku? Musisz zmieniać opcje tylko kiedy przycisk został naciśnięty, nie przytrzymany. Dodaj do przerwania warunek sprawdzający poprzedni stan przycisku. Pomyśl nad wyeliminowaniem delay.
SIGNAL(SIG_OVERFLOW0) - w ten sposób definiowały obsługę przerwania jeszcze nasze babcie i jeszcze za ich czasów wprowadzono nowy sposób - ISR(TIMER0_OVF_vect) 3-sekundowy delay w przerwaniu? "Super" pomysł.
Całkiem możliwe... bo masz delaya w przerwaniu... Spróbuj jeszcze w pętli głównej zrobić tylko miganie diodą bez użycia przerwań... z delay(1000) i 2x delay(500), albo jakimś mniejszym... potestuj
Niestety nadal występuje ten sam problem :cry: Problem wystąi niezależnie czy naciśniesz F10 czy F11 bo funkcje delay są inlinowane, więc co prawda tego nie widzisz, ale ich ciało jest osadzane w miejscu wywołania. Najlepiej ustawić breakpointa za delay i dać F5. A jeszcze lepiej zrobić tak, żeby dla celu debug przy symulacji preprocesor wywalał delay.
Czy jest możliwość, aby po powrocie z przerwania na PORTC pojawiła się ostatnia wartość sprzed wywołania tegoż przerwania? O ile dobrze zrozumialem twoj problem to rozwiazanie jest proste - na poczatku przerwania zapamietaj stan PORTD w jakiejs zmiennej i odtworz go na koncu obslugi przerwania. Co do delay w przerwaniu to sie nie przejmuj tym co pisza...
Programuję w Eclipse, tam w ustawieniach ustawiam częstotliwość, procesor. Dziękuję za odpowiedzi, wprowadzam teraz stałe w delay. Pozdrawiam
A to w bascomie nie ma jakieś funkcji delay?
Czy biblioteka Delay nie powinna mieć zadeklarowanego Fcpu ? Skąd ma kompilator wiedzieć jak długo ma trwać delay ?
Dzięki za pomoc nie pomyślałem, że mogę skorzystać z symulatora i obliczyć czasy na jego podstawie. Takie jeszcze jedno pytanko z jakiego symulatora korzystasz? Bo mi w AVR Studio 4 wyszło do opóźnienia ok 480 us : ow_delay_us(200); ow_delay_us(182);
Spróbuj wpisywać doświadczalnie jakieś wartości w polu port delay i zobacz co się dzieje.
Tak się tego nie da zrobić dobrze - uruchom Timer do sterowania PWM i zmieniaj współczynniki wypełnienia na podstawie poleceń. zapomnij o pętlach z "delay"!
Nie, te zmiany są niezbędne tylko w sytuacji, gdybyś chciał mieć poprawnie działający program. Jeśli nie ma takiej potrzeby - zostaw pętlę główną i delay.
Problem pewnie leży w procedurze. therm_read_temperature(temp); Tam zapewne masz jakiegoś delay-a ustawionego (na czas potrzebny na konwersje temperatury przez DS-a). Musiał byś pokombinować, żeby przebudować tą funkcję a delay-a wbudować najlepiej w obsługę przerwań z timera z którego korzystasz. Np. Timer przerywa częściej, za każdym razem...
Dlaczego nie? Wątek, który podałeś jako przykład to stek bzdur. Przy pomocy delay_ms można realizować opóźnienia bardzo długie, z pewnością przekraczające 3000ms: http://mikrokontrolery.blogspot.com/2011...
Pomysl z przerwaniem dobry. Zalezy jak podlaczysz przycisk to na takie zbocze bedziesz ustawial przerwanie. Przewaznie robi sie tak ze przycisk zwiera do masy czyli jak puscisz przycisk to z masy zrobi sie stan wysoki wiec bedzie to zbocze narastające. Z przyciskiem przeladowania - jak wczesniej tlumaczylem ale tu raczej na opadajace (przycisk zwiera...
Aby wyjaśnić wątpliwości: Użyłem funkcji stepinto żeby zobaczyć w którym miejscu mojego kodu jest błąd i otwiera mi plik delay.h gdzie znalazłem dwa warningi 1.# warning "F_CPU not defined for <util/delay.h>" 2.# warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed" Oraz taka informacja:__builtin_avr_delay_cycles(__...
Piszcie ludzie na odpowiednich forach! Od tego jest forum Mikrokontrolery. _delay_ms(1000) masz opisane (w sumie nie jest trudno się po nazwie domyślić). A o operatorach bitowych (np. &) poczytaj sobie PORTD &= 0xAA to to samo co PORTD = PORTD & 0xAA
a czy odczekujesz, aż pamięć zdąży wykonać operację zapisu? Potrzeba jej na to ok 10ms. Byćmoże symulator to tego nie uwzględnia. Wstaw delay między poszczególne operacje zapisu do pamięci, lub testuj flage zakończenia zapisu do pamięci.
Przerwać delay możesz tylko przerwaniem. Jeśli chcesz mieć możliwość normalnie przerwania delay to rozbij je na sekwencje kilku mniejszych opóźnień pomiędzy którymi sprawdzaj stan przycisków. A najlepiej zrobić to przy pomocy timerów i przerwań.
Witam, Zgadzam sie z poprzednikiem w przerwaniu powinno być wyłącznie tyle ile jest to niezbędnie konieczne najlepiej jedynie flagę, absolutnie żadnych delay-i !
Zamiast delay wykorzystaj inny timer.
pomyślmy... 10000 *100ms = 1000sekund = 1/3 godziny? Mogło wyglądać jakby zwisł:P Oczywiście czytałeś, że maxymalny delay to 266ms/f gdzie f w MHz?
Powinno być [syntax=C] PORTC &= ~(1<<PC5); [/syntax]. Linia taka ustawia maskę kod [syntax=C] PORTC |= (1<<PC5); [/syntax]. wykonuje operację OR rejestru PORTC z maską 00100000, czyli ustawi bit 6-ty (PC5). Operacja [syntax=C] PORTC &= ~(1<<PC5); [/syntax]. Spowoduje wykonanie operacji AND rejestru PORTC z maską 11011111, czyli...
Pytanie podstawowe, czy na obu procesorach delay działa tak samo?
Wystarczy wykryć zbocze opadające na wejściu przypisanym do przycisku, a po instrukcji delay zgasić diodę.
Mam dzisiaj dzień dobroci dla początkujących... [syntax=c]uint8_t khist = 0; while(1) { if ((khist = (khist << 1 | !!nacisnieto_przycisk) & 3) == 1) { if (++ n > MAX) n = 0; wyswietl_cyfre; } _delay_ms(10); } [/syntax] Własnym oczom nie wierzę... Napisałem kod z delay()!!! ;)
W tym trybie który wybrałeś (Single Mode) możesz generować PWM na PA0, PA1 i PA2. Zobacz sobe ten kod: [syntax=c]#define PERIOD_EXAMPLE_VALUE (0x01A0) //dec 416 F_PWM = 3.333MHz/4/416/2 = 1KHz (in dual slope PWM) #define DUTY_CYCLE_EXAMPLE_VALUE0 (0x00D0) // dec 208 (208/416 = 50%) #define DUTY_CYCLE_EXAMPLE_VALUE1 (0x003E) // dec 62 (62/416 = 15%)...
Nie znam się na bascomie, ale czy w petli do loop nie powinno być Pwm1a = X, b tak jak zostało napisane to wygląda jak by było z czytywanie raz z addc raz z pwm. I takie pytanie co do zadeklarowania częstotliwości czy to coś w ogóle da, w zasadzie funkcje delay i inne wykorzystujące opóźnienia po prostu wykonają się szybciej, czyli tak jak by zmniejszyć...
Nie wiem czy te delay jest jakieś krytyczne ale jeśli nie to sonar wyzwalaj na końcu przerwania a wynik pobieraj na początku w kolejnym przerwaniu. W ten sposób unikniesz tego delaya.
Oj, ale coś skaczesz z pytaniami z kwiatka na kwiatek :) 1. Czy masz włączoną optymalizację -Os ? 2. Po kompilacji w okienku z komunikatami, masz informację ile kod zajmuje pamięci. 3. wykorzystuj bibliotekę delay.h.
Kod BlueDarco już działa ale tylko w głównym programie int main(void) po każdej regulacji napięcia robię restart programu maint i wyśwetla mi poprawną wartość ale jak zmieniam to nic się nie dzieje ale to zrozumiałe bo muszę użyć pętli ciągłej np. while Nie wiem co jest nie tak ale nie wiem jak ten kod wstawić do ciągłej pętli jak już wstawiam to wyświetlają...
Niekoniecznie. Może wystarczy dodać po while(--delay) np. asm volatile ("nop")
void setup() { digitalWrite(pindiody, HIGH); Delay(500); digitalWrite(pindiody, LOW); Delay(500); digitalWrite(pindiody, HIGH); Delay(500); digitalWrite(pindiody, LOW); Delay(500); digitalWrite(pindiody, HIGH); Delay(500); digitalWrite(pindiody, LOW); Delay(500); zmienna = analogRead(pin do zmierzenia ); }
Wczytujesz hex do komponentu memo1 (musi mieć zaznaczoną opcję WordWrap=False żeby nie zawijał tekstu) wysłanie przez komponent Cport for i := 0 to Memo1.Lines.Count - 1 do begin st := Memo1.Lines.Strings[i]; If length(st) > 0 then begin st := st + #13; ComPort1.WriteStr(st); delay(400); // moja procedura...
Faktycznie wygląda to na problem z timmingami. Jak masz ochotę się pobawić to trzeba by spróbować zmienić wartości opóźnień w procedurach void write_onewire(u08 bit) i/lub u08 read_onewire(void) . Pisząc opóźnienia mam na myśli wartości dla funkcji delay - zmienić o kilka w górę lub w dół. W write jest dwa razy delay(30) - zmienić trza oba na raz np...
Witaj. Może przy okazji programowania zmieniłeś fusebity i zablokowałeś mikrokontroler, albo podczas programowania nie kasujesz pamięci FLASH. Doinstaluj AVR Studio 4.18 lub 4.19 i w nim pisz swoje programy - oprócz takich zalet jak automatyczne tworzenie makefile (które często jest przyczyną problemów) dostajesz dodatkowo symulator AVR, a to bardzo...
Funkcje delay muszą być wywoływane z parametrem będącym stałą. Użycie w wywołaniu zmiennej jest błędne, prowadzi do wzrostu objętości kodu i błędnego czasu opóźnienia. Twój przykład na to również wskazuje - zmienna int z przypisaną wartością użyta jako argument wywołania delay powoduje, że optymalizator to skraca do stałej i jest ok. Jeśli użyjesz modyfikatora...
Prosze napisane : MAm ustawione atmega8 na 8Mhz dlatego dluzszy delay. [syntax=csharp]/* * main.c * * Created on: 15 lip 2015 * Author: Rafal */ #include <avr/io.h> #include <avr/delay.h> int main(void){ DDRD |= (1<<PD0); while(1){ PORTD |=(1<<PD0); _delay_ms(8000); PORTD &= ~(1<<PD0); _delay_ms(8000); } } [/syntax]
Po trzecie primo: w funkcji _delay_ms() nie stosuje się zmiennej jako argumentu (tu wyjaśnienie: http://mikrokontrolery.blogspot.com/2011...
Tak, ale trzeba jeszcze dodać zmienną która będzie decydowała który stan należy podać na port. Tym sposobem wyeliminujesz delaye z przerwania.
#define F_CPU 16000000 przed dołączeniem delaya
http://tomeko.net/termometr.php -> projekty testowe dla ATmega8 i PIC18F2550. Przewód ma u mnie około metra - taka sama zwykła płaska taśma, kondensator przy czujniku. Nie zauważyłem by był wrażliwy na dotykanie. W main.h zdefiniowane jest F_CPU warunkujące opóźnienia w bibliotece delay i ustalające baudrate dla RS232. Jeżeli będzie wyższe niż rzeczywiste,...
Poszukałem i znalazłem prosty programik w C dla AT90S8515 z kwarcem 8 MHz mrugający diodą LED. Dokonałem małej zmiany (częstotliwość kwarcu), kompilowałem go za pomocą avr-gcc pod linuksem, zaprogramowałem mikrokontroler ATmega8 za pomocą uisp i STK200 i... działa z wewnętrznym oscylatorem 1 MHz. Dioda LED jest przez rezystor podpięta anodą do +5V i...
A nie ruszaj jeszcze tych fusebitów- chociaż przez parę dni. A procesor ma zasilanie? A jaki programator ustawiony w Bascomie? A delay jakie do programatora? A kable dobrze wetknięte? A zwarć nie ma? Prcesor ma zasilanie. Programator ustawiony poprawnie w Bascomie Atmega8 programuje sie bez problemow. Delay??? hmm wytłumacz o co ci chodziło. Kable...
Ale zupełnie nie wiem dlaczego Twój program działa tak a nie jak powinien. A co da taki program: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "LCD/lcd44780.h" int main(void){ lcd_init();/* inicjalizacja LCD */ lcd_locate(0,0);...
To wytłumaczę to tak. Tak jak w pętli jesst to wskazane zapisuje bity od 0 do 100 potem zostawia pamięć nie ruszoną do 255 i znowu zapisuje 100 bajtów i znowu do 255 nie tknięte i tak w kółko aż do końca pamięci. Podmień te dwie funkcje z tej biblioteki. Błędem w tej bibliotece jest używanie makr "bit_is_set()" do sprawdzania stanu bitu, ponieważ makro...
Tak, to dziwne delay po prostu zastąp przez _delay_ms, __flash nie możesz usunąć, ale jeśli istotnie masz AS 6.0 to go uaktualnij do najnowszej wersji 6.2, a tam siedzi avr-gcc 4.8.1, który __flash rozpoznaje.
To przerwanie w którym wykonujesz odświeżanie musi działać z dużą częstotliwością, a co do używania delay w przerwaniu napisałem Ci już wcześniej - w każdym wywołaniu przerwania zapalasz kolejną cyfrę, która świeci się do momentu kolejnego wystąpienia przerwania. W kolejnym przerwaniu zwiększasz sobie jakiś licznik, który teraz wskaże na drugą cyfrę,...
delay w przerwaniu?! Nie przesadzasz? Dlaczego 2 razy ustawiasz TOIE2? Po co zerujesz TCNT2? Po co ustawiasz TOV2? Spróbuj najpierw sprawdzić ten kod z taktowaniem timera z podstawowego zegara, nie z kwarcu zegarkowego. Wtedy będziesz wiedział, czy problem leży w oprogramowaniu, czy w braku oscylacji.
Wiatm. Jestem początkujący w tej dziedzinie. Jeste wiele projektów liczących czas (np. http://www.elektroda.pl/rtvforum/topic10... ) do zegarów i nie tylko. Nie znam języka C++, a pierwsze kroki stawiam za pomocą micropascala (znam pascala i delphi). Chciałbym nauczyć się jak liczyć czas, tzn. tak na chłopski rozum jak to się dzieje a z resztą...
czy ten delay jest niezbedny?? delay jest zbędny
(at)jvoytech , czym kompilujesz, że binarki się mieszczą w ATmega8?
Program po skompilowaniu ukazuje takie błędy: avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o sterowanie.o sterowanie.c sterowanie.c:2:24: util/delay.h: No such file or directory sterowanie.c: In function `main': sterowanie.c:18: warning: implicit declaration of function `_delay_ms' sterowanie.c:21:2: warning:...
Raczej tak, gdyż wykorzystywane przez ciebie biblioteka korzysta z delay. Ustaw F_CPU w opcjach projektu i powinno być ok.
<sciana> no tak nie zauwazylem. Kolega ostrytomasz wylapal swoim bystrym wzrokiem blad. Ja zawsze robie tak ze w delayu daje maks 10ms i petla for, tak zeby sie nie zastanawiac czy jeszcze taka wartosc bedzie czy juz nie, i nigdy mnie to nie zawiodlo :) A jesli kolega Tymek92 ustawia w programie czestotliwosc procka to tylko pogratulowac.
Robie zegarek na ATMega8 i robie go wlasnie na funkcji delay pokazanej powyzej czy to znaczy ze moj zegarek bedzie nie dokladnie odmierzal czas?? jak musze uzyc kwarca to jak go podlaczyc?? Prosze o pomoc jestem poczatkujacy.
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;...
Nie wiem w jakim środowisku piszesz ale w AVR Studio musisz też podać częstotliwość zegara z jaką układ będzie pracować. Inaczej źle Ci powylicza opóźnienia _delay_ms i _delay_us
I z tymi dwoma sekundami to raczysz zartowac, chyba, ze do procka ze 128kB FLASH ladujesz program o dlugosci kilobajta. Jutro w pracy moge specjalnie dla ciebie sprawdzic ;) Swoja droga, nie sadze zebys byl w stanie przez port LPT programowac z czestotliwoscia 4MHz. Co do symulatora, teraz pracuje na ukladzie gdzie jest w sumie 5 procesorow, pamieci...
Sory, że tak wprost zapytam: gdzie masz procedurę obsługi prpzerwania tego tajmera? I po co używasz delay do opóźnień jak chcesz mieć tajmer?
Zobacz w nocie jak działa timer, w szczególności funkcje pinów OCx. Zauważ, że impuls wyzwalający triak może być generowany całkowicie sprzętowo. Dzięki OCx możesz ten impuls wygenerować z zadanym opóźnieniem, w takiej sytuacji wyzwalasz tylko timer w przerwaniu detekcji zera. Tak jak kolega wyżej sugerował zapomnij o delay, szczególnie w przerwnaiu....
ISR(INT2_vect) //procedura obslugi przerwania { impulsy++; } A czy zadziała: (chyba powinno ;)) SIGNAL(SIG_INTERRUPT2)// gdy nastąpi przerwanie na wejściu INT2, wykonuje to co w klamrach { impulsy++; // każde przerwanie powiększa zmienną impulsy o 1 // tu wpisz swoją funkcję - opóźnienie o 40 milisekund } Ale spróbuj też w tym swoim...
Bardzo dziękuje za pomoc po dodaniu return'a działa wyśmienicie. Następnym programem pewnie będzie obsługa wyświetlacza. Pisze w c++ także z tym też powinienem sobie poradzić. Jeszcze raz dziękuje i pozdrawiam. pio_05 ps. Ta biblioteka z delay zjadła mi pół pamięci flash:)
To co zrobiłeś nie miało prawa zadziałać z wybraną płytką NG, ona ma ustwienie na kwarc 16MHz: c:\Program Files (x86)\Arduino\hardware\arduino\avr\board... ... ########################################... atmegang.name=Arduino NG or older atmegang.upload.tool=avrdude atmegang.upload.protocol=arduino atmegang.upload.speed=19200 atmegang.bootloader.tool=avrdude...
Po prostu programujesz układ taki jaki ma pracować, a więc jeżeli wykorzystuje on oscylator wewnętrzny i tak później będzie pracował, kwarcu zewnętrznego nie dajesz. Nie znam tego ISPprog-a, ale na pewno jakieś tam LPT-adres, czy Port delay można popróbować zmienić.
Oj kolego jest wyraźnie napisane: Jestem początkującym programistą... wiec gotowca nie ma co dawać bo człowiek się nie uczy tylko bezmyślnie go używa. Podejrzewam że nie potrafiłby jeszcze zainicjować odpowiednio timer, skoro nie znalazł odpowiedzi na prosty problem. Tak poza tym z timerem tez procek się kreci bez celu oczekując na wciśniecie przycisku....
Problemem jest to jakieś. Jesli timer ma np. okres 550us, a twoja pętla np. 551us to się robi problem - synchronizacja będzie się co raz bardziej rozjeżdżać, a kolejnej impulsy PWM będą co raz bardziej zniekształcone. Zamiast delay zrób tak jak pisałem - w funkcji obsługi przepełnienia timera uaktualniaj OCR. W dodatku musisz tak ustawić preskaler,...
btw czemu się tak upierasz przy tym, aby funkcje delay wywoływać z parametrem 1, można tam wpisać dowolna liczbę typu double więc czemu nie _delay_ms(t/1000.0) ?
NIGDY nie używaj opóźnień w przerwaniach bo tym zabijesz sobie resztę programu. Chciałem uniknąć drgania styków. Jak temu zapobiec nie używając delay? INT0 ma wyższy priorytet niż INT1 więc gdyby w INT0 miało dojść do przerwania, to doszło by do niego nawet gdyby właśnie wykonywany był delay z przerwania INT1, prawda?
Z grubsza tak. Jest jeszcze sporo krzaków, ale jakoś zadziała. Wyrzuć delay z pętli, potem skróć kod o połowę i będzie ok.
Nie w głównym a raczej: w innym przerwaniu wstawiają delay() albo pętlę oczekującą na cokolwiek. P.S. Poczekajmy co Autor wymyśli.
To by i tak nic nie zmieniło bo tamten kod wykonuje się co sekundę ;) Trzeba by wyjąć wtedy minuty spod tego IF`a sekund :P To też nie wiele da, bo processor jest zajęty w 50% liczeniem czasu dla delay (500 mS w każdej sekundzie!) plus kilka cykli na zmianę wartości flag i portów wyjściowych przez co praktycznie występuje zwłoka w reakcji na przycisk...
Tak czy siak - jaki problem napisac funkcję: void delay(int x) { while(x--) delay_us(1); } ? 4\/3!!
Programator "samoróbka":?: Może za mały kondensator przy mikroprocesorze. Albo obniżyć prędkość ISP, dodać jakiś delay w parametrach. Skąd kolega jest? Mazury to kraina czy miejscowość?
Nie działa, nawet tak nie działa że dodanie delaya nie pomaga :/
Witam mnie działa STK200/300 bez problemów z pod BASCOMa może to kwestia ustyawień BIOSa albo port delay w opcjach programatora miałem tak z ATMega8 na kompie ze cza było dac opóźnienie 10 i już lux chodzi Pozdrawiam
Spróbuj na wewnętrznym RC 1MHz, jak ruszy to znaczy, że w bibliotece musisz zwiększyć delaye przy wysyłaniu pojedynczych znaków na wyświetlacz.
delay nie powinno mieć takiego wpływu. zamiast modulo w przerwani zrób anda z 0x03; wykonuje się szybciej.
To dziwne bo ja niemiałem najmniejszych problemów... #include <avr/io.h> /***************************************... Definicje stałych ****************************************... #define F_CPU 1000000 /* 1MHz zegar procesora */ #define CYCLES_PER_US ((F_CPU+500000)/1000000) /* cpu cycles per microsecond */ /***************************************...
A jednak w pełnym kodzie masz kilka przerwań. I dwa z nich są NOBLOCK. To zobaczmy co piszą na ten temat: #define ISR_NOBLOCK # include <avr/interrupt.h> ISR runs with global interrupts initially enabled. The interrupt enable flag is activated by the compiler as early as possible within the ISR to ensure minimal processing delay for nested interrupts....
Ale to nie jest rozwiązanie, tylko półśrodek, pisałeś że to tylko część kodu, może w reszcie programu leży problem? Gdy będziesz robił jakąś komunikacje typu SPI lub I2C (mowie o rozwiązaniu software - owym) to niestety ale strasznie spowolni Ci ten delay wręcz uniemożliwi przesył danych
[syntax=c] ISR(ADC_vect) { register uint8_t Voltage = ADCH; if(Voltage>TRESHOLD) { //Zapis krytycznych danych do pamięci EEPROM } _delay_ms(100); }[/syntax] Czy delay nie powinien być wewnątrz ifa?
Bo pewnie używasz delay z argumentem będącym zmienną, podczas gdy funkcje te powinno się wywoływać z argumentami będącymi stałymi.
Holy, pracuje na 16MHz. Wszystko dziala, kiedy z funkcji LCD_Send() wywale dwa wywolania funkcji LCD_Busy() i zmienie "nop'y" na delay(1) [opoznienie o jedna milisekunde].
Witam. A skąd w Atmega8 wziąłeś rejestry TCCR0B , TCCR0B. Timer0 i _delay_ms() razem działają. Masz co nie tak w swoim kodzie. Pisał już (at)excray dodam tylko pełny. Możesz powyrzucać wszystko co jest nie potrzebne i zostawić sam błąd.
Program masz całkowicie źle napisany. Zacznij od sterowania serwami, ale tak, żeby nie używać delay. Czyli całe sterowanie musisz zrobić w przerwaniach. Najlepiej tak, że w procedurze obsługi przerwania inkrementujesz jakąś zmienną i porównujesz ją ze zmiennymi określającymi szerokość impulsu dla konkretnego serwa (skoro masz 10 to będziesz miał tablicę...
W zadnym wypadku :) Wylacz tylko wewnetrzne pull-upy tak aby Ci portu nie podciagalo do plusa a wykrycie przerwania zmien na zmiane stanu wejscia. PS. Czy delay juz dobrze dziala?
[syntax=c]unsigned int i; for (i=500;i<1001;i++) { OCR1A = i; _delay_us(300); } _delay_ms(330); [/syntax]
Nie neguję tego co piszesz, jedynie wyjaśniam to, czego nie napisałeś. W tym przypadku istotne było wyjaśnienie, dlaczego tam jest delay. Nie dam ryby, dam wędkę. I bardzo dobrze :)
Zadeklarowałeś częstotliwość zegara? Jeśli podczas kompilacji jest przyjmowana zła częstotliwość zegara to delay będzie źle działał. Tak samo może być jeśli użyłeś optymalizacji -O0.
Ja praktycznie wszystko co robię z AVRkami to zawsze docelowo jest to w obudowie TQFP albo SMD. Atmega8, ATmega88, ATmega32 - tych to już naprawdę całe mnóstwo przeszło mi w ten sposób przez ręce i nigdy ale to nigdy nie zauważyłem jakichś różnic w programowaniu pomiędzy TQFP/SMD a w obudowie DIP Oczywiście zawsze gdy robię jakiś prototyp to najpierw...
Opis funkcji _delay_ms() z biblioteki avrlibc The maximal possible delay is 262.14 ms / F_CPU in MHz.
A co to oznacza? The maximal possible delay is 262.14 ms / F_CPU in MHz. Bo myślałem że maksymale opóźnienie.
OK dzięki W bascomie trzeba przestawić dwa fusebit-y: Fusebit A987: na 0100:0100 interal osc. Fusebit KL: na 01:6 CK 4mS delay. I wszystko śmiga :) Pozdr i dzięki
Dodaj sobie do układu jakiegoś LEDa z rezystorem do któregoś wolnego pina. Wstaw między instrukcje while linijkę do zmiany stanu na przeciwny pina z podpiętym LEDem. Większy delay też w tym powinien pomóc. Sam zobaczysz dokąd dochodzi program.
Ma mi to posłużyć w nauce podstaw, później można się na coś większego/nowszego przerzucić. To "później" przyjdzie wcześniej niż Ci się wydaje. Pierwszy z brzegu kurs AVR-GCC: http://kursc.forbot.pl/ już na 3 lekcji pojawia się Atmega16A. Ja zrobiłbym podstawkę dip 40 i mniejsze procesory w "razie potrzeb" podłączał poprzez adaptery. Same wyświetlacze...
W przerwaniu delay na 10 sekund? Przerwanie ma działać jak najkrócej. Do poczytania: http://mikrokontrolery.blogspot.com/2011...
funkcja delay przerwanie delay relay delay
revox tuner pralki blomberg lustro prądowy
karta graficzna wzmacniacz mikrofonowy
Skuteczność mieszania środków ochrony agrestu Podłączenie czujnika MAP w Mercedesie W211