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



Teraz jest 5 mar 2026, o 15:25


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 16 ] 
Autor Wiadomość
PostNapisane: 15 paź 2016, o 12:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Witam
Pracuję właśnie na generatorem sygnałowym opartym na AD9850. Układ sterowany atmegą 88 przez SPI pracuje wsystko wyśmienicie.
Wyświetlam sobie na LCD jedną częstotliwość generatora w Hz np. 31525312 Hz co oznacza 31,525312 MHz i tak też bym chciał to wyświetlać.
O ile nie mam problemy z wyświetleniem liczy oznaczającej MHz (31) która jest u mnie po prostu wynikiem dzielenia przez milion :) ale już mam problem z wyświetleniem wyniku modulo czyli 6 cyfr po przecinku. Problem jest taki że jeżeli reszta z dzielenia jest 1Hz czyli
,000001 to oczywiście zera są pomijane i wyświetla mi się tylko ten jeden Hz. Mam niebieską i zieloną książkę i znalazłem przykłady zawarte w opisach ADC... jednak jakoś mój stary umysł nie może tego przetworzyć :D
Czy ktoś może mi coś zasugerować? jak wyświetlić zmienną dokładając przecinek po licznie określającej miliony :)

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 12:24 
Offline
Użytkownik

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

A gdybyś po prostu od 31525312 odjął 31*milion i to co wyjdzie wstawił po przecinku?

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 12:28 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

tak ale moja zmienna jest regulowana płynnie w zakresie od 0 do 40 000 000 z rastrem 1 i w momencie kiedy ustawiam na przykład 35 000 001 to wynikiem działania modulo jest 000 001 i wtedy wyświetlając taki wynik na LCD mam pominięte wszystkie zera poprzedzające. NIe ma problemu jeżeli pierwsza czyfra wyniku modulo jest większa od zera :) widziałem że Mirek używał w takim przypadku funkcji zmieniania int na string ale nie potrafię tego jakoś ogarnąć.

------------------------ [ Dodano po: 29 minutach ]



nie wiem jak poprawnie umieścić ten film :(

Tak to wygląda w przedstawieniu obrazowym :) Myślę że problem banalny... próbowałem już wielu metod... jakieś tam swoje karkołomne przemyślenia ale w końcu pomyślałem że zapewne ktoś już to kiedyś rozwiązał?
Jest cała masa takich opracowań na Arduino, ale ja jestem naprawdę mocno początkujący w sztuce programowania. Ogarnąłem przy pomocy BB jak sterować moim AD9850 i to mi się udało bez żadnego problemu, ale już to wachlowanie int to string trochę mnie zapętliło.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 13:14 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 cze 2014
Posty: 820
Lokalizacja: Tam gdzie PYRY są
Pomógł: 64

Wiem, że są pewnie ładniejsze sposoby na to ale jak często jak mam jakieś małe liczby po prostu załatwiam temat kilkoma if'ami.

zakładając, że masz MHz, czyli 6 cyfr po przecinku zrobiłbym tak:

wyświetlm te Twoje 32, potem przecinek i 000000.
Potem miejsce wyświetlenia reszty uzależniam od wielkości tej reszty. Jeżeli reszta<10 to leci na jakieś miejsce, jeżeli 9<reszta<100 leci na miejsce-1 itd itd.
Mało eleganckie ale zadziała.

_________________
IntegraMETEO
WordCLOCK
IntegraTOUCH



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 13:15 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 04 cze 2014
Posty: 855
Lokalizacja: pod Warszawą
Pomógł: 58

cześć

widzę, że masz BB więc strona 258 i 259 i wiesz wszystko :D

_________________
Pomóżcie mi stanąć na nogi



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 14:31 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

mczarny napisał(a):
cześć

widzę, że masz BB więc strona 258 i 259 i wiesz wszystko :D



Tak próbowałem tej metody ale problem mam z tym że jeśli wynik modulo jest na przykład 450200 albo 000100 to te zera na początku albo na końcu nie są wyświetlane. Widziałem że Mirek stosuje tam zamiany int na str ale nie potrafię tego ogarnąć. Może po prostu za długo już przy tym siedzę.. Kombinuję nad tym od dwóch dni :D pewnie potrzebuję odetchnąć i wrócić ze świeżym umysłem.
Pewnie coś źle robię.
Są gotowce już zrobione w C++ ale ja piszę mój kod w C i nie znam C++ w ogóle. nie potrafię tego jakoś przełożyć do czystego C.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 14:56 
Offline
Moderator
Avatar użytkownika

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

SP2LUB napisał(a):
Widziałem że Mirek stosuje tam zamiany int na str ale nie potrafię tego ogarnąć.

To po to jest forum, co za problem wrzucić kawałek kodu którego nie rozumiesz i dopytać ? ... wtedy nauka idzie 100x łatwiej i szybciej

_________________
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: 15 paź 2016, o 16:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Tak Mirku masz rację... Jakoś mi głupio pokazać kod bo piszę pewnie jak "pierwszoklasista"
Poza tym nigdy nie wstawiałem kodu na forum no ale spróbuję.

Poniżej jest funkcja którą napisałem do obliczania słowa które wysyłam przez SPI steruję AD9850
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Mój problem to wyświetlenie sześciocyfrowo wyniku z dzielenia modulo.
Zmienna DADA to zmienna uint32 która zawiera częstotliwość w herzach czyli na przykład 35000000 to jest 35MHz albo 24250300 to 24,250300 Mhz czyli dla mnie bardzo istotne jest zobrazowanie całej sześciocyfrowej liczby po przecinku. Nawet jeżeli zawiera zera na początku czy na końcu i tego nie wiem jak zrobić :)

Te zakomentowane fragenty to moje eksperymenty... nie ma problemu żeby wyświetlić megaherce ale potem już próbowałem nawet tablic :) chciałem rozbić to co po przecinku i napełnić tablicę ale to mi się wszystko posypało i stwierdziłem że to zła droga. Chociaż w przyszłości by się przydało mieć możliwość zapisywania częstotliwości do pamięci żeby potem użyć funkcji wspierającą pracę generatora jako wobulator. Taki z resztą jest zamiar tego projektu. Generator DDS ma być częścią przystawki do oscyloskopu zmieniającą go w wobuloskop do pomiaru i strojenia filtrów kwarcowych i innych obwodów W.CZ...

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 16:28 
Offline
Moderator
Avatar użytkownika

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

SP2LUB --> ale może mnie troszkę nie zrozumiałeś ... ja ze swojej strony pisałem o wklejenie kodu z Bluebooka, którego nie rozumiesz - a pisałeś że nie rozumiesz czegoś tam z przekształcania string na int ...

Tymczasem ty wklejasz jakiś swój kod ....

Zrozum, to że nie jestem w stanie ja akurat się zająć analizą twojego kodu wynika z kilku powodów:

1. Nie znam całości
2. Nie mam na tyle czasu aby analizować rozbudowane kody użytkowników forum
3. Przede wszystkim nie mam jak ich przetestować

Całkiem czym innym jest wstawienie fragmentu kodu z BB którego nie rozumiesz i dopytanie się o co tam chodzi przez ciebie - bo wtedy ja wiem o czym mówisz - mam to w książce i co więcej wiem co pisałem - a więc też wiem w jaki sposób ew coś doprecyzować itp ....

więc proszę o zrozumienie ...

No a jeśli chodzi o poważny błąd w twoim rozumowaniu, który ew daje się zauważyć to to co było już często poruszane na forum

Czytałeś w BB do czego jest funkcja

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


mi się wydaje, że sama nazwa wskazuje że do wyświetlania liczb z zakresu int a nie z zakresu uint32_t i to jest no mega błąd wciąż powtarzany przez początkujących - a pokazuje on że nie zwracacie uwagi na typy danych ...

Jak chcesz wyświetlić prawidłowo liczę typu uint32_t za pomocą funkcji lcd_int(), która (zajrzyj sobie do jej środka) przyjmuje argumenty zaledwie 16-bitowe int a ty przekazujesz 32 bitowy argument ....

a więc ?

trzeba by chyba poczytać jak w ogóle działa lcd_int() w BB - na prawdę uwierz mi warto się z tym zapoznać - bo gdy opisywałem jak powstaje ta biblioteka to nie po to tylko żeby kogoś nauczyć pisania własnej biblioteki do LCD ale przede wszystkim po to aby pokazać techniki programowania. Do tych technik zalicza się chociażby tak prosta rzecz jak właśnie wyświetlanie liczb int ... a SPECJALNIE wręcz nie pokazałem w książce jak zrobić dla większych liczb bez znaku po to aby czytelnik sam troszkę pokombinował ...

Niestety z tego co widzę, wiele osób pomija w ogóle czytanie rozdziału o LCD bo .... wydaje im się, że .... "aaaaa i tak nigdy nie będę pisał własnej biblioteki do LCD skoro już jest więc po co czytać? ... "

No i kłopot gotowy ;) później czytelnik kompletnie zaskoczony jest gdy do funkcji lcd_int() przekaże liczbę np:

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


i się mega dziwi, dlaczego na LCD pokazuje się jakaś ujemna wartość zamiast 40000 ... rozumiesz ?

_________________
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: 15 paź 2016, o 16:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

No ale Mirku ja już zmodyfikowałem dawno tę funkcję tylko nie zmieniłem jej nazwy. Nie mam problemu z wyświetleniem całej liczby... Jak już napisałem mój problem to zrozumienie jak wyświetlić wynik po dzieleniu modulo w taki sposób żeby wyświetlały się wszystkie cyfry z dokładnością do 6 miejsc po przecinku, nawet jeżeli tą cyfrą jest zero. lcd_int to tylko nazwa zmodyfikowanej przezemnie funkcji która tak na prawdę obsługuje uint32_t.

Jak już napisałem na początku WSZYSTKO MI DZIAŁA. To znaczy że biblioteki pozyskane z BB czy GB zostały już przezemnie odpowiednio spreparowane do potrzeb tak dużych zmiennych. Zmodyfikowałem też bibliotekę obsługi enkodera w której użyłem sobie dodatkowych callbacków do potrzeb obsługi menu za pomocą jednego enkodera... zmodyfikowałem też funkcję obsługi SPI do wysyłania słowa 40 bitowego to wszystko potrafię zrobić i to nie jest dla mnie większy problem. Nie Chcę Mirku Ciebie angażować bo wiem że masz swoje zajęcia... Po prostu zapytałem o ten problem na forum bo pomyślałem że ktoś już pewnie kiedyś to rozpracował jak wyświetlacz resztę z dzielenia tak daleko po przecinku.

_________________
SP2LUB - LA1BUA



Ostatnio edytowano 15 paź 2016, o 16:53 przez SP2LUB, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 16:47 
Offline
Moderator
Avatar użytkownika

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

No więc pokaż że tę swoją wersję funkcji i powiedz co ci nie działa ;) bo jak na razie to zobaczyłem jakąś funkcję strojenie() z której nic a nic nie rozumiem bo nie jestem w temacie.

_________________
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: 15 paź 2016, o 17:02 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

w BB znalazłem projekt ADC w którym Mirku używasz czegoś takiego

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



Myślałem żeby go użyć u siebie do tego żeby w końcu zobrazować na LCD wynik do sześciu miejsc po przecinku nawet jeżeli są to same zera. Po prostu chodzi mi o to żeby wyświetlacz mi wyświetlał zamiast 24000000 to 24,000000, Ta liczba jest zmieniana płynnie przezemnie za pomocą enkodera i i bierze udział w obliczaniu słowa wysyłanego do SPI.

Chyba nie potrafię się wysłowić poprawnie i zadaję durne pytania :(


a moją funkcję widać już powyżej przy czym zakomentowałem moje proste działanie z dzieleniem ... to był test

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 17:25 
Offline
Moderator
Avatar użytkownika

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

Nie no to rzeczywiście ja może nie do końca rozumiem co ty chcesz uzyskać...

bo z jednej strony piszesz że chcesz użyć tej funkcji z książki, która formatuej string z liczby int - a ty z kolei piszesz że chcesz jakieś miejsca po przecinku .... no to już kompletnie nie wiem o co chodzi :( sorki

Ta moja funkcja nigdy nie wyświetli ci liczby z przecinkiem ....

Poza tym co za problem na początku zamiast myśleć o jakimś przecinku nieistotnym bo to tylko kwestia wyświetlania to skupić się na tym żeby ci się poprawnie liczby wyświetlały - co za różnica czy wyświetli się

24000000 czy 24,000000

no co za różnica ?

samym formatowaniem to można zająć się na samym końcu a ty pewnie mieszasz dwa zagadnienia i ani nie wychodzi ci może w ogóle wyświetlanie prawidłowego wyniku ani jego formatowanie na LCD

_________________
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: 15 paź 2016, o 17:41 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Liczba mi się wyświetla poprawnie. Jak widać na filmie który zamieściłem. Wszystko działa poprawnie. Ja właśnie jestem w trakcie finalizowania tego projektu i chcę już moją zmienną DATA która jest uint32_t i wyświetla się jako cała, wyświetlić na LCD z sześcioma miejscami po przecinku. Do tego próbowałem użyć dzielenia modulo i to mi dało że mogę wyświetlić pierwsze dwie cyfry a potem przecinek, a teraz bym chciał w jakiś sposób wyświetlić resztę z tego dzielenia czyli jeżeli mam 24 000 000 najpierw dzielę to przez milion i wyświetlam 24 o przecinek. Następnie szukam rozwiązania żeby wyświetlić to co po 24 ale warunek że ma się wyświetlać nawet jeżeli po przecinku są same zera. czyli dla mnie wszystkie cyfry są ważne bo one obrazują częstotliwość generatora z dokładnością do jednego Hz. Mirku nie zaprzątaj sobie głowy tym. Ja sobie jakoś poradzę.

_________________
SP2LUB - LA1BUA



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 15 paź 2016, o 17:49 
Offline
Moderator
Avatar użytkownika

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

No teraz dopiero zaczynam rozumieć w czym rzecz ;)

a to że nie wyświetlają ci się zera po modulo to co w tym dziwnego ? ;) .... toż ta funkcja formatująca jest prosta i chowa zera nieznaczące ;)

Jeśli masz z tym kłopot a za to np sporo jeszcze miejsca we flash to czemu nie skorzystasz np ze sprintf() wraz z formatowaniem ? ;)

_________________
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: 15 paź 2016, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 15 lut 2016
Posty: 265
Lokalizacja: Norwegia
Pomógł: 16

Jazio Twój kod zadziałał u mnie doskonale. To jest właśnie to rozwiązanie którego szukałem. Zmodyfikowałem sobie bibliotekę do LCD wzbogacając o Twoją funkcję.

_________________
SP2LUB - LA1BUA



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

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