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ść...
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ć...
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ś...
// 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:...
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(&&...
Autorze, dałem Ci gotowe rozwiązanie, ale nie czytałeś mojego postu uważnie. Nie czytałeś też dokumentacji ( MojaPolskieZnaki18_Bitmaps . Aby wyświetlić tekst funkcją MojaPolskieZnaki18_Glyphs 90(*) wiersz, gdyż tam znajdują się informacje o tym, gdzie w pliku MojaPolskieZnaki18_Bitmaps znajduje się obraz literki "Z". * - 90 wiersz, a właściwie, to...
PROGMEM tu nic nie da, bo dla linkera ten atrybut już nie istnieje, dla niego jest adres z odpowiednim prefixem określającym lokalizację. Po określeniu sekcji należy jej adres początkowy przekazać poprzez parametr -Wl,--section-start=, lub po prostu zdefiniować nową sekcję w AVR Studio. Napisz co się pluje, że adres wykracza poza SRAM i jak dokładnie...
Bzdura, czy przekażesz do funkcji tabela, czy &tabela wyjdzie na to samo - poczytaj o tym jak są przekazywane tabele jako argumenty funkcji w C. A problem leży w tym o czym już pisałem - globalny wskaźnik nie może wskazywać na dane lokalne, które nie są zaalokowane dynamicznie lub ich czas życia nie jest nieskończony jak w przypadku static. Zastanów...
...I już się ucieszyłem, lecz stworzył się kolejny problem!! Ponieważ napisów jest ok 40-50, to po powyższej zmianie zajęty obszar pamięci data(RAM) nie wynosi już 31,3%, lecz 93,4%. I CO Z TYM DALEJ ROBIĆ:cry::?: Chyba się nie zrozumieliśmy :( Dane możesz umieścić w pamięci programu ... prog_char PM_UST_ZEG[] = "Ustaw zegar: ";...
Przeniosę to przerwanie i tablice do plików .c. Ale wtedy w pliku głównym .c mam includować plik przerwania .c? Myślałem, że tam inkluduje się tylko pliki .h Nie musisz include'ować pliku .c, a nawet nie powinieneś. W Makefile dopisz go tylko do plików źródłowych (SRC = $(TARGET).c przerwanie.c inny_plik.c itd.) a linker odwali resztę roboty. Zostało...
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,...
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.
Witam, Mam funkcję, która odczytuje tablicę zadeklarowaną jako: const PROGMEM unsigned char ikonka[32] = {0xFF, 0x03, 0x05, 0x09, 0xF1, 0x11, 0x11, 0x91, 0x91, 0x11, 0x11, 0xF1, 0x09, 0x05, 0x03, 0xFF, 0xFF, 0xC0, 0xA0, 0x90, 0x8F, 0x88, 0x88, 0x89, 0x89, 0x88, 0x88, 0x8F, 0x90, 0xA0, 0xC0, 0xFF}; i zapisuje ją do wyświetlacza. void...
Tablica menus zawiera wskaźniki do łańcuchów, a nie łańcuchy znakowe, stąd też podając adres elementu tej tablicy podajesz adres wskaźnika, który funkcja próbuje wyświetlić jak łańcuch co jest oczywiście błędem. BTW, ostatnio ściągałeś przykłady do mojej książki - tam masz przykłady ilustrujące takie menu, z wykorzystaniem przestrzeni adresowych, zamiast...
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.
Bardzo dobra uwaga kol. Sparrowhawk, tablica została wygenerowana przez pixel factory z atrybutem PROGMEM a dostęp do jej bajtów nie może odbywać się tak picture[k] tylko przez te funkcje pgm_read_byte. Nie napisałem tych funkcji więc wydaje mi się że tablica została umieszczona w ram i przepełniłem ram(dobrze kumam?). Zmieniłem def. tablicy na __flash...
Mam takie tablice: lcd_send(pgm_read_byte(&buziaa Mam problem z przekazywaniem nazwy tablicy, Bo najpierw jest odczytywane tablica buzia0, potem buzia1, itp. W jaki sposób zamienić teraz to: &buziaa aby w te miejsce pojawiła się najpierw buizia0, potem buzia1, i nastepnie buzia2 ?
To nie ma znaczenia. Każda tablica skompiluje się do binarnej. Wszystko trafi do pliku hex. Czy napiszesz {255,0xFF,0b11111111} to wszystko będzie ta sama wartości. Nigdy nie umieszczałem w programie tyle danych, ale mniej więcej powinieneś zrobić to tak: uint8_t PROGMEM tablica[1000][15] = { {255,128,130,255,128,130,255,128,13...
[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...
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...
poprawiłem na: const char *bufor[8] i errory zniknęły ale warning dalej ten sam. Dodanie progmem nic nie daje. Procesor ATMega88.
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.
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...
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]
(at)ex-or przyjrzyj się dokładnie tej sekcji kodu w pliku UTFTGLUE.h. Sądzę, że dyskusja jest czysto akademicka i jest to oczywiste ;) Ale nie w deklaracji, nieprawdaż? Tutaj użyte zostało to jako nazwa typu tzn. przynajmniej były takie intencje autora. Masz rację, że tego typu definicje typu się nie robi przez #define, a już na pewno nie w C++ ;)...
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...
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?
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,...
Czyściłeś cały projekt? Już chciałem napisać, że to genialna i jakże prosta odpowiedź, ale niestety to też nie pomogło ;( Spróbowałem czegoś innego. Po następującej zmianie: [syntax=c]const char cmd1[] PROGMEM = "PRINT"; const char cmd2[] PROGMEM = "START"; const char cmd3[] PROGMEM = "STOP"; const char cmd4[] PROGMEM = "CLR"; const char cmd5[] PROGMEM...
Czyli rozumiem,że PGM Space powyżej 64kB nie zadziała nigdy i lepiej sobie tym w ogóle głowy nie zawracać? Planowałem na samych wskaźnikach. Pobrać adres pierwszej tablicy, i potem "ręcznie" zwiększać go co 2048, by odczytać następną tablicę, ale to wymuszałoby znów użycie pgm_read_word(_far). Co z kolei, jak piszesz także nie jest tym, co potrzebuję....
Przecież to nie jest funkcja, tylko tablica w pamięci programu. Czyli zawsze jak uzywam dyrektywy Progmem to mam pisać {};
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.
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...
Witam, Dostałem ostatnio ogrzewanie przyczepy kempingowej z uszkodzonym sterownikiem. Chciałbym je zastosować do mojego garażu. Muszę zrobić prosty sterownik do tego ogrzewania i znalazłem program, który trochę przerobiłem. #include <OneWire.h> #include <DS18B20.h> #include <LCD.h> #include <LiquidCrystal_I2C.h> #define ONEWIRE_PIN...
Poczytałem trochę manuala do avr-libc dołączonego do najświeższego WinAVR i jak byk pisze tam, że aby zadeklarować i zainicjować tablicę łańcuchów w pamięci programu trzeba osobno zadeklarować samą tablicę jak i stringi ... Natomiast jeśli chodzi o struktury to powyższa reguła nie znajduje zastosowania! Ależ znajduje: tmf polega na stworzeniu typu...
Dzięki! Działa :) Dodano po 17 Mam jeszcze dodatkowe pytania odnośnie makra PSTR i pochodnych z użyciem __flash. Definicja PSTR to: compound literal qualified by address-space qualifierpamiec_flash . Nie wiem o co chodzi kompilatorowi, przecież wyraźnie zaznaczyłem, że tablica ma się znaleźć we FLASH. 4. Z kolei makro #define PGM_STR1(X) ( (const __flash...
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...
mam problem, a mianowicie nie wiem jak usunąć błąd, aby program dobrze działał. Program ma wybierać język w którym będziemy się dalej posługiwać. Dziękuję z góry za pomoc. W kodzie ( na samym dole w komentarzach ) jest napisane jaki błąd wyskakuje przy const char *phrase = pgm_read_word(¤t_language prog_char NEWLINE[] = {'\n','\r',0};...
[syntax=c]int pocz = 10; PROGMEM const byte dane_code[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16... }; byte dane_ram[20] ; void setup() { Serial.begin(9600); } void loop() { for (int i = pocz; i < pocz+10; i++) { dane_ram[i]=dane_code[i]; Serial.print(dane_ram[i]); } delay(2000); Serial.println(""); } [/syntax] Próbuję umieścić dane w tablicy...
Witam. Chcę upakować tablicę tekstową ( około 3000 bajtów ) w pamięci programu. Tablica ma taki wygląd. Próbuje ją deklarować tak jak widać w poniższym oknie ale efekt jest mizerny. [syntax=c] const char *trans[][3] PROGMEM = { { "L1 tekst" , "0x00" , "L1-tekst opis" }, { "L2 tekst 2" , "0x80" , "L2-tekst opis" }, ..... { "L90 ostatni tekst" , "0x33"...
Jak wgrać do EEpromu 4KB danych ? Miałem tablicę ok. 1.5 KB (czcionki). Tablica umeszczona była we FLASHu. Skopiowałem ją do EEPROM bez problemu. Teraz chcę skopiować "strukture" ok 4 KB( całe menu do wyświetlania). Do SRAM sie nie mieści. Czy mogę umiescic ją we FLASHu np: struct dane PROGMEM menu[]={ ......};? Pytanie: Jak sobie poradzić, aby przenieść...
Można też ładnie zoptymalizować dostęp do poszczególnych bitów: static const PROGMEM bit_masks[8] = { 0x80, 0x40, 0x20 ... }; inline bool getBit(const uint8_t memory[], uint8_t bitnum) { const uint8_t cellIndex = bitnum / 8; const uint8_t maskIndex = bitnum % 8; return memory[cellIndex] & pgm_read_byte(&bit_masks[maskInd...
Rozwiązałem problem ze zmienna, podaje cały kod jeszcze raz, jeśli ktoś ma chwile zerknąć na obsługę przerwania czy tak może zostać, oczywiście zostanie mi poprawić kod na czytelniejszy i kilka innych małych zmian. Dołączyłem jeszcze kilka ledow, wiec doszła mi jeszcze jedna tablica oraz zmienna "d" która służy do opóźnienia wczytywania danych z tablic,...
Witam wszystkich serdecznie. Mam oto taki problem. Próbuję sterować świeceniem diody LED podłączonej do wyjścia PWM mikrokontrolera. Sterowanie odbywa się w ten sposób, iż podstawiam do rejestru OCRx używanego kanału PWM wartość i to powoduje, że dioda podpięta do tego kanału świeci z określoną intensywnością. Tak wszystko działało. Ale to mi nie wystarczało....
Zadeklaruj stałą tablicę w PROGMEM, a ze struktury odnoś się przez wskaźnik.
A teraz pytanie o to kiedy używać PROGMEM "tutaj": const unsigned char data[] TUTAJ= { 0x2E,0x73,0x6E,0x64,0x00,0x00, Bo program ruszył bez tego? Chyba ma to znaczenie przy optymalizacji kodu? Mam nadzieje że używasz PROGMEM, to słówko wywołuje to że twoja tablica zostanie zapisana w pamięci programu czyli we flashu, a nie gdzieś w RAMie....
Chodzi mi o to, że mam układ hardware, gdzie segmenty wyświetlacza podłączone są część do portu D, część do Portu B. W necie Jest wiele opisów programów ale wszystkie pokazują jak działa program kiedy wszystkie segmenty wyświetlacza są podłączone do jednego portu. Zaprezentuje kawałki kodu i proszę o modyfikację aby to działało chodzi o idee dla dwóch...
Na początku uszczupliłem kod do wejścia jedynie w tryb konfiguracyjny: funkcja_trybu_konfiguracyjnego() wykonuje się tylko raz, dlatego pętla do-while jest pusta w końcu zabrałem sie za przeniesienie bibliotek. Na początku spróbowałem po prostu w ten sposób: https://obrazki.elektroda.pl/5661741000_... Jak zamiast danej biblioteki...
Przepisałem kod z książki tmf'a, ze strony 231 dotyczący wyświetlania multipleksowego. Z początku miałem kłopot ze skompilowaniem przykładu w ATMEL STUDIO bo kompilator sygnalizował błąd Error 1 variable 'DIGITS' must be const in order to be put into read-only section by means of '__attribute__((progmem))' Rozumiem to w ten sposób, że zmienne DIGITS...
[syntax=csharp] enum{ 0, menu1, menu2, menu3, menu4, menu11, menu21, menu31, menu41, ustaw1, ustaw2, ustaw3, ustaw4}; unsigned char menu_stage [13][4] PROGMEM = { // ok esc prev next {0,0,0,0}; {menu11,menu1,menu4,menu2}; //menu1 {menu21,menu2,menu1,menu3}; //menu2 {menu31,menu3,menu2,menu4}; //menu3 {menu41,menu4,menu3,menu1}; /menu4 {ustaw1,menu1,menu11,menu11};...
No to jest kolejna wersja : 1.0.0.5 teraz w przypadku konieczności generowania fontu binarnego tworzony jest nawet dodatkowy plik źródłowy w którym możemy sobie przetrzymywać nazwy plików na karcie pamięci SD. Dlaczego ? powód jest banalny no i znowu kolejne ułatwienie sobie pracy, bo przecież PetitFat nie może korzystać z LFN (długich nazw plików),...
Witam. Piszę program z obsługą MENU i w tym celu stworzyłem strukturę: Dodano po 2 Wystarczy zamiast: [syntax=c]const menu_item menu[] = {...[/syntax] wpisać: [syntax=c]const menu_item menu[] PROGMEM = {...[/syntax]
Witam! Mam następujący problem do rozwiązania... Stworzyłem strukturę napisaną w C, która jest szablonem menu wielopoziomowego pewnego programu. Początkowo projektowana była jako klasa w C++ na PCcie, teraz przenoszę ją jako strukturę do C pod AVR. Klasa była prosta, taka żeby łatwo na C przerobić. Problem polega na tym, że składniki struktury menu...
Chciałbym się odnieść do linku https://www.elektroda.pl/rtvforum/topic3... w którym w skrócie udało się zrobić cos takiego, że w zależniści od bajtu nr 0 w pamięci EEPROM ESP wchodzi albo w tryb konfiguracyjny, gdzie tworzy sieć wifi do wprowadzenia parametrów dla docelowej sieci wifi. Po zapisie ESP32 sie resetuje i wchodzi w tryb normalnej...
Coś może w takim stylu. Kod wyrwany z większej całości i trochę zagmatwany. Jest to fragment kodu do tablicowania wyjść w zespole wyświetlaczy 7-segmentowych LED. Fragment dotyczy wspólnych anod/katod ale jest również w podobnym stylu do obsługi poszczególnych segmentów podpiętych do różnych/dowolnych portów i pinów. Większość rozwiązań wykorzystuje...
Witam. Ostatnio analizuję kodzik z tej stronki: http://hobbyelektronik.org/Elo/AVR/3510i... Zastanawiająca jest tu tablica znaków. Mianowicie zapis nie wygląda tak jak standardowo, czyli dla każdego znaku jest np zapis ośmio-bajtowy, tak że nawet rzędy pikseli o wartości 0x00 są zapisywane do tablicy, przez co jest marnowane miejsce. Tu wygląda...
Witam kolegów. Po długim boju z poprawnym skomunikowaniem klawiatury komputerowej PS/2 z mikrokontroleram stanałem na rzeczy teoretycznie prostej, ale która troche mnie przerosła. Mianowicie chcę przekształcić kod odebranego klawisza na znak i wysłać tenże znak na wyświetlacz LCD. Na początku zdefiniowałem tablicę znaków, co próbowałem robić na dwa...
1. void ReadEncoder(); #define GLUE(a, b) a##b #define LEDPORT1(s)GLUE(PORT,s) #define LEDPORT LEDPORT1(LED) #define LEDDDR1(s)GLUE(DDR,s) #define LEDDDRLEDDDR1(LED) a) Co to jest? Coś jak podprogram? Ale dlaczego zakończony średnikiem? Pierwsza linia to deklaracja funkcji, dalsze linie...
dzięki za odp, masz racje chodziło mi o zatrzask, a dektywacje wyjścia mogę w moim układzie łatwo przerobić bo moge sterować bezpośrednio wejsciem OE w 74hc595; Teraz odnośnie tablicy znaków, to znalazłem taką na pokrewnym temacie: Temat Wyświetlacz LED - Mega32 Użytkownik xamrex ////////////////////////////0 1 2 3 4 5 6 7 8 9 : ; < = > ? (at)...
Trochę sobie zaoszczędzisz kodowania jak popatrzysz jak wygląda korekcja BCD przy dodawaniu binarnym. Te wszystkie ify nie są potrzebne - poczytaj o BCD. Po wykonaniu standardowej operacji nad liczbami w kodzie BCD należy sprawdzić i w razie potrzeby skorygować wynik. Dla dodawania i odejmowania korekcja będzie potrzebna wtedy, gdy dana grupa bitów...
Sprawa rozwiązana. Moje oko nie dostrzegło, ale miernik na zwarcia tak- zwarcie pomiędzy dwiema nogami Xmegi SMD. Po przeskrobaniu układ ruszył i teraz mogę podzielić się wersją na Xmega. W stosunku do wersji na AVR AtMega, zmiany są takie: Procedura setup() jest następująca: [syntax=c] void setup(void) { OSC.CTRL=OSC_RC32MEN_bm; // włączenie oscylatora...
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).
pisze programik w C ( nie jestem programista) dla atmegi88 moj problem to wywolanie odpowiedniego elementu z tablicy ktory jest wyswietlany na ekranie telewizora w postaci cyfry dziesietnej - odpowiadajacej wartosci z przetwornika AC static unsigned char cyfry[10][11][5] PROGMEM = //static unsigned char cyfry[10][11][5]...
Na początku jest to z pewnością zagmatwane. Postaram się to wyjaśnić najprościej jak potrafię. Cała konfiguracja połączenia znajduje się w opisie Hid. Urządzenie informuje system jakie dane jest w stanie przyjąć. Poniższy przykład Hid Descriptor informuje komputer, że urządzenie służy tylko do wymiany danych z komputerem. PROGMEM char usbHidReportDescriptor[22]...
Przystąpiłem do lekcji 10. Zrobiłem analogiczne poprawki, jak w lekcji 9, ale niestety również nie mogę skompilować kodu. Poświęciłem praktycznie cały dzień na szukaniu przyczyny. Pojawiają się takie błędy przy kompilacji: http://obrazki.elektroda.pl/4932303600_1... Tutaj zamieszczam kod programu po moich poprawkach: ////////////////////////////////////////...
Dobrze. Plik 'fonty.h' wygląda następująco http://obrazki.elektroda.pl/9227716000_1... zrobiłem dla każdego wiersza tablicę... [syntax=cpp]uint8_t napis0[]={0x89,0xcf,0x3e,0x88}; uint8_t napis1[]={0xda,0x28,0xa0,0x90}; uint8_t napis2[]={0xaa,0x28,0xa0,0xa0}; uint8_t napis3[]={0x8b,0xef,0x38,0xc0}; uint8_t napis4[]={0x8a,0x2a,0x20,0xa0};...
Dzięki wszystkim za opinie. Oddałem dziś projekt został oceniony na 5;] Dokonałem kilku zmian w programie więc wrzucam nową wersję: http://obrazki.elektroda.pl/8149391200_1... Jeśli już eliminujesz drgania styków programowo i w dodatku z użyciem timera, to mogłeś się pokusić o tak samo zrealizowane opóźnienia. Mnóstwo pamięci pożera...
Przystąpiłem do lekcji 10. Zrobiłem analogiczne poprawki, jak w lekcji 9, ale niestety również nie mogę skompilować kodu. Poświęciłem praktycznie cały dzień na szukaniu przyczyny. Pojawiają się takie błędy przy kompilacji: http://obrazki.elektroda.pl/4932303600_1... Tutaj zamieszczam kod programu po moich poprawkach: ////////////////////////////////////////...
Witam, Mam następujący kod: [syntax=c]void GLCD_putchar(char c) { char *ptr=(char*)font5x8+(6*(c-32)); for(uint8_t i=0; i<5; i++) { uint8_t px=GLCD_ReadByteFromROMMemory(ptr++); if(color==0) px^=0xFF; GLCD_WriteData(px); } if(color==0) GLCD_WriteData(0xFF); else GLCD_WriteData(0x00); }[/syntax] [syntax=c]// font.h // // Tablica czcionek 5x7 // #include...
Po podpięciu PCF mogę ustawiać / pobierać czas, niestety nie jest on w inny sposób zmieniany przez ten układ. w skrócie : PFC nie odmierza czasu. Kwarc 32k, kondensator 33piko. Zegar podłączony na płytce stykowej tak jak na schemacie, tylko pod ATmege8. Kod : w mainie w nieskonczonej petli jest pobierany czas i wrzucany na wyswietlacz. rtc.h [syntax=c]...
Pisałeś w temacie: http://www.elektroda.pl/rtvforum/topic18... I zastosowałem się do tego w taki sposób: Plik: main.h extern unsigned char reset_MCUCSR ; // zapamiętanie flag powodu restartu systemu extern unsigned char DDT_stan ; // flagi stanu urządzenia #define DDT_ON_OFF 0 // bit 0 - włączone / wyłączone extern unsigned char SOUND_stan; //...
Cześć, Do tej pory używałem czcionki 5x7. Kod do niej: [syntax=c]void GLCD_putchar(char c) { uint8_t orig_y=GLCD_y; char *ptr=(char*)font5x8+(5*(c-32)); uint8_t tmp_x=GLCD_x; uint8_t tmpcolor=color; for(uint8_t i=0; i<6; i++) { uint8_t tmp_y=orig_y; uint8_t tmp; if(i!=5) tmp=GLCD_ReadByteFromROMMemory(ptr++); else tmp=0; for(uint8_t y=0;y<8;y++)...
Witam Zbudowałem sobie na jednej płytce stykowej Dodano po 4 Przeczytałem na stronie radzio.dxp.pl, że w zmiennej znak otrzymuję kod klawisza, a nie kod ascii i po to jest plik scancodes.h aby sobie zamienić kod klawisza na znak. Jednak dla przykładu: SPACE - hex:0x20 znak klawisza:29, a gdy klikam spacje na klawiaturze Telly mate wyświetla mi literę...
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...
putc przyjmuje jeden znak puts przyjmuje łańcuch putsp przyjmuje łańcuch z progmem
Te tablice int[] powinny być zdefiniowane jako PROGMEM w programie. Wtedy nie zajmowałyby pamięci SRAM, zajmowałyby miejsce tylko we Flash.
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...
Marnowanie pamięci....
(at)dasej Jest jakiś techniczny argument za tym aby uprawiać tego typu archeologię?
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.
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.
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ń?
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...
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...
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ć...
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...
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...
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 ;)
Witam Chcę aby tablice Z1...Z5 były zapisane w pamięci programu, różnią się rozmiarem pomiędzy sobą: const char Z1[] __attribute__((__progmem__)) = {...}; ... const char Z5[] __attribute__((__progmem__)) = {...}; Tutaj mam tablice wskaźników również zapisaną w pamięci programu const char* TABLICA_WSKAZNIKOW[] __attribute__((__progmem__)) = { Z1, Z2,...
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,...
(...) .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>...
#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ą.
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...
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?
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...
char FontTable[97][8] PROGMEM = { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, // (blank) //0 (...) }; i RAM będzie wolny :wink:. I pamiętaj że do czytania takiej tablicy musisz wykorzystać wbudowane w winAVR pgm_read_byte(address_short);
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...
tablica progmem tablica chara progmem stringi progmem
oporność głośnik daewoo rozrząd generator klatkowy
schemat oświetlenia drogowego schemat oświetlenia drogowego
Schematy elektryczne Citroen Saxo 1.5 diesel - dostępność Gdzie kupić okrągły gumowy pasek napędowy do karuzeli?