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ść...
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 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...
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...
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]));
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.
Jesteśmy świadkami, jak cała konstrukcja jest generowana przez AI. Nie tylko kod programistyczny, ale również sposób łączenia elementów. Na razie modele radzą sobie z popularnymi elementami, pewnie kwestia czasu, jak zostaną przetrenowane na datasheetsach elementów elektronicznych. . No właśnie AI kiepsko radzi sobie z Datasheet. Nie za bardzo radzą...
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,...
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...
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 ?
Zadeklaruj stałą tablicę w PROGMEM, a ze struktury odnoś się przez wskaźnik.
[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...
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, 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.
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?
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...
(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++ ;)...
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]
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ć {};
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...
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.
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...
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...
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).
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...
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};...
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...
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"...
[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, 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...
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....
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....
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...
progmem tablica tablica chara progmem stringi progmem
17mb82s finlux podłączyć cyrkulacja renault master układ wydechowy
makita migają diody depollution system faulty peugeot
Beko FSE 1072 X - czerwona lampka, brak działania Zmywarka Hoover błąd 06 - przyczyny i rozwiązania