A nie jest czasem tak, że tablice stringów muszą być inaczej deklarowane, żeby siedziały w PROGMEMie? Nie jest tak. Zwróć uwagę na różnicę między definicją tablicy wskaźników do stringów a definicją tablicy stringów. Tobie się właśnie to pomyliło. char *tab to nie to samo co char tab Tablica wskaźników do stringów musiałaby być inicjalizowana jak w...
W nawiązaniu do porad kolegi tmf proponowałbym coś w tym stylu (być może strach przed kwalifikatorem __flash wynika z braku przykładów kodu :?: : [syntax=c] // przykład jak używać kwalifikatora __flash do umieszczania // danych w pamięci programu i jak się do nich odwoływać // kod gotowy do odpalenia w symulatorze Atmel Studio 6 // można zaobserwować...
Po prostu piszesz const uint16_t __memx Data[] = {...} i zapomoinasz o wszystkim. Dalej po prostu odwołujesz się do Data bez żadnych pośredników - wszystko załatwia kompilator.
A w jaki sposób zmienić lang_polish? Nazwa tablicy jest stałym wskaźnikiem do pierwszego jej elementu (o ile pamiętam z książek i studiów). Nie da się w programie zrobić tak, żeby tablica zawierała elementy znajdujące się pod innym adresem. Żeby uprościć: Sama nazwa tak, ale tu chodzi o to, co trzymasz w tej tablicy, a tam w niej musisz trzymać coś...
Nie tyle PROGMEM co const. Usuń const z ikony lub dopisz do bitmap .
Spróbuj: glcd_str_P((char *)pgm_read_word(&menus[idx]));
Obliczenia są +/- poprawne, pod warunkiem, że procesor rzeczywiście jest taktowany 12,8MHz. Domyślnie atmega8 działa na wewnętrznym rezonatorze 8MHz który jest dodatkowo dzielony przez 8. Żeby to zmienić musisz przeprogramować fuse bity. Najlepiej to zacznik od uzyskania częstotliwości 1Hz na jakimś pinie - miganie LED przy czasach rzędu 3,1ms dość...
Zadeklaruj stałą tablicę w PROGMEM, a ze struktury odnoś się przez wskaźnik.
Stwórz 3 elementową tablicę wskaźników na tablice; unsigned char PROGMEM *buzia = {buzia0,buzia1,buzia2}; a następnie przekazuj jakoś tak: lcd_send(pgm_read_byte((buzia[a])[][]); Kod poglądowy pewnie nie zadziała od razu :)
Próbujesz utworzyć tablicę z atrybutem PROGMEM jako zmienną lokalną, jest to sprzeczność i dlatego dostajesz ostrzeżenie od kompilatora. Przenieś tablicę na zewnątrz funkcji main (żeby była globalna).
Do tablicy umieszcoznej we FLASH (PROGMEM) musisz odwoływać się przy pomocy specjalnych makr zdefiniowanych w pgmspace.h, np.: pgm_read_byte (&weber[i]);
Widać nie rozumiesz o co chodzi. Ani ja ani Dr.Vee nie mówimy o przeniesieniu komunikatów do ramu, tylko tablicy wskaźników na komunikaty. Najpierw musisz pobrać wskaźnik z tablicy (ponieważ napisów jest więcej), potem dopiero wykorzystując wskaźnik odczytujesz ciąg z pamięci programu. Jeśli nie chcesz przenosić tablicy wskaźników, to niestety musisz...
Marnowanie pamięci....
putc przyjmuje jeden znak puts przyjmuje łańcuch putsp przyjmuje łańcuch z progmem
Dzięki za przykład działa dobrze, tylko nadal mnie zastanawia czemu to nie działa, tym bardziej że ten kod powyżej jest o wiele łatwiejszy. Chyba wartość kodu ocenia się w pierwszej kolejności na podstawie jego skuteczności, a nie tego, czy jest łatwiejszy. No bo co z tego, że jest łatwiejszy, jeśli nie działa? Przykład, który podałem nie jest mojego...
Tak powinno być dobrze const char *bufor[8] = ... ale napisz jaki mikrokontroler, dla AVR należy odpowiednio użyć atrybutu PROGMEM.
Te tablice int[] powinny być zdefiniowane jako PROGMEM w programie. Wtedy nie zajmowałyby pamięci SRAM, zajmowałyby miejsce tylko we Flash.
Próbuję i nic mi nie wychodzi. Dane nadal się różnią. Może jakiś przykładzik. Przykładzik: https://www.arduino.cc/en/Reference/PROG...
Czy da sie zmienic zawartosc tablicy zdefiniowanej w pamieci programu (np char TABLICA [] PROGMEM = " blablabla") podczas dzialania programu?? Wydaje mi sie, ze nie ale chcialbym sie upewnic.
(at)dasej Jest jakiś techniczny argument za tym aby uprawiać tego typu archeologię?
Raczej zastosuję taką tablicę: uint8_t PROGMEM tablica[1000][19] = { {0b0011101101101101, 0b0011011011011101, ........... 0b0111011110110101}, .......... {0b0011101101101101, 0b0011011011011101, ........... 0b0111011110110101}, }; Pierwszy wymiar to będą klatki a drugi to już po prostu dopełnienie do 150bitów....
Hmm, a jesteś pewien, że to co wygenerowałeś jako tablica jest poprawne? Bo może wyświetlasz dobrze, tylko że bzdury? ;) Patrząc na Twoją tablicę, to masz w niej 41 bajtów, czyli 41*8=328 bitów. Jeżeli Twój obrazek ma 30x11px, to potrzebujesz 330 bitów. Nie zgubiłeś czegoś? ;) I mam problem z małymi grafikami, o ile duże 96x48 px to nie problem, o tyle...
Na 164 raczej nie, bo to jest parallel in, serial out, a ty potrzebujesz na odwrót - serial in, parallel out, czyli 595. BTW, tablicę zdefinuj z progmem, dzięki czemu nie będzie zajmować SRAM (pamiętaj o użyciu stosownych funkcji do jej odczytu). Te wszystkie case są niepotrzebne - lepiej przesuwaj bity w PORTC - krótsze, szybsze.
czasem problemem okazuje się niestała stała - tablice stałych można przypuszczać, że będą tylko w pamięci flash - przeważnie okazuje się, że kompilator owszem zapisuje sobie tablicę w pamięci flash, ale z początku programu kopiuje sobie ją do ramu - w ten sposób można się odwoływać do komórek takiej tablicy jak do zwykłej pamięci ram (przestrzeń). Może...
PROGMEM to nic innego jak atrybut, który umieszcza zmienną/tablicę zmiennych w pamięci programu. Przy inicjowaniu tablic wielowymiarowych zawsze powinno się stosować zagłębianie klamer, czyli "każdy wiersz we własnych klamrach". [syntax=c]PROGMEM const uint8_t tab[2][2] = { { 0xff, 0xff }, { 0xff, 0xff } };[/syntax] lub [syntax=c]PROGMEM const uint8_t...
Nie napisałem tych funkcji więc wydaje mi się że tablica została umieszczona w ram i przepełniłem ram(dobrze kumam?). Nie ;-) Tablica była umieszczona w pamięci FLASH (makro PROGMEM), jednakże powoduje to, że do tak zdefiniowanych zmiennych nie można odnosić się w sposób bezpośredni, tylko z poprzez odpowiednie makra: pgm_read*, które są zdefiniowane...
// tablica "napis" znajduje się w PROGMEM - w kodzie jest pgm_read_byte: OK char napis[] PROGMEM = {"test"}; // zmienna "text"również jest w PROGMEM: wywołanie fun(text.wsk) odwołuje się do złej pamięci t_text text PROGMEM = {napis}; zamień: fun( text.wsk ); na coś pokroju:...
Hint : PROGMEM
W sofcie musiał byś dopisać tablice. Skompiluj i sprawdź jak to działa. [syntax=c] float GetTemp(u16 Adc,float ku) { const static float dw[] PROGMEM = { // Tablica wielomianu dla termopary J /* 1.978425E+01, -2.001204E-01, 1.036969E-02, -2.549687E-04, 3.585153E-06, -5.344285E-08, 5.099890E-10 */ // Tablica wielomianu dla termopary T /* 2.592800E+01,...
Potrzebne mi to od zabawy AVR+ENC28j60. Chciałbym umieszczać niestringopodobne treści strony www bezpośrednio w kodzie c. Mając jej jako tablice w progmem łatwo mi korzystać z posiadanych funkcji. No właśnie o tym piszę. To jak traktujesz dane to kwestia zapisu w programie. Konwertowanie danych binarnych na kod c, po to, żeby potem je przekonwertować...
Kondensator co wspominasz o nim to jes podłączony rozumiem do masy jednym biegunem a drugim do portu ? NIE NIE NIE ABSOLUTNI NIE! Kondensator wpięty jest szeregowo pomiędzy portem a diodą nadawczą optotriaka. Dlatego na porcie musi być wystawiany sygnał prostokątny a nie stan wysoki lub niski. Ale dzięki temu zyskujesz 100% pewności na wypadek awarii...
Dobrze byłoby, żebyś pokazał przynajmniej newralgiczną część kodu (definicje tablic)! Jeżeli chcesz mieć tablicę we FLASH, to trzeba użyć nie (tylko) modyfikatora const , ale atrybutu PROGMEM lub równoważnego. Czy robisz to poprawnie? Czy kompilator nie pokazuje żadnych ostrzeżeń?
... Po umieszczeniu tablicy w pamięci programu (dodanie PROGMEM do deklaracji) wywołanie powinno wyglądać tak? ... a=pgm_read_byte(FontLookup[ch - 32][i]); ... Nie zadziała :( ... a=pgm_read_byte(&FontLookup[ch - 32][i]); ... Zadziała :D Piotrek PS Nie znam struktury plików , w Twoim projekcie ;)
Jeśli zrobiłem tablice globalne, to przy wykorzystaniu pamięci RAM 83,6% jeszcze działało, Natomiast gdy zwiększyłem tablice i pamięć wynosiła 86% to już przestało działać ;D Funkcja która wysyła dane na kartę wygląda tak: passing argument 2 of 'f_write' makes pointer from integer without a cast Czym jest to spowodowane?
https://www.elektroda.pl/rtvforum/viewto... Wystarczy też na komórkę ściągnąć aplikacje dla konkretnego modelu, lub uniwersalną i dobrać działające wirtualne piloty, ale to zazwyczaj właśnie podstawowe funkcje. Z arduino jak wyżej trzeba ogarniać tworzenie tablic poleceniem PROGMEM i można zbudować swój pilot na kilka-kilkanaście...
Może coś takiego będzie działać, sprawdziłem tylko, że się kompiluje: // definicja tablicy wskaźników do funkcji void (*f_Function_table[])... PROGMEM = { f_1, ... f_5 } //----------- // wywołanie void (*f)(); // pośredni wskaźnik na funkcję f = (void*)(pgm_read_word(&&...
(...) .db "Jakis napis",0x0a,0x0d, 13,12, 0 lpm acc, z (lub z+) A co to za potworki? Znak końca linii (i do tego windowsowy :/) też nie jest potrzebny, wystarczy samo zero, chyba że urządzenie komunikuje się z windowsowym terminalem tekstowym przez rs-232. I skąd się wziął akumulator w AVR? W C robisz tak (avr-gcc): #include <avr/pgmspace.h>...
Trochę dziwna ta deklaracja: Ja __attribute__((progmem)) używam raczej po nazwie zmiennej: sizeof tablicy dosyć rozbudowanych struktur (menu) umieszczonej w pamięci FLASH działa prawidłowo. Czyli konkretnie jakie wartości zwracają?
W mikrokontrolerach AVR wystarczyło tylko dodać słówko "PROGMEM" przed tablicą, a potem odczytywać za pomocą funkcji pgm_read_byte(). Do programowania używam środowiska System Workbench i wiem że czegoś takiego tam niema W STM jest to jeszcze prostsze. Wystarczy dodać kwalifikator "const" np: [syntax=c] const uint32_t table[5] = {1,2,3,4,5}; uint32_t...
Moim zdaniem zdecydowanie lepiej, niesądzisz? Przede wszystkim zysk jest taki, że multipleksowanie robi się "samo" i w main sobie piszesz co chcesz. Popracuj jeszcze nad jedną kwestią, która zmniejsza czytelność kodu - zasięg zmiennych. Zastanów się, które zmienne naprawdę muszą być globalne, a które nie. Te, które nie muszą zrób jako zmienne lokalne....
Wersja konserwatywna - z PROGMEM - też może być. Tylko nie zapomnij dorzucić nagłówka pgmspace.h i makr pgm_read_... przy odczycie zawartości tablicy ;)
Szybki wstęp to takiego menu: Oznaczamy na potrzeby programu każdą pozycję w menu: enum{ 0, menu1, menu2, menu3, menu11, menu12, ...}; tworzymy tablicę przejść menu unsigned char menu_stage [32][4] PROGMEM = { // next prev up down {0,0,0,0}; {}; {}; {}; {}; } nieistotne...
Dlatego poprzestałem na dzieleniu. Zmienne "CyfraX" (X=1,2) są pointerami do tablicy (progmem) i nowe wartości podawane są już na port procka, do którego (przez oporniki) podłączone są katody wyświetlaczy. Anodami sterują inne piny. Nic wielkiego.
Ok teraz chyba rozumiem, czyli np: [syntax=c]void fun( uint16_t * zm ); fun( &zmienna_flash );[/syntax] tak by wyglądała deklaracja funkcji w której argumentem jest wskaźnik a niżej jej wywołanie w programie. Gdyby chodziło o tablicę w pamięci flash to np: [syntax=c]uint16_t tablica[] PROGMEM = {512,3,1333}; void fun( uint16_t * tb );[/syntax] a potem...
To zrób sobie tablicę o 256 elementach i dla każdej kombinacji wejściowej (numer elementu tablicy) trzymaj odpowiednią kombinację wyjściową (szybka metoda na poprawę połączeń w locie - zajmuje jednak 256 komórek ramu lub jest wolna jeśli robimy z progmem), albo po wygenerowaniu tablicy znaków, a przed kompilacją jeszcze na komputerze jakimś szybko napisanym...
Oj! Rzeczywiście, przecież tablica cmds też była PROGMEM , a nie była właściwie odczytywana (a palnąłem, że „powinno działać” :oops: ). pytanie więc brzmi czy cmd? znajdują się w RAMie czy też w pamięci programu. Tylko w pamięci programu. Ciekawe dlaczego to składowanie tablicy w pamięci programu nie działa właściwie. Może chodzi o to, że...
Musisz uzyc polecenia PROGMEM np const char tablica1[] PROGMEM="cos tam";
Aby zoptymalizować program możesz rozważyć poniższe podpunkty: 1)Mozesz dać tablicę do flash-a.wystarczy dołączyć plik nagłówkowy <avr\pgmspace.h> sposób definicji zmiennej ładowanej do flash: np. static unsigned int LCD_SegTable[] PROGMEM = { 0xEAA8, // '*' 0x2A80, // '+' 0x4000, // ',' 0x0A00, // '-' 0x0A51, // '.' Degree sign 0x4008,...
A moze tak send(PSTR("Falomierz V2.0")); a gdzies tam deklaracja send void send(u08 *pBuff) { while(PRG_RDB(pBuff)) putc(PRG_RDB(pBuff++)); } ewentualnie typ prog_char prog_char a[]="Ala ma kota"; i chyba PROGMEM powoduje umnieszczenie tablicy sekcji .text...
Witam, Panowie dziękuję za cenne uwagi. Mam jednak do nich pytanie: [syntax=c]// Definiuje nowy typ - tym razem dla mniejszej wygody typedef char Int8; // Napisy w pamięci programu static const Int8 PROGMEM Text_A[] = {" blebleble1 "}; static const Int8 PROGMEM Text_B[] = {" blebleble2 "}; static const Int8 PROGMEM Text_C[] = {" blebleble3 "}; static...
Volatile i PROGMEM?!! Zmienna i PROGMEM?!!
Ten procesor ma tylko 128 bajtow RAM, a twoja tablica ma 6*24=144 bajty. Zainteresuj sie atrybutem PROGMEM i umieszczaniem stalych w pamieci FLASH.
Jeśli to GCC (a wszystko wskazuje, że tak) to musisz na początku dodać: [syntax=c]#include <avr/pgmspace.h>[/syntax] Tablice deklarujesz tak: [syntax=c]unsigned char logo_bmp[] PROGMEM ={....[/syntax] Przekazanie tablicy do funkcji najlepiej robić przez wskaźnik do tablicy (w c sama nazwa tablicy to wskaźnik do jej pierwszego elementu). Czyli:...
dane.h #include <avr/pgmspace.h> #include <inttypes.h> //prog_uint8_t tablica[17] PROGMEM = {0b11111111, 0b10011110, 0b00001110, 0b01101110, 0b01101110, 0b01101110, 0b01100000, 0b01100001, 0b11111111, 0b01111100, 0b01111000, 0b01110010, 0b01100110, 0b01001110, 0b00011110, 0b00111110, 0b11111111}; //prog_uint8_t tablica[11]...
#define nie są nigdzie "tworzone" - to proste podstawienia na tekście programu, a nie obiekty programu. Stałe w AVR można umieścić w pamięci programu na dwa sposoby - pierwszy - to atrybut PROGMEM, ale potem nie tak łatwo się do nich dostać. Drugi, nowszy i lepszy koledzy AVRowcy zapewne podpowiedzą.
moja zabawkowa Yamaha na której eksperymentuję ma nuty od 41 do 72. Czyli tak tylko dla przykładu, nuta 41 to połączenie w układzie o numerze 12, nuta 42 to 18. Jak to najprościej zrobić? Tu się chyba nie obędzie bez przemapowania nuta->klucz. Najlepiej może w postaci stałej tablicy. Na Arduino przy dużych tablicach powstaje problem i trzeba korzystać...
Zastosowałem w innym miejscu, przy wpisywaniu do przetwornika DAC To nie jest zbyt dobre rozwiązanie. Po przekopiowaniu tablicy z FLASH do RAM przeskaluj dane w pętli, a w ogóle to najlepiej byłoby gdybyś już we FLASHu takie dane umieścił.
Dlaczego nie można zadeklarować tablicy większej niż 32k Kompilator się burzy nie o wielkość dostępnej pamięci programu tylko wywala komunikat że tablica jest za duża. ../Task2.c:26: error: size of array 'testX' is too large [syntax=c]uint8_t testX [0x8000] PROGMEM = {}; [/syntax]
Jednakże potrzebowałbym stworzyć takie menu w którym użytkownik wybiera sobie język i myślałem żeby rozwiązać to w taki sposób, aby każdy z tekstów był tablicą dwuwymiarową... A dlaczego to miałoby nie działać? Po prostu jako tekst związany z daną pozycją menu dajesz wskaźnik do tablicy, a w programie masz zmienną globalną określającą nr języka (indeksu...
W zasadzie twoj pomysl jest ok. Ja zrobilbym to tak: plik z danymi: data.txt [syntax=c] 1, 2, 3, 4, 5, [/syntax] plik z tablica: tab.c [syntax=c] const int data_tab[] = { #include "data.txt" } [/syntax] Nie zapomnij o PROGMEM oraz odpowiednim odwolywaniu sie do elementow tablicy.
Dodam tylko że ta tablica nie pomieści tylu znaków: char PROGMEM tab2[] = {"Zmienna:"}; A dlaczego ta tablica nie pomieści tylu znaków? Z czego to wynika że nie pomieści?
Procedura, która woła Twoją procedurę powinna zaalokować (zdefiniować) tablicę Nie do końca się zgodzę się - chyba, że tablica ma być potem "zapisywalna", O wiele lepiej ZADEKLAROWAĆ tablicę jako stałą - w obszarze PROGMEM. Rozwiązanie, które przedstawiłem - jest zgodne z regułami języka C, ale wielce nieoptymalne w przypadku mikrokontrolerów.
A, przepraszam, śmieci nie dają, bo nie ma PROGMEM - przywidziało mi się. A powinno być zadeklarowane jako symbol preprocesora, bo w ten sposób kod będzie krótszy i szybszy. Tak, jak jest teraz, DP zajmuje pamięć ROM i RAM. Gdyby było PROGMEM - zajmowałoby (też bez potrzeby) tylko pamięć ROM. Ogólnie jako const PROGMEM jest sens deklarować dane nieskalarne...
unsigned int value[128] __attribute__ ((section("moja_sekcja&... = {1,2,3,4,5,6,7,8,9}; Tak zadeklarowana zmienna wyląduje w pamięci RAM (brak atrybutu PROGMEM). Dziwne wartości biorą się z tego, że zmienna ta nie znajduje się w sekcji data ani bss (wkońcu została wymuszona inna sekcja), a więc taka...
Z tablicy int[] zadeklarowanej jako PROGMEM czyta się inaczej poszczególne elementy, np.:[syntax=c]int p1 = static_cast<int>(pgm_read_word(NTC... + (ADC_Value >> 4)));[/syntax]W poście #12 podałem link do strony, gdzie jest to wyjaśnione. Funkcja pgm_read_word() jest tożsama z funkcją pgm_read_word_near() - jako argument podaje się adres...
Dzięki. Zrobiłem osobny plik wyswietlacz.h. Podlinkowałem w main.c i wyswietlacz.c Deklaracja wysw_bufor ../wyswietlacz.h:16: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'PROGMEM' oto tablica: // tablica znaków wyświetlacza unsigned char tab_znakow[20] PROGMEM = { 0b11011101, 0b10000001, // 0 , 1 0b10111100,...
hmm, a nie powinno być: unsigned char klocki [x][y][z][a&... PROGMEM={...};
Porównaj, komentarz chyba zbędny. #include <avr/pgmspace.h> const char st_w_RAM[]="abcd"; const char st_w_ROM[] PROGMEM ="tekst w pamieci flash"; Nie tylko tablice znaków: const float PI PROGMEM=3.14159; const float PARAMETRY[3] PROGMEM={1.212, 2.4, 3.56};
[syntax=c]void CPY_FLASH_RAM (char *TAB)[/syntax] a do [syntax=c]char BUF_LCD[33] = "a"; char TX1[32] PROGMEM = "abcdefghijklmnop1234567890123456"; [/syntax] się nie czepia?
Cześć, mam następujący problem. Zadeklarowałem sobie tablice w taki sposób: [syntax=c] const uint8_t array0[5] PROGMEM = { 5, 15, 25, 35, 45 }; const uint8_t array1[5] PROGMEM = { 5, 1, 25, 3, 45 }; const uint8_t * const arrays[2] PROGMEM = { array0, aarray1 }; [/syntax] Próbuję się teraz dostać do elementów tablic array0: [syntax=c] uint8_t val = pgm_read_byte(&arrays[0][arr_counter]);....
a co masz w deklaracji tablicy czcionki? taki zapis: static const char font5x8[] PROGMEM = { ... } ???
Ogólnie to jasne, że wiadomo kiedy można sobie pozwolić na usunięcie volatile, jednak zastanawiam się w takim przypadku tablicy adresów portów, hmm. W końcu ten adres nie może się zmienić tylko wartość na porcie. Mogę zadeklarować tablicę typu volatile uint8_t * ale jaki to ma sens? Przecież ta tablica ma specyfikator PROGMEM, więc same adresy nie są...
Czytaj jeszcze raz ze zrozumieniem - dane możesz przechować w pamięci FLASH, teraz są one przechowywane w pamięci FLASH a potem podczas startu procesora kopiowane do pamięci SRAM. Stosując modyfikator PROGMEM, ograniczając typ danych tablicy do uint8_t oraz odczytując dane z pamięci za pomocą pgm_read_byte() możesz wszystko zrobić na Atmega8 - zajrzałeś...
z tego co widzę po kodzie, to autor używa PICa. Tam nie ma makra PROGMEM, tylko jak standard nakazał używa się słowa kluczowego const :) Może i PICa :) A propos const, standard nic nie mówi o wpływie const na miejsce przechowywania takiej zmiennej. W architekturze von Neumanna oczywistym wydaje się, że const powoduje umieszczenie zmiennej w FLASH (jednak...
Znaczy w pamięci FLASH - do tego celu należy posłużyć się makrem PROGMEM, które w C++ działa z pewnymi problemami ale działa.
O mem copy nie słyszałem, więc może nie będę się zagłębiał, Stosując mają pętlę wszystko działa, ale zajmuje strasznie dużo pamięci. Pomyślałem sobie zrobie to tak: do tablicy przetrzymującej obrazek dodam PROGMEM, Czyli mam [syntax=c]unsigned char PROGMEM obrazek[504]={0x00,0x00, ...CIACH..,0x00}; [/syntax] Oraz moja pętelka:[syntax=c] for (uint16_t...
Dopiero Twój drugi post pomógł zrozumieć mi problem :) W takim przypadku po prostu musze stworzyć tabele w której najpierw zapisze zmienna a dopiero później będę mógł się do nich odwołać przy pomocy wskaźnika :) P.S. dla sprostowania w/w przykład jest pisany w C dla pc tak więc printf nie ma nic wspólnego z progmem występującym w gcc dla AVR :)
Jeśli korzystasz z avr-gcc to aby zapisać tablicę do flasha to musisz doczytać do czego służy PROGMEM. http://www.nongnu.org/avr-libc/user-manu... Co do tej książki to uważaj, bo jest tam masa błędów.
Proponuje coś takiego: [syntax=c]unsigned int PROGMEM buzia0_w1 [] = {0x02ff, 0x5001, 0x02ff }[/syntax] -zamiana tablicy dwuwymiarowej na jednowymiarową -elementy są dwu-bajtowe i w starszej części jest umieszczona liczba powtórzeń, a w drugiej wartość dla wyświetlacza
Porobiłem wszystko tak jak trzeba ale mam pytanie. W programie mam przerwanie zewnętrzne. Gdzie takie przerwanie umieścić? Teraz mam tak, że mam plik przerwania.h i tam znajduje się to przerwanie (SIGNAL(SIG_INTERRUPT7){}. Czy dobrze? Nie mam do tego pliku przerwania.c, chyba nie jest potrzebny? Mam też tablicę w pamięci procka (const PROGMEM unsigned...
No skoro masz 2kB SRAM, a tablica zajmuje 1080 bajtów to się zmieści. Jeśli są to stałe to można też je przenieść do FLASH (zobacz progmem). Co do rezystorów podciągających to możesz je włączyć na wszystkich portach. Nie rozumiem o co ci chodzi.
możesz zastosować pętlę, np tak: [syntax=c] static const uint8_t rowsel[] = { tu wpisujesz maski bitowe wyboru wierszy } for (....) { PORTx |= maska_wyłączenia_wierszy; PORTx &= rowsel[i]; ... } [/syntax] Na AVR wypadałoby w deklaracji tablicy użyć jeszcze zaklęcia PROGMEM, a przy dostępie do niej pseudofunkcji dostępu do pamięci programu. Szczęśliwie...
Na wyjściu dostaje piski i nic więcej. Pomocy :/ Proponuję podejść do tego nieco inaczej. Na początek usuń całą komunikację z kartą SD. W pamięci Flash (tablica z kaluzulą PROGMEM) umieść próbkę sinusa 1kHz - jeden okres by danych nie było zbyt dużo. Napisz fragment programu który miałby ten sinus odtwarzać cyklicznie przez PWM. Tutaj masz prawie gotowca....
Dziękuję, o to mi chodzi, ale nie wiem ciągle co napisać, żeby z np: Jako funkcję: Dodano po 1 Deklaracja funkcji w pliku nagłówkowym: Dodano po 32 i tak do byte 500 Nie wiem, jaką masz konkretnie płytkę Arduino, ale może Ci zabraknąć pamięci SRAM. Lepiej te tablice zdefiniować w ten sposób: [syntax=c] const byte one[8] PROGMEM = {0x81, 0x3B, 0x01,...
Podpowiedź: Definicja tablicy we fleszu: char WCholereDuzaTablica[1000] PROGMEM = {/*tutaj wartości*/}; I odczyt wartości: Zmienna = pgmReadByte(&WCholereDuzaTablica[... Mega8 ma 1 kB SRAMu, nie wciśniesz tam tej tablicy, bo jeszcze stos i inne zmienne gdzieś muszą się zmieścić.
Witam, Potrzebuję umieścić dużo danych w pamięci Flash, jednak prosty sposób ogranicza się tylko do 64 kB, ja potrzebuje więcej. Robię wiec tak: [syntax=c] const uint16_t Tablica1[2048] PROGMEM= {65535,65534......3,2,1,0} const uint16_t Tablica2[2048] PROGMEM= {32768,32767......3,2,1,0} . . . const uint16_t Tablica19[2048] PROGMEM= {0,1,2,3....65534,65535}...
Witam Kolegów, Dokładnie wiem, co ono znaczy, wiem że zwykle sprawę załatwia rzutowanie typu, ale w definicjach preprocesora nie mogę tego pokonać: [syntax=c] #define VCC 50 #define R1 200 #define R2 220 #define VADC 256*95*R2/(R1+R2)*VCC [/syntax] "warning: integer overflow in expression [-Woverflow]" Potem używam tego w tablicy: const uint8_t Voltages[]...
Tablica w pamięci kodu (z tym, że przykład jest dla char): http://mirekk36.blogspot.com/2013/11/tab... Mając taką tablicę wyszukujesz pomiędzy którymi punktami tablicy leży wartość i liczysz https://pl.m.wikipedia.org/wiki/Interpol...
Mam mieszane uczucia. Na plus na pewno to, że główne pcb zostało wykonane osobiście oraz, że projekt stanowi skończony "produkt". Starczyło samozaparcia, żeby całość była praktycznym urządzeniem. Z doświadczenia wiem, że ciężko kończyć tego typu projekty. Na minus bałagan w środku, "obciążnik" w postaci radiatora, aż prosi się zastosowanie jakiejś przetwornicy...
Lepiej wykorzystaj do tego celu pamiec programu , ewentualnie eeprom. Sposob deklaracji tablic dla winavr : dla eeprom : #include <avr/eeprom.h> #define EEPROM __attribute__ ((section (".eeprom"))) unsigned char temp [20] EEPROM ={1,2,3,4,}; dla pamieci programu : #include <avr/pgmspace.h> static unsigned char temp_1 [2] PROGMEM = {1,2,3,4};
Z tym że jak wrzucisz do eepromu to ustaw bity BOD. Dlaczego? Dodano po 4 1. Zmień typ dla danych COLORS i brightness z int na unsigned char. Pętla wtedy będzie dla i < 255; i 10 kolorów wystarczy. Mógłbym prosić o wprowadzenie zmiany w kodzie ? Tablicę COLORS umieść w flash przez PROGMEM. Jak wywali błąd to dołącz odpowiedni plik (poszukaj gdzie...
Proszę o pomoc. Używam AVR Studio7 i pierwszy raz próbuję skorzystać z pamięci programu do zapisania i odczytów tekstów. Moje dotychczasowe próby kończyły się niepowodzeniem. Poniższy kod kompiluje się bez błędów ale z odczytem było już tylko źle. [syntax=c] #include <avr/io.h> #include <avr/pgmspace.h> int main (void) { static const char...
Robię sobie tablicę unsigned char tablica To zależy od kompilatora. Dla avr-gcc trzeba dodać do deklaracji PROGMEM i do odczytu używać makr pgm_read_byte/word itp. W przypadku IARa wystarczy _flash.
Może tak ? : LCD_DisplayPicture(*Obraz, 0, 0, 25, 7) Tak na pewno nie jest dobrze. *Obraz to liczba (z początku tablicy, czyli 0), a potrzebujemy wskaźnika. Nie wiem, czy dobrze mi się wydaje, ale dogm_core_data(pgm_read_byte(dpt... Nie inkrementuje zmiennej dptr sam z siebie. Spróbuj to zmienić na: dogm_core_data(pgm_read_byte(dpt...
Użyj sekcji .progmem.gcc - położona jest ona tuż za tablicą wektorów przerwań i standardowo nic w niej nie ma, a więc ma stały dla danego procesora adres początku.
Pisane "z palca" i nie sprawdzane: [syntax=c]unsigned int ledy[100][2]={{1,2},{3,4}... i tak dalej}; //pierwsza liczba w {} to piny portu D, druga liczba to czas opóźnienia, kolejna klamra to kolejna para liczb //100 to ilość par for(unsigned char i = 0; i<100; i++){ PORTD = ledy[i][0]; _delay_ms(ledy[i][1]); }[/syntax] Możesz także umieścić tablicę...
(at)tmf: ...ale autor tematu napisał, że print_str(strr też mu nie działa prawidłowo. Myślę, że prawdopodobnie kompilator ma problem z określeniem rozmiaru struktury i - co za tym idzie - obliczeniem wskaźnika do następnego elementu tablicy struktur. Proponuję dodać w strukturze rozmiar ciągu znaków: Musisz to tylko przerobić na swoje potrzeby, czyli...
Nawet kompilator ci mówi Elektr_Prakt_2.c:28: warning: excess elements in array initializer Elektr_Prakt_2.c:28: warning: (near initialization for 'g_WzorCyfr') deklaracja poprawna to: uint8_t g_WzorCyfr[10] PROGMEM= ... Oznacza ona że tablica ma 10 elementów, które będą indeksowane od 0-9. W C++ jest tak samo...
Wyniki do 1,2,3 i 5 dało się przewidzieć, ale test 4 dużo rozjaśnił: w hex'ie widać, że tablica znajduje się pod adresem 0x252 (ciąg "C0F9A4...") a kompilator wstawia adres 0x60 co może wskazywać, że tablica pomimo zastosowania prog_uint8_t ląduje w pamięci ram (inicjalizowana z pamięci flash) 6/ Spróbuj dodatkowo dodać atrybut PROGMEM 7/ Sprawdź, czy...
Czemu musisz posługiwać się indeksami? Napisz sobie: [syntax=c]void writecos(const uint8_t font[],uint8_t c,uint8_t e,uint8_t i,uint8_t n,uint8_t w) { twi_write(pgm_read_byte(font[c * e + i + (n * w)])); }[/syntax] i wywołuj: [syntax=c]writecos(ssd1306_fonts_0,c,e,i... writecos(ssd1306_fonts_1,c,e,i,n,w): writecos(ssd1306_fonts_2,c,e,i,n,w):[/sy...
tablica progmem tablica chara progmem stringi progmem
zmywarka bosch mycia zasilacz złącze 20pin 24pin programator zmywarki bosch
żarówka szeregowo początkujący elektronicy
Schemat modułu sterującego pralki Gorenje MAWS72 Opel Corsa D 2010 - Wyłączanie przednich świateł postojowych