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



Teraz jest 27 maja 2026, o 10:55


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 6 ] 
Autor Wiadomość
PostNapisane: 14 kwi 2016, o 07:28 
Offline
Nowy

Dołączył(a): 14 kwi 2016
Posty: 7
Pomógł: 0

Witam. To mój pierwszy post na tym forum. Nauka AVR to droga przez mękę, zwłaszcza jak się na co dzień pisze w Delphi, .NET.

uC = ATTiny25
Piszę bardzo, bardzo, prosty program do sterowania błyskaniem lampą stroboskopową. Dosłownie 4 zmienne po kilka bajtów. Moją filozofią było to, aby pętla główna kręciła się jak najszybciej i ja między czasie sprawdzał bym sobie kilka różnych innych rzeczy przy tak zwanej okazji, np.: stany klawiszy. Dlatego w pętli głównej zastosowałem delay() w mikrosekundach a nie w milisekundach. Chciałem sprawdzać klawiaturę jak najszybciej, bo brakuje mi tu dedykowanego zdarzenia od klawiatury. Czyli zrobiłem tak:

[ przede wszystkim to proszę prawidłowo umieszczać kody na forum - tu topic7402.html przecież jest instrukcja jak to robić, OK ? - mirekk36 ]

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


oczywiście w takiej sytuacji aby uzyskać opóźnienie = 1s to zmienna "LoopCounter" oraz zmienna "DelayFlashing_us" muszą być typu uint32_t czyli unsigned integer 4 bajtowe.
No i dobrze, niech będą takiego typu, kompilator mi to puścił, a programator wgrał soft w uC - bez błędów.

Jednak program świrował. Aż w końcu do testów umieściłem w kodzie taką linijkę:

DelayFlashing_us = 1000 * 2000;

I wtedy kompilator dopiero zwrócił mi (nawet nie błąd) ostrzeżenie, że w tym działaniu nastąpi przepełnienie typu. Do licha, jak to możliwe? Wszak wynikiem tego działania jest zaledwie 2 000 000 a ten typ danych (4 bajty unsigned) mieści liczbę nieco ponad 4 miliardy.

Przerobiłem program (powyższy kod) z mikrosekund na milisekundy i teraz pętla jest o 1000 razy wolniejsza. Zastosowałem typy uint16_t i teraz soft działa dobrze.

To jak to jest w końcu, czy te „średniowieczne” mikrokontrolery nie obsługują nawet typów 4 bajtowych? Kompilator niby obsługuje te typy, w książce niebieskiej są przedstawione jako zdatne do użytku, a w realu nie działają?

A są w ogóle jakieś ATTiny, które normalnie (jak np.: choćby te stare Pentium) obsługują obliczenia zmiennoprzecinkowe i tak dalej? Przepraszam ale jestem programistą PC’towym i tu mi brakuje jakby to powiedzieć … :-) ... kilku fajnych rzeczy poczynając od BIOS’u z obsługą FAT16 np.: do kart SD, 10MB RAM’u, trybu chronionego, i tak dalej.



Ostatnio edytowano 19 kwi 2016, o 06:22 przez analizator, łącznie edytowano 1 raz

Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 kwi 2016, o 07:37 
Offline
Moderator
Avatar użytkownika

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

analizator napisał(a):
I wtedy kompilator dopiero zwrócił mi (nawet nie błąd) ostrzeżenie, że w tym działaniu nastąpi przepełnienie typu. Do licha, jak to możliwe? Wszak wynikiem tego działania jest zaledwie 2 000 000 a ten typ danych (4 bajty unsigned) mieści liczbę nieco ponad 4 miliardy.

Ale ty nie doczytałeś sobie o tzw "domyślnej promocji do int" ... a warto:
http://atnel.pl/domyslna-promocja-do-typu-int.html

wtedy byś zrozumiał, że wystarczy to zapisać tak:

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


i obliczenia przejdą poprawnie

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

analizator napisał(a):
Zastosowałem typy uint16_t i teraz soft działa dobrze.

A widzisz ? ;) bo to właśnie ma bezpośredni związek z tym co napisałem wyżej - "domyślna promocja do int czyli do typu 16-bitowego"

------------------------ [ Dodano po: 4 minutach ]

analizator napisał(a):
To jak to jest w końcu, czy te „średniowieczne” mikrokontrolery nie obsługują nawet typów 4 bajtowych? Kompilator niby obsługuje te typy, w książce niebieskiej są przedstawione jako zdatne do użytku, a w realu nie działają?

Niestety to co tu wypisujesz to średniowiecze ... bo zamiast się zastanowić i pomyśleć ... "kurczę pewnie o czymś nie wiem - warto dopytać" ... to wyciągasz jakieś sobie banialuki z głowy ...

Polecam ci tę książkę i to zdecydowanie:

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

Z tego co piszesz to ją niby masz .... ale widać, że jak część osób przeleciałeś jak burza po wybranych rozdziałach uznając, że nie ma co czytać całości no i wychodzi co wychodzi .... A ja w tej książce piszę i podaję przykłady jak radzić sobie z obliczeniami zmiennoprzecinkowymi bez typów FLOAT, bo można. A jak się uprzesz już na obliczenia zmiennoprzecinkowe to

1. zaraz się zdziwisz i zaczniesz narzekać, że STRASZNIE wzrosło zużycie FLASH
2. że obliczenia zaczynają wolniej działać niż ty się spodziewałeś

a zajrzyj że sobie na mój blog: http://mirekk36.blogspot.com/2013/04/ec ... float.html i zobacz jak to się robi żebyś mógł na własne oczy zobaczyć, że działają obliczenia na typach zmiennoprzecinkowych w AVR

Książka ale po przeczytaniu całości wiele ci wyjaśni o tym jak podejść do programowania mikrontrolerów właśnie - szczególnie gdy jesteś przyzwyczajony do programowania obiektowego na PC i nie rozumiesz na tym etapie jak np w takim małym procku zorganizować sobie Zdarzeń (EVENTs), Timerów programowych, czy funkcji zwrotnych (Callback) - a można i to spokojnie .... i ta książka właśnie też o tym traktuje i wprowadza czytelnika w taki sposób programowania ...

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

analizator napisał(a):
A są w ogóle jakieś ATTiny, które normalnie (jak np.: choćby te stare Pentium) obsługują obliczenia zmiennoprzecinkowe i tak dalej? Przepraszam ale jestem programistą PC’towym i tu mi brakuje jakby to powiedzieć

No to właśnie IDEALNIE widać, że jesteś programistą PC'towowym ... a tacy zwykle się załamują gdy nagle ktoś im wyjmie obliczenia zmiennoprzecinkowe - to jakby im wyjąć dywanik spod nóg. Gdy tymczasem na takich małych 8-bitowych prockach wręcz warto unikać jak ognia obliczeń na typach zmiennoprzecinkowych. Ale UWAGA! ;) .... nie oznacza to że nie da się mieć obliczeń w wyniku których trzeba przedstawić liczby zmiennoprzecinkowe bo się da! i to bez typów float i double a TYLKO w oparciu o typy całkowite ;) ... hmmm dziwne to pewnie dla ciebie co? ;) .... a da się .... i to dość prosto ....

Widzisz ? Wszystko się prawie da - tylko trzeba zrozumieć ideę jak podejść do programowania na małych prockach ... więc jeszcze raz powtórzę po to jest książka BLUEBOOK ... bo w niej masz także pokazane przykłady jak bez zmiennoprzecinkowych obliczeń (które oczywiście są dostępne .... choć ty chyba nawet o tym nie wiesz) .... można uzyskać wyniki zmiennoprzecinkowe w oparciu o obliczenia na typach całkowitych...

To dziwne, zresztą troszkę, że zabierając się za procki i AVR GCC nawet nie zapoznałeś się z podstawowymi typami dostępnymi w tym kompilatorze dla tych procków.... A od tego zwykle się zaczyna.

------------------------ [ Dodano po: 16 minutach ]

analizator napisał(a):
kilku fajnych rzeczy poczynając od BIOS’u z obsługą FAT16 np.: do kart SD, 10MB RAM’u, trybu chronionego, i tak dalej.

Pomyśl o skali .... bo schodzisz z GIGANTYCZNEGO systemu np Windows czy Linux na PC czyli na 64 bitowych procesorach wielordzeniowych i wielowątkowych na samo dno ..... do świata mikroskopijnych zwierzątek 8-bitowych ... i co ? chcesz im zapakować na plecy 10 MB RAMu ? ;) .... Panie panie ... haaalo, puk puuuk .... tu procki np ATtiny2313 mają tylko 128 bajtów RAM ! a ATtiny13 tylko 64 bajty RAM a są i takie bez RAM !!! ... i co? i da radę ....

Da radę i obsłużyć kartę pamięci z systemem FAT32 !, da radę obsłużyć EThernet !!! .... i mnóstwo innych ciekawych rzeczy .... pomyśl jakie to są dopiero ciekawe wyzwania ... żeby tego dokonać na takich mikrusach a nie iść na łatwiznę i robić to pod kontrolą systemu Windows czy Linux ;)

_________________
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: 17 kwi 2016, o 06:59 
Offline
Nowy

Dołączył(a): 14 kwi 2016
Posty: 7
Pomógł: 0

Dzięki za odpowiedź. Aaaa, domyślna promocja do int. A ja czytam książkę (jestem na stronie 280) i nie widziałem opisu tej promocji do int. Hm, czyli zapewne jest to opisane gdzieś dalej i jeszcze nie dotarłem na tą stronę.

Eeeeh, C, C. Trochę kiedyś pisałem w C, generuje bardzo szybki, mały kod i na tyle pozwala programiście, że aż za bardzo. Jak trzeba to piszę w C ale szczerze to wolę Pascala bo prowadzi programistę za rączkę i nie pozwala na domyślną konwersję typów danych, sprawdza przepełnienie buforów (tablice, struktury) i składnia języka jest bardziej zbliżona do naturalnego, mówionego języka angielskiego (nie trzeba pamiętać tych znaczków=operatorów), np.: if (..) Then (..), albo zamiast "|" piszemy po ludzku "or", albo zamiast "{, }" jest naturalne "begin, end". I denerwuje mnie to, że C pozwala na skróty myślowe bo po roku przerwy zapominam o co chodzi, np.: i++; W Pascalu musi być i := i+1 i każdy, kto nawet nigdy nie pisał w Pascalu wie wtedy o co chodzi.

W kontekście treści z niebieskiej książki zachwalającej C - owszem C jest bardzo bardzo dobre, ale składnia Pascala jest prostsza do nauczenia a po skompilowaniu wychodzi mniej więcej na to samo, przynajmniej na PC. A w AVR nie wiem nawet czy są kompilatory Pascala.

No to się wyżaliłem :-)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 kwi 2016, o 08:21 
Offline
Moderator
Avatar użytkownika

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

analizator napisał(a):
Aaaa, domyślna promocja do int. A ja czytam książkę (jestem na stronie 280) i nie widziałem opisu tej promocji do int. Hm, czyli zapewne jest to opisane gdzieś dalej i jeszcze nie dotarłem na tą stronę.

Przecież podałem tobie LINK wyżej gdzie możesz o tym przeczytać - bo akurat w książce tego nie ma

analizator napisał(a):
W kontekście treści z niebieskiej książki zachwalającej C - owszem C jest bardzo bardzo dobre, ale składnia Pascala jest prostsza do nauczenia a po skompilowaniu wychodzi mniej więcej na to samo, przynajmniej na PC.

Wiesz co? jak od już 25 lat programuję na PC w Pascal/Delphi i kiedyś w ogóle nie mogłem zrozumieć języka C. A dzisiaj ? .... dzisiaj to sobie nie wyobrażam życia bez takich języków jak C/C++ ..... Dobrze więc rozumiem ludzi, którzy przyzwyczajeni są nogami i rękami szczególnie do Pascala .... to pod tym kątem pisałem też Bluebooka żeby im było łatwiej przejść na C tak jak i mnie się to udało - chociaż dopiero za chyba siódmym razem ;)

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

Cytuj:
No to się wyżaliłem


ale tego to nie przeczytałeś i nie poprawiłeś o co prosiłem w pierwszym poście
[ przede wszystkim to proszę prawidłowo umieszczać kody na forum - tu topic7402.html przecież jest instrukcja jak to robić, OK ? - mirekk36 ]

_________________
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: 19 kwi 2016, o 06:16 
Offline
Nowy

Dołączył(a): 14 kwi 2016
Posty: 7
Pomógł: 0

Przeczytałem o wklejaniu kody ale w ostatnim moim poście nie wklejałem prawdziwego kodu, tylko dwa nawiasy klamrowe i takie tam pierdoły. Oczywiście, będę się stosował w razie wklejania "prawdziwego" kodu.

Przepraszam, zastosowałem złą kolejność czytania. Najpierw odruchowo poszedłem do książki i zacząłem szukać tego "UL' a dopiero potem przeczytałem treść z linku, gdzie było napisane, że w książce tego nie ma. Nie wiedziałem, że należy zastosować odwrotną kolejność: najpierw link, a potem... już bym nie sięgał do książki.

Sądziłem, że w książce jest wszystko. Może przydało by się wydanie 3'cie poprawione i jeszcze bardziej uzupełnione niż poprzednie? Może nawet złożone z 2'ch tomów? Ta zielona książka to jeszcze co innego ale mówię o niebieskiej, jak się nie mieści wszystko w jednym tomie (trzymanie 2kg w ręku też nie jest wygodne), to zawsze można podzielić na 2 tomy, każdy po ...powiedzmy, no nie wiem, 1000 stron? Jak się kiedyś pojawi to kupię.

(... po kilku minutach analizowania poprzednich postów....)

Aaa, chodzi o to abym się cofną i wyedytował poprzednią treść i zmienił to co już wcześniej napisałem - ten kod. Nie chodziło wyłącznie o nowe wpisy. Już poprawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 19 kwi 2016, o 06:20 
Offline
Użytkownik

Dołączył(a): 26 lip 2015
Posty: 269
Pomógł: 34

Nawet jak wstawiasz wyrywki to także dajesz syntax. Jak to co piszesz jest w jakimś języku programowania i jest tego więcej jak 2linijki wstawiaj w syntax.



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

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