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

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 1 maja 2025, o 12:18


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 
    Autor Wiadomość
    PostNapisane: 8 lut 2014, o 02:47 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 mar 2013
    Posty: 64
    Pomógł: 0

    Witam wszystkich,

    Ostatnio postanowiłem się pobawić asemblerem (ot tak dla sportu, rozrywki i poszerzenia wiedzy). Podjąłem już pierwsze próby (miganie, przerwania zew, timery), jednak najbardziej denerwuje mnie że muszę pisać w AVR Studio którego nie lubię. Domyślam się że ktoś z was pisze w czystym asemblerze, ale .... czy w Eclipse ? Mam skonfigurowane to środowisko do AVR, C, C++. Fajnie byłoby jakbym mógł także zrobić sobie jakiś workspace dla ASM. Wiecie jak ? (używam jeszcze starego Eclipse'a Indigo)

    Druga sprawa to źródła do nauki asm. W sumie to do tej pory wystarczało AVR Instruction Set - bardzo dobry dokument, oraz kody zamieszczane przez użytkowników elektrody. Niestety do innych spraw (jak chociażby "ujarzmienie stosu" itp. trudnych rzeczy) potrzebna jest jakaś wiedza - i nie wiem gdzie jej szukać :( . W literaturze którą przeglądałem dot. mikrokontrolerów autorzy o asemblerze tylko wspominają a potem kontynuują wyjaśnianie C.

    Piszę programy w ASM - jednak ze względu na to że nie natrafiłem na dobre źródło wiedzy do nauki, nie jestem pewien czy prawidłowo obsługuje np rejestry i GPIO.

    Proszę was o wyjaśnienie kwestii ASM w Eclipse oraz podanie jakiś linków do kompletnych kursów ASM dla AVR

    Pozdrawiam

    _________________
    -



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2014, o 03:33 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 mar 2013
    Posty: 64
    Pomógł: 0

    Ale to nie jest odpowiedź na moje pytania ;)

    _________________
    -



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2014, o 09:06 
    Offline
    Nowy

    Dołączył(a): 25 sty 2014
    Posty: 6
    Pomógł: 0

    Postanowiłem sprawdzić, jak Eclipse radzi sobie z Assemblerem.
    Napisałem funkcje w Asm wystawiającą na porcie B jedynki.


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


    Proste, ale nie działało. Po przejrzeniu pliku .lls okazało się, że PORTB ma adres 0x38,
    zamiast 0x18. Oczywiście po wpisaniu out 0x18 było OK. Ale mnie to zaintrygowało i
    zacząłem poszukiwania w sieci. Trochę to trwało, zanim znalazłem to:

    http://msoe.us/taylor/tutorial/ce2810/candasm

    Tam się dowiedziałem, że trzeba wpisać definicję:
    # define __SFR_OFFSET 0

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


    I już wszystko jest OK!

    Jest tam wiele cennych informacji, polecam

    A możeby łaska używać opcji syntax przy publikowaniu kodu??? Różowy J.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2014, o 14:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 13 paź 2011
    Posty: 715
    Lokalizacja: Zielona Góra
    Pomógł: 75

    fullmoonguy napisał(a):
    Proszę was o wyjaśnienie kwestii ASM w Eclipse oraz podanie jakiś linków do kompletnych kursów ASM dla AVR


    Proszę, bardzo dobry kurs, - Beginners Programming in AVR Assembler

    Nie spotkałem się dotąd z pluginem do Eclipsea który pozwala pisać i kompilować kod w czystym AVR ASM, możesz użyć AVR plugin do Eclipse i pisać wstawki w ASM do C albo spróbować wykorzystać jakiś alternatywny Edytor do AVR asm np. qMicroIDE lub podobny - zapewne coś znajdziesz w Necie co Ci będzie odpowiadało ;)

    _________________
    pozdrawiam
    phill2k



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2014, o 15:11 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 mar 2013
    Posty: 64
    Pomógł: 0

    @ sq7gdu

    Kurczę, zamiast pliku *.c wstawiłeś i *.s ? I to działa ? To chyba nie jest czysty asm tylko wstawka, czy mam rację ?

    @ phill2k

    Dzięki, widziałem ten kurs ale nie wiedziałem czy jest dobry. Musze się z nim zaznajomić ;)

    _________________
    -



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 8 lut 2014, o 17:15 
    Offline
    Moderator
    Avatar użytkownika

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

    fullmoonguy napisał(a):
    @ sq7gdu

    Kurczę, zamiast pliku *.c wstawiłeś i *.s ? I to działa ? To chyba nie jest czysty asm tylko wstawka, czy mam rację ?


    Rzeczywiście to jest jedna z metod pisania wstawek hmm w zasadzie całych plików zawierających nawet wiele funkcji w asm. Czyli niejako wstawki ... Nie daje to możliwości tak wprost napisania kodu od początku do końca w asm.

    Sam się zastanawiam czy jest jakiś dodatek do Eclipse aby pisać w asemblerze ? Ja nie znam takiego - no ale to nie znaczy że go nie ma ;)

    _________________
    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: 9 lut 2014, o 12:07 
    Offline
    Użytkownik

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

    Pomógł: 101

    Z asm nie mam dużego doświadczenia (jakieś dwa tygodnie ;-) ), ale to co udało mi się ustalić:

    PKoz napisał(a):
    Może wiesz coś więcej o adresie PORTB, bo mnie zaintrygowało i mimo poszukiwań nie znalazłem odpowiedzi dlaczego adres PORTB jest czasami podawany w postaci 0x18 (0x38)?


    Co nieco na ten temat jest tutaj: http://nongnu.org/avr-libc/user-manual/group__avr__sfr__notes.html. Ja to rozumiem tak, że trzeba adres rejestru pomniejszyć o 0x20 jeśli chce się korzystać z instrukcji IN/OUT. Jeśli do tych rejestrów czyta/pisze się instrukcjami LDS/STS nie jest to konieczne. IN/OUT są szybsze, trwają tylko jeden takt, ale zaadresować można tylko adresy <=31.

    PKoz napisał(a):
    Gdzie jest wywoływana funkcja LED_WYL i dlaczego pisana jest dużymi literami - czy wielkość liter ma znaczenie?


    Zdaje się, że wielkość liter w gas jest bez znaczenia.

    PKoz napisał(a):
    Bo w języku C dyrektywa zaczyna się od znaku # (#include), a w asm od kropki (.global). U ciebie w jednym pliku są oba typy dyrektyw.


    W plikach .S (duże S) można stosować obie konwencje preprocesora. Prep. C jest, mam wrażenie, ogólnie wygodniejszy, ale asmowy też sie przydaje np. przy definiowaniu makr.
    Są jeszcze pliki .s (małe s), w których, zdaje się preprocesor C-owy nie działa. To mój domysł wywnioskowany z tego jak gcc wywołuje gas (są dwie opcje "assembler" i "assembler-with-preprocessor"), nie wiem czy prawidłowy. :-)

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lut 2014, o 12:22 
    Offline
    Nowy

    Dołączył(a): 25 sty 2014
    Posty: 6
    Pomógł: 0

    Funkcje wywołuje się tak jak C++. Nazwa funkcji może być pisana zarówno
    małymi jak i dużymi literami.
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język c
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


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


    Wszystko jest opisane na http://msoe.us/taylor/tutorial/ce2810/candasm
    Jest tam opisany sposób przekazywania parametrów.

    Widzę że nie trafia do ciebie zalecenie używania syntax - Różowy J.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lut 2014, o 13:49 
    Offline
    Użytkownik

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

    Pomógł: 101

    #define _SFR_ASM_COMPAT 1 /* Not sure when/if this is needed */


    Zaiste, rozbrajające ;-)

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



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 9 lut 2014, o 19:17 
    Offline
    Nowy

    Dołączył(a): 25 sty 2014
    Posty: 6
    Pomógł: 0

    Próbowałem, ale się nie udało. A kolega Różowy J jest nie elegancki i arogancki.
    Wypisuje się z tego forum.

    Andrzej SQ7GDU



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 lut 2014, o 02:23 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 09 mar 2013
    Posty: 64
    Pomógł: 0

    Mam nadzieje, że nikt się nie obrazi jak swoje problemy odnośnie ASM będe opisywał w tym wątku a nie tworzył nowych.

    Otóż mam problem ze zrozumieniem pewnego zagadnienia ....

    STOS w przerwaniach ;)

    Coś co w C problemem nie było bo programista się tym bezpośrednio nie zajmował. Chciałbym wiedzieć po co się w ogóle cokolwiek odkłada na stos ? Znalazłem informację że jest to kolejka LIFO i zrozumiałem jego działanie, jednak nadal nie wiem po co się go stosuje. Niby odkłada się 'coś' na stos by zapamiętać jego wartość i po wejściu w przerwanie zachować wartość rejestrów, którymi operowaliśmy w pętli głównej (nie stracić ich zawartości). Jednak co wtedy kiedy ja chcę celowo korzystać powiedzmy z rejestru r18 a potem w przerwaniu (np timera) inkrementować jego wartość. Czy wtedy konieczne jest odkładanie tego rejestru w prologu przerwania na stos ?

    Być może powyższy wywód jest całkowicie błędny dlatego proszę o odniesienie się do niego i wytłumaczenie (nawet skrótowo) kiedy coś (i co ;) ) powinienem odkładać na stos i zdejmować (bo jak to się robi to ja wiem -> najpierw push'e i potem w odwrotnej kolejności popy).

    PS: czy ten cały stos jest jakoś powiązany z specyfikatorem 'volatile' z języka C ?

    --

    _________________
    -



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 12 lut 2014, o 07:39 
    Offline
    Moderator
    Avatar użytkownika

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

    STOS w asm nie jest używany tylko w przerwaniach to taka uwaga ogólna. Nawet bez przerwań a tylko do procedury wywoływanych za pomocą poleceń typu call - już na stos odkłada się adres powortu - podobnie jak przy przerwaniach - no ale to dzieje się akurat automatycznie - bez naszego udziału - i to jest PODSTAWOWA funkcja stosu

    poza tym - jeszcze sami musimy zadbać o przechowanie na stosie tych rejestrów, których używamy w funkcji albo w przerwaniu a które wcześniej w programie głównym używaliśmy do czegoś innego .... to chyba zrozumiałe i wygląda na to że to czujesz ;) ... a jeśli masz rejestr z wartością którą chcesz modyfikować w przerwaniu to oczywiście że nie musisz przechowywać jego kopii na stosie tzn możesz ale nie musisz - wszystko zależy od kontekstu programu i potrzeb. Bo jeśli np z jakiejś okazji ... czasem jego wartość musi być zmodyfikowana ale też czasem wystąpi jakiś warunek, że jednak przy zakończeniu trzeba odzyskać wartość z przed modyfikacji no to przyda się odłożenie na stosie - prawda ? ;) ale jeśli na pewno się nie przyda - to nie musisz odkładać na stosie

    fullmoonguy napisał(a):
    PS: czy ten cały stos jest jakoś powiązany z specyfikatorem 'volatile' z języka C ?


    Nie ma NIC wspólnego - volatile w C odpowiedzialne jest za całkowicie coś innego a mianowicie za wyłączenie optymalizacji dostępu do danych w pamięci RAM. Jeśli jest volatile to nigdy nie dojdzie do sytuacji że kompilator wpakuje sobie taką wartość z RAM do jakiegoś rejestru i dalej już będzie działał TYLKO na wartości w rejestrze - bo akurat tak mu wygodnie i tak często można zrobić dzięki czemu optymalizujemy szybkość działań ....

    ale jeśli damy volatile to wtedy dostęp do komórki(-ek) pamięci będzie zawsze odbywał się na żmudnej zasadzie

    - pobierz do rejestru daną z RAM
    - wykonaj na niej operację
    - włóż ponownie do RAM zmodyfikowaną zmienną

    _________________
    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  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 12 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 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:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO