dondu napisał: niveasoft napisał: Uważam, że moderator ...
Działania moderatorskie wykonuję na czerwono za pomocą odpowiednich funkcjonalności.
Niestety raz się zdarzyło że na czerwono wyciąłeś tekst o "niewygodnym" środowisku programistycznym
Ale nie o tym będę pisał.
Napiszę jak to wyglądało u mnie.
Ja zaczynałem od BASCOMa. I to BASCOMa '51.
Były artykuły w EdW. Nie miałem jeszcze kompa więc sobie tylko czytałem.
Poznałem jak działają pętle, ify, itp.
Potem gdy rodzice w końcu kupili komputer to w EdW powtórnie wyszła seria o BASCOMie. Rozpoczęła się od jednego krótkiego wstępu w BASICu na PC (takie coś co się w DOSie odpalało).
No i faktycznie było fajne (BASIC na PC). Przynajmniej jak dla kogoś kto wcześniej w ogóle nie programował. I nie miał nikogo znajomego co by to robił. Więc co bym nie napisał, i w czym bym nie napisał, to było coś i szpan na całą wieś.
Tak więc ten jeden numer Edw z BASICem i potem od razu leciał kurs BASCOMa.
Prowadził go taki gość co już nie żyje. Pisał że BASCOM go powalił na kolana jako amatora. Bo nigdy nie mógł ogarnąć różnych rzeczy, a w BASCOMie np. wyświetlenie czegoś na LCD to była jedna komenda.
I nie powiem, w tamtych czasach jak słowo datasheet było mi jeszcze obce (nawet internetu nie miałem, BASCOMa mi jakiś kolega ściągnął (i to na dyskietkę)) to wyświetlenie czegoś na LCDku komendą było prostsze niż napisanie obsługi LCDka od 0. W ogóle to się dziwiłem wielce wtedy, jak ludzie robią różne cuda na układach scalonych. Skąd oni wiedzą co jest w środku?
Dopiero jak przyszedł internet, a wraz z nim datasheety, to zrozumiałem
Od razu jeden z kolegów mi powiedział żeby przejść na C. I nawet chciałem, ale zawsze mnie odstraszała składnia. Teraz wiem dlaczego.
Bo wszyscy z uporem stosują składnię w stylu:
Zaloguj się, aby zobaczyć kod
mi ona się wydaje nielogiczna i brzydka, i ja wolę taką:
Zaloguj się, aby zobaczyć kod
W BASCOMie taki styl jest naturalny. Dlatego bardziej mnie przekonywał. Nie wiedziałem że w C też tak można.
Na początku przygody każdy chce się posilać przykładami i mnie osobiście natrafione przykłady w C po prostu odstraszały. Nie zapisy do rejestrów bo to było mi znane (kurs BASCOMa '51 wiele rzeczy miał robionych a rejestrach). Tylko właśnie ten styl dziwny. Oraz zagnieżdżanie 100 rzeczy w jednym równaniu. Ciężko było po prostu zrozumieć czyjś kod w C. A w BASCOMie wszyscy pisali prosto.
Podobał mi się też symulator BASCOMa.
Z czasem pojawiały się problemy z czasem wykonywania kodu i innymi kwiatkami.
Niektóre rzeczy poprawiałem sam bo posiadłem umiejętność edytowania bibliotek BASCOMa (wcześniej zacząłem już robić wstawki assemblerowe, więc po otwarciu bibliotek BASCOMa wiedziałem co jest co i jak to edytować (biblioteki są w assemblerze)).
Inne rzeczy były dziwne więc po prostu robiłem ręczne protezy już w kodzie (w postaci wstawek asm albo ręcznego przypisania do rejestrów).
Pamiętam że były ciągłe problemy z Timerami. Co Timer, albo co procesor, to któraś opcja nie działa. Bo AVRy miały trochę burdel w Timerach i nawet się nie dziwię że ciężko było to ogarnąć (bo każdego Timera z każdego procka BASCOM musiał by w sumie osobną bibliotekę mieć).
W końcu całkowicie przeszedłem na konfigurowanie rejestrami. Co najlepsze symulator BASCOMa mimo to działał (prawdopodobnie symuluje niskopoziomowo na podstawie zawartości rejestrów a nie na podstawie własnych wysokopoziomowych komend).
W każdym razie w pewnym momencie, mimo że pisało się fajnie, zdałem sobie sprawę że tych protez jest za dużo.
Niech ktoś sobie zobaczy projekt AVT2864 który rzekomo jest napisany w BASCOMie. A tak naprawdę to jest jedna wielka wstawka assemblerowa.
W końcu postanowiłem się przełamać i spróbować C.
Myślałem że będzie to trudne. Najbardziej się bałem obsługi LCDka bo tego nigdy nie zrobiłem samodzielnie (jedyna rzecz do której używałem wbudowanych funkcji BASCOMa).
Okazało się że już pierwszego dnia pisało się lepiej niż w BASCOMie.
Kompilator C po prostu pozwala na dowolne "zagnieżdżanie" operacji arytmetycznych. Wtedy już programowałem ostro i zagnieżdżania się już nie bałem tak jak wcześniej. I wtedy wyszło ograniczenie BASCOMa.
W BASCOMie można było z tego co pamiętam zagnieździć co najwyżej jedną rzecz.
A w ifie to w ogóle nic.
Nie można było napisać:
If (a+b) > c Then
Trzeba było wcześniej wliczyć a_b = a + b.
I dopiero to podać do Ifa.
Albo obliczanie w jednej linii po prostu.
a = b*c + d*e + cos(e)
Też nie. Osobno musowo.
BASCOM też kiepsko kompiluje. Np. If z funkcją And albo Or (oczywiście też nie można zagnieździć zbyt wielu, max to było 1

).
On to kompiluje jako faktyczną funkcję And czy Or.
Sprawdza jeden warunek i ustawia bit. Sprawdza drugi i ustawia drugi bit.
Robi And albo Or na tych bitach otrzymując trzeci bit. I dopiero trzeci If z tego trzeciego bitu określa czy If wejdzie do środka czy nie.
Zamiast zagnieździć te dwa sprawdzenia w sobie (dla And). Czy dać je "prostopadle" (dla Or).
Albo jak się napisało
If a > 5 Then
to BASCOM uparcie sprawdzał czy jest większe od 5 rozwijając to w jakieś rozwinięcia algotytmiczne (AVR nie ma do tego instrukcji, ma tylko na >=).
Zamiast po prostu zamienić na If a >= 6 Then
Zagnieżdżanie i te nieszczęsne Ify sobie ogarnąłem wcześniej za pomocą takiego prekompilatora jak to nazwałem.
Teraz mój zasób słów jest większy więc bym to nazwał "przyspieszać do zwalniacza". Bo przyspieszało to powolny kompilator.
Zmieniało te nieszczęsne
If a > b Then
na
If a >= (b+1) Then
Dodawanie stałej zmieniało na odejmowanie odpowiedniej stałej ujemnej (AVR nie ma instrukcji addi, ma tylko subi).
I parę innych rzeczy. Kod faktycznie działał potem szybciej.
Nie żałuję, bo co się nauczyłem to moje.
Prekompilator się później przydał bo posłużył później do stworzenia własnego kompilatora (na potrzeby programowania inteligentnych budynków).
Ale po przesiadce na C odkryłem że to była trochę ślepa uliczka.
Po zdekompilowaniu przykładowego kodu (jakoś mało zajmował w stosunku do BASCOMa) okazało się że kompilator C robi te wszystkie moje sztuki sam. A nawet robi jeszcze inne.
Po co więc szukać nieoptymalności w BASCOMie, i je potem ręcznie poprawiać.
Kod do obsługi LCDka którego się tak bałem, powstał w godzinę i okazał się fajny.
Fajny bo napisany raz, a posłużył wiele razy.
A w BASCOMie zawsze musiałem uważać jak przenosiłem jakiś fragment (bo pisałem wstawki w assemblerze i trzeba było pilnować których rejestrów się użyło a które są jeszcze wolne).
Po jakimś czasie musiałem powrócić do BASCOMa bo musiałem przerobić zrobione wcześniej urządzenie. I nagle problem. Nie działa po przekompilowaniu (mój układ opierał się na pierwszym pomiarze ADC po uruchomieniu urządzenia (pomiar napięcia zasilania)).
Co się okazało. W AVR pierwszy pomiar po uruchomieniu ADC jest błędny.
A co robił stary BASCOM? Na wszelki wypadek
każdy pomiar robił dwukrotnie.
W nowszej wersji kompilatora już tak nie było. A ja przekompilowałem kod właśnie jakimś nowszym BASCOMem.
To oczywiście podstawa obsługi ADCka i trzeba ręcznie zrobić ten jeden pomiar przy inicjalizacji ADCka. Ale wcześniej nie znałem tego bo BASCOM wszystko załatwiał sam. Więc nawet nie wnikałem w datasheeta w tym miejscu.
Tak więc trochę przeróbek i kod znowu działa. Ale wiem po czytaniu elektrody że takich zmian jest więcej. Co edycja BASCOMa to wszystkie starsze programy po przekompilowaniu przestają działać.
Ostatnio pisałem na elektrodzie że jest równość pomiędzy C i BASCOMem. To wyjaśnię że chodziło mi o język. Bo sam język to tylko język. Sam BASCIC dopuszcza zagnieżdżanie obliczeń. Czy inne rzeczy.
To dopiero kompilator jest upośledzony.
Ale wystarczy upośledzony kompilator (do BASCOMa jest jeden, więc nie można wybrać innego mniej upośledzonego) żeby raczej tego unikać.
Mimo to nie będę zniechęcał do BASCOMa.
Jak mówię, sam zaczynałem w BASCOMie i pisałem w nim dobre kilka lat, zanim przeszedłem na C.
W pewnym sensie nie żałuję.
Jednak generalnie BASCOM nie dał mi nic. To samo bym napisał w C gdybym zaczynał od C.
Jest więc pomiędzy nimi równość gdy się chce pisać proste rzeczy.
To nie jest więc argument za BASCOMem (że ktoś chce pisać tylko programy amatorskie). W dodatku nawet gotowa komenda z BASCOMa może nie działać z powodu jakiegoś błędu w jego bibliotece. Tak więc dla początkującego BASCOM wcale nie musi być taki dobry jak się wydaje.
Wiele rzeczy o których wspomniałem być może już zostało naprawionych.
A zawsze coś bardziej skompilowanego będzie potrzeba i nagle się BASCOM wyłoży (operacje na wskaźnikach, albo zagnieżdżenie czegoś dla wygody choćby).
Już nawet nie mówię o funkcjach, ale o zwykłym zapisie do rejestrów (kiedyś był problem jak jakiś większy procek miał na tyle dużo rejestrów SFR że musiały być w dwóch wersjach adresowania).
Po prostu chyba nikt nie zauważył co odstrasza początkujących od C.
Ja zauważyłem na sobie, więc piszę. Są to skomplikowane kody z internetu.
Ale kod w C wcale nie musi być skomplikowany.
Czym się różni:
Zaloguj się, aby zobaczyć kod
od
Zaloguj się, aby zobaczyć kod
?
Niczym (w sensie skomplikowania).
Tak więc i w C można pisać prosto.
Ale
w razie czego dobrze jest móc napisać:
Zaloguj się, aby zobaczyć kod
na co BASCOM nie pozwoli. I trzeba będzie napisać:
Zaloguj się, aby zobaczyć kod
Jakoś w BASCOMie nie wydaje się to prostsze.
Zniechęcają też operacje w stylu:
Zaloguj się, aby zobaczyć kod
Ale wcale nie musowo tak pisać.
Można tak jak w BASCOMie napisać łopatologicznie:
Zaloguj się, aby zobaczyć kod
Po prostu początkujący trafiają na tą pierwszą wersję i nie wiedzą co to jest. Albo jak nawet wiedzą to myślą że tak musowo a im się to nie podoba.
A prawda jest taka że wcale tak nie musowo. Można pisać po swojemu.
Tak więc zniechęcać nie zniechęcam. Mam nadzieję że ten mój przykład sam zniechęci
W razie czego mogę nawet coś podpowiedzieć.
Ale od razu mówię: już mnie kilka osób prosiło o pomoc z BASCOMem i się wtedy okazywało że ja wcale nie znam BASCOma: bo po prosu nigdy nie wykorzystywałem tych jego wysokopoziomowych funkcji. Co najwyżej te od LCDka czy UARTa. Więc moja pomoc się ograniczy do obsługi menu i prostych rzeczy jak ify i pętle.
PS. Nie ma to jak się rozpisać