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



Teraz jest 27 lis 2024, o 20:39


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 61 ]  Przejdź na stronę Poprzednia strona  1, 2, 3  Następna strona
Autor Wiadomość
PostNapisane: 1 maja 2013, o 10:32 
Offline
Moderator
Avatar użytkownika

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

step_m napisał(a):
Wiem, że moje kolejne pytanie nie jest ściśle związane z callbackami.

Ależ spokojnie możesz pytać o WSZYSTKO ;) .... o wszystko - i o to chodzi.

step_m napisał(a):
W konfiguracji TIMERA0 rejestr OCR0 określony został następująco:

OCR0=(uint8_t)(F_CPU / 64.0 * 1000 - 0.5); //1ms

Po obliczeniu tego wyrażenia, podstawiając częstotliwość taktowania mikrokontrolera np. 8MHz otrzymamy dużą wartość - 125000000, znacznie przekraczającą 255. Domyślam się, że wkradł się błąd w zapisie z nawiasami. Ale pominąwszy to, dlaczego kompilator nie zgłasza błędu lub ostrzeżenia, że wartość OCR0 jest daleko poza dopuszczalną? Ponadto o dziwo enkoder pracuje z tak skonfigurowanym TIMEREM0:-)


Szczególnie to warto zrozumieć i stosować w swoich programach takie podejście ;) to nie żaden błąd a dla ciebie krótka podpowiedź:

- jak będziesz kolejny raz obliczał to zastanów się dlaczego najpierw wykona się mnożenie ?

64.0 * 1000

i dlaczego dopiero później dzielenie

8000000 / 64000

a na końcu odejmowanie

125 - 0.5

;)

a wtedy wszystko ci się rozjaśni i nie będziesz się dziwił dlaczego - pomimo iż dopatrujesz się błędu - to wszystko działa ... bo ma działać.

_________________
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: 1 maja 2013, o 11:35 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Witam .
Przepraszam za durne pytanie ale dlaczego w :

OCR0=(uint8_t)(F_CPU / 64.0 * 1000 - 0.5); //1ms

mnożenie wykona się przed dzieleniem ?
Według wszelkich znanych mi zasad matematyki mnożenie i dzielenie ma ten sam priorytet i wykonuje się w kolejności od lewej , więc dlaczego tutaj miało by być inaczej ? ( pewnie dlatego , że czegoś nie wiem i dlatego pytam )



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2013, o 11:39 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 23 kwi 2012
Posty: 108
Lokalizacja: Giżycko
Pomógł: 6

Obrazek
Tutaj kalkulator



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2013, o 11:44 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Artur napisał(a):


Tyle tylko , że 64.0 * 1000 ująłeś w nawiasy i to ja rozumiem

tutaj

OCR0=(uint8_t)(F_CPU / 64.0 * 1000 - 0.5);

tych nawiasów nie ma więc dzielenie wykonać się powinno niestety przed mnożeniem .



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 maja 2013, o 19:44 
Offline
Moderator
Avatar użytkownika

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

pagosa747 --> no i masz RACJĘ ;) .... Należy ci się DUŻE PIWO albo i dwa.

To fakt, że pomimo złych obliczeń TO COŚ działa, no bo w efekcie wychodzi wartość dla OCR0 = 255; !!! Masakra ;)

to znaczy może nie to że jakaś mega masakra ale wcale nie uzyskujemy częstotliwości ok 1 kHz !!! tylko dużo mniejszą - dla przykładu jeśli F_CPU = 8 MHz to

OCR0 = 8000000 / 64 * 1000 - 0.5 = 255 !!! czyli częstotliwość będziemy mieć:

8000000 / 64 / 255 = ok 490 Hz !!!! zamiast 1 kHz ... no ale działa - no działa

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

Ja nawet nie przeanalizowałem tego kodu i jakoś tak z uwagi że autor tu rzucił w oczy kodem graya itp to wręcz nie pomyślałem że mógł zrobić taki błąd ;) wręcz ślepo wierzyłem że jest ok a tu kicha ;) co wyszło dzięki tobie

zatem trzeba POPRAWIĆ TO TAK

Cytuj:
OCR0 = (uint8_t)(F_CPU / 64 / 1000 );


i będzie WSZYSTKO OK

------------------------ [ Dodano po: 7 minutach ]

na blogu już kod jest poprawiono no i informacja o błędzie dostrzeżonym przez kolegę pagosa747 ;)

http://mirekk36.blogspot.com/2013/04/en ... y-cz2.html

_________________
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: 2 maja 2013, o 00:19 
Offline
Użytkownik

Dołączył(a): 31 paź 2012
Posty: 99
Pomógł: 4

Dziękuję za uznanie ale nie mnie się ono należy tylko koledze step_m , to on bowiem zwrócił na to uwagę

step_m napisał(a):
Wiem, że moje kolejne pytanie nie jest ściśle związane z callbackami. W konfiguracji TIMERA0 rejestr OCR0 określony został następująco:

OCR0=(uint8_t)(F_CPU / 64.0 * 1000 - 0.5); //1ms

Po obliczeniu tego wyrażenia, podstawiając częstotliwość taktowania mikrokontrolera np. 8MHz otrzymamy dużą wartość - 125000000, znacznie przekraczającą 255. Domyślam się, że wkradł się błąd w zapisie z nawiasami. Ale pominąwszy to, dlaczego kompilator nie zgłasza błędu lub ostrzeżenia, że wartość OCR0 jest daleko poza dopuszczalną? Ponadto o dziwo enkoder pracuje z tak skonfigurowanym TIMEREM0:-)


ja jedynie miałem wątpliwości co do Twojego Mirek wyjaśnienia

mirekk36 napisał(a):
- jak będziesz kolejny raz obliczał to zastanów się dlaczego najpierw wykona się mnożenie ?

64.0 * 1000

i dlaczego dopiero później dzielenie

8000000 / 64000

a na końcu odejmowanie

125 - 0.5


więc aby było sprawiedliwie popraw na blogu , że to dzięki koledze step_m



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2013, o 05:32 
Offline
Moderator
Avatar użytkownika

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

ach już mi się pokićkało - ale dzięki za uwagę - już koryguję wpis na blogu ;)

_________________
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: 2 maja 2013, o 11:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 24 lut 2013
Posty: 94
Lokalizacja: Turek
Pomógł: 5

Cytuj:
OCR0 = 8000000 / 64 * 1000 - 0.5 = 255 !!! czyli częstotliwość będziemy mieć:



Panie Mirku dlaczego tutaj wyszło 255?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 maja 2013, o 12:21 
Offline
Moderator
Avatar użytkownika

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

Alltronik napisał(a):
Cytuj:
OCR0 = 8000000 / 64 * 1000 - 0.5 = 255 !!! czyli częstotliwość będziemy mieć:



Panie Mirku dlaczego tutaj wyszło 255?


eeeeh bo zrobiłem proste sprawdzenie typu:

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


no i w a wylądowało 255. Rzeczywiście powinno wylądować teoretycznie zero - ale proszę ;)

zresztą całe szczęście, że nie ląduje zero - a skąd się bierze 255 ? bo cała ta linijka kodu oryginalnego jest do ..... [piiik- cenzura].....

nie dość że brak nawiasów to jeszcze to nieszczęsne rzutowanie do (uint8_t) - to to rzutowanie jest powodem tego kłopotu i szczęścia w nieszczęściu że wpada tam 255 ;) Bo coś autorowi się warning pokazywał to pierdyknął sobie rzutowanko - tyle że próbował rzutować liczbę kosmicznie wielką uint32_t na uint8_t i skoro pojawiają się same jedynki w bajcie to oznacza, że coś poszło nie tak - tzn tak jakby liczba zamieniła się na ujemną i rzutowanie najmłodszego bajtu będzie wtedy z jedynkami ... nie wiem na razie tak na szybko coś myślę

ale na pewno trafiało tam przy złym zapisie 255 - nie wierzysz to sprawdź jak opisałem wyżej ;)

_________________
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: 29 maja 2013, o 19:16 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Użyłem biblioteki enkodera w swoim kodzie i się zastanawiam czy potrzebny jest enkoder
o jakimś ściśle określonym kroku? pytam ponieważ z moje zliczany jest co drugi krok.

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2013, o 21:40 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Czy wsze enkodery działają co krok?

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 cze 2013, o 22:16 
Offline
Moderator
Avatar użytkownika

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

ja mam taki jak na filmiku widać w czołówce - działa co krok

ale już tu gdzieś na forum komuś podpowiadałem jak można nieco zmodyfikować sobie kod żeby próbować działać z nieco inną rozdzielczością

pokombinuj sobie zamieniając te dwie linijki jedna z drugą czyli albo tak:

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


albo 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 chodzi o kod w EVENCIE enkodera ok ?

_________________
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: 3 cze 2013, o 16:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

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

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

Dzięki wielkie, enkoderek chodzi jak marzenie :-)
Mam jeszcze pytanko, odnośnie rfm12 otóż przesyłam temperaturę np "25.6" stringiem, jak mogę go zamienić na int dla wyświetlaczy 7led?

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 cze 2013, o 18:39 
Offline
Moderator
Avatar użytkownika

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

Cytuj:
Mam jeszcze pytanko, odnośnie rfm12 otóż przesyłam temperaturę np "25.6" stringiem, jak mogę go zamienić na int dla wyświetlaczy 7led?


A mam kolegę zastrzelić za to pytanie ? ;)

załóżmy że masz ten string w tablicy buf[] - pokażę ci tylko ideę, jedną z wielu a ty pokombinuj troszkę - a później ew dopytaj dalej ok ?

cy1 = buf[0] - '0';
cy2 = buf[1] - '0';
// ...... pomijamy np kropkię ;)
cy3 = buf[3] - '0';

oczywiście nie jest to idealna idea bo co gdy w buforze pojawi się np temperatura: 4,7 albo -8,2 ? ;)

i oczywiście nie robimy tego tak wprost jak tu wyżej napisałem no ale jak widzisz zamiana stringa na int ma wiele twarzy w C. Inną idea to wyłuskanie funkcją strtok() tego co przed kropką i po kropce a potem jakaś obróbka ....

jeśli pytasz o RFM12 to tak się domyślam że przynajmniej Bluebooka masz a może i GreenBooka ;)

a przecież w Bluebooku chociażby w rozdziale ADC ale też w rozdziale o multipleksowaniu masz wiele przykładów które powinny cię natchnąć do działania ....

niestety bez opanowania działania na tablicach i takich podstawach będzie ci ciężko

fajne przykłady też masz gdybyś chciał przeanalizować tworzenie biblioteki dla LCD ... bo zawsze powtarzam - opis tworzenia biblioteki do LCD nie jest po to żeby kogoś TYLKO nauczyć jak pisać taką bibliotekę ale po to żeby na ciekawym przykładzie przekazać sposoby stosowania języka C w czystej praktyce ....

_________________
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: 3 cze 2013, o 23:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Strzelaj Waść, strzelaj ;-) Mam obie knigi ale nie znalazlem
Rozwiązania.

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2013, o 09:42 
Offline
Moderator
Avatar użytkownika

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

W pierwszej książce masz wystarczające informacje na ten temat i to wystarczające w 100%

a ty jak piszesz nie znalazłeś rozwiązania - bo szukasz być może rozdziału jak zamienić temperaturę w stringu na wyświetlacz LED

ni byłbym w stanie i co więcej nikt nie jest w stanie opisać miliardów konkretnych przypadków pomysłów na jakie ktoś wpadnie. To o czym piszesz wymaga kilku działań na tablicach i podałem ci drogę jedną z wielu dróg do osiągnięcia celu - a nawet się nie odniosłeś ani nie dopytałeś no co to oznacza itp ?

jeszcze raz powiem - żeby to robić w C trzeba poćwiczyć elementarne i podstawowe działania na tablicach i C-Stringach, ba! jeszcze raz powiem wyżej podałem ci nawet rozdziały gdzie można podpatrywać te rzeczy

co więcej podałem ci nawet taki NAJPROSTSZY sposób metodą powiedziałbym "brute-force"

cy1 = buf[0] - '0';
cy2 = buf[1] - '0';
// ...... pomijamy np kropkię
cy3 = buf[3] - '0';

a ty nadal nic ? pewnie nawet nie wypróbowałeś - nie kombinowałeś - to jak ja mam pomóc ?

mam ci napisać jakąś gotową funkcję do twojego programu ? Nawet gdybym się tym zajmował i pisał każdemu funkcje do jego programu (pewnie nie miałbym czasu na nic innego wtedy) .... to skąd miałbym na podstawie tak zadanego pytania wiedzieć jak ją mam napisać ? jakie argumenty chcesz do niej przekazać , na jakich zmiennych globalnych pracujesz itp itd itp ....

nie no sorki - ale chociaż troszkę wkładu własnego trzeba w takim przypadku ...

_________________
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: 4 cze 2013, o 10:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Nie irytuj się tak Mirku. Złość piękności szkodzi :lol: Ja w ostatnim wpisie nie prosiłem o gotowca tylko odniosłem się do
strzelaniny i poszedłem grzecznie robić pompki przez co nie miałem czasu aby zająć sie dogłębnie moim zawiłym (jak dla mnie)
zadaniem. Tak jak napisałeś wcześniej będę próbował samodzielnie to rozwikłać i ewentualnie poproszę o pomoc w szczegółach ;-)
pozdr. ;-)

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 4 cze 2013, o 12:05 
Offline
Moderator
Avatar użytkownika

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

BIGjack napisał(a):
Nie irytuj się tak Mirku


Na prawdę nie denerwuję się to było raczej zdziwienie ...

BIGjack napisał(a):
Ja w ostatnim wpisie nie prosiłem o gotowca tylko odniosłem się do
strzelaniny


Więc być może źle zrozumiałem twoje intencje - przepraszam

BIGjack napisał(a):
Tak jak napisałeś wcześniej będę próbował samodzielnie to rozwikłać i ewentualnie poproszę o pomoc w szczegółach
pozdr.


Tak jak pisałem - spróbuj w jakikolwiek sposób to zacząć pisać / zaprogramować i od razu śmiało pytaj gdy tylko nasuną ci się pytania - bo wtedy łatwiej będzie doprecyzować pewne być może niezrozumiałe z książki rzeczy ...

_________________
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: 7 cze 2013, o 11:09 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Niestety nie poradzę sobie sam z tym wyświetlaniem na TWI 4*7LED
Wiec od początku, RFM12 ładuje ramkę do bufora
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

następnie chcę wyświetlić na wyświetlaczy led, robię więc tak
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


przekazuje zmienne do CY1-CY4 i no wysyłam przez TWI
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

i wyświetlają sie zera, cy1 jest pusty.
Prosze o naprowadzenie mnie na właściwą drogę bo wymiękam po któryms juz wieczorze z kolei.

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2013, o 11:31 
Offline
Moderator
Avatar użytkownika

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

O! teraz to można się odnieść do takiego konkretnego pytania, więc już się staram ;)

zobacz masz tablicę:

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


czyli 5 elementów tak ? dobrze rozumiem ? ... i w niej masz te cyfry na LCD ... ale skoro na LCD to znaczy że mamy tam kody ASCII znaków od 0 do 9 ... i super ale ....

ale za chwilę odwołujesz się do przedziwnych dla mnie indeksów tej tablicy :(

Cytuj:
temp_dzies = atoi(test[4]);
temp_jed = atoi( test[6] );
temp_dziesietne = atoi( test[8] );


z jakiej racji ? przecież przekraczasz dopuszczalny indeks i trafiasz gdzieś w kosmos :( ... tylko ten pierwszy index 4 jest prawidłowy i wskazuje na OSTATNI element tej tablicy test[5]

_________________
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: 7 cze 2013, o 11:46 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

te indeksy 6 i 8 to wypadek przy pracy. Wczesniej miałem większa ramkę i bufor no i mam już ogromny smietnik
po przeróżnych próbach podejścia do tematu.
Teraz mam tak
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.

i wyswietla zera.

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 cze 2013, o 11:59 
Offline
Moderator
Avatar użytkownika

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

ach a zaglądałeś do PDF'a ? jak się przekazuje argumenty do atoi() ???

C:\WinAVR-20100110\doc\avr-libc\avr-libc-user-manual.pdf

wystarczy zajrzeć na własny dysk, i szukajką znaleźć atoi()

zobaczysz wtedy :

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


widzisz ? przekazujesz WSKAŹNIK a nie kod znaku ..... a zajrzyj do książki na przykłady chociażby w rozdziale o multipleksowaniu jak się to robi ? ... jeśli chodzi o poszczególne elementy tablicy albo jej fragment.

Gdybyś chciał przekazać całą tablicę to ok napisałbyś test bez nawiasów kwadratowych i już ... no ale to pobrałoby ci cały string z tej tablicy .... i tak samo KICHA jak byś nawet prawidłowo odwoływał się do poszczególnych elementów a trzeba byłoby tak:

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


znaczek & wyciąga adres czyli wskaźnik na ten element.... ale nadal będzie panie KICHA - bo poleci cały string - a co to jest string ? to jest ciąg znaków zakończonych zerem więc jeśli np twoja ramka wyglądałaby tak

Cytuj:
"-23.55"


to atoi dostałoby kota gdyż analizę zaczęłoby od DRUGIEGO elementu i wzięłoby cały string pod uwagę do końca czyli

Cytuj:
"3.55"


na prawdę - zanim będziesz pisał takie programy no to chcesz czy nie chcesz musisz porobić sobie o wiele prostsze ćwiczenia na to jak się działa na tablicach w C bo widać - że na razie w ogóle się w tym nie orientujesz ... a bez tego NIE MA PROGRAMOWANIA w C :(

ale dobra .... to co możesz zrobić ?

no zakładając że masz sztywną ramkę i wiesz w którym elemencie jest jaka liczba i chcesz ją dać na LED - tak z tej próby kodu wynika to ja znowu ci podpowiem - skorzystaj że z tego co ci napisałem wyżej, czyli:

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


dlaczego uparłeś się na atoi() skoro nawet nie przeanalizowałeś jak ono działa ? tzn rozumiem - to nawyk z Bascoma pewnie, ale jak widzisz tu idą wskaźniki w ruch - coś czego w Bascomie nie uświadczysz :(

_________________
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: 7 cze 2013, o 12:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 22 kwi 2013
Posty: 257
Lokalizacja: 3miasto
Pomógł: 5

Dzięki Mirku oczywiście jak Ty podałeś rozwiązanie to zadziałało. Ja wcześniej to testowałem ale tylko z jednym indeksem
no i zapomniałem że zmieniłem treść ramki i trafiłem na jakis tam znak zamiast cyfrę i nie dziwota że głupoty mi wyświetliła kostka led.
W tym momencie szukałem innego rozwiązania bo jak pisałeś wcześniej jest ich prawie tyle co programujących.
Jak się siedzi kilkanaście godzin nad jednym tematem to się zaczyna robić niezły bałagan i w kodzie i w głowie od różnych prób.
Teraz dziękuję za rozwiązanie i idę robić czystki i uporządkować kod i uzupełnić wiadomości.
pozdrawiam i jeszcze raz dzięki, jesteś wielki ;-)

_________________
https://www.facebook.com/jacekplichtaphotography/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 cze 2013, o 17:14 
Offline
Moderator
Avatar użytkownika

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

robiw --> takie proste rozwiązania są bardzo popularne i niejednokrotnie jak już to je stosowałem, inni też ...

tyle że może nie zauważyłeś że tutaj obsługa enkodera pojawiła się niejako dodatkowo (wypadek przy pracy) ;) chodziło o to aby przy okazji callbacków pokazać coś jeszcze i może też ciut bardziej zaawansowanego ....a czemu nie ? .

Poza tym proste sposoby obsługi enkoderów nie są pozbawione wad, które eliminuje ten sposób. I jeśli komuś nie potrzeba większych możliwości to skorzysta z tych prostych procedur - za to - ten sposób - daje równie fajne możliwości i wcale nie jest jakiś zaraz pamięciożerny czy coś tam ;) ... bez przesadyzmu - mnie co najwyżej szkoda timera tracić że tak powiem w takim sposobie. Więc to byłoby dla mnie priorytetem wyboru metody. Gdy mam pod ręką wolny timer to zawsze skorzystam z tej metody bo jest wg mnie prosta ;) ... a jeśli nie mam timera to korzystam z prostej metody

_________________
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 sty 2014, o 12:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 gru 2012
Posty: 56
Lokalizacja: Praszka
Pomógł: 1

mirekk36 napisał(a):
Cytuj:
OCR0 = (uint8_t)(F_CPU / 64 / 1000 );


Witam, mam takie pytanie odnośnie powyższej linii.

Przeliczyłem sobie ją dla różnych wartości częstotliwości taktowania procesora i doszedłem do wniosku, że skoro jest stosowane F_CPU to program będzie dla każdej podanej częstotliwości w ustawieniach projektu wyliczał ~(mniej więcej) odpowiednią wartość.
Mniej więcej napisałem dlatego, że:
o ile w przypadku podania częstotliwości 8 MHz wartość OCR0 wychodzi całkowita to już w przypadku gdy podamy 11,059200 MHz to wartość OCR0 będzie równa 172,8. Czy dobrze myślę? W związku z tym, że rejestr OCR0 może przyjmować wartości z zakresu 0-255 wpadnie do niego wartość równa części całkowitej z liczby 172,8 czyli 172. A to będzie skutkować tym, że przerwanie będzie generowane nie co 1 ms, tylko co 1,0046 ms ?
Wspomagałem się troszkę excelem:
Obrazek

Czyli nie do końca prawidłowo, może działać program z enkoderem, gdy mirkoprocesor będzie taktowany częstotliwością 11,059200 Hz ??
Przekłamania mogą pojawić się gdy będziemy szybciej pokręcali enkoderem?
Jeśli gadam głupoty to proszę naprostujcie mnie ;)


--------------------------------------
PS.
Jeszcze mam wątpliwość co do tego:
OCR0 = (uint8_t)(F_CPU / 64 / 1000 );
czy nie powinno być tam jeszcze - 1 ? tzn.:
OCR0 = (uint8_t)( ( F_CPU / 64 / 1000 ) - 1 );
ponieważ impulsy w rejestrze TCNTx zliczane są od zera?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2014, o 14:07 
Offline
Moderator
Avatar użytkownika

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

ursmar napisał(a):
Mniej więcej napisałem dlatego, że:
o ile w przypadku podania częstotliwości 8 MHz wartość OCR0 wychodzi całkowita to już w przypadku gdy podamy 11,059200 MHz to wartość OCR0 będzie równa 172,8. Czy dobrze myślę? W związku z tym, że rejestr OCR0 może przyjmować wartości z zakresu 0-255 wpadnie do niego wartość równa części całkowitej z liczby 172,8 czyli 172. A to będzie skutkować tym, że przerwanie będzie generowane nie co 1 ms, tylko co 1,0046 ms ?
Wspomagałem się troszkę excelem:


Czyli nie do końca prawidłowo, może działać program z enkoderem, gdy mirkoprocesor będzie taktowany częstotliwością 11,059200 Hz ??
Przekłamania mogą pojawić się gdy będziemy szybciej pokręcali enkoderem?
Jeśli gadam głupoty to proszę naprostujcie mnie


Głupot nie gadasz - pytać zawsze można, Ba! nawet trzeba hmm warto ;)

tyle że teraz usiądź i chwilę pomyśl sam czy m z punktu widzenia serwa różni się czas

1 ms

od

1,0046 ms ???

Spójrz na ilość miejsc po przecinku - przelicz sobie ile wyniosą odchyłki nawet przy 100 krokach albo nawet przy 1000 !!! krokach ;) ... czy nie widzisz - że to nie będzie miało żadnego znaczenia ? ;) .... nadal mogą to być różnice jednej setnej! milisekundy jeśli już

ursmar napisał(a):
PS.
Jeszcze mam wątpliwość co do tego:
OCR0 = (uint8_t)(F_CPU / 64 / 1000 );
czy nie powinno być tam jeszcze - 1 ? tzn.:
OCR0 = (uint8_t)( ( F_CPU / 64 / 1000 ) - 1 );
ponieważ impulsy w rejestrze TCNTx zliczane są od zera?


Tak masz rację - tylko też spójrz co wyżej napisałem

_________________
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 sty 2014, o 14:30 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 gru 2012
Posty: 56
Lokalizacja: Praszka
Pomógł: 1

Dziękuję za odpowiedź ;)
rzeczywiście z tej strony na to nie spojrzałem... jakoś tak pomyślałem, że to przerwanie musi być generowane ściśle co 1 ms i to mnie zbiło z tropu, ale przynajmniej poprzeliczałem sobie te wartości kilkanaście razy :)

Mam jednak takie pytanie jeszcze:
stosuję taki enkoder inkrementalny optoelektroniczny
MOZ 30 500 5 BZ K
Nota 1. PL
Nota 2. ENG
i niestety, na wyświetlaczu LCD na pełen obrót przypada około ~560 impulsów, gdy kręcę powoli, tzn. 1 obrót/kilka sekund.
A gdy zakręcę trochę szybciej to już w cały świat skaczą te wartości.

Testy robię na płytce ATB, a sygnały A i B enkodera są podłączone przez stykówkę, ponieważ jest to enkoder typu otwarty kolektor i dodaję do linii sygnałowej A oraz B rezystory 2K podciągnięte do VCC.

W czy może być problem, ten program nie jest w stanie obsłużyć takiego enkodera?
czy coś z Enkoderem może być nie tak? Trochę się zatrzymałem i nie wiem w jaką stronę dalej ruszyć w obecnej sytuacji...



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sty 2014, o 14:39 
Offline
Moderator
Avatar użytkownika

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

Po pierwsze pokazywałem troszkę jak można tam kombinować ze zmianą rozdzielczości tego kodu nie tylko dla różnych enkoderów ale nawet dla tego samego enkodera ... ale nie podpowiem ci teraz szczegółów - lecz nie dlatego że nie chcę czy po złości ...

przypomnę tylko, że:

1. po pierwsze poradnik ten nie dotyczył enkodera - kod do niego to był wypadek przy pracy no i próba przemycenia przeze mnie nauki C w tym przypadku CALLBACKÓW na jakimś bardzo ciekawym przykładzie - i zauważ że zwykle mi się taki cel udaje osiągnąć bo większość czytelników, widzów o wiele lepiej po tym poradniku rozumie callbacki i zdarzenia. A że przy okazji w tle był inny ciekawy temat ;) ... to to jest właśnie sztuka przyciągnięcia uwagi na cel główny ale też z kolei zwrócenia uwagi na jeszcze inne pasjonujące zagadnienia ;) ... tyle że aby coś więcej mówić o tym to jak mnie znasz musiałbym się przygotować i zrobić o tym oddzielny poradnik czyli o enkoderach tak w ogóle ;) ... no ale myślę z drugiej strony, że to co zostało JUŻ powiedziane oraz - zobacz że na końcu poradnika na blogu masz link do alternatywnego kodu obsługi enkodera napisanego przez naszego super kolegę Antystatycznego - to myślę że sobie poradzisz - albo może ktoś jeszcze coś podpowie - bo ja ... niestety na razie nie będę miał jak zająć się tym tematem i mam nadzieję że mi wybaczysz.

2. zajrzyj właśnie do tego linku na końcu artykułu z bloga

_________________
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 sty 2014, o 14:54 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 07 gru 2012
Posty: 56
Lokalizacja: Praszka
Pomógł: 1

mirekk36 napisał(a):
...niestety na razie nie będę miał jak zająć się tym tematem i mam nadzieję że mi wybaczysz.

Oczywiście to rozumiem, każdy ma swoje zajęcia :) Sam bym chciał takie poradniki robić i wymieniać się wiedzą, bo to SUPER sprawa jest ;)
Na razie jednak muszę się jeszcze trochę poduczyć. Dzięki za wskazanie miejsca dalszych poszukiwań rozwiązania. Już się tam przenoszę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 20 gru 2015, o 18:25 
Offline
Użytkownik

Dołączył(a): 14 lut 2015
Posty: 44
Pomógł: 2

Dzień dobry,

Mam problem ze zmianą typu zmiennej "wynik".
Jest ona typu int8_t a chciałbym zrobić ją np. int16_t .
Próbowałem różnych wariantów zmian, jednak na nic, jedyne co uzyskiwałem to poprawna kompilacja a na wyświetlaczu i tak "-1" .

Próbuję dostosować bibliotekę do swojego enkodera, wiąże się to też ze zmianą częstotliwości przerwania. Czy ta konkretna biblioteka będzie sprawnie działać z przerwaniami nie 1kHz tylko np. 5kHz ?



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: 61 ]  Przejdź na stronę Poprzednia strona  1, 2, 3  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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