Aby wyjaśnić Ci Twój problem, podaję Ci metodę "czytania" typów zmiennych, który wyjaśnia wszystko. Jest kilka zasad: 1. Czytanie zaczynamy od nazwy zmiennej 2. Czytamy w prawo dopóki nie dojdziemy do "końca", po osiągnięciu "końca" czytamy w lewo od nazwy zmiennej 3. Obowiązują nawiasy, które są "lokalnymi końcami" Tak więc: const char * const l_wartosc[]...
witam dane: kompilator CV na AVR. prosze o pomoc bo nie wiem jak to rozwiazac a mianowicie... mam zadeklarowane dwie stale tablice znakow: flash char tak[]="TAK"; flash char nie[]="NIE "; zadeklarowana tablice wskaźników do tych stalych: flash char *wyborptr[2]={tak,nie}; mam nastepne stringi we flashu: flash char jeden[]="JEDEN "; flash char dwa[]="DWA";...
...Zauwałzyłem, że po zadeklarowaniu w ten sposób liczba komórek RAM zmniejsza się:... Pamięci programu również :( Zajrzyj do pliku pgmspace.h , no i oczywiście do dokumentacji , a w lot zrozumiesz ;) #define EEPROM __attribute__ ((section (".eeprom"))) #define FLASH __attribute__ ((section (".progmem.gcc"))&...
Witam Niby prosta rzecz a nie wychodzi mi... Chce umieścić łańcuchy znaków w pamięci FLASH przy użycium atrybutu __progmem oraz symboli __flash o __memx. W każdym z przypadków dane nie mogą znaleźć się w pamięci FLASH. Mało tego, podgląd pamięci w Atmel Studio podczas debugowania nie wskazuje nawet że dane te znajdują się w pamięci SRAM. Uzywam płytki...
Użyj rozszerzenia gcc dla AVR: __flash [syntax=c] struct record { uint16_t pos; const __flash char *txt; } ; const struct record tab[] = { {940, (const __flash char[]){"txt940"}}, {789, (const __flash char[]){"txt789"}}, {115, (const __flash char[]){"txt115"}} }; [/syntax] PS: oczywiscie sama tablica również może rezydować w pamięci flash: [syntax=c]...
...Twoja wersja mi nie działa...z powodu "gwiazdki" ;) nastomiast działa mi takie coś... umieszczam dwie stałe w pamięci flash: flash char tak[]="TAK "; flash char nie[]="NIE "; teraz deklaruję tablicę wskaźników (o dziwo też musi być we flash! ): flash char *wyborptr Dodano po 2 ...prosze o pomoc bo nie wiem jak...
Jak deklarujesz tablice to wystarczy słowo kluczowe const i tablica wyląduje we flashu, a używasz jakby była w ramie, jak nie musisz modyfikowac to nie musisz kopiować. [syntax=c]const char tab[] = "tablica we flash";[/syntax] a jak juz musisz kopiować to standardowymi funkcjami memcpy, strcpy... [syntax=c]const char tab_flash[ 50 ] = { ... }; char...
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ć...
Poprzedni mój przykład działa poprawnie pod warunkiem że cały jego tekst zawarty jest w jednym pliku głównym. Jeśli wywołanie funkcji piszącej do lcd nastąpi w innym pliku, to argument funkcji będący zarazem wskaźnikiem do tekstu flash nie zostanie rozpoznany. Obszedłem to poprzez zdefiniowanie W pliku nagłówkowym powinny być tylko deklaracje, zazwyczaj...
gps79 sorry, ale czy Ty czytasz tylko sam kod w moich postach, czy również tekst ? "Ale ja nigdzie nie deklaruję tablicę stringów niezmiennych const char *. Wydaje mi się, że raczej dokładnie opisałem, co robię. Napisałem, że jeśli utworzę tablice w pamięci flash" JEŚLI....... Natomiast w czasie rzeczywistym w programie docelowym nie tworzę tablic we...
[syntax=c]void LcdText(rom const char *txt);[/syntax] ? Albert
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.
witam Mam problem z deklaracją takiej tablicy w AVR Studio 4 (używam WinAVR-20070525 ) - nie rozumie deklaracji flash flash unsigned char unshifted[][2] = { 0x0d,9, 0x0e,’|’, 0x15,’q’, 0x16,’1’, 0x1a,’z’, 0x1b,’s’, 0x1c,’a’ };
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...
Witam; mam sobie taką tablicę wskaźników do tekstów w pamięci flash: [syntax=c]flash char *napis[]={"Start","Stop","Pauza","OK","D... [/syntax] i chciałbym te teksty móc wysłać przez RS232 . Jeśli zastosuje konstrukcję typu : [syntax=c]putsf(napis[1]);[/syntax] to wszystko jest OK. Ale chciałbym wysłać ten tekst poprzez funkcję printf i tu pojawiają...
Musisz uzyc polecenia PROGMEM np const char tablica1[] PROGMEM="cos tam";
1) Zapomnij, że istnieje coś takiego jak String... przynajmniej na Arduino. Używaj char (niestety z wszystkimi tego konsekwencjami). 2) Do trzymania komunikatów używaj pamięci FLASH, szkoda marnować RAM na każdy String w programie... czyli nie " Serial.print("Inicjowanie karty SD..."); " lecz " Serial.print(F("Inicjowanie karty SD...")); ".
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,...
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])
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...
(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...
bez "&" - to co masz to nie jest tablica stringów tylko tablica wskazników do tych stringów (a tak naprawdę wskaznikiem do pierwszego wskaznika - tyle ze ułozone sa w pamieci po kolei). W C tablice sa reprezentowane przez wskazniki czyli char ala_ma_kota[] = "dfdsffsf" definiuje wskaznik ala_ma_kota. W C nie ma tablic w rozumieniu np PHP.
nie wiem, jak to w gcc wygląda, ale nie zadziała czasem 'static' w deklaracji, ewentualnie 'const', ale nie za bardzo wiem, jak działa const w C++ (programuję w C), wiem tylko, że inaczej... :D static char tablica[8] = {1,2,3,4,5,6,7,8};
Witam Wydaje się, że najprościej to wykorzystać poniższą strukturę przechowującą parametry danej tablicy ze znakami w pamięci Flash [syntax=c] struct sFont{ unsigned char height; // ilosc linii unsigned char width; // szerokosc char const *font; // tablica znaków }; [/syntax] W przypadku chęci wykorzystania kilku tablic z różnymi rozmiarami, to do funkcji...
zawsze musi być na końcu '\0'? czyli w moim przypadku 6 element tablicy zakończenie łańcucha? Tak. W funkcjach, które użyłeś wykonywana jest konwersja char[] do char*, więc to jest jedyny znacznik końca łańcucha tekstowego.
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...
Witam! Natrafilem na dziwny problem i nie bardzo mam pomysl jak go rozwiazac. Otoz w programie zadeklarowalem kilka tablic o lacznej pojemnosci okolo 1.2KB. Wszystkie tablice sa umieszczane w pamieci flash (const), typy to "char" i struktury 4x"char", tablice 1 i 2 wymiarowe. Teraz opis problemu: kiedy mialem nieco mniej tablic i dodalem kolejna (120...
Możesz przekonwertować plik na tablicę C (jest wiele narzędzi, poza tym to max kilkanaście linii w większości języków). Albo wygenerować od razu plik obiektowy i zlinkować z programem. arm-none-eabi-objcopy -I binary -O elf32-littlearm --set-section-flags .data=alloc,load,data,readonly --rename-section .data=.rodata plik.bin plik.o Dodaj plik plik.o...
unsigned char tablica definiujesz tak: prog_char unsigned char tablica[] = { 128, 134, 136, 134, 128, 116,….. } i kompilator wstawia ją tylko do flesha
kombinowałem z tablicą struktur, ale kompilacja się wykłada na procedurze wyświetlania z pamięci Flash na LCD , która oczekuje char*, a dostaje strukturę TDzień_tyg (pewnie coś namieszałem z wskaźnikami), więc skorzystałem z pomysłu Raphaw i BlueDraco - rzeczywiście, jakoś to prościej wygląda ;-) Dzięki wszystkim.
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};
Atrybut progmem wymusza włożenie do sekcji tylko do odczytu, a tylko do odczytu może być zmienna const. Inną mógłbyś próbować zmienić, a tak się nie da. 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...
Niestety nie mam żadnego filmiku. Sprawuje się REWELACYJNIE. Za to podrzucę Ci gotowca bo ten na stronie wymaga sporo poprawek i domysłów co gdzie jest. Jest to wersja pierwotna która przechowuje w tablicy RAM. Funkcje których tutaj nie ma robią: LCDINIT - inicjalizacja wyświetlacza LCD_POS - ustawia pozycję: wiersz, kolumna LCD_CLS - czyści ekran LCD_PSTR...
Witam chciałem wyświetlić pojedynczy znak z tablicy i nie wiem jak to zrobić może pokaże na przykładzie : [syntax=c] char PROGMEM tab1[] = {"FLASH"}; char tab2[]={"AVR ATMEL"}; lcd_str_P(tab1[2]); //znak A lcd_str(tab2[2]); //znak R [/syntax] Wyświetlacz LCD to hd44780 biblioteka do obsługi lcd pochodzi z książki od mirekk36 niestety po skompilowaniu...
Witam, Mam pytanie czym mogę zastąpić napisany w winavr kawałek kodu: flash unsigned char tak aby kompilator WinARM nie wywalał błędów. Potrzebne mi to jest do wgrania obrazu przerobionego z bmp do wyśw. graicznego. Przykład z WinAVR: flash unsigned char icon1[] = { 0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,... 0x01,0x02,0x00,0x00,0x02,0x01,0x00,0x00,...
Tzn, że program może działać dalej poprawnie a debuger wskazuje na to, że jesteśmy w np HardFaultHandlerze ? Mógłbyś nieco rozwinąć myśl ? Czasem może być jakiś problem sprzętowy/programowy/systemowy, który może spowodować wywalenie się debuggera, który będzie np. uparcie twierdził, że jesteśmy wciąż w jakiejś linii, choć mikrokontroler sobie wtedy...
(...) .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>...
1. Funkcję konwersji do hex-a możnaby zrobić w oparciu o LUTa (stablicowane wartości). Poniżej prosty przykład na PC-ta dla testów ale łatwo zaadoptować do arduino: [syntax=cpp]#include <iostream> using namespace std; void tohex(unsigned long val, char* buf) { const char* const lut16 = "0123456789ABCDEF"; // tablicę można przenieś do FLASH for...
Ponieważ odczyt z tablicy w maluczkich uC zajmuje "dużo" flash i czasu też, dlatego nie ma odczytu z żadnych tablic. A w tych gdzie ciąg ląduje w ram, zużywa ją niepotrzebnie. Na szczęście choinka if then else zajmuje zero bajtów i zero instrukcji oraz wykonuje się w ujemnym czasie. Proponuję najpierw sprawdzić obie wersje na min. 2 platformach, a...
Cze, W moim programie chciałbym wrzucić pewną tablice stałych (dość dużą, zajęła by ona połowę RAMu w F100RB) do pamięci Flash. Problem polega na tym, że jakoś nie potrafię skłonić linkera do tego aby to uczynił. Testowo deklarowałem trochę mniejszą tablicę w taki sposób: [syntax=cpp]volatile static const char test[2][2][2][10] = {............}[/syntax]...
Witam, Pomysł dobry ale sypie się najprawdopodobniej z powodu zbyt dużej ilości przerwań. Proponuje projekt sterownika "równoległego", taki wykorzystałem w mojej pracy inżynierskiej. Wprawdzie korzystałem tylko z 8 serw ale 16 też obsłuży po drobnej modyfikacji. Program zabiera większość mocy procesora do obsługi przerwań ale tylko przez czas 2ms potem...
Faktycznie, jeśli maski zadeklaruję jako tablicę stałych w pamięci flash to "odczyt" maski jest stały i wynosi 8 cykli, czyli prędko :) Kompilator nie wywala błędu, w bibliotece funkcja wygląda tak: [syntax=c] unsigned char sprawdz_bit(unsigned char *_port,unsigned char _bit){ ... } [/syntax] a wywołanie funkcji w kodzie programu: [syntax=c] i=sprawdz_bit(&PORTD,7);...
Nie ma. W języku C nie można przypisywać tablic, trzeba je kopiować. Można (jak tzw tablice wiszą na wskaźnikach) , z małą gwiazdką u dołu. W języku C w ogóle nie ma rasowych tablic, jest obszar pamięci i arytmetyka wskaźników, w tym operator (tak!!!) tablicowy Nie ma sprawdzania zakresu, bo nie ma informacji o zakresie. Tak naprawdę to w ogóle nie...
Witam, mam pytanie, ponieważ namieszałem już tak bardzo, że sam nie wiem o co chodzi... (1) Załóżmy, że mam kilka deklaracji funkcji: void f_1(void); ... void f_5(void); (2) Następnie mam deklarację łańcuchów, umieszczonych w pamięci Flash: char f_Command1[] PROGMEM = "01"; ... char f_Command5[] PROGMEM = "05";...
cześć takie dwie sprawy. 1. Zakładając że mam zadeklarowane dwa takie ciągi znakowe [syntax=c]char *str1 = "string numer 1"; char str2[] = "string nr 2";[/syntax] oraz jakąś funkcję która wysyła przekazany ciąg znaków dla przykładu na RS choc może być to jakiś LCD [syntax=c]void wyslijRS(char * ciag);[/syntax] z tego co rozumiem to str1 jest ZMIENNĄ...
Atmega8 ma za mało ramu, żeby obsłużyć kartę SD. Podczas obsługi kart SD odczytujesz sektory po 512bajtów, więc trzeba zrobić w pamięci ram procka tablicę 'unsigned char' o pojemności 512 elementów czyli 512x8 bitów daje 512 bajtów w pamięci. Tak więc procek musi mieć co najmniej 1kb pamięci RAM. Oczywiście pamięć flash też musi być sensowna, żeby pomieścić...
Teraz ja nie rozumiem do końca o co chodzi z 'zewnętrznością' ;). Jeśli chodzi Tobie o klauzulę extern, to została dodana po to, aby tablica widziana była we wszystkich plikach projektu. A co do odwoływania, podam przykład. Jeśli tablica zapisana jest w RAM-ie, to działaja poprawnie co nastepuje: void LCDPutchar(unsigned char ch) { unsigned...
Witam, W jaki sposób skopiować zawartość tablicy która jest w pamięci flash do tablicy w pamięci RAM, Czy trzeba odczytywać bajt po bajcie, i później zapisywać do tablicy RAM czy da się to zrobić szybciej jakąś gotową funkcja jak memcpy? Np. mam taki kod; [syntax=c]#include <avr/io.h> #include <avr/eeprom.h> char tablica[22]; EEMEM char...
Witam próbuję zapisać i odczytywać tablice z napisami w pamięci FLASH, niestety nie udaje mi się to, wyświetlacz nie wyświetla nic próbowałem po przez PROGMEM jak i przez __flash co kompletnie nie zadziałało nie chciało utworzyć zmiennej. poniżej kod programu. [syntax=c]const char T1[] PROGMEM = {"DS1307"}; const char T2[] PROGMEM = {"TESTER"}; const...
Witam, Z powodu kończących się zasobów pamięci flash jestem zmuszony przenieść definicje wyglądu znaków wyświetlacza LCD od nokii 3310. Deklaracja tablicy oraz fragment tablicy wygląda tak: [syntax=c] static EEMEM unsigned char lcd_Font[][5] = { { 0x00, 0x00, 0x00, 0x00, 0x00 }, // sp { 0x00, 0x00, 0x2f, 0x00, 0x00 }, // ! { 0x00, 0x07, 0x00, 0x07,...
Ale się nakombinowałeś :). A więc tak: typedef struct { char *opis; uint8_t tab_arg[2]; } kl_menu_pozycja; const kl_menu_pozycja menu_pozycja_nr[2] PROGMEM = { {"telefon", {11, 12}}, {"rower", {23, 24}} }; Niestety nie możesz deklarować ciągu znaków "telefon"...
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...
Witam Chciałem umieścić tablice pod stałym adresem w pamieci flash, ale nie na koncu flasha. Do tej pory robiłem to tak: wycinek z pliku linkiera dla GCC [syntax=c] MEMORY { rom (rx): org = 0x08000000, len = 192k var (rx) : org = 0x08030000, len = 64k ram (rwx): org = 0x20000000, len = 64k } .... SECTIONS { .dane : { KEEP(*(.dane)) *(.dane*) } >var...
Czyli reasumując: - Nie ustawiam bitu PGSEL - W programie wprowadzam : unsigned char xdata tab Ja robię to tak: 1. Model Small. 2. W programie: xdata unsigned char tab[] = {0,1,2,3,4}; Zakresu nie ustawiam, z rejestru EMI0CN nie korzystam. Tak nawiasem mówiąc masz świadomość, że ta tablica znajdzie się i w pamięci Flash i w pamięci...
Witam Kolegów, Przyznać muszę, że bez problemu robiłem już coś takiego a tym razem pomroczność jasna zasnuła mi oczy i nie wiem, gdzie jest błąd. Mam następujące tablice we flashu: [syntax=c] char menu1[] PROGMEM = "MENU 1"; char menu2[] PROGMEM = "MENU 2"; char menu3[] PROGMEM = "MENU 3"; char menu4[] PROGMEM = "MENU 4"; char* menus[] PROGMEM = {menu1,...
Dzięki za szybką odpowiedź. Nie wiem czy mnie dobrze podałem przykład, z samą tablicą jedno i dwuwymiarową nie mam problemu, natomiast z tablicą w której elementem jest struktura w skład której wchodzi kilka zmiennych. sr xxl[10]; nie jest prawidłowym zapisem ponieważ "sr" odnosi się tylko do lokalizacji danej struktury. To jest przykład z helpa...
No tak ale jeśli tworzę wskażnik char *ptr, czyli powienien wskazywać na daną w pamięci RAM a przekazuję do niego wskazanie na dana która ma sie znajdować w pamięci Flash. CZyżby to znaczyło że nie ma znaczenia czy do wskażnika zapiszę adres pamięci flash a RAM. Przecież prog_char *ptr to nie jest to samo co char *ptr . Jeden wskażnik powienien wskazywać...
(at)wojlej 1. sizeof char jest zawsze równe 1 więc jest tu zbędne 2. Dwa razy kopjuesz dane. Najpierw do tablicy a później do struktury. Szybciej będzie bezpośrednio odczytywać do struktury tak: [syntax=c] char *tab = (char*)&Struktura_odczytana; for(i = 0; i < size; i++) { tab[i] = Read_EEPROM_BYTE(1+i); //Adres względny - sektor 7 } [/syntax]...
Może zamiast czytać z karty stwórz sobie dużą tablicę (kilka sekund dźwięku) w pamięci flash i zobacz czy czytając z niej dane będzie dobrze słychać. Słychać tylko pisk: const unsigned char xx[] = {0x7D,0x7C,0x7C,0x7B,0x7B,0x7A,0x79... itd.}; ... ISR(TIMER2_COMP_vect) { OCR1A = (xx[i]);...
W tej wersji: strcmp_P (i prog_char tu nie pomoże).
Mam problem. Potrzebuję zapisać tablicę o rozmiarze 96kB do Flasha. Następnie potrzebuję z niej czytać. Część pierwszą mam zrobioną. Problem pojawia się przy czytaniu z flasha. Zapis wyglada tak: unsigned char tab1[24413] PROGMEM = {...dane...} unsigned char tab2[24413] PROGMEM = {...dane...} unsigned char tab3[24413] PROGMEM = {...dane...} unsigned...
Jeśli chcesz przechowywać coś, co rzadko się zmienia, możesz spróbować użyć fikcyjnych bajtów w mainConfig_t : https://github.com/search?q=repo%3Aopens... Jednak główny config powinien zmieniać się tylko wtedy, gdy użytkownicy coś zmieniają, a nie sam z siebie... nie jest zoptymalizowany pod kątem...
Witam serdecznie, Dotychczas wystarczało bierne uczestniczenie na forum, lecz w tym przypadku spędziłem 2 popoludnia na czytanie postów i niestety nie udalo mi się znaleźć rozwiązania mojego problemu. Stad uprzejma prośba do szanownych kolegów, programistów o pomoc. Ogólny problem jest taki że nie udalo mi się dotrzec do fachowej literatry, istnieje...
Obsługuję led display, mam funkcje która odświeża 6 cyfr wyświetlacza na podstawie kodów w tablicy digits unsigned char txt_read[] = {0x00, 0x28, 0x7C, 0xFA, 0xAE, 0x00}; i funckcję która ustawia napis void set_lcd_text(unsigned char* text, unsigned char blink){ int i; for(i=0;i<6;i++) digits[i] = text[i];...
Witam, Po pierwsze. Chciałbym przenieść całą strukturę do pamięci flash: typedef struct { unsigned char state; unsigned char input; unsigned char nextstate; } MENU_NEXTSTATE; typedef struct { unsigned char state; unsigned char *pText; unsigned char (*pFunc)(unsigned char input); } MENU_STATE; Czy możecie mi wyjaśnić...
Witam Od jakiegoś czasu próbuję odczytać łańcuch znaków z pamięci flash. jeżeli chodzi o dane 8 bitowe lub 16 bitowe nie ma problemu wszystko jest ok. Sytuacja komplikuje mi się jeżeli chcę umieścić napisy w pamięci Flash. Żeby bardziej zobrazować o co mi chodzi to przedstawię fragmenty kodu które mi działają a które nie. funkcja która odpowiada za...
const char text nie mozesz inicjalizować tablicy tablcą. Podstawy C/C++ trzeba poznać najpierw. Na AVR-ach poza parametrami funkcji na razie wogóle zapomij o const bo temat jest dość śliski. Nie tylko nie powinien zapomnieć, ale wręcz powinien używać const. I to z kilku powodów, z których najważniejszy jest taki, że zmienne z PROGMEM muszą być const....
Witam ponownie, jakiś czas temu zadałem pytanie odnośnie przechowywania bitmap w pamięci flash mikrokontrolera. Jednakże troszkę to zagmatwałem ,więc postanowiłem otworzyć nowy temat. Postaram się wyklarować pytanie najbardziej jak potrafię. :) Mianowicie mam do przechowywania tablicę mieszczącą 76800 elementów 16-bitowych oraz kilka innych mniejszych....
Witam Mój projekt polega na komunikacji przez moduły NRF24L01 podłączone do dwóch Atmeg (16 i 32). Nadajnik wysyła z tablicy np. [syntax=c]const char wej1[] PROGMEM = "WEJ1";[/syntax] odbiornik odbiera taką funkcją, która jest częścią biblioteki [syntax=c] void parse_nrf_data( char * buf, uint8_t len ) { if (!strcmp_P( buf , wej1)) { WEJ1 |= WEJ1; }...
dziękuje za odpowiedź, ale mam kolejne pytanie: deklaruje sekcje eeprom, tak by zajmowała mi ostatnie 100B pamięci flash (taki miałem zamiar): MEMORY { FLASH (rx) : ORIGIN = 0x00100000, LENGTH = 0x00020000 eeprom (rx) : ORIGIN = 0x00120000-100, LENGTH = 100 DATA (rw) : ORIGIN = 0x00200000, LENGTH = 0x00008000...
(at)ElektrodaBot jak dodać większą czcionkę np. font16x16 do biblioteki arduino TVout? Bezpośrednia odpowiedź na pytanie - Aby dodać większą czcionkę (np. 16×16) do biblioteki Arduino TVout, należy przygotować własną tablicę danych (bitmapę) dla poszczególnych znaków i zaimportować ją do biblioteki jako czcionkę w formacie PROGMEM. - Następnie w plikach...
Witam, mam taki problem: char napis[] PROGMEM = {"test"}; // definiuję napis w pamięci FLASH typedef struct { char * wsk; // struktura ma zawierać wskaźnik do napis'u } t_text; // definiuję strukturę typu t_text t_text text PROGMEM = {napis}; // definiuję zmienną text typu t_text i odrazu ją inicjalizuję...
A nie lepiej używać kwalifikatora __flash. Odczyt danych jest wtedy wygodniejszy, bo nie trzeba używać makr 'pgm_read_xxx()': [syntax=c]#include <avr/io.h> #include <string.h> #include <avr/pgmspace.h> // macro tworzy ciąg znaków we flash // i zwraca wskaźnik do tego ciągu #define PGM_STR(X) ((const __flash char[]) { X }) // należy...
Dziękuję za pomoc. Tablica wygląda jak w przedstawionym przykładzie powyżej a programy z nią współpracujące jak poniżej: [syntax=c]void load_menu() { unsigned int temp; void (*func)(unsigned char); LCD_CLS(); temp = pgm_read_word(&menu[current_menu].first_... if (temp) { LCD_POS(1,1); LCD_PSTR((char*)temp); } temp = pgm_read_word(&menu[current_menu].second...
Błędne znaki wyświetlane są na LCD. Zamiast wyświetlić "Klucz: 0000", wyświetla "xxxxxxxxxxx0000", gdzie zamiast x jest wyświetlany tekst z tablic lub jakieś znaczki, nigdzie nie zapisane przeze mnie. Jeśli chodzi o kod, to zamieszczam w załączniku. LCD 2x20. char dane0[] = "Mikrokontroler (skro"; char dane1[] = "t...
To jest 20x4 znaki bo nie upewniłem się? Jakies problemy z nim miałem, poniżej działający kod (biblioteki IIC nie załaczyłem) [syntax=c] LcdDOGM204Init(); //LcdDOGM204Charset( 1 ); LcdDOGM204Kontrast( 35 ); //LcdDOGM204view( 1 ); // Negatyw/pozytyw //======================================... void LcdDOGM204Init() { WriteLcdIIC(...
W projektowanym układzie chcę zrobić jako dodatek rejestrator historii pracy układu z możliwością jego odczytu programatorem, przy jednoczesnej blokadzie możliwości odczytu programu. Dane będą zapisywane w pamięci programu (FLASH) więc uprzedzając pytania, a dlaczego nie EEPROM: - EEPROM jest za mały, - EEPROM będzie wykorzystany do innych celów i będzie...
Wiem, że w niektórych uC występuje interfejs XMEM, który obsługuje pamięci zewnętrzne. Moje pytanie dotyczy tylko tego czy jest możliwość odwoływania się do różnych rodzajów pamięci (zewnętrznych lub wewnętrznych) poprzez podanie odpowiedniej wartości wskaźnika czy jednak trzeba użyć jakiś specjalnych instrukcji asemblerowych. Wiem że dla pamięci FLASH...
heh. tak można. Kontroll proponujesz zapamiętywanie aktualnej pozycji w menu poprzez PC, natomiast ja proponuję zapamiętywanie poprzez zmienną w rejestrze bądź w pamięci ram. Tyle ile masz menu tyle potrzebujesz tych pętli. Mi nudziłoby się pisanie takiego czegoś. Strata czasu. Przykład z AVRbuterfly może i działa, ale mi osobiście sie nie podoba. Przez...
Witam serdecznie , po uporaniu się z wyświetlaniem grafiki na LCD przyszedł czas na dźwięk - niestety nie do końca działa poniższa procedura - może mi ktoś podpowiedzieć , gdzie robię błąd? oto fragment funkcji: f_mount(0,&fs); res = f_open( &fsrc , "0:/dzwiek.wav" , FA_READ); res = f_read( &fsrc, wav_tab, 6144, &br); I2S_WriteByte( (uint8_t*)wav_tab,...
No ja rozumiem ze właśnie w tym jest problem. Mam te funkcje: [syntax=c]bool LCD_PutText(uint8_t x, uint8_t y, char *txt) { LCD_trans *trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2); bool ret=LCD_PutText_B(x, y, txt, trans, true); return ret; } bool LCD_PutText_B(uint8_t x, uint8_t y, char *txt, LCD_trans *buf, bool autodel) { buf->cmd=LCD_Text;...
Dziękuje za rady. Użyłem biblioteki którą podałem w poprzednim poście uprzednio ją modyfikując (wyrzuciłem wszystko co nie było związane z obsługą dużych liczb, szyfrowaniem RSA i konwersja na hex) Całość czyli owa biblioteka + klucz publiczny zapisany w tablicy char + dodatkowe biblioteki do obsługi UART i 1wire mieści się w Atmedze32 zajmując ok 83%...
void LCDString(uint8_t ui8Y, uint8_t ui8X, char cStr[], enum Polar eNormalNegativ) { unsigned char ucNumberAscii; char ucChar; uint8_t uiNumberCharInLine=0; goto_YX(ui8Y, ui8X); // skacze pod pozycje yx na LCD for(unsigned char ucCounterChar=0; NULL!=cStr[ucCounterChar]; ucCounterChar++) { ucNumberAscii=cStr[ucCounterChar]...
Dziękuję za podpowiedź *, też chciałem ubrać to jakoś w "mielenie w tablicy", ale zastanawiałem się jak to ugryźć. Dzięki twojej podpowiedzi zużycie tego kawałka kodu spadło z 93 bajtów RAM do zaledwie 11 bajtów RAM. W dalszym etapie optymalizacji chcę zająć się optymalizacją fontów (obecnie fonty 8x8) do mniej zajmujących RAM i Flash fontów 5x7. Da...
Witam dondu. Cieszę się, że moje myślenie jest właściwe. Jak pisałem wcześniej, dopiero się uczę, ale logika nie jest mi obca i to pomaga mi dość szybko łapać, o co chodzi.Jeśli chodzi o kopiowanie tablic do eeprom, to już nie mam z tym problemu, ale tylko z jedną tablica.A jesli są np. cztery ? Dodano po 12 Sprawdziłem i działa zapis do pamięci i potem...
Witam, Dzisiaj natknąłem się na taki dziwny problem. Otóż, mam ja sobie atmege 1280 i zadeklarowaną tablicę do uarta UARTBuffer #define BUFF_SIZE 8 volatile unsigned char UART0recv, UARTBuffer[BUFF_SIZE], UARTCount, UARTGet, rx_counter; // Zmienne globalne, reszta unsigned char a; ISR(USART_RXC_vect) { UARTBuffer[UARTCount]...
Lepiej napisz co chcesz osiągnąć. Jeśli to mają być stałe to lepiej je zadeklarować z atrybutem PROGMEM, żeby nie zabierały RAMu. Wtedy tablicę możesz zainicjalizować na etapie kompilacji. Jest tylko jeden problem - musisz wtedy korzystać z funkcji operujących na wskaźnikach do FLASH, klasyczne będą odczytywać dane z RAM używając wskaźnika na FLASH...
Witam, Mam proste pytanie. Zastanawia mnie, w jaki sposób obsługiwane są przez kompilator i następnie w procesorze, zmienne, którym podczas pisania programu przypisuje się konkretną wartość. Istnieje spory zasób informacji o procedurach czytania wartości z obszaru pamięci programu, jednakże przecież przy zwykłym [syntax=c]unsigned char zmienna[2][2]...
Bardzo często pisząc programy posługujemy się zmiennymi lokalnymi, które teoretycznie zwalniają pamięć jeśli nie są używane... ale dlaczego przestawiając podział pamięci na zewn. SRAM (kostka 62256), zmienne te jakby się nie inicjowały i program się wywala? Przykład: dodałem do makefile LDFLAGS += -Wl,--section-start,.data=0x801100,--def...
Cały kod teraz wygląda tak: Niestety nadal nie jest tak jak powinno a mianowicie po zapaleniu diody na sekundę zeruję zawartość tablicy i gdy ponownie wysyłam poprzez Realterm "1234" dioda po raz drugi nie chce się zapalić. [syntax=c] #define F_CPU 8000000 #define UART_BAUD 9600 #define _UBRR (((F_CPU)/(16UL * UART_BAUD))-1) #include <avr/io.h>...
Przyjrzałem się funkcji "strtok2()" i wniosek mam taki, Bardzo Ci dziękuję za zaangażowanie w moim temacie. Oczywiście jetem wdzięczny każdemu za każdą odpowiedź. Wczoraj do późnej godziny pracowałem nad tym programem, napisałem bardzo dużo kodu od początku, nie patrząc wcale wstecz na to co i jak pierwotnie wykonałem. Oto część kodu, który tworzę....
https://obrazki.elektroda.pl/3221612800_... Witajcie moi drodzy. Zapraszam na relację z postępów prac nad otwartym firmware dla BK7231T. Temat ten napisany będzie w formie tutoriala, przedstawię tu krok po kroku jak opracowałem własny, wieloplatformowy (działający na Windowsie i BK7231T) mini-serwer HTTP, system konfiguracji pinów...
Witam, dzisiaj miałem czas na zgranie kodu i wyrzucenie z niego tego co nie dotyczy tematu: Dodano po 7 Przepraszam za dziwne znaki w komentarzach ale przerzucałem z Windowsa na Linuxa i nie konwertowałem kodowania. Będę wdzięczny za pomoc. Sławek
Z dodatkowych rzeczy, które mógłbyś poprawić to: - stosowanie wielkich liter dla makr for . Mamy 21 wiek i stosujemy co najmniej "-std=c99", więc nie ma potrzeby deklarowania wszystkich zmiennych na początku funkcji enum i stosować zmienne i argumenty tego typu, np: enum class , który wprowadza zakres widoczności, ale musiałbyś wtedy zmienić język z...
A masz jakieś przerwania? Bo na Cortex-M3 mogą być DWA stosy i to że jeden się nie przepełnia jeszcze o niczym nie świadczy... 4\/3!! Możliwe ale tutaj mamy do czynienia z Cortex-M0. Nie mniej nie używam żadnych przerwań. Znalazłem pośrednią przyczynę podczas debugowania. Aplikacja pobiera wzory znaków do wyświetlenia(duże statyczne tablice). Odpowiada...
Chyba codziło ci o funkcje flush a nie flash... [syntax=c]#include <stdio.h> #include <stdlib.h> //struktura powinna być poza mainem struct czlonek{ char nazwa [40]; //nazwisko i imie maja byc z getsem w jednej lini // char dat[8]; char wys[10]; }; int main() { printf(" Podaj liczbe czlonkow spoldzielni: \n" ); int x; scanf ("%d", &x);...
Witam, Potrzebuje pomocy w przetwarzaniu danych przychodzących na uart od modułu SIM900. Generalnie chodzi o to bym mógł odebrać i zidentyfikować dane np numer dzwoniącego, tekst smsa z komendą. Obsługę uartu mam sprawną w dwie strony. Moge wysyłać z dane z pamięci RAM i flash. Odbieranie danych realizuję w przerwaniu. Moduł SIM900 ma pewien standard...
Witam, Chciałbym narysować przebieg sygnału mierzonego przez przetwornik A/C mikrokontrolera. Niestety za nic w świecie nie potrafię tego zrobić. [syntax=c]#define F_CPU 16000000UL #include <avr/io.h> #include <avr/pgmspace.h> #include <util/delay.h> #include <stdlib.h> #include <avr/interrupt.h> #include "pcd8544.h" //...
https://obrazki.elektroda.pl/8545401100_... Mój poprzedni temat o Pierwsze kroki Jakiś czas temu publikowałem temat o https://obrazki.elektroda.pl/4535548900_... Wyszukujemy DHT. Biblioteka DHT wymaga też dodania Adafruit Unified Sensor Library, więc dodajemy obie biblioteki. Najpierw Unified Sensor: https://obrazki.elektroda.pl/1839946000_...
nie usuwaj tablicy wektorów i całej reszty z której rezygnujesz przy opcji -nostartfiles. skrócenie IVT w celu oszczędzania pamięci Kombinuję dalej, w tabeli dane2 mam wrzucną zawartość hex'a programu, który miga diodą z delay'em (mało ważne), ok 230bajtów, bootloader ładuje mi tylko 1 stronę: Dodano po 20 Ok, gdy zapisuję drugą stronę to muszę zrobić:...
chara tablica tablica chara chara flash
honda civic temperatura silnik odbiornik janeczek gniazdka angielskie
swiatlo pozycyjne punto obciążalność prądowa przewodów
Bosch Serie 4 WAN2425EPL vs Serie 6 WAU28RHEPL: Wybór pralki dla dużej rodziny Tevion LCD 2207 – gaśnie podczas pracy, przyczyny: kondensatory, inwerter, CCFL, 3,3V