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



Teraz jest 23 cze 2018, o 14:31


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
Autor Wiadomość
PostNapisane: 9 cze 2018, o 04:45 
Offline
Użytkownik

Dołączył(a): 15 gru 2013
Posty: 174
Pomógł: 3

Proszę o podpowiedz w czym tkwi błąd lub niezrozumienie do końca struktur.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mam taki o to kod, w którym to ma się wyświetlać na linijce LED liczba w zależności od x . W tym problem że na lcd jest wyświetlana liczba x ,lecz ni jak się to ma do odwzorowania na pasku led.
Jeżeli zamiast x wstawie np. 3 to OK. na linijce jest wyświetlana ta liczba, a jeżeli zamiast niej wpiszę x to jest już zupełnie co innego wyświetlane choć niby to też liczba 3. Czego tu nie kumam w czym problem .
Proszę o wskazówkę.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 07:27 
Offline
Użytkownik

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

Na początku przypisujesz zmiennej x wartość zapisaną w ram_cfg.poziom, następnie masz szereg warunków if() gdzie do zmiennej ram_cfg.poziom wpisujesz jakąś inną wartość w zależności od tego , który if jest spełniony. I teraz powinieneś do x wpisać tą nową wartość ram_cfg.poziom. Tymczasem wyświetlasz na LCD wartość x , która była przypisana na samym początku.


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 07:38 
Offline
Tech-support
Avatar użytkownika

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

Witam,
Chodzi o kolejność.
Program jest wykonywany linijka po linijce.
1. ify zapisują do struktury
2. teraz do x zapisz to co jest w strukturze
3. wyświetl x.

Wysłane z mojego Lenovo K33a42 przy użyciu Tapatalka


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 08:02 
Offline
Użytkownik

Dołączył(a): 15 gru 2013
Posty: 174
Pomógł: 3

No dobra może inaczej x =3 ,na wyświetlaczu pokazuje 3 czyli ta sama liczba jest w nawiasie kwadratowym to dlaczego z tablicy jest pobierana zupełnie inną wartość.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 08:25 
Offline
Użytkownik

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

A co w tej tablicy jest zapisane?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 09:09 
Offline
Użytkownik

Dołączył(a): 15 gru 2013
Posty: 174
Pomógł: 3

W tablicy są liczby które mają zapalać ledy na porcie A i tak też działa ale tylko jeżeli wpisze fizycznie jakąś liczbę ale jeżeli za pośrednictwem zmiennej x to już zupełnie inna liczba jest wyświetlana z tablicy. Nie potrafię już jaśniej tego opisać

------------------------ [ Dodano po: 3 minutach ]

uint8_t const tablicy[ ] PROGMEM={ 1,2,4,8,16 }
Tak wygląda tablica.
Nie mam teraz komputera pod ręką żeby skopiować dokładniej kody



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 09:46 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 336
Pomógł: 79

Jeśli zdefiniowałeś tablicę w pamięci FLASH przy użyciu atrybutu PROGMEM, do odczytu jej elementów musisz użyć makra pgm_read_byte():
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Opcjonalnie możesz zdefiniować tablicę we FLASH przy użyciu kwalifikatora __flash i odczytywać jej elementy tak, jak masz w tej chwili:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Możesz wybrać, który sposób jest dla Ciebie wygodniejszy ;)


Autor postu otrzymał pochwałę

_________________
Miksowanie kodu C i ASM przy użyciu GCC



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 9 cze 2018, o 11:33 
Offline
Moderator
Avatar użytkownika

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

a ja od siebie dodam, że poza oczywiście słusznymi uwagami kolegów wyżej, NAJWAŻNIEJSZE to nauczyć się jak TESTOWAĆ własny kod ....

bo jeśli piszesz, że masz x=3 a wyświetla ci się CAŁKIEM inna wartość z tej komórki tablicy to oznacza że robisz jakiegoś TRAGICZNEGO BABOLA ... i co ? a gdyby nie było forum to nie da się tego samemu sprawdzić ? No da się i to bardzo prosto albo chociaż zbliżyć się do problemu.

OCZYWIŚCIE ZAKŁADAM że ta twoja tablica TabPozytyw[] jest zdefiniowana w pamięci RAM ???? bo jeśli we FLASH - to robisz tego MEGA BABOLA o którym wyżej napisał kolega andrews - czyli nie stosujesz do odczytu pgm_read_byte()

UWAGA!

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


i wywalasz na PORTB - i sprawdzasz czy się pokaże na PORTB binarnie liczba 17 .... No toż jeśli mi to zadziała to wiem, że bzdurnie myślałem, że źle tablice obsługuję, że coś nie rozumiem z tablicami - bo działa tak jak ma działać ... TAK czy NIE ?

Dzięki temu posunąłem się do przodu z rozwiązaniem zagadki bo wiem, że problem leży gdzie indziej w moim kodzie. TAK TAK wiem - to bardzo prosty i niektórzy powiedzą, że durny test - tymczasem niestety początkujące osoby NAWET takiego testu nie są w stanie wymyślić - więc go podpowiadam.

---------------------------------

ok ale co dalej ?

no to spójrzmy na ten kod z pierwszego postu

Cytuj:
uint8_t x = ram_cfg.poziom; // <----- tutaj przypisujesz wartość zmiennej x ze struktury ram_cfg.poziom .... załóżmy że była tam w ram_cfg.poziom wartość = 4

// no to teraz w tej sekcji - wartość ram_cfg.poziom zmieni ci załóżmy wartość na 6 bo załóżmy że STAN4_ON był wysoki
// pomijam już fakt, że tu powinny być wszędzie else po pierwszym IF'ie wg mnie
if(STAN0_ON)ram_cfg.poziom = 0;
if(STAN1_ON)ram_cfg.poziom = 1;
if(STAN2_ON)ram_cfg.poziom = 2;
if(STAN3_ON)ram_cfg.poziom = 3;
if(STAN4_ON)ram_cfg.poziom = 4;
if(STAN5_ON)ram_cfg.poziom = 5;
if(STAN6_ON)ram_cfg.poziom = 6;
if(STAN7_ON)ram_cfg.poziom = 7;

// <---- no i teraz czego się spodziewasz ??? jakiej wartości x ??? na pewno będzie to stara wartość jeszcze z przed tych IF'ów
PORTB = TabPozytyw[x];
lcd_locate(1,0);
lcd_int(x);


------------------------ [ Dodano po: 6 minutach ]

a jeśli tablica TabPozytyw() - jest zdefiniowana we Flashu za pomocą PROGMEM to przecież MUSISZ pan to zrobić tak do PORTB

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


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: 9 cze 2018, o 17:56 
Offline
Użytkownik

Dołączył(a): 15 gru 2013
Posty: 174
Pomógł: 3

Panowie no i oczywiście działa :D .Wiem to są podstawy i zdaję sobie sprawę że to nawet śmieszne pytać się na forum o takie rzeczy :oops: no ale jakoś nie dałem rady znów wpaść na ten ogromy babol :evil: . zazdroszczę wam takiej wiedzy ale to też mnie motywuje do dalszej nauki, tej pięknej sztuki jaką jest programowanie w "C". Dziękuję Wam 8-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2018, o 09:06 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 1460
Pomógł: 71

W skrócie to: książki, czytać, praktykować :)



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

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: tom_zas i 1 gość


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