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



Teraz jest 20 kwi 2026, o 11:09


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 46 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
PostNapisane: 13 lis 2014, o 00:06 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Hej. Postanowiłem zmienić RTC w moim zegarze z PCFa na DS 3231. Wszystko zaprojektowałem, zrobiłem nową płytkę (przy okazji poprawiłem stare błędy :) ) zainicjalizowałem PCFa wszystko wygląda na to, ze gra, bo na wyjściu mam 1hz.

Na prawdę wielokrotnie przejrzałem poradnik Mirka na temat tego DSa Nie byłoby tego pytania, gdybym używał wyświetlacza LCD przerwania zewnętrznego tak jak jest w przykładzie.
Ja natomiast nie mogę użyć przerwania zewnętrznego (mam zajęte porty), i chcę wyświetlać na wyświetlaczu LED. Tym samym łatwiej mi było pozbyć się struktur i unii jak to jest w przykładzie, i odczytywać bardziej bezpośrednio poszczególne komórki pamięci DSa. To pytanie to prośba tak mi się wydaje o pokazanie sposobu odczytu tych komórek. Mirek robił to właśnie unią i strukturą Ja napisałem taki początek:

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


Jak widzicie problem chyba bardziej leży w zrozumieniu wskaźników Ja rozumuję to tak.


Jeśli chcę odczytać wartość godziny z poniższej tablicy
Obrazek

to odczytuję najpierw bajt - adres w której bity godziny się znajdują tj adres 02 a następnie wyciągam z tego bajtu bity godziny i następnie konwertuję je na bin2dec.
Taki zapis powinien załatwić sprawę
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
ale jak teraz wyłuskać te cztery interesujące mnie bity (podejrzewam że wskaźnikiem, ale jak go użyć?)

W funkcji zapisu do pamięci widzę że można także użyć bufora :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


i tutaj nie trzeba kombinować ze wskaźnikami. Zna ktoś jakiś prosty sposób, i mógłby mi go opisać jak te komórki odczytywać bez unii i struktur? Wystarczy jeden przykład z oznaczonymi miejscami gdzie adresujemy bajt i gdzie wyciągamy bity. I czy trzeba stosować wskaźniki?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 02:12 
Offline
Użytkownik
Avatar użytkownika

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

Zupełnie nie rozumiem co mają ze sobą wspólnego przerwania, LED/LCD i struktury.
Struktury oraz unie mają być pomocą przy opisywaniu jakiś złożonych typów danych (same nimi są). Jest już bardzo późno i zapewne dlatego nie rozumiem dlaczego przez przerwania zewnętrzne i brak wolnych pinów trzeba było się pozbyć struktur :shock:...

Dostęp do poszczególnych bitów można uzyskać oczywiście przez maski bitowe, ale również przyjemniej poprzez ..... struktury ;), a dokładniej pola bitowe:

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: 13 lis 2014, o 07:24 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Przerwania zewnętrzne faktycznie ze strukturami nie mają nic wspólnego, jednak wspomniałem o nich ponieważ Mirek w swoim przykładzie wykorzystuje je jako zewnętrzny sygnał do odczytu DSa. Ja będę musiał to zrealizować na jakimś opóźnieniu jednak to nie będzie stanowić większego problemu. Po prostu pisząc o tym chciałem zasygnalizować że moje "inne" podejście jest czymś uzasadnione.

Co do odpowiedzi kolegi powyżej to skomplikowanym przynajmniej dla minie jest mimo to dostęp do tych zmiennych strukturalnych Próbowałem, ale nie jestem w stanie wskazać zmiennej Hour jako argumentu do mojej funkcji wyświetlania czy też przeliczenia bcd2dec bezpośrednio

Po podanym niżej (i powyżej w pierwszym poście) przykładzie zapisu :
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


widzę że można to zrobić bardziej bezpośrednio jak pisałem.
Faktycznie widzę korzyści z zastosowania tej struktury Mirek także o nich mówi ale przekształcanie tych zmiennych i ich wykorzystanie jest też trochę kłopotliwe i chcę tutaj wyważyć Czy łatwiej będzie zastosować te struktury i następnie je przepisywać do innych ( i w jaki sposób), czy też łatwiej będzie działać trochę staroświecko odczytując każdy bajt oddzielną funkcją.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 08:13 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

no ale przecież skoro nie chcesz na strukturach to możesz to zrobić
dokładnie tak samo jak robiłeś do tej pory z wykorzystaniem PCF'a.
Co najwyżej zmienią Ci się tylko adresy rejestrów w których masz
poszczególne dane dotyczące czasu i daty.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 09:26 
Offline
Moderator
Avatar użytkownika

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

Jarosław J napisał(a):
ale jak teraz wyłuskać te cztery interesujące mnie bity (podejrzewam że wskaźnikiem, ale jak go użyć?)


No myślę, że tu przydałoby się obejrzeć poradnik o maskowaniu bitów a nie myśleć o wskaźnikach, które tak samo nie mają nic wspólnego z wyciągnięciem godziny jak struktury czy unie ... (o ile w ogóle zrozumiałem problem):

http://mirekk36.blogspot.com/2014/03/ma ... m-oka.html

po takim poradniku od razu kolega napisałby odczytywanie godzin tak:

Cytuj:
hh = bcd2dec( TWI_read_buf( DS3231_ADDR, 0x02) & 0b00111111 );


użycie tutaj wskaźnika w postaci

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


nie ma większego znaczenia - bo co to za różnica czy napiszemy hh= czy też *hh= ??? żadna różnica - ważne jest to żeby zamaskować nie używane przez godziny bity jak wyżej pokazuję. Zakładam oczywiście że wcześniej ustawiony został bit odpowiedzialny za pokazywanie godzin w systemie 24 godzinnym.

a gdyby trzeba to było zrobić nie do zmiennej hh występującej "luzem" tylko w strukturze to też co za problem ?

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


i co za problem ? jak widać (jeszcze raz się powtórzę) ... tu chodzi TYLKO o maskowanie a nie o jakiś tajemniczo-trudny dostęp do struktur. Wręcz odwrotnie układanie danych w struktury ZAWSZE TYLKO POMAGA. I zdecydowanie warto korzystać ze struktur zamiast ze zmiennych wałęsających się luzem po programie ;)

_________________
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: 13 lis 2014, o 11:27 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Powoli mi się coś rozjaśnia Rozumiem maskowanie bitów, ale widzicie, że nie wpadłem na to tak od razu, że można to zrobić w jednym działaniu. Znajdźcie proszę chwilkę i spójrzcie na mój kod, który oczywiście nawet się nie chce skompilować.

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: 13 lis 2014, o 11:43 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

to w linii 26 co nie wiesz po co jest
to deklaracja globalnej zmiennej strukturalnej ;-)
i zdecydowanie być musi :lol:

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

komentarz w linii 41 to raczej nie to.
Dbaj o aktualność komentarzy bo to może Cię kiedyś zaprowadzić na manowce...

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

Z tym, że przypisujesz tylko jedności godzin, minut i sekund. Wiesz o tym?

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 12:05 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Tak wiem. Program zmieniałem na bieżąco, żeby łatwiej było czytać jednak to z pewnością nie powoduje błędów kompilacji
Wyrzuca mi że
Cytuj:
error: expected expression before 'uint8_t
' w linijce 47
Cytuj:
error: too few arguments to function 'DS3231_get_datetime
w tej samej linijce i w linijkach 55 56 i 57
Będę wiedział jak pobrać i połączyć pozostałą część godzin minut i sekund. Na razie chcę ujednolicić sam odczyt.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 12:08 
Offline
Moderator
Avatar użytkownika

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

Jarosław J napisał(a):
// Tu definiuję strukturę ze zmiennymi
typedef struct {
      uint8_t ss;
      uint8_t mm;
      uint8_t hh;
    } TTIME;
 
    TTIME time;// Tu  nie wiem po co to  jest  ale widocznie być musi.


No zobacz ... pierwszy z komentarzy mówi - że tu definiujesz strukturę. BŁĄD! :( .... nie definiujesz struktury - nie widzisz słówka TYPEDEF ? ... ten specyfikator mówi że definiujesz (Uwżaj!) .... TYP STRUKTURALNY hmmm TYP Struktury, ogólnie - nowy TYP zmiennej. I zaraz potem w kolejnej linii tworzysz zmienną tego typu

TTIME time;

przecież pomyśl to podobne jak np:

uint8_t a;

co tu widzisz powyżej ? Trzeba sięgnąć do pierwszej części Bluebooka - tu widzisz - że definiujemy zmienną o nazwie "a", która będzie typu uint8_t a wyżej ? ... że definiujemy zmienną o nazwie "time", która będzie typu TTIME (czyli typu takiego jak przed chwilą sam stworzyłeś, a zatem zmienna time to będzie twoja struktura i to w TYM miejscu następuje jej DEFINICJA - teraz jaśniej ?)

_________________
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: 13 lis 2014, o 12:19 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

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

Z tym że to załatwi (mam nadzieję) pobranie i wrzucenie do do struktury a wyświetlanie to już inna sprawa.
Nie testowałem i tylko mi się wydaje, że powinno działać :P

------------------------ [ Dodano po: 11 minutach ]

Inna sprawa, że zmienna strukturalna time jest globalna,
więc w ogóle nie musisz jes przekazywać do funkcji get_time.
A wtedy w funkcji odwołujesz się do pól struktury przez kropkę
tak jak Ty to napisałeś
Wtedy masz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 14:01 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Przepisałem Twój przykład i kolejne błędy. Spróbuję opisać jak to rozumiem. Bardzo proszę poprawiajcie mnie intensywnie.


Tworzę typ strukturalny, żeby odczytywać całe bajty z pamięci zamiast pojedynczych komórek.
Będę odczytywał czas czyli tworzę w strukturze zmienne strukturalne o nazwie hh, mm, ss, wszystkie typu uint8_t.
Robię to w ten sposób
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Druga sprawa definiuję zmienną strukturalną o nazwie "time" typu TTIME tym zapisem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

To jeszcze rozumiem. Będę w przyszłości posługiwał się tą zmienną time jako argumentem w funkcjach do wyciągania danych.

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

ze wskazaniem że będę korzystał z tej struktury o nazwie time

Dalej piszę funkcję wyciągającą te dane czyli zaczynam tak


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

Nie wiem tylko dla czego przy deklaracji kolega napisał w argumencie *time, a w definicji &time.

Dalej przypisuję czyli rozumiem to tak w strukturze time, przypisuję wewnętrznej zmiennej hh PRZEKONWERTOWANE DO DEC to co odczytam spod adresu na przykład 0x02 z maską założoną na cztery pierwsze bity tego adresu To pozostaje mi jeszcze wywołać tę funkcję w głównej pętli
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Tutaj też nie wiem na ile ten argument &time jest potrzebny jak pisał kolega wcześniej

Tylko teraz jak dostać się do tych zmiennych hh mm ss Czy trzeba powołać jakieś inne zmienne i je przepisać jeszcze jakoś?

Bardzo proszę o pomoc. Pokazałem Wam to co rozumiem i to czego nie rozumiem. Powiedzcie mi co rozumiem źle i o czym jeszcze nie wiem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 14:18 
Offline
Moderator
Avatar użytkownika

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

to jest zła deklaracja :(

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


a gdzie panie TYP przekazywanego argumentu ? ... zapominasz o typach, musi być np tak:

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


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

to co dalej opisałeś tym bardziej jest źle i nie dziw że lecą błędy na potęgę

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


nie dość że & zamiast * ..... to tu też chyba jak już sam rozumiesz brak TYPU ...

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

zajrzyj proszę do rozdziału w BB o tym jak się tworzy funkcje ... jak się tworzy argumenty itp .. to naprawdę pomoże - bo teraz tego ci brakuje i dlatego się totalnie gubisz

_________________
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: 13 lis 2014, o 15:03 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A to ja koledze namieszałem :oops: sorki

------------------------ [ Dodano po: 15 minutach ]

No a skoro namieszałem to trzeba spróbować odkręcić. ;-)
Przy deklaracji i definicji funkcji musi być typ przekazywanego argumentu czyli poprawiamy na:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

A przy wywołaniu już w funkji main():
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

* gwiazdka informuje, że zmienna to wskaźnik
Natomiast znak & to operator wyłuskania - pozyskania adresu który do zmiennej przekazujesz
Nie potrzebujesz już żadnych dodatkowych zmiennych. Wszystkie dane masz umieszczone w strukturze

------------------------ [ Dodano po: 18 minutach ]

A jak się donich dostać?
Jeśli operujesz bezpośrednio na strukturze
to korzystasz z kropki 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.

A jeśli korzystasz ze wskaźnika to wtedy do konkretnego pola odwołujesz się przez "strzałkę" np.:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 lis 2014, o 15:40 
Offline
Moderator
Avatar użytkownika

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

MirkoT napisał(a):
No a skoro namieszałem to trzeba spróbować odkręcić.

No i ładnie wyjaśnione ! .... ;)

_________________
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: 14 lis 2014, o 19:50 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Wybaczcie koledzy ale wywaliło mi błąd że za mało argumentów w funkcji TWI_read_buf w ciele funkcji Wpisałem adres, dalej mam podać ilość bitów do odczytania i co? Zmienną jakąś lokalną, czy jeszcze raz zmienną strukturalną podać?

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


|Próbuję tak i tak i błędy jakich w życiu nie widziałem

Cytuj:
../main.c:104: warning: passing argument 4 of 'TWI_read_buf' makes pointer from integer without a cast
../main.c:104: error: void value not ignored as it ought to be


i inne

W deklaracji funkcji TWI widzę że żąda jakiegoś wskaźnika ale co mam tu wskazać jako *buf ?
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.




W sumie zbyt wiele chciałem sam Teraz spojrzałem do pliku Mirka do Dsa, i widzę tam taki zapis


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



Tylko kląć mi się chce, bo niewiele z tego znów rozumiem.
Bufor ma wartość 7 bo odczytuję 7 pozycji w tamtym przykładzie unia wygląda tak :

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 jeśli zrobię to po Mirkowemu to i tak będę mógł dobrać się do poszczególnych zmiennych sposobem kolegi MirkoT ? Zaraz spróbuję....

------------------------ [ Dodano po: 55 minutach ]

I znów pod górkę

Zrobiłem tak jak mówił kolega wcześniej czyli:

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



i co dostałem?

Cytuj:
../main.c:121: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:122: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:123: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:124: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:125: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:126: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:127: error: invalid type argument of '->' (have 'TDATETIME')
../main.c:128: error: invalid type argument of '->' (have 'TDATETIME')


Kiedy zmienię na TDATETIME
dostaję

Cytuj:
../main.c:121: error: expected expression before 'TDATETIME'
../main.c:122: error: expected expression before 'TDATETIME'
../main.c:123: error: expected expression before 'TDATETIME'
../main.c:124: error: expected expression before 'TDATETIME'
../main.c:125: error: expected expression before 'TDATETIME'
../main.c:126: error: expected expression before 'TDATETIME'
../main.c:127: error: expected expression before 'TDATETIME'
../main.c:128: error: expected expression before 'TDATETIME'


I jak tu żyć? Pomoże ktoś ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2014, o 21:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Kolego a moglbys wkleic jak wyglada teraz Twoj kod ? Byloby na pewno latiwej cos podpowiedziec :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lis 2014, o 21:28 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Wyszło mi sposobem odczytu ze struktury

Teraz kod wygląda tak:


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


Jak widzicie dodałem w strukturze jeszcze jedno pole dot wieku. Jak jest, to dla czego by nie wykorzystać. Mam na razie mały problem jeszcze z wyświetlaniem, ale powoli dojdę. Na razie dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2014, o 09:15 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Hej To znów ja. Poradziłem sobie z odczytem DSa, sposobem Mirka Powyżej jest kod który na razie używam i widzę że działa... ALE nie do końca.

Zauważyłem, że prześwituje mi na każdym z wyświetlaczy cyfra zero. Czyli słabo świecą wszystkie segmenty oprócz segmentu G. Mocno zaś świecą segmenty które mają się świecić czyli wskazujące cyfrę godziny. Problem nie leży w funkcji wyświetlającej, ponieważ jak widać przekazuję do niej w pętli głównej dwie liczby i dwie zmienne odpowiadające za kropkę i formatowanie. Jęśli na sztywno wpiszę jakieś wartości problem znika. Zauważyłem jeszcze, że im częściej wywołuję funkcję GET DATETIME (na przykłąd bez opóźnienia w pętli głównej) to świecenie niepożądanych segmentów jest słabsze. Jeśli zaś rzadziej wywołuję tę funkcję czyli dam opóźnienie w pętli powyżej 100ms to świecą się same zera. Stąd wyciągnąłem wniosek, że funkcja GET DATETIME tylko na chwilę pobiera wartość z DSa a potem te zmienne resetuje do zera. Dla tego im częściej pobiera tym wyraźniej widać godzinę. Próbowałem już rzadziej wywoływać, częściej przepisywać i odwrotnie, ale nic nie dało efektu. Podejrzewam, że taka jest natura struktury - czy w tym wypadku unii - , że tak się zachowuje. Możecie spojrzeć na ten krótki program i podpowiedzieć mi jak sobie z tym poradzić?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2014, o 10:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Jarku ,

Nie wiem czy gdzies w watku mi umknelo czy nie podales tego szczegolu ... uzywasz segmentowego wyswietlacza 4x7 i sterujesz nim uzywajac funkcji ?

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


Jesli tak to pokaz prosze jak ta funkcja wyglada u Ciebie. Natomiast jesli ominalem jakis szczegol ktory juz podales wczesniej to sorry :O

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 lis 2014, o 11:03 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Tak. Steruję wyświetlaczem 6*7segm i robię to przy pomocy funkcji, do której wysyłam zmienną uint16 wskazującą godzinę np 2234 zmienną 8 bit na mniejszy wyświetlacz, kolejną zmienną na znak minus, w przypadku wyświetlania temperatury, i kolejna zmienna wskazująca tryb wyświetlania (czy jedno zero wygaszone w wypadku wyświetlania godziny czy wyświetlam dwa zera w przypadku wyświetlania temperatury 0.0. Jeśli chcesz tę funkcję to proszę, jednak ona działała dobrze. Skopiowałem ją ze starego układu z PCFem, jedyną różnicą w programie jest zastosowanie właśnie unii i wyczuwam, że to tu jest bug.


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


Jak już pisałem w przypadku pętli głównej wyłącznie ze wskazanymi argumentami na sztywno bądź też zmiennymi zmieniającymi się w tej pętli wyświetlanie działa poprawnie. Tylko kiedy zmienne godzin minut i sekund przepisuję z unii to problem się pojawia.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 19:20 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Koledzy pomóżcie jeśli łaska nie wiem jak to działa, że nie mogę przypisać zmiennych na stałe. mam wrażenie że przypisuję je tylko na chwilę i potem mi się zeruj. Trzy posty powyżej opisałem swój problem. Jeszcze raz proszę o pomoc.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 19:33 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 12 maja 2014
Posty: 1089
Pomógł: 34

Sluchaj bardzo chcialbym Ci pomoc :) tylko ,ze jako poczatkujacy moge nie miec tyle dosw :)

Ale probujac znalezc glowny problem. To na chwile wyelminuj sobie unie/struktury i zobacz czy bedziesz nadal miec ten sam problem. Wtedy bedziemy wiedziec gdzie dalej szukac problemu :)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 19:37 
Offline
Moderator
Avatar użytkownika

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

Ja z kolei nie rozumiem problemu żeby pomóc ... musiałbyś precyzyjniej opisać i podać fragment kodu o który chodzi - bo z tego opisu 3 posty wyżej to żeby dojść co tam jest nie tak musiałbym chyba mieć taki sam układ na biurku żeby móc go testować i zobaczyć w czym rzecz ...

trzeba zawsze postarać nauczyć się wyizolować problem i małymi kawałkami rozwiązywać kłopoty w kodzie - zamiast pytać co jest nie tak w całym kodzie bo coś tam się źle wyświetla ... przynajmniej ja nie umiem inaczej podejść ....

_________________
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: 16 lis 2014, o 19:56 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

A ja mam takie pytanko. Po co setki, tysiące razy robisz to przypisanie w pętli głównej?
Może zrobiłbyś tak.
Ten DS na pewno może wywoływać przerwanie co 1 sek.
To dlaczego z tego nie skorzystasz?
Podłącz nóżkę DS to któregokolwiek pinu procesora który może obsłużyć przerwanie zewnętrzne.
W procedurze obsługi przerwania ustaw flagę np. "sekunda"
w pętli głównej wpisz taki kod:
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 wszystko co potrzebujesz mieć w pętli głównej
Oczywiście odnośnie odczytu czasu i jego wyświetlania.
Zobacz jaka oszczędność czasu procesora i jak upraszcza się pętla główna

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:01 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

Spróbuję jeszcze raz opisać sedno.

W pętli głównej programu umieszczam tylko te polecenia

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

czyli pobieram zmienne z unii i przepisuję je do zmiennych globalnych
Zaraz potem w funkcji ob_i_wy() wrzucam je na wyświetlacz

Jeśli robię to raz za razem jak jest w tym przykładzie to wyświetla mi poprawną godzinę, a na wyświetlaczu delikatnie prześwitują mi zera na każdej z pozycji.

Jeśli wprowadzę jakiekolwiek opóźnienie między przepisaniem zmiennych a ich wyświetleniem to na wyświetlaczach mam wyłącznie 0000

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


Wyświetlacz bez najmniejszego problemu wyświetla to w prawidłowy sposób. Bez żadnego przebicia zer.

Stąd mój wniosek ze zmienne pobrane z unii pobierane są tylko na chwilę a potem coś je zeruje. Im szybciej je wyświetlę tym wyraźniej je widać

Nie potrafię wstawić jakiejś pułapki żeby wyczaić miejsce gdzie się te zmienne zerują ponieważ program jest zbyt porosty. Nie potrafię znaleźć takiego miejsca gdzie mógłbym to zerowanie sprawdzić

Dodam jeszcze , ze jak ustawię bitrate na 50 to wyświetlane są praktycznie same zera delikatnie mocniej świecą segmenty wyświetlanej godziny
Najwyraźniej godzinę widać przy bitrate powyżej 200.

Nie znam jeszcze na tyle dobrze zasad przepisywania tych zmiennych z unii żeby móc wywnioskować cokolwiek, dla tego proszę o pomoc.

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

Przykłąd MirkoT nie zadziała ponieważ jak już napisałem zmienne mam tylko przez krótką chwilę Jakiekolwiek opóźnienie np delayem, od razu je zeruje i na wyświetlacz trafia 0000. Wydaje mi się że winne jest samo pobieranie zmiennych z unii lub ich przepisywanie do zmiennych globalnych.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:12 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jarosławie, a ja Ci radzę... zrób jak mówię :-)
Ale to Twój projekt i zrobisz jak zechcesz.
Przepraszam ale Twój kod czyta się nienajlepiej
więc lepiej go uprościć. W pętli głównej zostawić
tylko to co być musi.
Powtórzę jeszcze raz.
Po co miliony razy na sekundę odczytujesz DS'a?
Po co miliony razy na sekundę ustawiasz zmienne
które się w tym czasie nie zmieniają?
Ale rób jak uważasz.

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

Szukasz rozwiązania nie tam gdzie jest problem. :-(
Skoro tak się dzieje to szukaj w:
procedurze ob_i_wy()
obsłudze multipleksowania czyli w przerwaniu

------------------------ [ Dodano po: 8 minutach ]

Jarosław J napisał(a):
Spróbuję jeszcze raz opisać sedno.

Przykłąd MirkoT nie zadziała ponieważ jak już napisałem zmienne mam tylko przez krótką chwilę Jakiekolwiek opóźnienie np delayem, od razu je zeruje i na wyświetlacz trafia 0000. Wydaje mi się że winne jest samo pobieranie zmiennych z unii lub ich przepisywanie do zmiennych globalnych.

Ten przykład >musi< zadziałać bo tak właśnie się to robi ;-)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:22 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

To nie jest jeszcze projekt tylko jego zarys. Podstawowa funkcjonalność to odczyt godziny i tego uprościć się nie da. Zrobiłem to w pętli głównej bo tak jest przejrzyściej według mnie niż na te osiem czy dziesięć linijek miałbym tworzyć funkcję. Po uporaniu się z tym problemem na pewno rozbiję to na bloki Tym czasem kiedy nie mogę poprawnie odczytać unii jak mi się wydaje, wszystko tkwi w pętli głównej, i tak jest przejrzyściej.
Jak już pisałem próbowałem odczytywać to i przepisywać z różną częstotliwością wykorzystywałem opóźnienia delay'em i przerwaniem od timera wewnętrznego. Wszystko sprowadzało się do tego że po wprowadzeniu opóźnienia powyżej 100ms na wyświetlaczu są same zera Im opóźnienie mniejsze tym godzina wyświetla się wyraźniej. Wybacz ale jestem przekonany, ze jeśli dam opóźnienie od przerwania zewnętrznego efekt będzie dokładnie ten sam. Dla tego przynajmniej na razie nie widzę sensu ingerowania w sam układ. Jeśli jesteś mi w stanie to bardziej uzasadnić nie będę się upierał, i zrezygnuję z jakiejś funkcjonalności i dołączę ten sygnał. Jak już napisałem wcześniej, wszystkie nóżki mam już rozdysponowane.

Wcześniej również napisałem że jeśli przypiszę na sztywno zmienne wysyłane do funkcji ob_i_wy sama funkcja działa doskonale. Stąd właśnie mój wniosek, że to z przepisaniami lub pobieraniem danych z unii musi być problem.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:26 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jarosław J napisał(a):
To nie jest jeszcze projekt tylko jego zarys. Podstawowa funkcjonalność to odczyt godziny i tego uprościć się nie da. Zrobiłem to w pętli głównej bo tak jest przejrzyściej według mnie niż na te osiem czy dziesięć linijek miałbym tworzyć funkcję.

Jest taka książka "Czysty kod" i tam mądrzy ludzie, profesjonaliści a nie tacy laicy jak ja napisali, że dobra funkcja to właśnie taka
która ma te 8 czy 10 linijek kodu ;-) Ale co ja tam wiem. Jestem całkowicie początkujący.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:30 
Offline
Użytkownik

Dołączył(a): 01 sty 2013
Posty: 169
Pomógł: 0

No nie obrażaj się. Sam niewiele wiem i dla tego tu jestem. Po prostu NA RAZIE dla mnie jest tak przejrzyściej Nie zmienia to nic w działaniu programu. (albo w jego nie działaniu)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 lis 2014, o 20:32 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Jarosław J napisał(a):
Tym czasem kiedy nie mogę poprawnie odczytać unii jak mi się wydaje,

no właśnie wydaje Ci się. Gdybyś nie mógł odczytać te cyfry by Ci nie "przebijały"
Powtórzę - to nie tu jest problem

Jarosław J napisał(a):
wszystko tkwi w pętli głównej, i tak jest przejrzyściej.

Nie zdecydowanie nie jest przejrzyściej! Szczególnie gdy dajesz ten kod do czytania innym osobom
i prosisz je o pomoc ;-)

Jarosław J napisał(a):
Wcześniej również napisałem że jeśli przypiszę na sztywno zmienne wysyłane do funkcji ob_i_wy sama funkcja działa doskonale. Stąd właśnie mój wniosek, że to z przepisaniami lub pobieraniem danych z unii musi być problem.

A według mnie to właśnie w ob_i_wy lub w przerwaniu masz coś skopane. Stawiam bardziej na funkcję ;-)

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

Jarosław J napisał(a):
No nie obrażaj się. Sam niewiele wiem i dla tego tu jestem. Po prostu NA RAZIE dla mnie jest tak przejrzyściej Nie zmienia to nic w działaniu programu. (albo w jego nie działaniu)

Nie obrażam się. Po prostu przyznaję się do swojej niewiedzy
a tą odrobiną którą mam staram się podzielić

_________________
Jestem początkujący i moje porady mogą być błędne



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