Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 23 sty 2026, o 00:24


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 6 paź 2016, o 20:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

cześć Koledzy

Napisałem sobie program który zlicza impulsy i następnie wyświetla je na LCD po czym po naciśnięciu przycisku zmienna jest zerowana.
W następnej kolejności postanowiłem jednak zapamiętywać sumę impulsów i po wyzerowaniu licznika móc po naciśnięciu kolejnego przycisku zobaczyć wynik na LCD np: zliczyłem 40 imp. i zerowanie następnie 42imp. i zerowanie ale suma 82imp. jest dostępna w innej zmiennej.
Idąc dalej postanowiłem, że program zapisze mi zmienną która sumuje impulsy do eeprom-u po zaniku zasilania. Wykorzystałem wbudowany komparator do detekcji zaniku zasilania i w tym momencie zapisuję zmienną do eepromu.
Do zapisu standardowa funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


uruchamiana w pętli głównej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Po włączeniu zasilania funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


przepisuje wartość z eepromu do zmiennej "pobór"
funkcja jest wywoływana przed pętlą główną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i to też mi działa, ładnie dodaje i zapamiętuje

W takim razie czego on chce??????

Ano tego, że po wgraniu wsadu do procka zmienna "pobór" przyjmuje wartość "-1" pomimo tego, że jest inicjalizowana wartością "0"
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Dzieje się tak tylko po wgraniu wsadu później wszystko działa prawidłowo.
W eclipsie zakładka AVRDude "do not upload eeprom image"
"Ptak" przy EESAVE nie odznaczony, ale nawet jak ustawiam na 1 to nie ma różnicy.

Czekam łaskawych odpowiedzi Waszmościów

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2016, o 20:51 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Cześć ziomal, :)
Nie wiem dlaczego mam wrażenie że odczytujesz i zapisujesz z tej samej zmiennej do tej samej zmiennej. spodziewał bym się jakiejś zmiennej "ee_pobor". ?
chyba że źle coś rozumiem. :roll:



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2016, o 22:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Daro69

czyli mówisz, że co?
powołuję zmienną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

a czy funkcje zapisu i odczytu się w takim razie nie zmienią?
coś mi świta hehe - napisz proszę jak to ma być a nie się drażnisz ;)

Z której strony Warszawki mieszkasz? bo ja na północ kierunek Legionowo

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 paź 2016, o 23:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Mogę się mylić bo dopiero raczkuję :?

Myślę że potrzebna będzie jeszcze zmienna w pamięci eeprom.
Bo to w niej próbujesz zapamiętywać.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Coś jakoś tak myslę.

i oczywiście : #include <avr/eeprom.h>

Kierunek wschodni - na Wołomin. Blisko. :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 07:54 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Ja tylko dodam, że stosujesz bardzo mylące nazewnictwo. Te funkcje nazwałbym przynajmniej: eeprom_do_ram() & ram_do_eeprom(). Po za tym zastosowałbym funkcje eeprom_read_dword() & eeprom_write_dword(), skoro zapisujesz tylko jedną wartość uint32_t.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 09:36 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

:evil: dupa psia nadal mam "-1" po wgraniu programu :evil:

Idę na piłkę i piwo może wieczorem coś mi się rozjaśni

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 11:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

Tak sobie myślę czy czasem piblem nie jest w rzutowaniu.
Są zmienne 32bit, ale jest i 8bit. TCNT0.
Może zależeć od sposobu napisania pozostałych funkcji.
Chyba że ktoś zauważył coś Jeszcze.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 14:39 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Czyli jak już program działa, to przy zaniku zasilania wartość jest zapisana w pamięci EEPROM, a po ponownym włączeniu otrzymujesz poprawną wartość?

Wartość -1 otrzymujesz tylko w przypadku, kiedy wgrasz nowy kod od nowa?

Bo jeżeli tak, to przy wgrywaniu wsadu pewnie masz zaznaczone chip erase. A tak opcja czyści flash i eeprom zapisując 0xFF. A 0xFFFFFFFF będzie wyświetlane jako -1 u Ciebie.

Z dokumentacji AVRDUDE:
2.1 Option Descriptions napisał(a):
-e
Causes a chip erase to be executed. This will reset the contents of the flash ROM and EEPROM to the value ‘0xff’, and clear all lock bits. Except for ATxmega devices which can use page erase, it is basically a prerequisite command before the flash ROM can be reprogrammed again. The only exception would be if the new contents would exclusively cause bits to be programmed from the value ‘1’ to ‘0’. Note that in order to reprogram EERPOM cells, no explicit prior chip erase is required since the MCU provides an auto-erase cycle in that case before programming the cell.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 16:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Sparrow-hawk

kurczę przecież nawet jak wszędzie mamy 0xFF to przecież deklaruję zmienną
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

więc powinno to zostać zapisane. :o

Ptak przy EESAVE w fusach ma być zaznaczony? Zresztą zmieniałem o czym piszę w pierwszym poście.....

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 17:01 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

A jaki plik wrzucasz do procka? Pokaż zrzut z AVRDUDE.

Bo jeśli teraz dobrze rozumiem, to definiujesz zmienną w pamięci EEPROM, nadajesz jej wartość 0. A następnie pierwsze co robisz w programie, to ją odczytujesz? I ona ma wartość -1, a nie 0? Ten (EESAVE) służy do zachowania zawartości pamięci eeprom podczas wgrywania nowego wsadu, więc w twoim przypadku powinien być odznaczony.

I czy w opcjach projektu w AVRDUDE, w zakładce FLASH/EEPROM, masz dla obu pamięci wybrane opcje from build?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 17:25 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


o to chodzi?
A co do pytania to tak - odczytuję ją po starcie programu w (main)
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


robię jakiś czeski błąd ale już się zakręciłem

------------------------ [ Dodano po: 4 minutach ]

Sparrow-hawk napisał(a):
I czy w opcjach projektu w AVRDUDE, w zakładce FLASH/EEPROM, masz dla obu pamięci wybrane opcje from build?


o cholerka już sprawdzam

nie dla eeprom mam " do not upload......"

zaznaczyłem "from build" i wgrywa prawidłowo - nadałem zmiennej wartość "10" tak dla sprawdzenia tylko, że po wyłączeniu zasilania i ponownym starcie ciągle mam tą samą wartość chociaż w trakcie pracy programu zwiększa się prawidłowo.
Kurdę taka prośbaSparrow-hawk napisz proszę jak to ma wyglądać po kolei:
-w zakładce AVRDUDE
-w fusach jeżeli chodzi o EESAVE

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 18:44 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

(EESAVE) - Odznaczony
(AVRDUDE) - Dla obu pamięci from build.

mczarny napisał(a):
tylko, że po wyłączeniu zasilania i ponownym starcie ciągle mam tą samą wartość chociaż w trakcie pracy programu zwiększa się prawidłowo.

A czy kiedy to sprawdzałeś, to nie zapomniałeś przypadkiem w kodzie dołączyć funkcji, która tę wartość w EEPROM zapisze / zaktualizuje?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 21:35 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Daro69 napisał(a):
Mogę się mylić bo dopiero raczkuję :?

Myślę że potrzebna będzie jeszcze zmienna w pamięci eeprom.
Bo to w niej próbujesz zapamiętywać.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Coś jakoś tak myslę.

i oczywiście : #include <avr/eeprom.h>


daro69

coś tu się chyba nie zgadza w tych Twoich funkcjach
tak to wygląda w manualu WINAVR

Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


sparrow-hawk
odptaszenie w eclipsie załatwiło sprawę, ale teraz się motam z funkcjami zapisu i odczytu bo mi Daro69 trochę namieszał ;)

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 22:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

mczarny napisał(a):
bo mi Daro69 trochę namieszał

Ops.. to sorka :roll:
To może ja się tylko poprzyglądam tym razem. :?


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 23:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Daro69 napisał(a):
Ops.. to sorka :roll:
To może ja się tylko poprzyglądam tym razem. :?


nie no spoko po prostu argumenty w tych funkcjach są poprzestawiane
Twoja rada żeby powołać nową zmienną w eepromie bardzo mi pomogła :D

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 paź 2016, o 23:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 01 lis 2015
Posty: 1448
Lokalizacja: okolice Warszawa
Pomógł: 149

A...to dzięki, :D
Fajnie że się przydałem.
Trochę mało jeszcze mam wiedzy,
i dlatego pomyślałem by dalej nie mieszać,
usunąć się w cień i poprzyglądać jak to się powinno robić. ;)

Aha.. :)
czyli zamieszałem z wpisem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

powinno być
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

:D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 12:24 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Daro69 napisał(a):
A...to dzięki, :D
Fajnie że się przydałem.
Trochę mało jeszcze mam wiedzy,
i dlatego pomyślałem by dalej nie mieszać,
usunąć się w cień i poprzyglądać jak to się powinno robić. ;)



Daro69 ja też jestem na początku i z wiedzą jak widać jest nie bardzo, ale dlatego robię różne dziwne rzeczy żeby się nauczyć.
Starzy wyżeracze pewnie siedzą i się śmieją z takich tematów bo dla nich to bułka z masłem.
Wklejam jak powinny wyglądać te funkcje - może się komuś przyda na naszym poziomie :oops:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Teraz skoro zapisuje mi jeden parametr to dodam drugi i stworzę strukturę

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i dalej
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i zobaczę jak pójdzie
Wątpliwości mam tylko co wstawić jako rozmiar.

pozdrawiam

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 8 paź 2016, o 21:02 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Od razu powiem, że sizeof(CASH) nie zadziała ;-) Funkcja eeprom_read_block(...) przydaje się do zapisu tablic, a nie struktur. Nie wiem, czy gcc gwarantuje, że pola struktury będą w pamięci wyrównane i umieszczone kolejno, więc jeżeli myślisz o zrzucie struktury do eeprom, to napisz funkcję, która do każdego pola zastosuje odpowiednią funkcję z rodziny eeprom_().

PS. Nie mieszaj w obrębie jednego kodu nazewnictwa w języku polskim i angielskim. Stosuj jedno. A nazw złożonych z samych dużych liter stosuje się raczej do makr, niż do typów. Te zazwyczaj nazywanym z dużej litery.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 14:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Sparrow-hawk napisał(a):
Od razu powiem, że sizeof(CASH) nie zadziała ;-) Funkcja eeprom_read_block(...) przydaje się do zapisu tablic, a nie struktur. Nie wiem, czy gcc gwarantuje, że pola struktury będą w pamięci wyrównane i umieszczone kolejno, więc jeżeli myślisz o zrzucie struktury do eeprom, to napisz funkcję, która do każdego pola zastosuje odpowiednią funkcję z rodziny eeprom_().


Sparrow-hawk
nie wiem czy mówisz to z autopsji czy tylko tak przypuszczasz?
W tym poradniku https://www.youtube.com/watch?v=ix0EBtdiviY nasz Guru-Mirosław tworzy strukturę i zapisuje ją do wszystkich rodzajów pamięci. Jedyne co może tu budzić wątpliwości to to, że moje zmienne się zmieniają a w poradniku to są stałe....
Sprawdzimy i zobaczymy ;) a może w tzw. międzyczasie P.Mirek się odezwie?

Co do nazewnictwa to to nie jest żaden komercyjny projekt - jeszcze nie ten poziom - więc piszę co mi przychodzi do głowy
wiem, wiem - nawyki trzeba wyrabiać ;)

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 16:34 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Wprawdzie nie jestem ani Guru, ani Mirosław, ani tym bardziej P.Mirek ;) ale spróbuję odpowiedzieć.

Domyślnie kompilator avr-gcc ma włączoną opcję kompilacji -fpack-struct, co zapobiega umieszczaniu padding bytes w strukturach.

Gdyby jednak ta opcja była wyłączona i kompilator umieści padding bytes w strukturze, to operator sizeof() wliczy je do rozmiaru struktury, dzięki czemu zapis (kopiowanie) bloku o rozmiarze sizeof(struktura) do pamięci będzie prawidłowy. Jedyną niekorzystną rzeczą byłoby w tym przypadku marnotrawstwo pamięci.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 17:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

andrews napisał(a):
Wprawdzie nie jestem ani Guru, ani Mirosław, ani tym bardziej P.Mirek ;) ale spróbuję odpowiedzieć.

Domyślnie kompilator avr-gcc ma włączoną opcję kompilacji -fpack-struct, co zapobiega umieszczaniu padding bytes w strukturach.

Gdyby jednak ta opcja była wyłączona i kompilator umieści padding bytes w strukturze, to operator sizeof() wliczy je do rozmiaru struktury, dzięki czemu zapis (kopiowanie) bloku o rozmiarze sizeof(struktura) do pamięci będzie prawidłowy. Jedyną niekorzystną rzeczą byłoby w tym przypadku marnotrawstwo pamięci.


andrews
Możesz napisać jak można to wyłączyć?
Co do pamięci to kompilator zarezerwował dla struktury 6-bajtów czyli tyle samo co dla pojedynczych zmiennych więc chyba tu nie ma róznicy....

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 17:58 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Chyba trochę źle mnie zrozumiałeś. Nie trzeba niczego wyłączać. Opcja -fpack-struct powinno być włączona. Niezależnie czy jest włączona czy nie, zapis bloku do pamięci z użyciem sizeof() będzie prawidłowy, jednak włączenie -fpack-struct powoduje, że rozmiar struktury nie jest większy niż suma rozmiarów jej elementów, więc tak jest lepiej.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 18:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

no i Panowie zonk :evil:

struktura
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


deklaracje zmiennych
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


funkcja
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

lub
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

nie działa
Wychodzi na to, że kolega sparrow-hawk miał rację tylko cholerka w poradniku Mirkowi działało :(

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 19:00 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

To musi działać. Coś robisz źle, ale trudno tu coś doradzić, jak pokazujesz tylko wybrane linie kodu. Przykładowo pokazujesz tylko deklarację zmiennej ram_cash, a nie widać, czy i jak wpisujesz do niej dane. Na jakiej podstawie twierdzisz, że nie działa? Jak to sprawdzasz?

Jeśli nie chcesz przedstawić całego kodu (bo jest na przykład zbyt obszerny), to ogranicz go do minimum, które odzwierciedla problem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 19:19 
Offline
Użytkownik

Dołączył(a): 25 lip 2015
Posty: 140
Zbananowany użytkownik

Pomógł: 18

Przyznaję, że wcześniej się pomyliłem. I zapis takich struktur z operatorem sizeof() działa. Sprawdziłem to zresztą na symulatorze w AVR Studio i funkcjonuje to bez problemów.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 19:23 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27446
Lokalizacja: Szczecin
Pomógł: 1045

Sparrow-hawk napisał(a):
Od razu powiem, że sizeof(CASH) nie zadziała


zadziała na 100%

Sparrow-hawk napisał(a):
Funkcja eeprom_read_block(...) przydaje się do zapisu tablic, a nie struktur.

W avr gcc struktury w pamięci są adresowane podobnie albo w zasadzie tak samo jak tablice, wykorzystywane są do tego rejestry indeksowe X, Z itp

Najmniejszym polem struktury w prockach avr jest bajt dlatego sizeof( struktura ) .... ZAWSZE zadziała i to nie ważne czy będzie załączone domyślnie -fpack-struct czy nie (choć tu mogę się mylić)

andrews napisał(a):
To musi działać. Coś robisz źle, ale trudno tu coś doradzić, jak pokazujesz tylko wybrane linie kodu.

DOKŁADNIE

a żeby uciąć już to czy sizeof( struktura ) zadziała czy nie - bo widzę że kolega mczarny ciągnie już długo ten temat i wciąż ma zagwozdkę czy sizeof() mu dobrze działa - to ja zachodzę w głowę ....

no jak można sobie tego samemu tak dla siebie - żeby się upewnić - nie sprawdzić. No na prawdę mczarny powiedz mi czy ciężko wpaść na taki mega najprostszy pomysł ?

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


no prościej się nie da .... Tylko nie mów mi że nie masz LCD to nie możesz sprawdzić ... bo jak nie masz LCD to nie da rady ?

Już nie wspomnę że nawet mając 1 diodę LED bym to sobie sprawdził ale jak nie masz LCD to no chyba MUSISZ mieć jakąś przejściówkę USB/RS232 i wtedy terminal w łapki i już masz wyświetlacz - zamieniasz tylko powyższą linię z lcd na:

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


------------------------ [ Dodano po: 1 minucie ]

Sparrow-hawk napisał(a):
Przyznaję, że wcześniej się pomyliłem. I zapis takich struktur z operatorem sizeof() działa. Sprawdziłem to zresztą na symulatorze w AVR Studio i funkcjonuje to bez problemów.


No to teraz warto dodać że tu na AVR zadziała ale już na PC nie musi i nie zadziała zgodnie z oczekiwaniem bez pakowania.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 paź 2016, o 21:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

Już po temacie - poszło
Jak to zwykle u mnie niedopatrzenie - za szybko chcę zrobić a później się zamotam.
Żeby zobaczyć ile bajtów ma struktura to nie muszę tego wyświetlać bo to widać po kompilacji pod warunkiem, że nic innego nie mamy w Eepromie

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2016, o 18:49 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

mirekk36 napisał(a):
No to teraz warto dodać że tu na AVR zadziała ale już na PC nie musi i nie zadziała zgodnie z oczekiwaniem bez pakowania.

Chyba niepotrzebnie namieszałem z tym pakowaniem ;) tym bardziej, że w 8-bitowym mikrokontrolerze nie ma za bardzo potrzeby wyrównywania elementów struktury, więc pewnie i bez pakowania nie będzie ona zawierała padding bytes.

Ja to widzę tak:
Niezależnie od tego, czy struktura jest pakowana czy też nie, operator sizeof() zwróci rzeczywisty rozmiar, jaki struktura zajmuje w pamięci (w przypadku niespakowanej może być większy, choć nie musi). Osobiście nie widzę powodów, aby funkcje operujące na blokach pamięci (np. memset(), memcpy()) miały nie działać prawidłowo z argumentem sizeof(struktura), co najwyżej funkcje będą dodatkowo kopiować nadmiarowe padding bytes.

Myślę, że problemem byłaby tu raczej bezpośrednia wymiana takich struktur danych pomiędzy systemami o różnych rozmiarach wyrównania elementów struktury lub z ustawionym czy też nie ustawionym atrybutem pakowania. Wtedy należy raczej przesyłać poszczególne elementy struktury osobno, jednak nadal trzeba pamiętać o następnym problemie, jakim jest endianess w przypadku typów kilku-bajtowych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2016, o 18:59 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27446
Lokalizacja: Szczecin
Pomógł: 1045

andrews napisał(a):
Myślę, że problemem byłaby tu raczej bezpośrednia wymiana takich struktur danych pomiędzy systemami o różnych rozmiarach wyrównania elementów struktury lub z ustawionym czy też nie ustawionym atrybutem pakowania.

Dokładnie, a często też ludzie mają problemy gdy np (z takimi pytaniami się spotkałem na avrfreaks) chcą sobie od razu do struktur pakować struktury z Modbusa - i nagle zonk ... bo cosik nie pasuje ...

A więc na styku systemów czy różnych protokołów może być tak jak mówiłeś więc nic nie namieszałeś - bo w sumie to WARTO o tym było wspomnieć - a ja robiąc moje starsze poradniki po prostu domyślnie odnosiłem się tylko do programowania AVR i nawet nie pomyślałem o tym.

Ale jak spojrzeć na wymianę danych poprzez struktury pomiędzy systemami to szybko się okaże że problemy nie dotyczą tylko pakowania czy też nie samych struktur - inną podstawową bolączką bywają inne sposoby umieszczania bajtów w słowach czy zmiennych typu DWORD. Chodzi o sposoby typu BigEndian oraz LittleEndian - na tym też szybko można się przejechać na początku tworzenia takiej komunikacji gdy się o tym nie doczyta ;) Pamiętam jak mi się to dało we znaki gdy analizowałem zapis nagłówków pliku WAV w greenbooku na karcie pamięci i umknęło mi to ;)

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 paź 2016, o 19:45 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

mirekk36 napisał(a):
inną podstawową bolączką bywają inne sposoby umieszczania bajtów w słowach czy zmiennych typu DWORD. Chodzi o sposoby typu BigEndian oraz LittleEndian

No tak, o endianness też wspominałem ;)

AVR mają akurat taki sam porządek bajtów co procesory x86 (x86-64) powszechnie stosowane w PC, czyli little-endian, niemniej trzeba na to uważać.
Istnieją również architektury bi-endian, które obsługują zarówno big- jak i little-endian, co czasami bardzo ułatwia sprawę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 31 ]  Przejdź na stronę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO