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



Teraz jest 10 maja 2026, o 19:44


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 4 lis 2014, o 18:58 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

Jako że to mój pierwszy post to przede wszystkim witam wszystkich forumowiczów:)

Mam problem (chyba) z linkowaniem wymienionych bibliotek. Używam atmel studio 6 na windowsie xp. O ile w general jest checkbox "use vprintf library (-Wl,-u,vprintf)" to resztę wpisałem w AVR/GNU Linker ->Libraries, tzn m i printf_flt. Wszystkie komendy linkera wyglądają więc tak: -Wl,-Map="$OutputFileName).map" -Wl,-u,vfprintf -Wl,--startgroup -Wl,-lm -Wl,--end group -mmcu=atmega328a.

Program który piszę na wyświetlać wartości zmiennych typu float na ekranie wyświetlacza LCD. Znaki są wyświetlane, lecz są one bez sensu. Wygląda to np tak:

Obrazek

Do obsługi wyświetlacza używam biblioteki hd44780.h ze strony kamami: http://www.kamami.pl/index.php?productID=46782
Wyświetlacz w moim układzie również od kamami: http://www.kamami.pl/index.php?ukey=search

Wyświetlam stringi tak jak tu:

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



Lub wartości zmiennych typu float, konwertując je uprzednio na tablicę char[8] przy pomocy "sprintf"

Z programem jest wszystko w porządku, bo wgrywając z innego komputera działa tak jak powinno. Różnica jest taka, że tam programowałem używając wiersza poleceń i zewnętrznego makefile'a. W AS6 próbowałem też opcji 'use external makefile' ale nic to nie zmieniło (zresztą wolałbym kompilować narzędziami środowiskowymi). Nie jest to też problem programatora, bo inne układy mogę nim programować. Jakieś pomysły o co może chodzić? Z góry dziękuję:)

Cytuj:
Poprawiłem listing kodu. Kila. P.S. Matko z córką, co to było??
Obrazek



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

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Witam,

1. Kolega kody wrzucamy w znacznikach syntax, nawet jednej linijki.
2. Kolega używanie float na mikrokontrolerach to istna masakra ;), ja zrobiłem parę układów w życiu i nie miałem musu z nich korzystania. Więc naprawdę zastanowił bym się nad ich użyciem.
3. Funkcję typu sprintf to następne katowanie mikrokontrolera. Już od samej funkcji pewnie zajętość programu ładnie skacze go góry.
4. Funkcja sprintf nie służy do konwertowania zmiennych, tylko do wyświetlania. Oczywiście jest możliwość rzutowania zmiennych, ale nie na zmienną typu char.
5. Nie ma prostej metody, aby przekształcić zmienną float na łańcuch znakowy, oczywiście da się, ale ja nawet pomagając w tym temacie koledze z forum, poświęciłem na to kilka dni.
6. Zastanawiam się po co kolega bawi się w jakieś zewnętrzne makefile? Korzystam również z AS 6.2 i nigdy nie przejmowałem się makefile'm. Niech się AS o to martwi, a nie ja.
7. Na podstawie funkcji LCD_WriteText, niech kolega sobie utworzy funkcje do wyświetlania zmiennych. Jak kolega napisze, że nie wie jak to dopiero będę się zastanawiał nad sensem tego float'a i grzebania po makefile ;)

Napisz może kolega co chcesz uzyskać tymi float'ami, może będzie coś łatwiej doradzić/podpowiedzieć.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2014, o 11:22 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

No cóż, nic dziwnego w takim razie, że musiałem zmieniać ATMEGĘ 8 na 328.

Co do makefile'a również robiłem to niechętnie. Po prostu na tym drugim kompie zadziałało w ten sposób, więc tutaj też spróbowałem. Nie wyszło, także oczywiście nie zamierzam się w to dalej bawić.

Float jest potrzebny zdecydowanie. Chodzi o wyświetlanie przyspieszeń w trzech osiach w jednostkach g. Używam w programie funkcji przetwarzania przetwornika AC i czułości akcelerometru wyznaczonej poprzez kalibrację. Nie ma opcji, żeby wystarczyły liczby całkowite. Można próbować ewentualnie mnożyć przez np. 1000 i wtedy jakoś sprytnie konwertować na char, ale czy to to faktycznie powoduje błędy w wyświetlaniu?

Przyznaję, nie wiem do końca jak działa to sprintf, ale działało, stąd zostawiłem. Wygląda to np. tak:
Składnia: [ Pobierz ] [ Ukryj ]
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Zatem łączę zwykłego stringa z przyspieszeniem konwertowanym na char. Może tego nie widzę, ale jaką inną funkcję mógłbym napisać w swojej bibliotece, żeby nie robić tego z użyciem sprintf? Muszę i tak połączyć stringa z tym przyspieszeniem bo chcę mieć na ekranie "ax=<wartość zmierzonego przyspieszenia>".

I czy faktycznie w tym leży problem i użycie floatów i sprintf powoduje nieprawidłowe wyświetlanie? Może się nie znam, nie wykluczam, ale nie widzę związku.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2014, o 11:34 
Offline
Moderator
Avatar użytkownika

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

Hipermuflon napisał(a):
Float jest potrzebny zdecydowanie. Chodzi o wyświetlanie przyspieszeń w trzech osiach w jednostkach g. Używam w programie funkcji przetwarzania przetwornika AC i czułości akcelerometru wyznaczonej poprzez kalibrację. Nie ma opcji, żeby wystarczyły liczby całkowite

Jest jest opcja tylko im wcześniej zrozumiesz, że jest i zrozumiesz jak się to robi prosto tym szybciej pozbędziesz się wielu problemów ....

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

Dołączył(a): 20 wrz 2013
Posty: 647
Zbananowany użytkownik

Pomógł: 101

Hipermuflon napisał(a):
Wszystkie komendy linkera wyglądają więc tak: -Wl,-Map="$OutputFileName).map" -Wl,-u,vfprintf -Wl,--startgroup -Wl,-lm -Wl,--end group -mmcu=atmega328a.


Nie widać -lprintf_flt.

Do konwersji floatów są jeszcze funkcje dtostre i dtostrf.

_________________
+++++[>++++<-]>[>++++++<-]>.---------.+++.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2014, o 18:11 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

xor napisał(a):
Hipermuflon napisał(a):
Wszystkie komendy linkera wyglądają więc tak: -Wl,-Map="$OutputFileName).map" -Wl,-u,vfprintf -Wl,--startgroup -Wl,-lm -Wl,--end group -mmcu=atmega328a.


Nie widać -lprintf_flt.

Do konwersji floatów są jeszcze funkcje dtostre i dtostrf.


Przepraszam źle napisałem (nie mam internetu na tamtym komputerze więc nie mogłem skopiować). W linkerze jest tak: -Wl,-Map="$OutputFileName).map" -Wl,-u,vfprintf -Wl,--startgroup -Wl,-lm -Wl,-lprintf_flt -Wl,--end group -mmcu=atmega328p

Zastosuję się do porad z konwersją i nie stosowaniem floatów w swoim czasie. Na razie wyrzuciłem z programu absolutnie wszystko robię tylko wyświetlanie:

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


I nadal jest ten sam problem więc to na pewno nie o to chodzi. Czy trzeba podać jakąś konretną ścieżkę w AVR/GNU Linker->Libraries? Tam jest pod "Libraries" coś takiego jak "Library search path (-Wl,L)". Może to o to chodzi? Jak wyszukałem bibliotekę printf_flt to jest ich na dysku aż 56 (z rozszerzeniem a). Czy może chodzić o to, że nie może ich znaleźć?

Jeszcze jedna rzecz mnie dziwi. Mimo, że robiłem clean tak prosty program zajmuje mi ponad 3 kB! Czy to może mieć związek z dużą ilością "inkludów" czy też np nie do końca się wszystko wyczyściło?



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

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

No i wez tlumacz ... panie ... te 3kb to biblioteki do obslugi floatow a nie zaden blad ... rozumiesz teraz? ... Wlasnie widzisz jeden z minusow

_________________
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: 5 lis 2014, o 20:41 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

mirekk36 napisał(a):
No i wez tlumacz ... panie ... te 3kb to biblioteki do obslugi floatow a nie zaden blad ... rozumiesz teraz? ... Wlasnie widzisz jeden z minusow


A czego tu nie rozumieć? Rozumiem i nigdy nie-nie rozumiałem;) Napisałem, że będę chciał się tym zająć ale teraz już jest pewne, że ewidentnie nie w tym leży problem.

Stworzyłem całkiem nowy projekt, z inkludów zostawiłem tylko avr/io.h, util/delay.h i ten nagłówek od lcd. Próbuję wyświetlić cokolwiek przy pomocy LCD_WriteText, ale problem dalej jest. Już mam zero pomysłów o co może chodzić..



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lis 2014, o 20:46 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

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

Czy jest w porządku?

_________________
Dragonus Cracovus: Biomagia



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

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Kolega:

1. Nie grzeb w ustawieniach kompilacji i itp. Jedyne co Cię tam interesuje to:
- ustawienia taktowania procesora,
- ustawienia optymalizacji -> musi być for size -0s.
2. Wrzuć kod jaki masz cały w main'ie może coś znajdziemy, bo kolega Krauser już Ci wskazuję na jeden kwiatek w kodzie.

z Niebieskim pozdRowieniem,
Doman89



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2014, o 17:30 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

Całość programu w tym momencie:

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


I też nie działa, więc kombinacje ze sprintf tym bardziej nie... Spróbuję jeszcze wgrać nowy firmware, choć inne układy mogę bez problemu programować więc nie spodziewam się za wiele..

doman89 napisał(a):
ustawienia optymalizacji -> musi być for size -0s.

Co masz na myśli dokładnie?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2014, o 18:03 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 03 mar 2014
Posty: 580
Lokalizacja: Jastrzębie-Zdrój
Pomógł: 71

Kolega dla Twojego dobra zapamiętaj:

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


Tak się to poprawnie robi w Atmel Studio:

1. Project -> [nazwa_projektu] Properties...
2. Toolchain
3. AVR/GNU C Compiler -> Symbols
4. W okienku Defines symbols (-D) kilkamy dokument z zielonym plusikiem
5. W oknie co wyjdzie wpisujemy: "F_CPU=8000000UL" dla 8MHz, dla innych analogicznie
6. Następnie AVR/GNU C Compiler -> Optimization
7. Ustawiamy Optimization Level na Optimize for Size (-Os)

Jeżeli masz problemy z Atmel Studio to przejdź na Eclipse. 99% użytkowników tego forum z niego korzysta wraz z p. Mirkiem który popełnił parę poradników na jego temat.

z Niebieskim pozdRowieniem,
Doman89


Autor postu otrzymał pochwałę


Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 6 lis 2014, o 21:56 
Offline
Nowy

Dołączył(a): 04 lis 2014
Posty: 9
Pomógł: 0

doman89 napisał(a):
Kolega dla Twojego dobra zapamiętaj:

Tak się to poprawnie robi w Atmel Studio:

1. Project -> [nazwa_projektu] Properties...
2. Toolchain
3. AVR/GNU C Compiler -> Symbols
4. W okienku Defines symbols (-D) kilkamy dokument z zielonym plusikiem
5. W oknie co wyjdzie wpisujemy: "F_CPU=8000000UL" dla 8MHz, dla innych analogicznie
6. Następnie AVR/GNU C Compiler -> Optimization
7. Ustawiamy Optimization Level na Optimize for Size (-Os)
[/color]


Say whaaat? Zadziałało. Dzięki wielkie. Nie wiedziałem, że tak się to robi. Wcześniej nie miałem tego typu problemów, ale teraz będę pamiętał, żeby tak robić.

Tzn na razie jeszcze nie chwalę dnia, bo pytanie czy zadziała pierwotna wersja programu, ale powinno być ok. A potem popróbuję coś zakombinować z dtostre/f i nie używaniem floatów, za te rady również bardzo dziękuję.

I zostanę przy AS jednak, lubię je a eclipse mi się kojarzy z linuxem którego nienawidzę :D



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

Strefa czasowa: UTC + 1


Kto przegląda forum

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