No dobrze - o matko (sorki) moja kurza ślepota ale zwrócę uwagę na coś innego mocno niepokojącego w twoim kodzie. On się cały czas resetuje po przerwaniu. Po pierwsz po co ci cli() i sei() w przerwaniu (przecież wyłączenie innych przerwań po wejściu w każde przerwanie dzieje się z automatu) ale już wplecenie rozkazu: reti(); to wyciągnięcie dywanika...
Na początek zacznij od sprawdzenia czy masz wyłączoną optymalizację. Dopóki masz tylko zmienne i ich nie używasz to to co pokazuje się w debug'u może doprowadzić do szaleństwa.
Bo może wektor przerwań dla tego akurat kanału DMA się nazywa inaczej? Porównaj nazwę Twojej funkcji z zawartością tablicy wektorów. Jeśli masz w projekcie pliki C++, to trzeba przerwania deklarować jako extern "C". 4\/3!!
Nie wiem skąd kolega mickpr czerpie pomysły ale wole nie wiedzieć Faktycznie co do zmiennych statycznych wyraziłem się błędnie. Myślałem o zmiennej globalnej - nie będącej zmienną statyczną, a napisałem "statycznej". Zadeklarowanie zmiennej statycznej oznacza współdzielenie jej danym bloku programu. Naśmiewanie się z innych - kolego gaskoin - nie jest...
Chyba zaczyna się ujawniać wyższość procesorów o możliwie długim słowie danych - nawet operacje 32 bitowe będą atomowe. Nie będą niestety o ile operacja RMW będzie realizowana przez kilka rozkazów, które mogą być przerwane. Będzie natomiast w systemie, który będzie modyfikować pamięć jednym rozkazem, który nie może być przerwany (a często mogą być...
Pisząc w C tego nie wiesz i wiedzieć nie będziesz (chyba, że zajrzysz w wygenerowany przez kompilator kod assemblera - co swoją drogą jest czasami przydatne). Nie wiem jak daleko działa REGISTER, ale prawdopodobnie kompilator patrzy bardziej na to jak na mocną sugestię niż 100% wymuszenie, bo co by zrobił gdybyś zrobił 20 zmiennych int jako REGISTER?...
Może warto poczytać, ile znajdują specjaliści https://cert.pl/posts/2024/09/CVE-2024-6...
Dodano po 4 W przypadku edycji kodu makra, zmienne globalne są anulowane. Następnie uruchom makro Workbook_Open
O tym wiem, ale RAMu mam zajęte tylko 35%, więc nie ma z tym problemu. To dotyczy tylko ilości pamięci zajętej przez zmienne globalne i statyczne. Nie dostajesz informacji o zajętości pamięci przez pozostałe typy zmiennych, w tym łańcuchy tekstowe znajdujące się w RAM. Na podstawie pokazanego fragmentu kodu i objawów o których pisałeś obstawiam, że...
każda jest dla mnie cenna Może nie do końca na temat, ale: jeśli zmienna LicznikKonfiguracyjny jest globalna, to nie musisz jej przekazywać (jako parametru) każdej funkcji osobno. Każda z tych funkcji może się do niej (zmiennej globalnej) odwołać bezpośrednio. Zmiennych globalnych generalnie należy unikać. Np. w Twoim kodzie SredniaADC i WartoscADC...
a tak w ogóle to polecam ci zamiast tworzyć stada zmiennych globalnych - to nauczyć się dobrze korzystać ze struktur i unii do takich celów. Zobaczysz szybko jakie to kolejne ciekawe i super efekty za sobą niesie ;) a zmienne globalne o których piszesz - mam nadzieję że wiesz że są tylko globalne w ramach jednego pliku w którym mieści się kod. Aby były...
Zależne od kompilatora, a czasem wręcz od jego ustawień. Dobrym nawykiem jest inicjować nawet wtedy, gdy nie ma takiej potrzeby w danym środowisku. Nieprawda. Wszystkie zmienne globalne są domyślnie zainicjowane wartością zero, niezależnie czy są to typy proste czy złożone. Wynika to wprost ze standardu języka c. Dodano po 1 W AVR GCC wszystkie zmienne...
Pierwsza metoda - zdefiniować niektóre zmienne globalne i używać ich do przekazywania danych w innej formie
Czy to znaczy, że zmienne statyczne czyli zadeklarowane ze słowem static i zmienne globalne znajdują się w pamięci FLASH i są później kopiowane do RAM? Dotyczy to tylko zmiennych globalnych (statycznych w scope funkcji), które są zainicjalizowane. Zmienne globalne niezanicjalizowane są umieszczane w sekcji .bss i inicjalizowane wartością 0. Gdybym...
Wątki nie bardzo chcą widzić zmienne globalne programu. Jak moga nie chciec ? Nie moga. Od niedawna zaczynam pisać w Visual C++. Wogóle dopiero zaczynam programowanie obiektowe. Co programowanie obiektowe ma do rzeczy ? Uprosc program jak sie da i wklej to co niby nie dziala bo pewnie robisz jakis podstawowy blad. Wątki działają ale nie mogę się skomunikować...
Wątpię, by bez specjalnej deklaracji był tylko we flashu. W czystym C tego nie da się zażądać ( To prawda, czyste C nic nie wie o żadnych FLASH-ach, stosach, RAM-ach i innych (dotyczy to też sekcji, segmentów itp). Ale w realnym życiu używamy konkretnych implementacji, które coś o różnych lokalizacjach w pamięci wiedzą (bo w końcu kod jakoś sie musi...
Ja bym zrobił to w drugą stronę. Tworzysz 3 zmienne globalne jako liczniki (tak jak masz TCNT dla timera). W przerwaniu od timera jedyne co robisz to inkrementujesz te zmienne. W ten sposób częstotliwość zmieniasz poprzez wartość tych zmiennych (do ilu ma liczyć twój programowy timer). A pwm robisz na 3 ifach w pętli głównej (wypełnienie zmienisz poprzez...
gcc zmienne globalne i statyczne przypisuje do zera. Jest to zdefiniowane w standardzie :) Optymalizator przypisanie do 0 oleje (w sensie nie zrobi go), ale jeżeli jest wyłączony to marnuje to nieco pamięć programu. I jak napisał sulfur, czy jest to char czy uint8_t, czy jest też volatile czy extern - nie ma to nic do rzeczy
Umieszczenie kodu w załączniku z prowizją, kiedy prosisz o pomoc, to jakby trochę strzał w stopę ;)
https://bitbucket.org/fmalpartida/new-li... Do obsługi wyświetlacza pobierz z linku i powinno się kompilować bez błędnie najnowszą wersję Na pro mini atmega 328 wygląda tak "Opcje projektu zmienione, przeładuj całość Szkic używa 6150 bajtów (20%) pamięci programu. Maksimum to 30720 bajtów. Zmienne globalne używają 622 bajtów (30%)...
Jeśli zmiana rozmiaru buforów powoduje że program przestaje działać oznacza to że prawdopodobnie kończy się pamięć na stosie. Kilka rozwiązań jest. 1. zwiększyć stos 2. zdefiniować bufory jako static albo zmienne globalne wtedy nie trafią na stos 3. jeżeli idea projektu na to pozwala podzielić odczyt na mniejsze paczki i zapisywać po trochu(używając...
Akurat nie o zmienne globalne chodzi... Chodzi o to że podając stałą do tych funkcji zostanie ona przeliczona na etapie kompilacji na ilość... napiszemy tików. Jeżeli natomiast podjesz zmienną do funkcji opóźnienia to niestety ale może ona z założenia może się zmienić w trakcie pracy programu i wtedy uC musi na żywo obliczyć ilość tych ticków. A jak...
Napisałem program,ale nadal nie działa. Prosze o podpowiedzi. #include <stdio.h> #include <stdlib.h> //int i; //zmienne globalne są złe. nie używaj ich //static int wynik; // wynik nie musi być static. Jeżeli już to powinien być static int wynik = 1; inaczej wynik *= liczba ma wartość 0. //int liczba; //zmienne globalne są złe. nie używaj...
Jeśli to są zmienne lokalne , to muszą być static , natomiast globalne - nie muszą ;) Piotrek
Zmodyfikowałem odrobinkę twój kod. Od teraz, proszę zamieszczać ten kod (jeżeli będzie taka potrzeba) w wersji spakowanej, bo jest on dość długi co poważnie utrudnia przeglądanie wątku. 1. Pozmieniałem "odrobinkę" nazwy zmiennych. 2. Dodałem definicję rekordu dla klienta wypożyczalni. 3. Usunąłem zbędne tablice, zmienne globalne itd. 4. Dodałem funkcję...
Magiczne słowo static daje dokładnie to samo co zmienna globalna. Przekazywanie wyniku przez zmienne globalne owszem jest w niektórych przypadkach dobre lub jedyne możliwe (z przerwania do kodu), ale pomiędzy funkcjami - nigdy. Przyjmijmy, że mamy n funkcji, każda może zwrócić tablicę o rozmiarze m. Jeśli każda funkcja przydzieli sobie tą tablicę mającą...
Excray, twój kod zadziała raz na 255, zapomniałeś zerować zmiennej a :P Mylisz się. Po prostu nie zrozumiałeś jak działa ten kod. Nie trzeba zerować tutaj żadnej zmiennej. W zasadzie kod można jeszcze bardziej uprościć: [syntax=c] while(1) { if(!(PINC & 0x01)) PORTD ^= 0x01; }[/syntax] Jak widać żadne zmienne ani globalne ani lokalne nie są potrzebne...
.data - zmienne statyczne .bss - obszar sterty na zmienne statyczne i globalne niezainicjalizowane .noinit - nalezy do sterty na zmienne niezainicjalizowane zerem .stab i .stabstr sa uzywane do celow debuggera avr-gdb i nie sa ladowane do pamieci
Ale on nie ma przewidywać, a po prostu pobrać najaktualniejszą wartość . Jak wielu Kolegów już napisało, C jest WYSIWYG. Zgadywanki kompilatora nie wchodzą w grę... Wiesz, dopóki usiłowałeś pisać merytorycznie odpowiadałem Ci. Dopisany cytat to zwykłe chamstwo, które nic nie wnosi do tematu, a jedynie świadczy, że z językiem polskim także na bakier....
Najprościej będzie przenieść tylko zmienne globalne zainicjowane (.data section) oraz globalne niezainicjalizowane (.bss section ). Niezainicjalizowane (co za straszne słowo) wg standadu powinny być wyzerowane. MEMORY { ROM (rx) : ORIGIN = 0x00000000, LENGTH = (512k-4k) RAM (rw) : ORIGIN = 0x40000000, LENGTH = (32k-32)...
Masz tendencję do pisania kodu w sposób uniemożliwiający jego łatwą analizę: - nigdy nie grupuj kilku instrukcji w jednej linii kodu - to formalnie dopuszczalne, ale kompletnie nieczytelne - korzystaj ze spacji do odseparowania wizualnie operatorów w wyrażeniach (z wyjątkiem -> , i * jako operatora wyłuskania) Teraz wracając do Twojego problemu: 1....
Wstawiasz pole tekstowe i nazywasz go np.: wynik i jako wartosć ustawiasz 0 (w opcjach) Potem robisz 10 butonów z liczbami 0..9 i x butonów z działaniami Do kazdego przycisku dajesz if(wynik->text=="0")... wynik->text="liczba";} else{ wynik->text=wynik->text+"licz... Potem tworzysz...
Według mnie Jeśli chodzi o wysyłanie ascii (7bitów ) + bit parzystości, to problem jest prosty do rozwiazania. Co prawda piszesz ze chcesz wysylac 7 bitow plus bit parzystosci ale go nie wysylasz, wysylasz tylko 7 bitow o parzystosci zapomniales Jeśli chodzi o wysylanie liczby 1+ cyfrowej to wystarczy ją podzielic na np tysiace setki dziesiatki jednosci...
...czy nie ma możliwości w Xdata umieścić globalnej tablicy ??... Jeśli w startupie włączysz wewnętrzny XRAM , to zmienne mogą być zarówno globalne jak i lokalne. Ba , nawet stos można tam wsadzić :D Piotrek PS A co do błędu kompilacji , to ... popatrz(policz) dokładnie na klamry w moim przykładzie :D
Nigdzie nie widzę definicji PINCx, a więc zakładam domyślne pochodzące z avr/io.h (iom8.h): /* PINC */ #define PINC66 #define PINC55 #define PINC44 #define PINC33 #define PINC22 #define PINC11 #define PINC00 Tak więc są to stałe zdefiniowane jeśli dany pin istnieje, zawierają numer bitu który należy sprawdzać. Nie są to marka do sprawdzania stanu pinu...
Myślałem żeby załaczyć Ci mój projekt ale - 1. jest komercyjny 2. jest zbyt myślę złożony Tak że na szybko sama idea - jest to zrobione w 5 minut i skrypt linkera powinno sie przerobic lepiej. Funkcje też są do kitu - bo parametry trzeba przekazywać wskaznikiem do nich) wtedy nie jesteś ograniczony ich ilościa itd itd. Nie jest to reentrant i bezpieczne....
Tu masz info jak posługiwać się zewnętrzną pamięcią w gcc: http://www.nongnu.org/avr-libc/user-manu... Oczywiście tablice możesz mieć, tyle, że alokowane dynamicznie czyli na stercie, albo jak piszesz dodawać do nich atrybut określający sekcję. Stertę możesz umieścić w zewnętrznej pamięci. To może być o tyle sensowne, że duże...
Fajnie, że Ci program działa. Kilka sugesti: 1) nazwij jakoś te flagi. Możesz uzyć np: struct { unsigned mute:1; unsigned inna:1; } flags; /* dalej w kodzie */ flags.mute = 1; 2) używasz "magicznych stałych" w stylu 0xFD, 0x18, 63 itd. Wszystkie powinny być opisane i zdeklarowane na początku pliku za pomocą static const ... albo #define...
Generalnie kod nie wygląda tak źle. Jak na początkującego, to muszę nawet pochwalić! Formatowanie poziome i rozdzielenie różnych części programu białymi znakami na duży plus. Bardzo wiele osób ma z tym problem, mimo tego, że nowoczesne IDE dbają o to praktycznie same. Kilka uwag się znajdzie, ale myślę, że będzie to konstruktywna krytyka. Po pierwsze...
i<=2*nn-1 a to to co? nn skąd się wzięło? i tab_2?
Zmienne globalne i obsługa przerwania INT0: unsigned char n=0,numer=0,komenda=0,kod=0; bit zdalna_komenda; void IR_INT0 (void) interrupt 0 { if(n) { TL0=TH0=0; TR0=1; while (int0==0); TR0=0; if (TH0 > 5) { n=0; komenda=numer=kod=0; } else { if (TH0>2 || (TH0==2 && TL0 >...
hmmm no ja to robiłem wtedy w Bascomie mniej więcej tak: ustawiałem sobie tak któryś Timer, żeby przerwanie wykonywało się powiedzmy 64 albo 128 czy ze 200 razy w ciągu czasu trwania jednej połówki czyli w trakcie ok 10ms tak? Gdy pojawiło się przerwanie INTx to odpalałem ten Timer, który zaczynał tykać i wykonywać przerwanie tyle razy ile ustalonych...
Do optymalizacji: 1) formatowanie kodu (można wcinać więcej poziomów niż tylko jeden ;) ) 2) za dużo "magicznych liczb", za 3 dni zapomnisz co te PORTD=0xXX znaczą 3) zmienne i funkcje globalne powinny być static (poza main i przerwaniami) - oznacza to, że nie będą eksportowane = kompilator może je zoptymalizować/rozwinąć w miejscu wywołania. 4) o stałych...
Dawno nie bawiłe się arduino ale coś jescze pamiętam. Aby używać zmiennych uint8_t musisz dołączyć plik nagłówkowy [syntax=c]#include "U8glib.h"[/syntax] Następnie radzę dla wejścia (pin1) zastosować podciągnięcie do plusa programowo. [syntax=c]pinMode(pin1, INPUT_PULLUP);[/syntax] Proponuję zastosować taki kod (nie używam adruino więc nie mogę go sprawdzić):...
Problem tkwi w miejscu gdzie są inicjowane wartości zmiennych do odnierzania czasu. Niestety nie :( Problem tkwi tu: /* TIMSK = 130; // globalne odblokowanie przerwań /* TIMSK |=(1<<TOIE1); Skąd wytrzasnąłeś te 130 :?: Piotrek PS A jaki to proc :?:
Jeżeli wiesz, że odpowiedź z wagi będzie miała faktycznie długość 10 bajtów, to najprościej można to zrobić tak: [syntax=c] WriteFile(hNumPort, lpBuffor_write, strlen(lpBuffor_write), &RS_ile, 0); RS_ile = 0; do { ReadFile(hNumPort, lpBuffor_read, 10, &RS_ile, 0); } while(RS_ile<10); [/syntax] Po co zmienne globalne deklarujesz jako static?...
Spróbuj czegoś takiego: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DT... <html xmlns=""> <head> <script type="text/javascript"> var x=0; var y=0; function otwarcie_nowego(podaj_link,gorny,lew... { window.open(podaj_link,...
gcc 4.7.0 to wersja eksperymentalna i stara, zdecydowanie nie powinieneś jej używać. W ogóle wersji 4.7 pod linuksem nie powinieneś używać, chyba, że znasz się na patchowaniu kompilatora i wiesz jakie patche trzeba zaaplikować dla AVR. Pod linuxa ściągnij toolchain z Atmela. Co do twojego błędu - pokaż raport z kompilacji, ilość użytej pamięci i opcje...
Urzyj zmiennych globalnych (przed "main()"!! )!!!!
Chyba nie ogarniasz tworzenia nowego okna ;] Dodałeś deklarację na początku pliku - ok. Dodałeś rejestrację klasy MyRegisterClass - ok. Powiedz mi dlaczego w WndProc masz [syntax=cpp]HWND hRysuj, noweOkno; //?? dlaczego one nie są jako globalne ? po stworzeniu buttona już nigdy nie obsłuzysz jego naciśnięcia bo uchwyt zostanie zapomniany do przycisku...
zmienne globalne plikach ocieplenie globalne globalne klawisze
fabia pompa oleju poduszka skrzyni sterowanie przez telefon komórkowy
Arduino Nano miernik napięcia 0-30V z OLED I2C – kod, schemat, kalibracja Silnik 3-fazowy 7,5 kW – podłączenie gwiazda-trójkąt, zaciski U V W Z X Y, stary typ