volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; A czy przypadkiem tylko pierwsza zmienna będzie volatile przy takiej deklaracji?
Dzieje się tak, ponieważ po wyjściu z ostatniej pętli czyścisz ekran, zmieniasz wartość zmiennej "a" i kończysz program - wracasz z funkcji main(). Zapomniałeś dodać pętlę nieskończoną, while(1). Rozpoczyna się ją za wstępną inicjalizacją. W twoim przypadku, będzie to za ekranem powitalnym. Skoro zaczynasz przygodę z programowaniem, to napiszę jeszcze...
Pamiętaj że sama transmisja też swoje trwa :) a poza tym nie pokazałeś funkcji printf (może ona bawi się w _delay_ms() ?) Zauważ również że przerwanie występuje niezależnie od transmisji, może dochodzić do takiej sytuacji ze raz przerwanie zmienić Ci wartość zmiennej tuż przed transmisją a raz tuż po niej i to spowoduje Twoje opóźnienia. Spróbuj blokować...
tak dokładnie jako uint_16_t czyli następująco: volatile uint16_t zmienna = 0; Zastanawiam się czy dobrze mam fusy ustawione - bo nic innego do głowy mi juz nie przychodzi.
Jeśli chcesz gotowego rozwiązania to napiszę jak sam robię takie systemy: Deklaruję pewną strukturę globalną, koniecznie volatile, w której umieszczam flagi w zależności od tego ile ich potrzebuję, np.: [syntax=c]volatile struct sZmienna { unsigned char Pomiar :1; unsigned char Timer :1; unsigned char Odswiez_LCD :1; //itd. }Zmienna;[/syntax] Następnie...
To jest na avr tak dla pewności. Korzystam z biblioteki do HD44780 Radosława Kwiecienia. W funkcji [syntax=c] void LCD_WriteText(char * text) { while(*text) LCD_WriteData(*text++); }[/syntax] Potrzebuje dać char* i nie wiem jak do tego przekonwertować w najprostszy i najszybszy sposób. Jeszcze raz przypomne, chce by zmienna [syntax=c]volatile uint8_t[/syntax]...
U mnie ta funkcja tyle że na unsigned long działa dobrze. Kompilowana pod IAR na MSP430. Dlaczego zmienna temp jest typu volatile? to chyba trochę bez sensu.
a co jest nie tak z pętlą while(1) bo nie mogę się dopatrzeć To, że jest pusta. Stan zmiennej flaga sprawdzasz tylko raz na początku programu, po czym zapętlasz go w pustej pętli. Poza tym sprawdzanie if(flaga=1) jest błędem, zapewne miało być if(flaga==1) - przeczytaj ostrzeżenia kompilatora generowane w czasie kompilacji.
Witam. Od dość długiego czasu zmagam się z projektem ramienia i aplikacji nim sterującej. Cały projekt jest już prawie ukończony, poza komunikacją usart, która przysparza mi olbrzymich problemów. Aplikację napisałem w visualu. W skrócie, po kliknięciu przycisku "wyślij" program wysyła po serial porcie 18 bajtów (6x[bajt kontrolny+wybór serwa+wartość...
Raczej nie wydłuży obsługi przerwania,a w przypadku uC wydajniejszych od ATmega wręcz ją skróci, bo modyfikacje zmiennej bez atrybutu volatile zajmują zwykle mniej czasu, niż modyfikacje stanu portu. Być może w AVR jest tak samo - to zależy i od sprzętu i do kompilatora. Po prostu te operacje, które wykonujesz na porcie, należy wykonywać na zmiennej...
Witam. Zmontowałem przed chwilą i sprawdzone. Zostaje tylko pozbycie się drgań styków klawisza. [syntax=c]#define F_CPU 16000000UL // Atmega644 #include <avr/io.h> /*biblioteka avr*/ #include <string.h> /*biblioteka napisy*/ #include <stdio.h> /*biblioteka podstawowa C*/ #include <stdlib.h> /*biblioteka C*/ #include <stdbool.h>...
Rozumiem, że nie masz kodu źródłowego? ;) Jako osoba pisząca od wielu lat w C i mająca okazje w tym czasie obejrzeć wiele różnego rodzaju "wynalazków" powiem, że to co napisałeś w pierwszym poście może mieć sens. Tzn. spotkałem się z praktyką pisania kodu testującego flagę bitową w nst. sposób: if ((zmienna & STALA) == STALA) // na ustawienie...
Zmienna count powinna być volatile .
Znalazłem conajmniej 2 błędy 1. Zadeklaruj enterRx jako volatile 2. Najpierw przypisujesz zmiennej enterRx wartość 1, a potem sprawdzasz czy zmienna ma wartość '1' (czyli 49) Spróbuj z tymi 2 zmianami i powinno zacząć chodzić Mirekk36, może on ma procedury LCD buforowane (ja zwykle takich używam), wtedy to niebyłby taki wielki błąd, ale wnikał niebędę.
Kłania się pojęcie funkcji w języku C. setup() i loop() to też są funkcje. Do testowania stanu styków potrzeba tylko jednego przerwania timera, nic więcej. Po co mnożyć przerwania, czy to od zmiany stanu linii, czy to od dodatkowych timerów? Przy jednopoziomowym systemie przerwań, takim, jaki ma ATmega, o ile programista nie udziwnia nic na siłę, zmienna...
Dopisz "volatile".
Powód jest bardzo prosty: zmniejszenie zmiennej w pamięci nie jest operacją atomową. Co prawda za każdym razem następuje odczytanie zmiennej, zmniejszenie jej a następnie zapis, to jeśli przerwanie wystąpi pomiędzy odczytem a zapisem, to utracisz zmianę dokonaną w przerwaniu. W przypadku gdy przerwanie i funkcja main konkurują o jeden zasób, musisz...
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...
Treść linku - Znam i rozumiem. uC to ATmega 16. Jeżeli możesz, wytłumacz mi : cytat od "tmf"" "#define PIN(x) (*(&x - 2)) To jest błędne. Powinno być volatile, ....." Co miał na myśli, jak z tego zrobić volatile. Czy chodziło Mu o to: unsigned char volatile zmienna; zmienna=PINA; lub zmienna=PIN(PORTA); a dalej, już w kodzie: }while(zmienna...
void InitTimer(void) { TCCR1B |= _BV(CS11); TCCR1B |= _BV(WGM13); TCCR1B |= _BV(WGM12); TIMSK1 |= _BV(OCIE1B); OCR1B = 12500; } w tym trybie timer liczy do rejestru ICRn którego nigdzie nie ustawiasz, nie powinieneś ustawiać bitu WGM13 lub ustawić rejestr ICRn na większy od OCR1B (wtedy także musisz...
Już prawie masz to, co trzeba. Jeśli zmienna timer zwiększana jest co 20 ms, to zrób: if (timer >= 2) { /* albo więcej, ale 40ms to i tak dużo */ uint8_t zmiany = debounce(); /* wersja freddiego */ timer = 0; if (zmiany & _BV(PIN_MINUS)) servonumber -= 1; if (zmiany & _BV(PIN_PLUS)) servonumber...
SIGNAL(SIG_OVERFLOW0){ straznik = 0; cli(); } #1 Skoro 'straznik' przyjmuje tylko wartości 0 lub 1, to po co 16-bitowy typ 'int'. Wystarczy w zupełności 'uint8_t'. Ta sama uwaga dotyczy również zmiennych 'i' oraz 'j' w pętli 'for'. #2 Jeżeli używasz zmiennej 'straznik' zarówno wewnątrz procedury obsługi przerwania i w programie...
Zmienna sek powinna być volatile: http://mikrokontrolery.blogspot.com/2011... ssek natomiast zrób statyczną w funkcji przerwania: unsigned tam gdzie liczby nie będą ze znakiem. Wprawdzie ani godziny, ani minuty, czy też sekundy nie przekroczą maksymalnych ich wartości, ale porządek warto mieć. Poza tym, taktujesz swój mikrokontroler...
Zmienna liczba musi być typu volatile, to tak na szybko. ;) Dodano po 13 No zrób jakieś opóźnienia, żeby wyeliminować drgania styków.
...proszę o sprawdzenie i korektę błędów z komentarzem... //--------------------------------------... // >>>>>>>>>>... V O L T O M I E R Z <<<<<<<<<<... //--------------------------------------... //##################...
A ta zmienna globalna napewno wypełniona danymi jest? Bo zrobiłem mały teścik: basemodule.h: typedef struct { uint8_t blockParam; uint8_t signedMove; uint8_t deviceInitialAddress; } glob; uint8_t returnBlockParam(void); basemodule.c: volatile static glob globalVariables = { .blockParam = 127, .signedMove = 23, .deviceInitialAddress...
Koledzy, dlaczego zmienna i4 nie jest cyklicznie inkrementowana? Przynajmniej na porcie UART jest wysyłana tylko zwiększona o jeden i dalej już bez zmian. Dioda LED miga poprawnie. Problem pojawił się przy próbie wysyłania tablicy danych. Tablica jako taka jest odbierana na PC poprawnie, ale bez zmian poszczególnych bajtów. Do obsługi UART wspomagam...
Witam ! Tracąc dziesiątki godzin szukania w Internecie i dwa tygodnie prób i błędów z w/w LCD proszę o pomoc (i pokazanie błędu) Dołączam kod w http://obrazki.elektroda.pl/7865128700_1... [syntax=c][/syntax] // --------- sterownik LCD -> chyba NT7108/NT7107 (podobny do KS0108 ) --------------- // ATmega 128 + POWERTIP -> LCD PG12864...
Witam ponownie, próbowałem ogarnąć na początek funkcję eeprom_write_block. Oto fragment kodu: [syntax=c] typedef struct { // tu są chary, inty, tablice } TEngine; // zmienna w RAM volatile TEngine Engine; // Kopia będzie w EEPROM TEngine EEMEM eeEngine; // i gdzieś w kodzie dalej eeprom_write_block( &Engine, &eeEngine, sizeof(Engine) ); [/syntax] Przy...
teraz już program jako tako działa z główną zmianą Teraz: https://filmy.elektroda.pl/58_1696779169... Teraz jest problem, że w trybie 1 rozjeżdzają się timingi i kolory oraz ich jasność. Tryb 2 za to po osiągnięciu maksymalnej wartości na każdej zmiennej błyska oślepiająco. Nowy kod: [syntax=c]/* * main.c * * Created on: 14 wrz 2023 * Author: Dzieci...
Oprócz tego co napisał janbernat: czy zmienna second jest zadeklarowana jako volatile? Jeżeli nie to tak zrób, a tutaj jest wytłumaczenie dlaczego: http://mikrokontrolery.blogspot.com/2011... Pokazuj cały swój program, a nie tylko wycinki.
Cześć Mam taki kod ale niewiem w czym lezy problem czy możecie mi pomóc [syntax=c] //Dołączenie plików bibliotecznych #include<avr/io.h> #include<util/delay.h> #include<avr/interrupt.h> //Deklaracja funkcji void initialization(void); //Powołanie zmiennych globalnych wykorzystywanych w przerwaniu volatile uint8_t licznik_1; volatile...
a tak poza tym jak chcesz inkrementować zmienną utworzoną wewnątrz timera która nie ma operatora volatile :?: O której zmiennej piszesz? O zmiennych: Tczas ? - nie ma takiej potrzeby, bo jest to zmienna używana tylko w przerwaniu dlatego deklaracja Static jest prawidłowa? i ? - w pierwszym kodzie wklejonym w tym temacie jest deklaracja volatile. Ale...
Po pierwsze zapomniałeś po ustawieniu bitu ASCC poczekać na zakończenie konwersji, czyli: [syntax=c]while(ADCSRA & (1<<ADSC)); //czeka na zakończenie konwersji [/syntax] Ustawiłeś napięcie referencyjne 2,56V. Jaki sygnał napięciowy na wyjściu daje twój czujnik? W jakim zakresie napięć? Zmienna pomiar nie musi być w Twoim przypadku volatile,...
jeżeli zmienna 'a' jest zadeklarowana jako globalna i jako volatile, to jest to ta sama zmienna zarowno dla main() jak i dla przerwania, więc w main() nie bedzie sie zerowac (no chyba ze wpiszesz ze a = 0 to oczywistym że sie wyzeruje)
na atmedze i tak typ double jest równy typowi float. Zmienne x i kat powinny być zadeklarowane jako volatile. aha no i często warunki typu if(zmienna == 43.342) zwracają fałsz, nawet jak wpiszesz zmienna = 43.543; if(zmienna == 43.543) {cos} to "cos" się może nie wykonać, bezpieczniej jest tam dać znak nierówności if(zmienna...
Taki zapis ( definicja )powinien być w jednym pliku C (zmienna globalna) volatile unsigned char stan = CZEKAJ; w pliku headera (chyba sensor.h) tylko deklaracja extern volatile unsigned char stan; w żadnym wypadku nie można dawać w headerze (pliku *.h) includowanym do wielu plików *.c definicji zmiennej statycznej static unsigned char stan = CZEKAJ;...
Cześć Coś mi kod do obsługi wyświetlacza LED niedziała. Czy moglibyście rzucić na to okiem. [syntax=c] #ifndef DISPLAY_LED_H_ #define DISPLAY_LED_H_ //Załączenie plików bibliotecznych #include<avr/io.h> #include<avr/pgmspace.h> #include<avr/interrupt.h> //Deklaracja zmiennych na których wykonywane są operacje w przerwaniu extern volatile...
Przez ostatnie 2h doszedłem do tego w czym tkwi problem zarówno w obsłudze przerwania od timera0 oraz od zewnętrznego INT1. Problem polega na tym że zmienna globalna którą wykorzystuję jako flagę istnieje tylko w obsłudze przerwania,flaga nie jest widoczna w głównej pętli programu lub po obsłudze przerwania resetuje się ATmega. Wywnioskowałem to gdy...
ADMUX=0b10000000; //kanał 7 ADC Zamiast 7 ustawiasz zerowy kanał ADC, a ten pin wykorzystujesz jako wyjście na wyświetlacz przecież... nic dziwnego, że bzdury wychodzą. O co chodzi z tym mnożeniem przez 100 (i dlaczego w przerwaniu, do tego jeszcze na zmiennej globalnej)? Jeśli już to powinno być przez 2 (wtedy wystarczą liczby 8-bitowe) albo (na 16-bitowych)...
[syntax=c] #define Button (1<<PB0) #define Button_PORT PORTB #define Button_PIN PINB #define Button_DDR DDRB volatile _Bool Key_Pressed = 0; // flaga wciśniętego przycisku [/syntax] [syntax=c] Button_DDR &= ~(Button); //port - wejście Button_PORT |= (Button); //włącz pull up [/syntax] [syntax=c] ISR(TIMER0_OVF_vect)//przerwanie wywoływane...
Chyba trochę mały ten bufor na napis, w dodatku na stosie (pozostałe bufory tak samo). Zajeżdżasz sobie stos, więc nie dziw się, że się "cuda" dzieją.
Drogi kolego , popełniłeś szkolny błąd :D W procedurze obsługi przerwania Timer0 masz ... SIGNAL(SIG_OVERFLOW0) //obsługa multipleksowania wyswietlaczy { //extern unsigned char wyswietl[7]; unsigned char licznik;//<-- ********** błąd !!!!!!!!!!! ... zmienną licznik , tyle że jest to zmienna lokalna , czyli istnieje w pamięci...
Podpinam sie pod wątek. Sytuacja jest podobna. Oto kod, z ktorym nie moge sobie poradzic: #include <avr/io.h> #include <avr/interrupt.h> #define tau0 0; volatile unsigned char liczt=0; int main(void) { DDRD=0xFF; TIMSK=1<<TOIE0;//zezwolenie na przerwania od TC0 TCNT1=tau0; //wpisz stałą czasowa do TCNT0 TCCR0=0x07; //preskaler...
Dzięki za tak szybkie odpowiedzi :-) Rozumiem, ze zmienne zadeklarowales jako volatile, czy zapomniales o tym?:) Druga sprawa - komplikujesz. Ustaw 16-bitowy timer tak, zeby np. mial impuls co 1us, albo czesciej, w zaleznosci jaka potrzebujesz rozdzielczosc. Tak, zmienne mam jako volatile, ale rzeczywiście nie policzyłem, że counter tak szybko się przepełnia...
Dlatego potrzebne jest blokowanie przerwań. Dodać należy, że dla przykładu podanego przez kol. albertb, że w przypadku mikrokontrolerów AVR przy wejściu w funkcję obsługi przerwania następuje automatyczne zablokowanie przerwań, więc pod tym względem operacje w tej funkcji są atomowe (wyjątek gdy użyjemy ISR_NOBLOCK wtedy pierwszym rozkazem w funkcji...
Pomóżcie mi bo mnie krew zalewa. Atmega mierzy impulsy na wejściu zewnętrznego przerwania INT1. Timer2 służy jako podstawa czasu. Od około 240 kHz na INT1 miernik mierzy nie poprawnie, to znaczy nie występuję przerwania od Timera2 w trybie CTC i program wisi w pętli while, ale gdy przełączę zakres na generatorze na mniejszy to wyświetla mi się wartość...
Powiem tak, zdążyłam posiedzieć trochę nad Twoją procedurą Piotruś i jakoś pokombinować żeby zrobić przerwanie od timera, tylko sie pogubiłam i jeszcze troche musze posiedzieć zanim to mi ruszy. Piotruś nie bardzo rozumiem pewnych rzeczy, mianowicie: ChannelMUX Czyli będzie to wyglądało przy deklaracji: ChannelMUX if(ConversionResults tu się dokonuje...
Witam, próbuję przepisać program z Atmega8 na Atmega328P, z powodu małej pamięci Atmegi8, w programie wykorzystuje komunikacje USART. Program dla atmegi8: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #ifndef F_CPU #define F_CPU 1000000 #endif //set desired baud rate #define BAUDRATE 9600 //calculate...
Witam Mam pytanie dlaczego zmienna która inkrementuje się tutaj: [syntax=c] if(klawisz_wcisniety(ZAWODNIK_M)) { lcd_cls(); zawodnik_przejazdy_read(); zawodnik_przejazdy[zawodnik.numer].okraz... = 0; zawodnik_przejazdy_update(); zawodnik.numer++; zawodnik_przejazdy[zawodnik.numer].okraz... zawodnik_przejazdy_update(); } [/syntax] Inkrementuje się...
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...
(at)arturt134 Robiłem to co mi sugerujesz - bezowocnie. Ale spostrzegłem ciekawą rzecz: wysyłając pakiet czynię to co parę sekund (ręcznie), przypadkowo dałem chwilkę czasu (5..10 min.) spokoju ATMEDZE (musiałem coś tam innego zrobić), po tym czasie znowu wysłalem pakiet i o dziwo ramka wyglądała jak po resecie uC! Ale następne znowu były oszukane....
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....
łał :) Super opis - co prawda wszystkiego się domyślałem i upewniałem przy próbach uruchomienia. A jak wygląda dokładniej ta praca asynchroniczna - technicznie wiem tylko programowo jak to obsluzyc. Drugi obecnie problem to wieszanie się / resetowanie mojego programu. Troszkę go zmodyfikowałem obecnie ma on postać: // Testowanie timera 2 #define F_CPU...
Jak już pisać wstawki w ASM, to zamiast używać kodu w stylu (przykład z GCC-AVR Inline Assembler Cookbook): naked ): _SFR_IO_ADDR(SREG) zamiast zwykłego SREG . Można zresztą w ten sposób pisać także funkcje wywoływane później w plikach *.c, jeśli są np. krytyczne czasowo. No chyba, że tego wstawianego kodu będzie naprawdę niewiele :)
Witam, Mam potencjalnie banalny problem z odczytem stringa z przerwania UART w pętli głównej programu. Kiedy przesyłam przez UART ciąg znaków są one odbierane, jednak przy próbie wyświetlenia ich na wyświetlaczu którego obsługa znajduje się w pętli głównej programu zamiast przesłanego stringu widzę losowe śmieci z pamięci (np. fragmenty danych poprzednio...
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...
Witajcie! Robię bibliotekę mającą w zamyśle być modułem do I2C slave, z użyciem atmegi 128A. Wyizolowałem najmniejszą możliwą część błędu który doświadczyłem, może ktoś z Was będzie miał pomysł co może być przyczyną. Żebyśmy wiedzieli o czym dyskusja, kod programu: avr-g++ -O0 -std=gnu++1y -Wall -Wextra -Winline -mmcu=atmega128a Testowałem również z...
Witam. Jeśli chodzi o zmienna typu volatile to często używam tego oznacznika. Moje pytanie dotyczyło bezpośrednio utworzenia wskaźnika w pliku nagłówkowym gdyż było dla mnie to nie jasne dlaczego odwołując się do niego nie otrzymujemy poprawnej odpowiedzi w programie. Koledzy macie w 100% racje z tym, że stworzyłem tylko wskaźnik, a nie zmienna. Problem...
Gdy jeszcze bawiłem się ATmegami , 328 przede wszystkim to żonglowałem kałami ADC w tajmerze. Co ileś tam przerwań, przykładowo 10, był odczyt ADC i zmiana kanału. Po nastepnych 10 przewaniach znowu odczyt ale już ze zmienionego kanału i zmiana na następny kanał. Działało to po prostu pewnie. Lepiej będzie to widać na przykładowym kodzie. Oczywiście...
Czy zmienna uint16_t licznik nie powinna być typu volatile jeżeli operujemy nią w przerwaniu?
No i znowu natknąłem się na jakiś dziwaczny problem. No i niestety zmienna dane nie zmienia swojej wartości podczas zmian napięcia na wejściu przetwornika ADC. Pokaż cały program, a w szczególności jak definiujesz zmienną dana . Użyłeś magicznego słowa volatile ?: http://mikrokontrolery.blogspot.com/2011... Funkcja wykonuje...
Jeśli zmienna nie jest oznaczona jako "volatile", to kompilator jeśli zdecyduje, że zmienna na nic nie wpływa, może ją zoptymalizować (czytaj: usunąć). Kompilator nie sprawdza, czy zmienna jest używana w przerwaniach, gdyż dla niego są to osobne funkcje, które muszą być wywoływane (a te nie są w twojej funkcji wywoływane). Masz dwa rozwiązania: zmienną...
Witam! Mam prośbę o pomoc w poprawieniu kodu. Otóż mam zadeklarowane globalnie następujące zmienne: [syntax=c] volatile uint8_t x; volatile uint8_t recaive_complete; volatile uint8_t block_recaiver; volatile unsigned char bufferin[5]; [/syntax] W programie głównym mam 2 funkcje w pętli while. [syntax=c] while(1) { ReadKeypad(); ComRdFrame(); }[/syntax]...
Skoro bez przerwań wszystko działa poprawnie (nie licząc zgubionych znaków na USART1), wydaje mi się, że program jest zrozumiały dla uC oraz dla mnie. GPS - 3,3V GSM - 3,9V uC - 5V Wyprzedzając kolejne pytanie, stosuje konwerter napięć. Widzę, że rozmawiając w ten sposób niczego nie osiągnę. Może inaczej... Czy włączając przerwania [syntax=c]UCSR0B...
OK, zwracam honor!!! Zauważyłem , że GM się w tym lubuje. Mimo wszystko, sterowanie ACG i kontrola nad nim są dużo prostsze niż SM. Nieważne. Niech autor próbuje. Po czym to zauważyłeś ? Po silniku i płycie zegara ? Te z fotki kolegi to grupa VW stary pasat B4 , VW T4 itp . Silniki jak najbardziej krokowe ... Nie napisałem, że te na zdjęciu są od GM....
Pijopic : A ja proponuję czytać dokumentację od avr-libc, ten temat oraz temat, którego link dałem (opisałem tam problemy z _delay_ms). _delay_ms(500) nie będzie działać - przy zegarze 1MHz maksymalne opóźnienie wstawiane przez _delay_ms wynosi 262.14ms. The maximal possible delay is 262.14 ms / F_CPU in MHz. . Nie wprowadzaj znów w błąd. rrata : równie...
Witam Was ponownie. Chciałbym abyście odnieśli się do tego kodu. Steruje na razie 1 serwem stąd atmega 8mhz (aby móc wysterować licznik2 do wartości 20ms) Mam rozumieć, że to jest programowy pwm? A może są jeszcze inne sposoby? #include <avr/io.h> #define F_CPU 8000000 #include <util/delay.h> #include <avr/interrupt.h> int volatile...
Witam. Mam kłopot staram się wyświetlić na lcd lub wysłać przez USART zmienną która powinna przyjąć wartość około 70000 - 100000 ... Mam wielkiego zonka :-( Teoretycznie definiuję zmienną jako volatile uint32_t licznik = 70000; a na lcd dostaję jakieś dziwne odczyty ... to samo na rs... używam takiej funckji : sprintf_P((char*)tekst, PSTR("Licznik:...
nie wiem w jakim celu są te 2 minusy Operator predekrementacji. Zmniejsza div_1s o jeden. jakiego typu ma być ta zmienna div_1s? volatile? Może być np. unsigned short. Lokalna statyczna w procedurze obsługi przerwania. 50Hz jest wystarczające, aby oko ludzkie, nie wyłapało zmiany. Nie jest wystarczające (no, może dla żarówek... :D ). Jak mam ją zainicjować...
a _delay_ms i _delay_us Ci nie wystarcza ? Do opóźnień nie trzeba wykorzystywać koniecznie przerwań timera. Można wykorzystać flagi timera (o ile się da, ale wszystko zależy). Poza tym, zmienna deb w Twoim programie zapewne nie jest volatile, ale wrzuciłeś nam NIC, także pomoc też nijaka
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)...
Ile trwają procedury Measurement_DS18B20() oraz Measurement_SHT11()? Najlepiej pokaż też je. Takie coś się może dziać się w momencie, jeśli przerwanie od timera przychodzi w momencie działania funkcji dtostrf, jeśli uart działa z większą prękością to prawdopodobnie rzadziej trafia w tą funkcję. Najszybciej poprawić to można poprzez wprowadzenie jakiejś...
Na pierwszy rzut oka widze,ze w kodzie dla atmega8 nie inicjujesz trybu pracy PORTC jako wyjscie, gdzie podlaczona jest dioda majaca sygnalizowac odbior znaku z rs-a. No i oczywoiscie zmienna fodb powinna byc volatile bo tego nie widze . Przy dluzszych polaczeniach rs485 zalecalbym jednak stosowac te rezystorki , o ktorych mowa byla kilka postow wczesniej....
Witam, Jestem w trakcie budowy sferycznego wyświetlacza widmowego. Globus składa się z 40 diod LED RGB sterowanych procesorem ATmega328P. Pozostał do rozwiązana ostatni problem a mianowicie wykrywanie położenia pierścienia, na którym są umieszczone diody LED. Pierwsze, co przyszło mi na myśl to zastosowanie diody emitującej promieniowanie podczerwone...
Pomijając to, że zasada działania tego programu jest dziwna i wypadałoby trochę rzeczy zmienić, to problemem w tym przypadku jest fakt, że zmienna speed nie jest typu volatile.
wilk125: jeszcze mam takie pytanie, jeśli kwarc zew. mam 8MHz i preskaler ustawiony jest na 8, to jeden takt timera1 w tym przypadku będzie odpowiadał 1us ? Tak Tak powinno być TCCR1B, moja pomyłka Przy odczycie wartości z TCNT1, sróbuj najpierw odczytac TCNT1L(młodszy bajt TCNT1), i następnie TCNT1H (starszy bajt). Chociaż odczyt jak wyżej tez powinien...
Ustawiasz bit TOIE1 w rejestrze TIMSK, żeby włączyć przerwania przepełnienia, deklarujesz funkcję obsługi przerwania w sposób: volatile uint16_t pwm; //zmienna globalna do wartości pwm SIGNAL(TIMER2_OVF_vect) //funkcja wykona się po przepełnieniu timera 1. { OCR1A = pwm; } W swoim programie wpisujesz do zmiennej globalnej pwm wartość...
Proponuje umieścić deklarację typu: volatile uint8_t DZIESIATKI, JEDNOSTKI; przed funkcją main. Tak zadeklarowana zmienna powinna być widoczna w przerwaniu oraz każdej innej funkcji.
Witam, Pewnie sprawa będzie dla was banalna ale ja się z nią zmagam już jakiś czas. Poniższy kod steruje 5 serwami: [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #define KEY1 (1<<PA0) // definicja przycików #define KEY2 (1<<PA1) #define KEY3 (1<<PA3) #define KEY1_DOWN ( !(PINA &...
ustaw sobie przerwanie od np. TIMER2 co 10ms i sprawdzaj 4 ostatnie stany przycisku. teoria: http://mikrokontrolery.blogspot.com/2011... powyższe zaadoptowane do A8: [syntax=c] //**************definicja przycisku************** #define _Key _BV(PD7) #define Key_PIN PIND #define Key_DDR DDRD #define Key_PORTPORTD...
Witam, ustawienie rejestru DDR i PORT na 0 daje wejścia pływające (ATmega8 nie ma rezystorów ściągających do masy, tylko podciągające do plusa). Tak jak jest teraz łapiesz kolego zakłócenia. Należałoby albo dodać zewnętrzne rezystory między przyciskami a masą lub zmienić położenie przycisków (między pinem a masą) i włączyć wbudowane rezystory. O volatile...
Reszta programu jest nieistotna, program jest za duży, żeby go wklejać. Ogólnie przerwanie wygląda tak: volatile u08 licznik; ISR(INT1_vect) { licznik++; } void Init(void) { DDRD &= ~_BV(1); // PORTD |= _BV(1); //init dla przerwania zewnetrznego EICRA = _BV(ISC11) | _BV(ISC10); //Zbocze...
Zmienna tick to zwykły char. Musi być volatile: http://mikrokontrolery.blogspot.com/2011... Brak volatile, także może być przyczyną. Funkcję uprość pozbywając się switch i zostaw tylko właściwe TCCR2 |= (1<<CS22) | (1<<CS20);
Bo cały czas dajesz klaw=, co powoduje nadpisanie wartości zmiennej i jeśli wszystko jest w ostatnim wierszu na 0 to zmienna niezależnie od tego co się dzieje wcześniej ma wartość zero. Poza tym nie musi być ona opatrzona atrybutem volatile. Wystarczy, że dasz jej na początek wartość 0, a potem zamienisz klaw= na klaw +=
Dodałem koszmarnie długi czas czekania po wciśnięciu klawisza i wygląda na to, że działa. Można wyświetlać kolejne cyfry z tablicy i nie ma przeskoków (losowych wyświetleń). W pętli głównej sprawdzam, czy jest wciśnięty przycisk i czy zmienna b ma wartość co najmniej 10. Jeśli tak, to program zabiera się za czynności przypisane do klawisza, a przerwanie...
Na wstępie mała dygresja nie związana bezpośrednio z problemem - dla OCR2A=100 okres zliczania timer'a 2 wynosi 101, a nie 100 taktów. Zamiast tworzyć tyle tablic do regulacji częstotliwości proponowałbym zastosować technikę zwaną DDS. Zgodnie z tą logiką tablica dla 2Hz musiałaby mieć 5000 elementów? ( 10kHz/5000=2Hz ) Poniżej 50Hz zmieniam częstotliwość...
Witam! Postanowiłem przetestować tryb asynchroniczny timera0 z podłączonym kwarcem 32768 Hz na płytce #include <avr/io.h> #include <stdlib.h> #include <avr/interrupt.h> #include "HD44780.h" volatile int time=0; int main (void){ TCCR0|=(1<<WGM01)|(1&l...
Poza tym to: TCNT0 = 130; Powinna być pierwszą instrukcją w przerwaniu, a tak w ogóle polecam poczytanie o trybie CTC - nie będzie trzeba martwić się o ciągłe ładowanie wartości timera. EDIT: A problemem właściwym jest nadmiarowy średnik, o tu: if(licznik == 375); jak go wywalisz to będzie w miarę OK. A zmienna nie musi być w tej sytuacji volatile,...
Nie no jeżeli zadeklarujesz zmienna w pliku interrupt tak: volatile TFrame Frame; a w main-e dasz informacje kompilatorowi w ten sposób: extern volatile TFrame Frame; to niemożliwe żeby kompilator pominął tą zmienną. Sprawdź jeszcze czy dobrze ustawiana jest flaga Frame.state & READY. Z natury nie ufam AVRStudio ( Softwarowy Debugger juz pare razy mnie...
Okej, ogólnie to działa, wielkie dzięki za tamto. Mam jednak dalszy problem troszkę. Ogólnie chcę osiągnąć coś takiego, że wysyłam najpierw z Matlaba liczbę - jakąś flagę, po której uC wejdzie do odpowiedniej pętli. Po wejściu do tej pętli dopiero w niej ma odbierać wysłaną z Matlaba wartość. Czyli np. najpierw wysyłam liczbę równą 2 z Matlaba do uC....
Wewnętrzny zegar jest na tyle mało dokładny, że aby można było nim coś zmierzyć, należało by ustalić jego dokładną częstotliwość porównując z jakimś wzorcem, po czym zapisać poprawkę do osccal albo uwzględnić to w czasie przepełnienia t1 - a i tak dokładność nie będzie duża ze względu na wachania częstotliwości. Warto poczytać w dokumentacji jaką dokładnie...
Dodaj funkcję przerwania USART_RXC_vect lub wykasuj ustawianie bitu RXCIE, bo jeśli coś USART odbierze, to program pójdzie w maliny. Zmienna data w przerwaniu USART_UDRE_vect powinna: http://mikrokontrolery.blogspot.com/2011... ... a w ogóle, to odłóż na chwilę swój projekt zrób test na bazie tego artykułu do Atmega8 (nic nie...
wow tego nie wiedziałem... Dzięki Przetestowałem, zaczęło działać. Ale... Jeśli zrobię tak:[syntax=cpp]ISR(TIMER0_COMP_vect) { rob_cos=1; }[/syntax]a w main:[syntax=cpp]while(1){ if(rob_cos==1){ PORTD &= ~_BV(3); OCR1A=0; _delay_ms(1); PORTD |= _BV(6); OCR1B=50; _delay_ms(1); rob_cos=0; } }[/syntax]to i tak dalej się resetuje. A potrzebuję umieścić...
Ok, zgadzam się, nie ma 'volatile' przy zmiennych. Wykorzystuję je w przerwaniach zatem powinny być volatile. Ale problem jest nadal, bo przecież program, gdy będzie się wykonywał, to w terminalu powinienem ujrzeć tekst "Sart", później program wchodzi w pętlę nieskończoną. W niej jeśli zmienna "icr" jest różna od 0 powinienem uzyskać dalsze wyniki (powinno...
Napisałem taki oto program do pomiaru napięć: Kiedy uC działa z wewnętrzną częstotliwością 1MHz i ma wyłączony JTAG, czyli ustawienia E1 i D9 wszystko jest ok (ADC4 i ADC5 mierzą napięcia). Kiedy jednak zmieniłem ustawienia na wewnętrzną częstotliwość 8MHz lub 4MHz i też wyłączony JTAG, czyli E4 i D9, to wyświetlacz pokazuje mi podobne napięcie w obu...
Możesz zrobić sobie np. dwie zmienne (jedna dla PD4 i druga dla PD5) i przypisywać im jakąś wartość (np 0 1) w momencie ustawiania 00,01,10,11 na PD4 i PD5. I w przerwaniu sprawdzasz sobie, jaką wartość ma zmienna - wiesz z którego pinu poszedł sygnał. Dodano po 7 Zobacz tu: http://mikrokontrolery.blogspot.com/2011...
Zmienna jest typu: volatile float obrabiam ją w przerwaniu.
Zobacz czy zmienna flaga ktorej przypisujesz 1 masz jako volatile.. sam walczylem z tym ostatnio. Mariusz.
Witam w swoim projekcie do sterowania silnikami krokowymi wykorzystuję joysticki potencjometryczne. By określić, w którą stronę został on wychylony mierzę napięcie na potencjometrze przetwarzając je w przetworniku analogowo cyfrowym. Silniki działają bez zarzutu, tak jak zakładałem. Problem występuje jedynie przy silniku numer 1. Dokładniej po załączeniu...
zmienna volatile volatile atmega atmega volatile
plyta indukcyjna siemens rozruchowy danfoss subwoofer płaski
silnik kohler teltonika konfiguracja
Makita 4120 - Silnik włącza się i od razu gaśnie Błąd ogrzewania postojowego: ryzyko zżywiczenia paliwa