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.
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.
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...
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 :)
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.
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ś...
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]);
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...
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...
Te tablice int[] powinny być zdefiniowane jako PROGMEM w programie. Wtedy nie zajmowałyby pamięci SRAM, zajmowałyby miejsce tylko we Flash.
Marnowanie pamięci....
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.
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ć...
(at)dasej Jest jakiś techniczny argument za tym aby uprawiać tego typu archeologię?
putc przyjmuje jeden znak puts przyjmuje łańcuch putsp przyjmuje łańcuch z progmem
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.
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...
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...
// 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:...
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...
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...
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...
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...
... 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 ;)
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...
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(&&...
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ń?
Tak powinno być dobrze const char *bufor[8] = ... ale napisz jaki mikrokontroler, dla AVR należy odpowiednio użyć atrybutu PROGMEM.
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]...
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...
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....
Hint : PROGMEM
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....
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ą?
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...
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 ;)
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...
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,...
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 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?
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...
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.
(...) .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>...
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...
Musisz uzyc polecenia PROGMEM np const char tablica1[] PROGMEM="cos tam";
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ą...
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...
#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ą.
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ł.
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?!!
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?
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,...
Witam, Mam mały problem związany właśnie z tą pamięcią. Buduję układ z wykorzystaniem LCD 7' i potrzebuję do pamięci FLASH wgrać kilka ikonek do interfejsu graficznego. Ikonki generuję sobie przez program Pixel Factory i tam generuje mi się tablica z ciągiem bajtów dla określonego obrazka(ikonki). I moje pytanie czy da się takie dane (tablicę z bajtami)...
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ć...
a co masz w deklaracji tablicy czcionki? taki zapis: static const char font5x8[] PROGMEM = { ... } ???
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.
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...
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...
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....
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]
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:...
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};
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...
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...
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,...
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]);....
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[]...
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...
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.
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};
hmm, a nie powinno być: unsigned char klocki [x][y][z][a&... PROGMEM={...};
[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?
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ć.
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,...
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.
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...
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.
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...
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...
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 :)
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: Spróbuj, nie testowane... [syntax=c]const uint16_t Tablica01[2048] PROGMEM = {65535,65534,.......3,2,1,0}; const uint16_t Tablica02[2048] PROGMEM = {32768,32767,.......3,2,1,0}; . . . . const uint16_t Tablica19[2048]...
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...
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...
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
Stablicuj to bo az w oczy gryzie. A przy okazji tablice upchnij w kodzie programu. Wartosci tablicy oczywiscie tez popraw na prawidlowe #include <avr/pgmspace.h> PROGMEM uint8_t convTab[10] = { 0x06, 0x5b, ... 0xe6 }; a potem uzyj PORTD = pgm_read_byte(convTab + i ); i Twój caly switch do wywalenia wtedy
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ś...
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.
Przygotowujesz animację dodając kolejne klatki, a na końcu program przygotowuje Ci odpowiednią tablicę - przykład: [syntax=c]const imageTab[] PROGMEM = { { 0b011, 0b000, 0b010, 0b000, 0b010, 0b000, 0b000, 0b010, 0b000, 1080 }, { 0b010, 0b011, 0b000, 0b000, 0b001, 0b000, 0b000, 0b010, 0b000, 1080 }, { 0b000, 0b000, 0b000, 0b010, 0b010, 0b000, 0b010,...
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...
Witam, Udało mi się uruchomić wyświetlacz 240x320 ze sterownikiem ili9341 na uC Atmega 1280. Obecnie chcialbym uzyc czcionkę znalezioną w internecie ze strony: [url=http://www.rinkydinkelectronics.com... a dokladniej takiej, która ma wymiary 64x100 pixels (nazwa SevenSeg_XXXL_Num) Jak mogę taką czcionkę użyc u siebie? Problemem jest dla...
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ę...
[syntax=c]char test[5];[/syntax] Bufor do którego odbiornik wpisuje odebranego stringa (przesyłana jest temeperatura bez przecinka) np 234 to tablica znaków mojego wyświetlacza [syntax=c]prog_char cyferki[15] PROGMEM = { 0x3F,//0 0x09,//1 0x6E,//2 0x6D,//3 0x59,//4 0x75,//5 0x77,//6 0x29,//7 0x7F,//8 0x7D,//9 0x00 //nic };[/syntax] Jak bezpośrednio...
Przykład zapisu tablicy w pamięci flash i trzymania jej tylko tam: unsigned char temp[3] PROGMEM = {0,1,2}; aby odczytać dane z takiej zmiennej wykorzystać należy polecenie postaci: data = pgm_read_byte(&temp[j])
progmem tablica tablica chara progmem stringi progmem
router uderzenie piorun centralny zamek sygnalizacja sterownik lm339
Powtarzający się alarm dźwiękowy w urządzeniach Amica Migająca czerwona kontrolka w młotowiertarce Milwaukee - jak zresetować?