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



Teraz jest 5 lut 2025, o 23:46


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
Autor Wiadomość
PostNapisane: 3 sie 2014, o 19:35 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 5
Pomógł: 0

Witam, pisze proste menu do terminala po rs232. Menu ma wygladac tak ze zaraz po tekscie, ma wystepowac odpowiadajaca liczba do edycji. O ile z wyswietleniem tekstu i wyboru nie ma problemu, to powstal w chwili gdy chce zapisac we flashu wskazniki do zmiennych, i odwolywac sie do nich.

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


W rezultacie wyswietla 255. W czym jest problem? Jeżeli uda się to naprawić umieszcze pod koniec tematu caly poprawny kod menu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 sie 2014, o 20:59 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

A robiłeś próbę ze zdefiniowaniem tablicy w osobnej instrukcji i przypisaniem wartości jej elementom w osobnych?

Tak ot, na próbę?

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

A nie... przecież do flasha się nie da tak zapisać :P To nie EEPROM.

Sorry, pospieszyłem się.


Ale gdybyś na chwilę zmienił koncepcję i spróbował z EEPROMEM i zobaczył jak to hulnie?



Ostatnio edytowano 3 sie 2014, o 21:07 przez HCOOH, łącznie edytowano 1 raz

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

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

W języku C niezależnie od typu wskaźnika i tak jego rozmiar wynosi 2B.
Typ wskaźnika informuje jedynie o wielkości przesunięcia w przypadku artytmetyki wskaźników.

Spróbuj może zamienić funkcję odczytu na "pgm_read_word"...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 05:22 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 5
Pomógł: 0

Próbowałem pgm_read_word, zmieniac zmienna ptr na int ze wskazniiem i bez, czyli milion roznych ustawien az ruszy. Może ktoś wyprowadzi mnie z błędu jednym słowem. Wstawie może cały kod dla czytelności.

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


Złe podejście czy skladnia?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 08:53 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 29 maja 2013
Posty: 432
Lokalizacja: Gostyń / Poznań
Pomógł: 25

A ja jako że mało wiem to zapytam czy char jest domyslnie ze znakiem? bo jesli tak to chyba nie moze przyjmować wartości a6=128? z tego co mówi internet to zakres -128 : 127... Może tu jest problem...
Czy to 255 jest przy każdej pozycji w tym menu?

_________________
Podpis...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 17:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 16 lut 2014
Posty: 96
Lokalizacja: Łódź
Pomógł: 6

Może mi się już miesza w głowie, ale i tak wyjdę z propozycją :P


Może spróbuj w 128 linii zrobić:
ptr=pgm_read_byte(&(menu_ptr[a]));
lub
ptr=pgm_read_byte(menu_ptr + a);

zamiast:
ptr=pgm_read_byte(menu_ptr[a]);
?

------------------------ [ Dodano po: 2 minutach ]

Czyli (głośno myślę) wykonać makro pgm_read_byte na adresie zmiennej menu_ptr[a], które zwróci jej zawartość, czyli adres do zmiennej typu char, który zostanie zapisany we wskaźniku (char* ptr) do zmiennej char :D



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 18:07 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 5
Pomógł: 0

Rzeczywiscie, pomylilo mi sie, ale wartosc 123 i tak powinno obslugiwac.

Udalo mi sie naprawic problem nie wiem jeszcze jak poprawić warning
" warning: assignment makes pointer from integer without a cast"

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.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 19:11 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

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: 4 sie 2014, o 19:23 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 5
Pomógł: 0

Proste a jednak nie. Zmienna ptr mam typu:
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 po wpiasniu:

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


wywala:

"main.c:128: warning: cast to pointer from integer of different size
"



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 19:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Czyli w tym momencie ostrzeżenie dotyczące przypisania zlikwidowane.
Może ponownie spróbuj z funkcją "pgm_read_word", gdyż odczytujesz adres, który jest liczbą 16-bitową.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 20:17 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

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

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



pgm_read_byte zwraca wartość typu char a NIE wskaźnik. To przypisanie jest nieprawidłowe. Poza tym tablica menu_ptr przechowuje wskaźniki więc operator & jest niepotrzebny.
Możesz napisać tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

...ale na patrząc pobieżnie na Twój program raczej nie będzie to miało sensu. Raczej coś takiego:
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: 4 sie 2014, o 20:32 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 kwi 2013
Posty: 418
Lokalizacja: Rzeszów
Pomógł: 102

Dowolną wartość liczbową (całkowitą, a taką objęty jest typ char) można rzutować na typ wskaźnikowy. Tak właśnie działają wszystkie makrodefinicje określające nazwy rejestrów np. PORTA, DDRC, UDR1, TCCRA0 itd.. Jest to rzutowanie zwykłych "intów" (adresów) na typy wskaźnikowe.
Jeżeli autor tematu zapisuje adresy zmiennych (tj. liczby dwu-bajtowe) w pamięci FLASH to po ich odczycie trzeba dokonać rzutowania, a później ewentualnej dereferencji. W przeciwnym wypadku odczytana wartość nic nie wnosi - jest to po prostu liczba (adres).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 sie 2014, o 21:39 
Offline
Użytkownik

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

No dobra, niech tam będzie...tylko po coś tam wsadził '&'?

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 sie 2014, o 05:17 
Offline
Nowy

Dołączył(a): 29 lip 2014
Posty: 5
Pomógł: 0

Ustawienie zmiennej ptr jako zwykla zmienna powoduje tylko dobranie sie do adresow zmiennych, a jak dobrac sie do wartosci ktora siedzi pod adresem? Rzutowanie na wskaznik nie dziala natomiast rozwiazalem to tak tyle ze juz na intach bo domyslnie:

int *ptr;
ptr=(int*)pgm_read_word(&menu_ptr[a]); //rzutowanie na wskaznik bo takiego typu jest ptr
uart_putint((int)*ptr, 10); //rzutowanie na int bo funkcja pobiera int

Wszystko dziala, dziekuje i pozdrawiam!



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

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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO