Do zadań gdzie musisz np. robić coś bardzo szybko i dokładnie móc wyliczyć zależności czasowe używasz asemblera. Ma on tę zaletę, że dokładnie panujesz nad sprzętem i wiesz dokładnie jak są realizowane poszczególne funkcje. Wadą jest jednak, że wszystkie wyższe formy (typu obliczenia zmienno przecinkowe, złożone formy zależności funkcyjnych, liczenie na zmiennych wyższej precyzji wymagają większego nakładu pracy i wprawy by się nie pomylić.
Poza tym każdy typ procesora (typ w sensie konstrukcji a nie podwersji jednej serii) ma swój asembler przeważnie inny od sąsiada. Inny asembler ma seria 8051 (8031,8032,8052), inny procesory Atmela (serie ATiny, ATmega) jeszcze inny Microchipa (seria PIC), Ziloga (Z80 i nowsze), Rockwella (6500), Motoroli (6800, 68000), Intela (wersje od starych 8086 do najnowszych Pentium). Zasady pisania programów są podobne ale różnice są w możliwościach, nazwach rozkazów a nawet w dostępności pewnych rozkazów na dany typ procesora. Każdy producent stawia sobie chyba za punkt honoru wymyślić nowe nazwy rozkazów często mocno odbiegające od konkurencji co zmusza osobę chcącą napisać coś na dany procesor do żmudnego przebijania się przez nową "odkrywczą" filozofię nazewniczą. Do tego jeszcze dochodzą różne nazwy rejestrów bloków wewnętrznych procesora, więc jest z tym trochę pracy (aczkolwiek w granicach ludzkich możliwości, bo filozofia pisania jest podobna).
Języki wysokiego poziomu to te, w których piszesz w pseudoangielskim: C,Basic, Pascal itd. Mają one tę zaletę, że są bardziej czytelne, operujesz na formach bardziej abstrakcyjnych i nie musisz się zastanawiać jak rozpisać złożone konstrukcje np.
IF ((A=B) AND (B>=C)) OR (D IN [1...7]) THEN
na proste rozkazy konkretnego procesora gdzie masz dostępne np. tylko operowanie na bajtach a zmienne A, B i C są wielobajtowe, nie trzeba pamiętać kiedy sprawdzać znacznik przeniesienia i czy możesz użyć rozkazu skoku względnego czy też jednak trzeba użyć bezwzględnego bo odległość skoku przekracza zasięg tego pierwszego.
Z drugiej jednak strony zostajesz odseparowany od poziomu sprzętu co czasami powoduje, że napisany kod nie jest optymalny, np. jest za wolny albo za obszerny (bo wstawiane są w kod nawet te fragmenty bibliotek uniwersalnych, z których w programie nie korzystasz).
Dlatego dobrze jest znać i podstawy asemblera jak i języki wyższego poziomu, bo do różnych zadań może być przydatna wiedza z wielu kierunków pozwalająca na efektywne wykonanie zadania i efektywne wykorzystanie dostępnego sprzętu.
Nie musisz być specjalistą z każdego języka ale dobrze liznąć podstawy każdego, bo to wyrabia elastyczność w myśleniu i pozwala w miarę szybko przesiąść się na nowe narzędzie (bo nigdy nie wiesz co będziesz miał w danym miejscu dostępne narzędzia).
Zacznij od podstaw czyli umiejętności tworzenia algorytmów, czyli opracowania metody wykonania zadania w skończonej ilości kroków.
Naucz się rozpisać problem na kroki elementarne: przenoszenie wartości pomiędzy zmiennymi, operowania zmiennymi prostymi, tablicami, strukturami, stosowania warunków i stworzenia struktury przepływu danych czy realizacji programów.
Konkretny język to sposób kodowania powyższego algorytmu dla procesora, bez powyższej wiedzy jest małoprzydatny.
Jeżeli zdecydujesz się na konkretny typ procesora, to wtedy możesz uczyć się jego asemblera, to jest przydatna wiedza.
A co do języków wysokiego poziomu (Basic, C, Pascal) to zapoznaj się z każdym (przynajmniej w zakresie podstawym) i wtedy dopiero podejmij decyzję, który ci najbardziej leży (z uwzględnieniem problemów jakie chcesz rozwiązywać, bo też nie ma sensu używać "armat" jak chcesz zapalać tylko diodki i na tym zakończyć zabawę).
Dobrą nauką jest analiza gotowych programów napisanych przez inne osoby, bo poznajesz od razu jakw yglądają różne struktury w programie co w literaturze jest często zagmatwane w opisie (szczególnie dla osoby początkującej)
Jeżeli chcesz się bawić w Atmele to zacznij od Bascoma, jest najprostszy a w książce M. Wiązani masz też podane podstawowe rozwiązania układowe, pozwalające krok po kroku robić co raz bardziej skomplikowane rzeczy. C (kompilator WinAVR) jest dobry jak już zaczniesz panować nad sprzętem, bo na początek jest nieczytelny poza tym wymaga sporo konfiguracji i kilku kroków dla zaprogramowania układu, co w Bascomie robisz w jednym programie.