volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; A czy przypadkiem tylko pierwsza zmienna będzie volatile przy takiej deklaracji?
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>...
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;...
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...
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ą...
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.
Cześć Załóżmy że mam pewną funkcje w której zwiększam zmienną a o jeden. W funkcji main wywołuje funkcje i wynik przypisuje do zmiennej b. Załóżmy też że mam przerwanie które też zwiększa a o jeden. W celu optymalizacji operacje na zmiennej a będą wykonywane w wolnym rejestrze i przy wyjściu z funkcji wynik rejestru zapiszemy do zmiennej załóżmy że...
Witam. Poniżej przedstawiam dość specyficzny problem. Mamy np zmienną k zadeklarowaną następująco: volatile int k; Jest ona zadeklarowana nie w głównej funkcji main tylko w funkcji bitin(); Na początku jest ona zerowana. k = 0; I tu zaczyna się ciekawie. W programowej symulacji działa wszystko ok. Natomiast gdy odpalam na rzeczywistym układzie zmienna...
Witam, ostatnio pisze bibliotekę służącą do eliminacji drgań styków w przyciskach. Będzie to działało w ten sposób, że w timerze wywołujemy funkcje obniżającą czas po którym możemy wcisnąć przycisk kolejny raz. Tak samo w kodzie - używamy funkcji z biblioteki która robi wszystko za nas :) Jednak napotkałem na taki problem - gdzie zastosować volatile...
Witam, Czy może mi ktoś w przystępny sposób wytłumaczyć kiedy zmienna powinna mieć typ volatile a kiedy nie musi?? Szukałem na google, czytałem kilka definicji tej zmiennej, ale dalej nie wiem kiedy ją używać (w programowaniu mikrokontrolerów) a kiedy nie. Wiem (tzn. wyczytałem :P) że jeżeli zmienna globalna ma być zmieniana w przerwaniach, to wtedy...
Mam następujący problem: Gdy zmieniam w przerwaniu zawartość zmiennej (co najmniej dwubajtowej) z kwalifikatorem volatile program w loop odczytuje czasem "hybrydową" wartość w której część bajtów pochodzi ze starej, a część z nowej wartości. Podobnie bywa przy odczycie w przerwaniu zmian wprowadzanych w loop. Sądzę, że problem pojawia się gdy przerwanie...
Mam problem w Bascom AVR. Program w pętli głownej ma wyświetlać odczyt na LCD 3,5 cyfry, tylko to. Wyświetlana wartość -zmienna jest modyfikowana w obsłudze przerwania. Problem jest taki, że pętla główna (wyświetlająca) nie widzi zmian zmiennej i cały czas wyświetla np "0". Pewnie jest to ułatwienie przy kompilacji - jeśli zmienna nie jest zmieniana...
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...
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 ! 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...
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...
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ść...
ł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...
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...
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....
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]...
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...
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...
Witam, mam problem z programem na mikroprocesor. Na początek dodam, że prototyp, zanim poszedł w odstawkę pół roku temu działał prawidłowo. Program w tym momencie ma za zadanie wyświetlić 4 zmienne na wyświetlaczu. Uruchomienie przerwań zawiesza program. W zależności od tego kiedy zostaną rozpoczęte, skutkuje to innym efektem. Umieszczając sei(); na...
Witam Chciałbym napisać program, który będzie obsługiwał 12 diodek ze zmianą jasności świecenia każdej z nich. Chciałbym jednak najpierw zacząć od obsługi pojedynczej diody, żeby zając się potem częścią stricte programistyczną. Żadna z nich nie jest wyprowadzona do nóżki OC0A , OC1A, OC1B. Zdecydowałem się na tryb CTC, użyłem licznika drugiego. Poniższy...
Witam Zbudowałem prosty sterownik pomp do kotła węglowego bez podajnika (planuję dorobić wentylator, ale narazie jest odłączony). Problem polega na tym, że codziennie rano sterownik jest jakby zawieszony. tj LCD pokazuje cały czas to samo, nie reaguje na przyciski, nie załącza przekaźników. Pomaga odłączenie i podłączenie na nowo zasilania. Jestem bardzo...
Mam problem z uzyskaniem oczekiwanego działania przerwań INT0 i INT1. Procesor to ATMEGA 16 z zewnętrznym taktowaniem 16MHz. PD2, PD3 są skonfigurowane jako wejścia z podciągnięciem do 1. W obu przerwaniach jedyną czynnością jest inkrementowanie zmiennych zdefiniowanych jako volatile uint32_t. ISR(INT0_vect) { N_T++; } ISR(INT1_vect) { N_F++; } Przerwania...
Czyli rozumiem, że tą dodatkową diode w przyciskach podłączoną do int uC wpiąłem dobrze. Nie rozumiem tylko tej odpowiedzi: "*to raczej EEPROM jest nieulotny,SRAM jest podtrzymywana" Ja rozumiem ją tak że obie pamięci są nieulotne a tak chyba nie jest. Chodzi mi o taką, która nie straci swojej zawartości po wyłączeniu zasilania bo chce do niej zapisywać...
Witam, mam problem z kodem ( no właśnie, to sie okaże :) ): #define F_CPU 16000000UL #include <stdio.h> #include <ctype.h> #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/pgmspace.h> #define UART_BAUD 115200 //prędkość transmisji #define UART_CONST (F_CPU/((16*UART_BAUD)-1...
Szanowni Koledzy, Buduję kontroler sterujący urządzeniami zewnętrznymi. Na chybcika skleciłem układ-programator AVR przez łącze LPT. Program napisany i skompilowany w WinAVR-20100110 (Win2k). Wszystko działa poprawnie (Linux Slackware 10 + avrdude) jeśli idzie o programowanie flesha. Od strony elektronicznej też jest wszystko w porządku (jak manual...
Dzięki wszystkim za opinie. Oddałem dziś projekt został oceniony na 5;] Dokonałem kilku zmian w programie więc wrzucam nową wersję: http://obrazki.elektroda.pl/8149391200_1... Jeśli już eliminujesz drgania styków programowo i w dodatku z użyciem timera, to mogłeś się pokusić o tak samo zrealizowane opóźnienia. Mnóstwo pamięci pożera...
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...
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ć...
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.
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...
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...
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.
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ę.
Dopisz "volatile".
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]...
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...
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...
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,...
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...
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...
Podejrzewam, że chodzi o to, że ja robię pomiary bezpośrednio, bez żadnych boczników i źle to konwertuje. Tylko gdzie tkwi szkopuł? Akcja społeczna włącz myślenie. lcd_puts(dtostrf(Voltage[i... Jak kolega wyjaśni sens dzielenia wartości zmierzonej przez 50 ? Przy zakresie pomiarowym <0, 5> V oraz 10 bitowym...
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...
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...
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...
volatile jest konieczne jeśli zmienna może zmienić swój stan niezależnie od głównego ciągu instrukcji, a taka zmiana jest niemożliwa do prześledzenia przez kompilator. Przykłądem jest np. sprawdzanie stanu zmiennej w jednym miejscu, kiedy ta zmienna może niezależnie (np. w przerwaniu) ulec zmianie. Bez tej wiedzy kompilator może zoptymalizować i wyrzucić...
W tym trybie timer po prostu zlicza impulsy zegarowe do niego doprowadzone, jeśli przekroczy zakres to zgłasza przerwanie overflow (nadmiaru) i rozpoczyna zliczanie od nowa. Funkcja obsługi tego przerwania zlicza je zwiększając liczniki f - przechowujący czas z rozdzielczością <1ms i m przechowujący liczbę milisekund. W programie należy korzystać...
Zmienna liczba musi być typu volatile, to tak na szybko. ;) Dodano po 13 No zrób jakieś opóźnienia, żeby wyeliminować drgania styków.
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...
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...
zmienna volatile volatile atmega atmega volatile
tracer highlander silent instrukcja challenger splitter internet
rozpoznawanie znaków zmiana starego termostatu
VW Polo 6N2 1.0 2000 – brak napięcia na wtyczce sondy lambda za katalizatorem Canon 3400 – po resecie świeci tylko zielona dioda POWER, żółta kontrolka zgasła