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



Teraz jest 20 gru 2024, o 02:35


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 8 ] 
Autor Wiadomość
PostNapisane: 28 maja 2015, o 21:38 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 maja 2015
Posty: 10
Pomógł: 0

witajcie, jestem początkujący w C i postanowiłem napisać program, który wyświetli na 4-cyfrowym segmentowym wyświetlaczu informację z 8-elementowej tablicy. W tej tablicy mogą być cyfry, niektóre litery i niektóre znaki specjalne, w tym kropka. Mimo czterech pól wyświetlacza zdecydowałem się zastosować tablicę 8 (a nie 4) elementów, gdyż zakładam, że można do niej wrzucić tekst: "A.C.E.F.", który by wyświetlił podane litery, oraz zapalił wszystkie kropki między nimi. Cyfry, litery i znaki wyświetlają się prawidłowo. Problem mam z kropką, na którą przeznaczyłem oddzielną zmienną. Moją intencją jest utworzenie takiej zmiennej dot (tak ją nazwałem), żeby po wprowadzeniu np. "0.uP.A" miała wartość 0b00001010, co powinno oznaczać, że w drugiej i czwartej cyfrze od prawej na wyświetlaczu powinna się świecić kropka. Funkcja analizująca zmienną i wyświetlająca kropki we właściwych miejscach na podstawie zmiennej dot działa prawidłowo, jednak sama zmienna przyjmuje dziwne wartości, na przykład dla "A." zmienna ma wartość 0b11111100. Bity w zmiennej są wielokrotnie przesuwane, ale w puste miejsca powinny wskakiwać zera, nie wiem dlaczego w tej zmiennej jest tyle jedynek, skoro powinna pojawić się jedna. Proszę o pomoc.

Piny a-g wyświetlacza podłączone są odpowiednio do portu PB0-PB7
Piny A1-A4 są podłączone przez tranzystory odpowiednio do portu PC0-PC4

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



Ostatnio edytowano 29 maja 2015, o 16:35 przez Lexander, łącznie edytowano 3 razy

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2015, o 10:16 
Offline
Użytkownik

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

Chwilowo nie widać kodu, ale z opisu problemu wynika, że tą zmienną przechowującą dane gdzie mają być wyswietlane kropki - masz zapewne zadeklarowaną jako typ ze znakiem (pewnie int8_t). W przypadku przesuwania bitowego w prawo liczby ze znakiem, w wolne miejsca będzie wpisywana taka wartość jak była w najstarszym bicie przesuwanej zmiennej. Czyli np.:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Przy przesuwaniu w lewo nie ma znaczenia czy zmienna jest int czy uint - zawsze uzupełniana jest zerami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2015, o 15:12 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 maja 2015
Posty: 10
Pomógł: 0

@janusz
ciekawe, nie wiedziałem tego wcześniej

Niemniej jednak u mnie bity są przesuwane w lewo, a jedynek jest zdecydowany nadmiar



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2015, o 16:32 
Offline
Użytkownik

Dołączył(a): 25 lut 2015
Posty: 252
Lokalizacja: Lublin
Pomógł: 23

Wklej proszę kod poprawnie, bo teraz, to jakaś masakra wyszła
i komu będzie się chciało to odszyfrowywać...
topic7402.html

------------------------ [ Dodano po: 31 minutach ]

Przede wszystkim zmień deklaracje, tak, jak napisał Ci Janusz17.
int8_t i int na uint8_t
Wystarczy Ci zakres 0-255.
Dopiero dalej szukaj.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 29 maja 2015, o 21:44 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 maja 2015
Posty: 10
Pomógł: 0

Ten krok już wykonałem, wciąż nie rozumiem dziwnego zachowania tego bitu, mógłby ktoś przeanalizować ten kod ze mną? Konkretnie funkcja showNum do case 46.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2015, o 07:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 31 mar 2015
Posty: 310
Pomógł: 18

Lexander napisał(a):
Ten krok już wykonałem, wciąż nie rozumiem dziwnego zachowania tego bitu, mógłby ktoś przeanalizować ten kod ze mną?

Kto lubi cofać się ? A jednak trzeba wrócić się do konfiguracji sprzętu ;)
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: 30 maja 2015, o 08:11 
Offline
Użytkownik

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

Nic dziwnego w tym nie ma, że w zmiennej dot pojawiają się dodatkowe jedynki. W funkcji showNum(int8_t liczba[8]), w pętli for następuje wielokrotne przesunięcie jedynki w zmiennej dot. Jednak dodatkowo po wybraniu "kropki" - wartość case 46 w instrukcji switch - zwiększasz dot o 1 (dot++). Zatem pojawiają sie dodatkowe jedynki w zależności od ilości kropek i pozycji na której występują, które też są przesuwane w następnych obiegach pętli for.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 30 maja 2015, o 20:36 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 28 maja 2015
Posty: 10
Pomógł: 0

@up
Przecież takie jest założenie, jedynek ma być tyle, ile jest kropek. Jeżeli dana wejściowa do funkcji ma 3 kropki, to przy tych 8 przebiegach pętli powinna ona trzykrotnie inkrementować zmienną. Problem w tym, że dla jednej kropki jedynek jest 6.



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

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