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



Teraz jest 28 mar 2024, o 17:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 26 sie 2016, o 20:53 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Witam.
Usiłuję zapisać zmienną do wewnętrznej pamięci eeprom atmegi32. Mój problem polega na tym że kompilator wskazuje cały czas na błąd w linijce
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2016, o 21:01 
Offline
Użytkownik

Dołączył(a): 18 kwi 2013
Posty: 181
Lokalizacja: Kraków
Pomógł: 30

Zmienna w pamięci EEPROM musi być deklarowana jako zmienna globalna, a więc przed funkcją main().



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2016, o 21:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

A ten "przydomek" EEMEM powinien być raczej za nazwą zmiennej, i do tego nie inicjalizuje się w ten sposób zmiennych w pamięci EEPROM.

edit:
Inicjalizację możesz zrobić przez funkcję eeprom_write_byte(). Odczytując bajt powinieneś jako argument funkcji eeprom_read_byte() podać adres tej zmiennej, a jej wartość zostanie zwrócona przez funkcję.

Tu masz coś co pewnie się przyda:
http://www.atmel.com/webdoc/AVRLibcReferenceManual/group__avr__eeprom.html



Ostatnio edytowano 26 sie 2016, o 21:24 przez wojtekr51, łącznie edytowano 2 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2016, o 21:11 
Offline
Użytkownik

Dołączył(a): 29 lip 2014
Posty: 195
Pomógł: 44

Witam,

Przecież kompilator "napisał" Ci o co mu chodzi - chce argumentu typu uint8_t* w funkcji eeprom_write_byte(...)
popraw linie:

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

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


a... i to co Kolega janusz17 Ci napisał.

A tak "poza konkursem ;-)", linia
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

jest tez błędna - OCR0 to przecież rejestr 8 bitowy.

Pozdrawiam, QuadMan.

Dopisane:

wojtekr51 napisał(a):
A ten "przydomek" EEMEM powinien być raczej za nazwą zmiennej....


W tym wypadku kolejność specyfikatorów nie ma znaczenia.

wojtekr51 napisał(a):
....i do tego nie inicjalizuje się w ten sposób zmiennych w pamięci EEPROM.


Może eleganckie to nie jest, choć merytorycznie poprawne i działać będzie.

Dopisane2:

Kolego wojtekr51 źle zrozumiałem Twoją wypowiedź dotyczącą inicjalizacji zmiennych w pamięci EEPROM - myślałem, że chodzi Ci o stworzenie struktury z danymi dla EEPROMA, bo to że aby zmienna fizycznie znalazła się w pamięci EEPROM, trzeba wywołać funkcję eeprom_write_byte(...) to dla mnie oczywistość.

Pozdrawiam serdecznie QuadMan.



Ostatnio edytowano 26 sie 2016, o 21:33 przez QuadMan, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2016, o 21:20 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Panowie nie spodziewałem się takiej szybkiej odpowiedzi. Jutro jak wrócę do domu biorę się za testowanie. Jeszcze wiele przedemną jeżeli chodzi o programowanie c avr ale idę cały czas do przodu;)
Pozdrawiam miłego wieczoru ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 26 sie 2016, o 21:30 
Offline
Moderator
Avatar użytkownika

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

henryxxl napisał(a):
uint8_t EEMEM a=1 ;
czas_trwania_podkladania = eeprom_read_byte(a);

Nie baw się w takie bezsensowne podejście do EEPROM w procku bo to cię tylko na manowce sprowadzi i coraz większe kłopoty - tak się nie robi ... chcesz zobaczyć jak wygodnie się posługiwać EEPROMEM w procku

to koniecznie obejrzyj to:

http://mirekk36.blogspot.com/2012/11/av ... iazek.html

i rób to jak należy ;) mówię ci


Autor postu otrzymał pochwałę

_________________
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: 26 sie 2016, o 23:22 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

Z ciekawości sprawdziłem sobie jak to jest z tą inicjalizacją EEPROMA. Rzeczywiście da się zainicjalizować przy definiowaniu zmiennej. I stwierdziłem że obojętne jest z której strony będzie specyfikator.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
(Zawsze dawałem specyfikator z prawej strony i bezpośrednio do nazwy zmiennej chciałem dopisać wartość, co skutkowało błędem. Teraz wiem czemu myślałem że tak się nie da :oops: )

Kompilator tworzy plik z rozszerzeniem .eep w którym jest utworzony obraz pamięci EEPROM. Jeżeli chcemy to wgrywamy również go do mikrokontrolera.

A to jak powinno się właściwie jeść tę potrawę jaką jest eeprom, najlepiej tłumaczy pan Mirek. Tu na razie tylko sobie smakujemy. ;)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 11:19 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Oglądam właśnie poradniki i mam problem z dzieleniem programu. Przed dzieleniem działał a po dzieleniu nie wykonują się działania z common.c
program liczy sekundy i wyświetla je na ekranie (zmienna czas);
Proszę o naprowadzenie w czym tkwi problem ;)
main
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 11:56 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

Popatrz na plik main.c linia 44 ;)


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 14:38 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

kolego wojtekr51 aż mi wstyd;)
Teraz usiłuję zapisać do eeprom wartość zmiennej czas_trwania_podkladania i przy uruchomieniu odczytać tą wartość z epprom ale wyskakują mi błędy w main (linijka 41 i 106) i common.h (linijka 19). Nie wiem czego nie zrozumiałem w poradniku że coś źle robię.
main
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

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



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

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

W pliku common.h linia 19 nieprawidłowo zdefiniowałeś makro. Jego nazwa jest identyczna jak element wyżej zdefiniowanego typu strukturalnego TCFG. I podpowiem że dobrą praktyką jest pisanie nazw makrodefinicji wielkimi literami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 16:44 
Offline
Użytkownik

Dołączył(a): 04 lis 2012
Posty: 108
Pomógł: 0

Po usunięciu 19 linijki wyskoczył mi błąd w 14 linijce main błąd: "'czas_dzialania' undeclared here (not in a function)".
Pozdrawiam ;0



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 sie 2016, o 20:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 wrz 2013
Posty: 74
Lokalizacja: Sierakowice/Gdańsk
Pomógł: 9

No oczywiście że wyskoczył. :roll: :D Makrodefinicja którą usunąłeś definiowała, jaka liczba ma być podstawiona w miejsce nazwy "czas_dzialania", gdzie właśnie teraz wyskoczył błąd. Wpisz w to miejsce bezpośrednio liczbę, lub gdy takich miejsc jest więcej, przywróć definicję makro którą usunąłeś, tylko zmień jej nazwę.

Polecam koledze poćwiczyć język C od podstaw. ;)



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: 13 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 7 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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO