Jeśli to zmienna i była by zapisana w pamięci FLASH to jak byś zmieniał jej wartość :?:
Nie, odczytywać możesz dowolną ilość razy. Co do pamięci SPI to są one niezwykle proste w obsłudze, sam interfejs SPI jest prosty, o wiele łatwiejszy w obsłudze niż I2C. Jaką pamięć wybierzesz, będzie dobrze. Zacznij od TME, mają niezły wybór.
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...
EEPROM jest zapisywany przy programowaniu, gdy użyjesz dyrektywy $EEPROM. Polecenie DIM zmienna as ERAM Byte jest instrukcją dla µC (jest zapisywane w pamięci Flash) która tworzy zmienną w EEPROM.
Dokładnie jak napisał przedpiśca. :) Składnia w IAR to np: unsigned int __flash zmienna = 123; //(2 x "_" przed flash) Dokładny opis znajduje się w Help -> C/EC++ Compiler Reference Guide, strona 37.
Witam, Mam pewne pytanie dotyczące zmiennej globalnej wyspecyfikowanej jako const. Taka zmienna nie może zostać zoptymalizowana i jest trzymana w sekcji nazywanej .rodata, która to znajduje się w pamięci FLASH. (W mikrokontrolerach stm32) W takim razie jeżeli zadeklaruje np. tabelicę: [syntax=c]const uint8_t tablica[1000]; [/syntax] to oznacza, że taka...
Bo zmienna wcale nie leży w pamięci FLASH tylko SRAM. I teraz z zależności czy jest to zmienna globalna czy lokalna ląduje w sekcji .bss lub na stosie. A że zmienne globalne są domyślnie inicjowane na 0, a kod inicjujący już masz więc dodanie tej zmiennej nie wydłuża programu. Zresztą to wszystko masz już napisane w pliku map i lss - naucz się je czytać...
podzielić odczyt na dwie części, zamiast upychać w jednej linii? Upchnąłem w jednej :wink: Powstało coś takiego: [syntax=c] value = pgm_read_byte(pgm_read_word(&arrays[iter... I rzeczywiście działa. Chyba zrozumiałem mój błąd na początku - jeśli była stała to pewnie kompilator podstawiał wyliczony adres. Ale gdy była zmienna,...
Wydaje mi się, że nieprawidłowo liczysz adresy. Zauważ, że rekordy 02-05 zawierają różnie zapisany adres, który powinieneś odczytywać, a nie zakładać, że przestrzeń adresowana jest liniowo. To ma znaczenie w kodzie, gdzie przesuwasz segmenty, albo tworzysz własne segmenty w pamięci (w BASCOMie tego chyba nie ma, więc możesz się z tym problemem nie spotkać)....
Oczywiście powinieneś dać long zamiast int ale to tylko jedna rzecz. Pozatym 0xffffffff nie zmieści sie do longa. Zmieści się za to do unsigned longa. A teraz dlaczego nie działa: wskaźnik musisz zadeklarować tak jak zmienna na która ma wskazywać. W Code vision są rozdzielone przestrznie adresowe i musisz dodać do deklaracji wskaźnika flash jeżeli ma...
Nie wiem jak masz inicjalizowana strukture menu_state, ale przyjrzyj sie zmiennej statetext. Jest to statyczna zmienna bedaca wskaznikiem na char*. Funkcja lcd_puts_p spodziewa sie, ze bedzie to lancuch znakow zakonczonych zerem (null). Natomiast: statetext = pgm_read_byte(&menu_state[i].pText); powoduje, ze, czytasz tylko jeden bajt, a najstarszy bajt...
Czyli, generalnie zmienna lokalna zadeklarowana w przerwaniu , też będzie odłożona przez kompilator do rejestru i potem wszystkie operacje będą wykonywane na tym rejestrze? Dokładnie tak będzie. A jak wygląda sprawa z zmienną lokalną z specyfikatorem "static" ? Taka zmienna, jest niby tworzona w pamięci RAM, tam gdzie zmienne globalne, ale jej dostęp...
Ze zmiennymi trzymanymi we flashu nie ma tak łatwo, do ich odczytu musisz korzystać z odpowiednich funkcji. Tak jak w pokazanym kodzie dajesz funkcji uart_write_txt ciąg znaków teraz musisz podejść do tego inaczej. Musisz zadeklarować zmienne prezentujące ciągi znaków w sposób: char temp[3] PROGMEM = {'a','b','c'}; , PROGMEM spowoduje iż zmienna będzie...
hmm czyli kompilator tłumaczy to na asembler pózniej rozdziela to co będzie w pamieci ram a co w flash nie jest tak że linijka po linijce trafia do flash kompilator rozdziela co trafia do ram a co do flash??? Dodano po 16 int zmienna=5; po kompilacji postać jest zapisywana w pamięci flash i to samo w pamieci ram na stosie dobrze pojmuje?
Użyj znaczników syntax. Ciut chaotycznie opisałeś metodę. Nie ma za co. Mam nadzieje, że nie tylko tobie się przyda. Powtórzę należy pamiętać by nie dopuścić do sytuacji gdy zmienna i stalą część kodu znajdzie się w jednej stronie pamięci flash.
A czy atrybut nie wskazuje na to iż dana zmienna ma zostać utworzona w pamięci programu. Tzn czy taka deklaracje nie mówi o tym że musi to zostać utworzone w pamięci Flash a nie RAM? Właśnie tego nie rozumiem.
tak samo jak wgrywasz flash z programem możesz wgrać zawartość pamięci eeprom pomiń tylko komórkę z adresem 0h bo bywa że się przypadkiem zapisze przy starcie układu reszta do twojej dyspozycji ;) w zakładce programatora memories masz w górnej linijce ścieżkę do wyboru pamięci flash a w kolejnej ścieżce wpisujesz ścieżkę do pliku z zawartością eeprom...
Wolałbym zapis: Dobry wniosek (tak sądzę). Skąd kompilator ma wiedzieć jaką wartość ma zmienna i ?
(at)ryszta Const nie jest tylko dodatkiem. Jest dobrą praktyką, którą wiele osób po prostu ignoruje. Ponadto const nie determinuje gdzie dana zmienna zostanie umieszczona (np w pamięci FLASH). Oznacza tylko to, że danej zmiennej/obiektu nie można modyfikować. Ponadto const w parametrach funkcji oznacza mnie więcej tyle, że funkcja obiecuje nie zmieniać...
Efekt ten sam tablica ma większy wymiar w czasie działania... Tablica nie jest zmienna globalną.. A czy tablica uwzględnia znak zakończenia łańcucha '\0'? Bo jak nie, to może mieć bardzo dużą długość ten string ;)
Możesz sobie napisać taką funkcję proforma: [syntax=c] void UnusedVar (uint32_t var) { var = 0; } [/syntax] W ten sposób zmienna będzie jakkolwiek używana, więc nie ulegnie redukcji. Możesz też użyć dyrektywy volatile.
Czy wystarczy utworzyć sekcję w taki sposób, powtarzając ten wpis dla każdej sekcji, czyli d1sramdata, d2sramdata, d3sramdata? Nie. Albo inaczej. Sekcje zostaną utworzone i jeśli przypiszesz do nich jakieś zmienne, to one tam wylądują, ale aby dane zostały zainicjalizowane domyślnymi wartościami (a'la sekcja .data) lub wyzerowane (a'la sekcja .bss),...
Co to będą za próbki? Jak często będą zapisywane i odczytywane? Jeżeli dość często będzie zapis - zajeździsz pamięć... ma tylko 10.000 cykli. Zewnętrzna pamięć jest chyba nieunikniona. Dodano po 2 Albo "większy" procesor. Dodano po 1 Co do Twojego pytania - nie wiem, PIC-ki to nie moja specjalność. Może taka porada będzie pomocna - poszukaj w helpie...
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]...
(at)michalko:"Dokładnie, wystarczy zmieniać tylko adres bazowy głównego programu w skrypcie linkera. " No właśnie nie. Zmienna FLASH_BASE w tym wyrażeniu, to nie adres bazowy programu, ale adres bazowy całej pamięci FLASH 0x80000... (sprawdziłem). Najmniej inwazyjna zmiana, to właśnie podmiana w tym wyrażeniu FLASH_BASE na jakiś PROGRAM_BASE (celniej...
1. Bascom jest bardzo dobrym językiem, znacznie lepszym niż Arduino. 2. "a:10.0" "a:10.0 " ":10" "10 " Ten temat jest zamknięty, dostałeś 2 przykłady. Pierwszy napisałem do składni ramki jaką podałeś w pierwszym poście, później zmieniłeś konstrukcję rami to napisałem kolejny przykład, można jak dobrze naliczyłem jeszcze 9 innych metod zastosować by...
Witam moje pytanie jest proste ale efektywnej odpowiedzi nie znalazłem, programuje procesor atmega8 w jezyku C w kompilatorze avrstudio, napisałem sobie podprogram generujacy znaki na wyswietlaczu LCD, problem w tym że musze wywoływać "piszznak(tu numer znaku)"dla każdej literki co przy komunikatach długosci 10 literek gmatwa strasznie program...mógłbym...
Witam Czy ma ktos moze pomysł w jaki sposob wykorzysac pamiec programu w Atmedze128 do zaladowania danych. Chodzi o uzycie okolo 60k pamieci program flash do zaladowania plikow z danymi uzywanumi w programie i najlepiej aby odwolanie bylo poprzez jakas zmienna. Czy ktos wie jak lub robil cos takiego w srodowisku AVRStudio i WinGCC? Dzieki badzo za wszelkie...
Walczę już kilka dni próbując różnych podejść i niestety się nie udaje, więc postanowiłem spytać, może ktoś miał coś podobnego. Mikrokontroler stm32F407VGT6, potrzebuję zapisać bajt w pamięci flash pod określonym adresem. Mam 2 funkcje do zapisu i odczytu jednego bajtu w sektorze 2 pamięci flash: void flash_init(void) { FLASH_PrefetchBufferCmd(ENABLE);...
Witam! Chciałem umieścić stałe w pamięci flash ale coś mi nie wychodzi. [syntax=c] // Funkcja wykorzystująca stałe uint8_t Search(const char data[]); [/syntax] Przy wywołaniu funkcji w kilkunastu miejscach w programie w taki sposób: [syntax=c] Search("OK\r\n"); [/syntax] Zajętość flash=47428 i ram=10760 Po zmianach: [syntax=c] const char(* const AT_OK)[]...
(at)Piotrus_999 Popraw mnie jeśli się mylę. Mając proca w architekturze Princeton gdy użyjesz kwalifikatora "const" zmienne z automatu wpadną do pamięci flash (jeśli mnie pamięć nie myli tak się stanie choćby w przypadku avr32 i arm). Zmienna taka nie musi być statyczna i kompilator sobie z tym radzi. Oczywiście próba dobrania się do takiego obszaru...
Witajcie, właśnie się bawię pamięcią Flash w STM32F0DISCOVERY (chcę się nauczyć obsługi). Efekt? Chyba zablokowałem możliwość zapisu... Kod (dopiero się uczę, więc komentarze mogą zawierać błędy): [syntax=c]#include "stm32f0xx.h" #include "stm32f0_discovery.h" int main(void) { RCC -> AHBENR |= RCC_AHBENR_GPIOCEN;//LEDY GPIOC -> MODER |= GPIO_MODER_MODER8_0...
Z tym rzutowaniem to wolę jednak "ręcznie" to robić....jakoś tak wydaje mi się bezpieczniej. U mnie akurat sizeof zawsze będzie mniejsze niż 256 gdyż jest to po prostu ilość bajtów do zapisania jednej zmiennej/tablicy/struktury i nie zamierzam robić większych :wink:. Biblioteki z ST są zakręcone..niestety. Zaletą mojego pomysłu jest to że struktura...
Szanowni koledzy, chciałbym zrobić projekt, w którym mikrokontroler będzie generował pewne określone wartości napięcia analogowego za pomocą DACa (16 bit, podłączony przez SPI). Rozdzielczość czasowa jednego okresu sygnału wynosiłaby 2^12 (czyli 4096) próbek na okres. W sumie, na jeden okres spróbkowanego sygnału potrzeba 8kB pamięci. Mikrokontroler...
Kod z ARM - przerób sobie :) Mam nadzieję, że się przyda. Pamiętaj, że zmienna może mieścić się w kodzie -czyli w pamięci Flash (PROGMEM) lub w pamięci RAM. [syntax=c]void xprintf (const char* str, ...) { va_list arp; int d, r, w, s, l; va_start(arp, str); while ((d = *str++) != 0) { if (d != '%') { xputc(d); continue; } d = *str++; w = r = s = l =...
Witam, poczytałem sporo informacji nt. skryptów linkera, ale niestety jednej rzeczy nie mogę zrozumieć. Mam przykładowy zapis (sam napisałem): [syntax=c] .text : { . = ALIGN(4); __text_start__ = .; /* zmienna zawierająca początek sekcji text */ *(.text) /* kod wykonywalny aplikacji */ *(.text.*) *(.rodata) /* dane tylko do odczytu przechowujemy we flashu...
Znalazłem specjalnie dla Ciebie jeszcze kilka bajtów :D ahahahahaha Bascom stara się być "ignorantoodpornym" czyli jak ktoś może czegoś nie wiedzieć to on to, na wszelki wypadek, robi za niego. W języku C każdą zadeklarowaną zmienną najczęściej inicjuje się jakąś wartością ponieważ po reset nie można być pewnym, że w niej znajduje sie zero lub potrzebna...
Pierwsza sprawa jest taka, że zmienna odczytywana/zapisywana przez przerwanie i kod główny powinna być volatile. Druga zaś - 1ms delay w przerwaniu to nie jest szczególnie dobry pomysł... 4\/3!!
Wywal to "FAR" !! Te tablice zapewne tworzone są zaraz na początku pamięci flash. Tak było u mnie. Kompilator sam dopierze długość adresu. Po co go męczyć arytmetyka na 4 bajtach skoro równie dobrze możne to zrobić na 2?? A dla poprawności politycznej zmień zmienna wysyłaj na bez znaku, tak samo argument funkcji wysyłania przez SPI. Teraz kod wygląda...
Domyślnie masz 9.6 MHz dzielone przez 8, czyli 1.2 MHz. Wszystko się zgadza. Po co używasz operatora |= przy inicjowaniu peryferiali? Wstaw jakieś usypianie do pętli w main(). Zmienna timer_overflow_ nie powinna mieć atrybutu volatile. Zamiast tego, podobnie jak indeks, powinna być zadeklarowana wewnątrz procedury obsługi przerwania jako static. tab[]...
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...
Witam, zgodnie ze specyfikacją PIC16F1459 posiada on: "High Endurance Flash Memory (HEF) 128 B of Non-volatile Data Storage" komórki te znajdują się zgodnie z datasheetem od adresu 0x1F80 do adresu 0x1FFF. Ponadto zgodnie z przykładem dotyczącym zapisu do Flash z "Help'a" mikroC PRO for PIC v7.1.0 i używaniu poniższej funkcji http://obrazki.elektroda.pl/2832708000_1...
Witam! Może tak: prog_char stala = {1}; //stalej przypisana jest wartosc 1 char zmienna = pgm_read_byte(&stala); //spod adresu stala czytana jest wartość i zapamiętana w zmiennej inne typy stałych: -8 bitowy: prog_char -16 bitowy: prog_int -32 bitowy: prog_long -64 bitowy: prog_long_long Pozdrawiam EDIT: sorry, nie doczytałem tematu...
Cześć Co do tego co napisałem wcześniej( będą strony z data sheet do Twojego procka): Jak program odwoła się do obszaru pamięci UNDEFINED(ABORT)str.18,19 to generowany jest wyjątek "data abort", procesor wchodzi w tryb "ABORT MODE" i skacze pod adres 0x00000010 a adres powrotny zostaje zapisyna w rejestrze R14_ABORT,str41. Adres niezdefiniowanej pamięci...
Nie przeczytałeś noty aplikacyjnej i dalej marudzisz. Po pierwsze zauważ więc, że nie ma obowiązku używania ARMów, Cortexów, STM32 czy ogólnie emulowania EEPROMu - jeśli masz przy tym cierpieć takie katusze, to przecież nie ma sensu męczyć siebie i nas. To jest ten najważniejszy punkt. Jeśli nie sprawia Ci to przyjemności, a wręcz sprawia "egzystencjalny...
Cześć, mam zadanie do rozwiązanie a nie wiem czy się da. Mianowicie mam w programie jakąś zmienną np. : int cena =0; ... Program się wykonuje "coś się dzieje" - przychodzi komenda zmiany cena =100; po czym zasilanie jest odłączone i płytka nie jest zasilana w żaden możliwy sposób. Po uruchomieniu układu oczekuję, że zmienna "cena" będzie równa 100 a...
I gdzie jest Twoja zmienna? : O to Ci chodziło? U mnie pod SW4STM32 identycznie debuger pokazuje takiego rodzaju śmieci. Ale jak się przypatrzeć to widać wyraźnie że błędnie lokalizuje tą zmienną w obszarze RAM (np. 0x20000070). Bierze adres stąd (output.map): .mySection 0x20000070 0x3b load address 0x08002634 .mySection 0x20000070 0x3b Src/main.o...
Jeżeli soft został wgrany poprawnie, to zmienna w EEPROM przyjmuje np. wartość 0x00 i Sama, czy ustawia ją aplikacja, czy bootloader? Jeśli bootloader, to równie dobrze a moim zdaniem lepiej może być we flash. Jeśli aplikacja to patrz mój poprzedni post. Albert
(at)paluszasty Właśnie sprawdzałem jak wygląda kwestia dostępu do FLASH i jest tak jak pisałem. Definiujesz stałą z const i automatycznie ląduje ona we FLASH, a z programu masz do niej dostęp bez żadnych specjalnych udziwnień. Czyli definicja: const char tmpchar1 Chyba że z jakiegoś powodu chcemy umieścić zmienne zadeklarowane jako const w RAMie, jak...
Niestety tak nie jest, gdyż gromadzisz potem te wskaźniki w kolejnej tablicy... Więck każdy jest użyty. Ale wskaźnik to przecież adres w pamięci i kompilator wie czy w programie się do niego odwołuje czy nie, to po co najpierw ładuje wszystkie zmienne/stałe do pamięci i nie sprawdza czy w ogóle są wykorzystane w programie. Przecież jeżeli wykomentuję...
Teoretycznie const powinien także powodować, iż dane są pobierane z FLASH a nie RAM (zmniejsza to zużycie pamięci), ale zauważyłem, iż różnie to bywa. Pewnie dla optymalizacji czasu dostępu do pamięci, dane są przerzucane z FLASH do RAM i potem wykorzystywane. Bzdura. Tylko-const jako "lokalne w funkcji" nie będzie nigdy we flash - musi być "static...
Chodzi mi o to, że zmienna też mogłaby być int16_t i nie trzeba się wtedy zastanawiać czy aby na pewno ma 16-bitów. A z option bytes chodzi mi o to, ze ja u siebie mogę zapisać jedną zmienną jak i sto - nie muszę robić żadnych dziwnych kroków, ponieważ nigdy nie włączałem zabezpieczeń w option bytes czy gdziekolwiek indziej - po prostu flash jest albo...
Zniechęcił mnie brak eepromu. Kompletnie nie jest dla mnie zrozumiałe, aby w takich nowoczesnych procesorach robić takie ograniczenia. Po prostu coś takiego przydaje się wbrew pozorom nie tak często, a jak już jest potrzebne, to łatwo zastąpić czymś innym: - pamięcią zewnętrzną (chip, karta SD, ...) jeśli i tak jest na płytce, - pamięć podtrzymywana...
https://obrazki.elektroda.pl/7245713600_... BK7231 zazwyczaj programujemy przez UART - pozwala na to wgrany przez producenta bootloader. W wyjątkowych sytuacjach jednak możemy niechcący ten bootloader nadpisać - wtedy musimy użyć trybu programowania SPI by odratować zablokowany układ. Tutaj opiszę, jak działa tryb SPI w BK7231 oraz...
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...
Przyznam się ze czytałem Twój post z dziesięc razy ..i niezrozumiałem :-(. Nie wiem po co tworzysz wskaźniki do tak prostych tablic (widocznie nie zależy Ci na pamięci :wink:). flash char tak_nie[][]={{... skoro i=0 ma wskazywać na "TAK" to tak_nie wskazuje na tak i odwrotnie....
Cześć p.kaczmarek2! Fragment kodu, którego użyłem do zapisania zmiennej generującej, służy celom programistycznym. Użyję Twojego kodu, gdy już skończysz. Na razie po prostu upewniłem się, że użyto właściwych pozycji pamięci, więc jest on wstecznie kompatybilny z ostatecznym kodem. Mogę potrzebować pomocy w zsynchronizowaniu Twojego repozytorium z moim...
Mam problem .... a przebiegi powinny być takie same i nie wiem gdzie mam błąd. Kod pilota podany wprost do zmiennej działa a odczytany z Flash tylko częściowo. Nie było by problemu gdyby nie mój upór na tiny 13 (64b RAM) . Może się nie da a ja za bardzo kombinuję . Za wszelką pomoc Dziękuje :) Próbowałem jeszcze zapisać kod jako liczbę binarnie a potem...
const uint32_t data = (uint32_t)(&RCC->APB2... int main(void) { ... Gdzie RCC to wskaźnik na strukturę, a APB2ENR to jeden z jej elementów. #define RCC ((RCC_TypeDef *) RCC_BASE) -> ((RCC_TypeDef *) ((((uint32_t)0x40000... + 0x20000) + 0x1000))...
Już zgłupiałem. Niemniej jednak fizyczny zapis dokonywany jest po 4 bajty na raz jeśli ustawiłeś zapis 32-bitowy. Więc: mam w buforze daną o wartości 0xAB <- 1 bajt. Zapisuje ją pod adres = 0, więc komórki od 0 do 3 zawierają 0x000000AB tak? Następna zmienna powiedzmy 0xCD zostaje zapisana pod adres 4. I komórki od 4 do 7 zawierają 0x000000CD. Więc...
1. Schematu jak powiedziałem nie będzie 2. Nie wykorzystałem miejsca, bo na wszystko by i tak nie starczyło i wtedy poza tym na samej płytce byłaby plątanina kabli - a tego nie chciałem. 3. Program po malutkiej modyfikacji może obsłużyć matryce o rozmiarach do 56*8 (buforem jest tu zmienna 64-bitowa). Po dalszej modyfikacji (trochę większej) można sterować...
Witam Pomocy panowie bo juz tydzien sie z tym mecze. Prubuje napisac zapis do Flash. Odczyt mi dziala ok Natomiast cos niebardzo chce zapisac . Pisze w keilu procedura wyglada tak : void AT91F_Flash_Write( unsigned int Flash_Address ,int size ,unsigned int * buff) { unsigned int i,status; unsigned int * Flash; AT91C_BASE_MC->MC_FMR =...
Nie lepiej uzyc sprintf? W tym kodzie wiele było by "użyć lepiej" ale.... ;) Mając na względzie początki ( trudne ) autora, chcę by choć trochę rozumiał co robi ( on i jego kod ). Małymi kroczkami. I tak i nie. Jak uC ma mało FLASH, potrzeba prostych operacji, mozna robic na piechotę, jak pamięci jest dużo (taki sprintf to ok 1kB) operacje są skomplikowane...
ATmega644p (64kB Flash!) i brak pamięci programu ???? A rozważał kolega tak na poważnie przejście na język C ? w którym taką obsługę i to większej ilości czujników można byłoby zmieścić w ATmega16. (Bo to na 100% będzie jeden ze sposobów żeby napisać dużo krótszy program i mieć obsługę nawet 30 czujników) Jeśli zaś zamierzasz dalej męczyć się w Bascomie...
Z tych czterech tylko punkt D jest niekiedy prawdziwy. A. dotyczy Flash i EEPROM. B - odczyt z Flash dużo łatwiejszy niż z szeregowego EEPROMu, np. przez bezpośredni dostęp do danej/struktury. C. "Oddzielna przestrzeń adresowa" - to ewidentna wada rozwiązania. Jednolity dostęp do wszystkich danych jest znacznie wygodniejszy. D - przeszukiwanie Flash...
Hmmm. Wgrałem oryginalny program z Stm32 MassStorage. vectors.c startup.S i .ld o kolegi Freddie Chopin. Mam obecnie dwa przerwania z Usb: USB_HP_CAN1_TX_IRQHandler i USB_LP_CAN1_RX0_IRQHandler ( w vectors.c było bez jedynek kolo CAN ). Zrobiłem takie coś, orginalny program void USB_HP_CAN1_TX_IRQHandler(void) { CTR_HP(); }...
...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...
No masz, ale co jest przed tym warunkiem? Inkrementacja zmiennej i odczytanie bajtu z pamięci flash. Dopiero po tym sprawdzasz warunek i jeśli jest większa niż 10, to ją zerujesz. Przeanalizuj ten kod krok po kroku. Weź pod uwagę to, że gdy m=1, zmienna te może zmieniać się aż do 15. Gdy zmienisz m na 2, to może się zdarzyć sytuacja, że t będzie większe...
Jest ogrom stron traktujących o mikrokontrolerach, ale jakoś na żadnej nie jest napisane wprost co robi mikrokotroler bezpośrednio po włączeniu i potem dalej... tak żeby ktoś wprost napisał. Chętnie zerknę na każdy link jeśli ktoś się ze mną nie zgadza, pozwolę sobie przedstawić mój tok myślenia. Na początku po włączeniu zasilania mikrokontroler odczytuje...
Witam Was! Jako, że uczę się programować AVR'y w C, to napisałem sobie prosty program, który miga diodą. czas zwiększy się o 250 (oczywiście jeśli jest spełniony warunek czas < 1500 ) 2) Naciśniemy przycisk 2, to zmienna czas zmiejszy się o 250 (oczywiście jeśli jest spełniony warunek czas > 250 ) Wczoraj również pisałem takie proste programy....
przeanalizuj sobie dobrze ten kdzik poniżej bo on jest dobrze napisany - naprawdę ;) ja wprawdzie kiedyś przy okazju swojej wytrawiarki też zrobiłem sterowanie w Bascomie 2 odbiorników przy 75 krokach ale dałoby radę więcej kroków i jeszcze kilka odbiorników. Z tym, że już nie pamiętam dokładnie zagadnienia więc trudno mi się teraz znowu w to wgryzać....
Jeżeli używasz liczb zmiennopozycyjnych, to problem drgań przycisków masz automatycznie z głowy. Zastosowanie tutaj zmiennego przecink to chory pomysł - te operacje zajmują większość czasu procesora i większość pamięci Flash. Mopesz np. trzymać temperaturę jako liczbę całkowitą w dziesiątych częściach stopnia.
Przecież .DB i .DW to deklaracje stałych umieszczonych w pamięci flash (pamięci programu). Co do deklaracji zmiennych umieszczonych w wewnętrznym RAM to można zrobić to w ten sposób: .dseg ;deklaracja zmiennych Zmienna1: .byte 1 Zmienna2: .byte 1 Zmienna2bajty: .byte 2 .cseg ;tu piszemy program Nie musimy się wtedy martwić o adresy zmiennych, kompilator...
Witam, Przesiadam się powolutku z PIC na ARM, i mam pytanie. Skompilowałem sobie programik migający diodkami (przykład z książki "LPC mikrokontrolery z rdzeniem ARM7"), program działa, diodki migają ale FlashMagic podaje : Flash Used: 46.96 Kbytes (including gaps), 73.38% of an LPC2142. No i tutaj mnie troszkę przytkało. Tak ma być? Sporo jak na miganie...
[syntax=c] //Załączenie pliku nagłówkowego #include"LCD.h" //Funkcja ustawiająca linie danych LCD jako wyjścia void output_LCD(void) { DDR(D4_PORT)|=(1<<D4); DDR(D5_PORT)|=(1<<D5); DDR(D6_PORT)|=(1<<D6); DDR(D7_PORT)|=(1<<D7); } #if RW_M==1 //Funkcja ustawiająca linie danych LCD jako wejścia void input_LCD(void) { DDR(D4_PORT)&=~(1<<D4);...
Obecnie korzystam z STM32F030F4P6. No to nie masz dużego wyboru. Jeśli masz tych zmiennych nie więcej niż kilkadziesiąt, to wystarczy jeśli zajmiesz na eeprom dwa obszary 1k. Czyli stronę 14 i 15 a PAGE_NB_PVP ustawisz na 1. Jeżeli chciałbym, by EEPROM zapisywał mi od strony załóżmy 15, to wtedy ta linijka kodu przyjmie taką postać?: #define EEPROM_START_ADDRESS...
Mówiłem, że działa tylko na AVRach, przypadkiem. Powodem jest to, że AVRy mają Hardwardzki model pamięci i tam uzyskanie stałej w pamięci flash jest mozliwe jedynie poprzez makra PGM. Uwierz - bufor to wskaźnik zainicjalizowany na STAŁĄ. Wrzuć ten kod na MSP430, PICa, ARMa to się przekonasz. Poprawnym rozwiązaniem jest napisanie: char bufor char *bufor...
K_o_n_r_a_d, jeżeli masz trochę czasu to przedstaw mi swój sposób zapisu/odczytu danych do/z EEPROM. Z góry dzięki. Ja to robię tak mniej więcej: Dim pomocnicza As single At 700 Dim X As Eram Single At 100 X=pomocnicza 'zapis do eeprom pomocnicza=X 'odczyt z eeprom Zrobiłem już dużo sterowników i innych urządzeń ale jeszcze nigdy nie używałem zmiennych...
1. Standard to sektor 512B, ale jest to zapisane w strukturach dysku jako zmienna więc są możliwe inne rozmiary. 3. Aby stworzyć plik musisz: - znaleźć wolną jednostke alokacji w tablicy FAT - zaznaczyć ją jako zajęta - (jeśli rozmiar pliku > rozmiar jednostki alokacji to utworzyć w tablicy FAT odpowiedni "łańcuch" jednostek alokacji - uaktualnić...
Czwarta sprawa - na pewno chodzi Ci o zajęcie RAM, a nie Flash? Nie wydaje mi się, żeby sama obsługa zmiennych potrzebowała tak dużo pamięci operacyjnej. Pokaż jakiś fragment kodu. Wystarczy że przed pętlą główną programu, napiszę sobie: Dim tmp1 As Double Dim tmp2 As Double Dim tmp3 As Double Dim tmp4 As Double Dim tmp5 As Double i otrzymuję Error...
... Moze inaczej sie zapytam: Jak zadeklarowac zmienna do wyswietlenia, aby wstawic ja do funckji pisztekst(PSTR("wyswietl cos")) Zamiast "wyswietl cos" chcialbym wstawic zmienna,ktorej wartosc to "wyswietl cos". W ten sposób sie nie da :( Podejrzewam , że niezbyt dokładnie przeczytałeś manuala.Jest tam napisane: #define PSTR...
Udało mi się wreszcie zapisać i odczytać 16 bitów w eepromie, zrezygnowałem z funkcji, oraz uprościłem instrukcje do niezbędnego minimum: [syntax=c]//reklaracja zmiennych uint32_t address = 0x8080014; //adres eepromu, poczatek jest pod adresem 0x8080000, ten adres to 0x8080000 + 20 uint16_t data_read = 0; //dane do odczytu dwa bajty uint16_t data_write...
Bazując na https://obrazki.elektroda.pl/4178510200_... https://obrazki.elektroda.pl/8769073400_... main.c [syntax=c] /* Virtual address defined by the user: 0xFFFF value is prohibited */ uint16_t VirtAddVarTab[NB_OF_VAR]={0}; uint16_t Virtval[NB_OF_VAR]={0}; uint16_t VarValue= 0; int main(void) { HSE_init(); //systick_init();...
Można użyc ich jako wstawek asemblerowych, bo ja piszę w C? Myślisz, że zatrzask 74HC573 wydoli dla Atmegi128L(3.3V,8MHz)? Czy może zaopatrzec się w wersje AHC? Jak najbardziej można operować asemblerem i w sumie jest to dość przejrzyste (trzeba sobie zmontować proste wstawki przeładowania zmienna<->RAM. Sorry za brak szczegółów co do samego...
Nie rozumiemy się, ponieważ projekty z którymi Ty pracujesz mają zapewne inne wymagania niż moje. U mnie nie ma żadnej "struktury" - każdy parametr konfiguracyjny jest zupełnie niezależny od pozostałych. I teraz może być tak, że parametr "X" jest zmieniany raz w tygodniu (np. zmienna która odpowiada za przyporządkowanie przycisku do jakiejś funkcji),...
Mówisz masz. Ten kod jest prawidłowy dla AT45DB161 więc musisz pozmieniac niektore parametry jak by co. Nie wrzucęci tutaj całego kodu ale tylko niezbedne fragmenty. Zresztą całego nawet nie mogę umieścić :D. Właściwie to interesuje cie tylko zapis więc: unsigned char act_buffer=1; // zmienna globalna void write_to_flash(unsigned char flash_data) {...
Problemem okazały się brak mocy procesora, stąd wyższy poziom optymalizacji pomógł go, przynajmniej tymczasowo, rozwiązać. Dalej jestem ciekaw czemu tak się stało, mimo poszlak, że procesor tej wolnej mocy powinien mieć więce Nie podałeś jakim zegarem taktujesz procek (XMEGA domyślnie to 8 MHz, ale można max 32 MHz), Zegar taktowany jest 24MHz. Wynika...
Freddie Chopin... Dlaczego tak ślepo wierzysz tym "specjalistom" od AES'a? Czytałeś założenia konkursu na następce DES'a czyli AES'a? Może i algorytm jest skuteczny, ale problem w tym, że jednym z założeń było to aby nie mógł być objęty prawami patentowymi oraz ma być ogólnodostępny! Czyli wiemy co on robi już na starcie. Wiemy na jakim bloku danych...
Witam, Już przy dwóch projektach zdarzyła mi się podobna sytuacja dlatego postanowiłem zapytać użytkowników elektrody czy być może spotkali się z takim problemem. Używam AVRStudio z AVR-GCC, zauważyłem niepoprawne zachowanie programu przy włączonej optymalizacji kodu. Nie jest to związane z błędną definicją zmiennych Uwaga - zarówno w jednym jak i drugim...
Drodzy koledzy zwracam się z prośbą o pomoc gdyż temat był wielekrotnie poruszany i obszernie opisywany lecz wszystkie posty dotyczą środowiska WinAvr. Sprawa wydaje się być widziana w innym świetle gdyż przeczytawszy manuala pt. "AVR IAR C/C++ Compiler" stwierdzam, że nie ma tam mowy o bibliotekach które są potrzebne do umieszczania danych we flashu...
Można użyć modułów na 800 z kawałkiem MHz, ale wypadało by do tego dorobić własny protokół transmisji (korekcja błędów, szyfrowanie itp.). Nie da rady. Moja znajomosc elektroniki nie pozwala mi na takie szalenstwo :) 15 zł, transformator, mostek prostowniczy + stabilizator, to akurat mały problem. Chodzilo mi o zasilanie z bateri. Nie ma mowy zeby...
Analizuję od początku, uwzględniając wcześniej nabyte informację. TestFor123 1. wyłączenie przerwań 2. odczytywanie znaku z UART, pakowanie do zmiennej bstatus 3. wysłanie odebranego kodu znaku po uart (coś w rodzaju echo?) 4. Jeśli 5 razy po UART napłynie znak inny niż 123 lub 124 uP zostanie zresetowany 5. Gdy napłynie znak 123 lub 124 zmienna bkind...
https://obrazki.elektroda.pl/5694434400_... Moduły zasilaczy warsztatowych, takie jak DPS5005, dostępne są od dłuższego czasum.in. na AliExpress. Doczekały się wielu recenzji, w większości pozytywnych. Jednakże często wskazywanym problemem z tymi modułami jest kiepskiej jakości oprogramowanie – interfejs użytkownika pozostawia...
printf() używa okrutnych ilości RAM, więc zacząłbym od tego. Jeśli nie wyświetlasz liczb z przecinkiem, to użyj iprintf() - wersja ta nie obsługuje zmiennego przecinka, ale za to zajmuje mniej pamięci flash i chyba trochę mniej RAM. Do tego printf() wymaga funkcjonalnego syscallsa _write_r(), więc na "pierwszy ogień" lepiej zacząć od sprintf() (lub...
Dzień dobry, Dopiero zaczynam swoją przygodę z uC, mniej więcej ogarniam język C i stanęło przede mną zadanie napisania kodu sterownika do diod WS2812B. Wiem, że na temat tych diod było już sporo wątków na forum, więc będę się streszczał. Sercem sterownika ma być docelowo mikrokontroler z serii STM32F0 lub STM32F4, w zależności od tego jak dużo będę...
1. Wiemy podczas pisania programów na architekturę ARM programista decycyduje za pomocą skryptu linkera gdzie w pamięci leżą sekcje programu generowane przez kompilator. Najczęściej wygląda to w ten sposób: Nie do końca tak to wygląda dla ARM, choćby dlatego, że zwykle między flash a RAM jest spora "dziura", a więc między .rodata a .data na obrazku...
ale chcesz ustawić do czego te wskaźniki - no toż ci piszę, że jeśli chcesz sobie np z Flasha odczytać zmienną np uint16_t to piszesz: [syntax=c]uint16_t PROGMEM zmienna_flash = 17; uint16_t zmienna_ram; zmienna_ram = pgm_read_word( &zmienna_flash );[/syntax] teraz jaśniej ?
Jakby co to całość programu znajduje się $regfile = "2313DEF.dat" $crystal = 10000000 Dim Eaddress As Eram Byte At 2 'adres pilota Rc5, zosatał umieszczony pod adresem 2 gdyż z doswiadczenia wiem, że komórki 0 i 1(szczególnie 0) pamięci EEPROM potrafią się skasować przy nagłych skokach napięcia zasilania Dim Epamiec(16) As...
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...
W skrypcie linkera po prostu stwórz nową sekcję umieszczoną w konkretnych miejscach. Tutaj przykład z wydzielonymi dwoma ostatnimi stronami pamięci: MEMORY { rom (rx) : org = 0x08000000, len = 128k - 2k rom_p126 (r): org = 0x08000000 + 126k,len = 1k rom_p127 (r): org = 0x08000000 + 127k,len = 1k ram (rwx)...
flash zmienna zmienna flash zapis zmienna flash
alpine kostka dioda selenowa przedwzmacniacz zasilać akumulator
renault mascott stabilizator lm7812
Odbiór radia w VW Golf 5 1.9 TDI z GPS - przyczyny szumów Zepsuta matryca w telewizorze na gwarancji - prawa konsumenta