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 3 maja 2025, o 22:18


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 10 ] 
    Autor Wiadomość
    PostNapisane: 3 sie 2013, o 19:00 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    Jako że dopiero teraz udało mi się poprawnie wstawić nowy temat przepraszam wszystkich za kłpoty

    Witam
    Zaczynam poznawać język C z "Niebieskiej Biblii" trwa to już trochę :D
    i właśnie dzięki tej książce (między innymi) dostałem procesor w prezencie,
    Ponieważ był to AtTiny15 po odpaleniu Eclipsa nastąpił "zonk", Eclips
    nie wspomaga tego procka .
    Następnie przyszła por na AS i tu też niespodzianka AS też nie wspomaga tej kostki,
    znaczy wspomaga ale tylko w ASM.

    Mój błąd może najpierw powinienem doczytać (słabiutki angielsi)
    ,że ten procek nie ma w ogóle pamięci RAM (oczywiście poza rejestrami - jakby nie patrzeć rejestry to też RAM ) więc
    wpadłem na pomysł spróbuje przerobić program Mirka z C na asembler.

    Jako że AS w ogóle mi nie podszedł znalazłem taki symulator o nazwie VMlab
    po poznaniu nawet ciekawy (bez reklamy :D ).

    Wziąłem program pilota RC5 (bo wydawał się "krótki" :P ) i cóż pomyślałem co ja
    robię C nie znam a asembler to tylko trochę na C-64 i to słabo ale tutaj
    wielki pokłon Mirkowi jego rady w książce pozwoliły mi to zrobić.

    Co prawda na razie to działa tylko w symulatorze (VMlab ma taki oscyloskop programowy)
    a wiadomo w realu to cuda mogą z tego wyjść .

    Wstawiam to co mi się udało zrobić, nie jest to przetestowany program w procku,
    (niestety mam inne obowiązki a to jest moje hobby na które ciężko znajduje czas)
    jak tylko znajdę czas to będę dalej działał w tym temacie.

    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.


    plik definicje.inc
    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.


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


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


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


    Plik przerwINT0.inc
    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.


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


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


    Plik daneRC5.inc
    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.


    Plik czekajtim.inc
    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.


    Jeśli ktoś rzuci na to okiem to
    wszelkie opinie i krytyka mile widziane.
    Na swoją obronę napisze ,że jestem bardzo początkujący :)


    Dodano po 30 minutach

    Podzieliłem ten kod na tyle kawałków aby testować wszystko mniejszymi kawałkami
    choć może to utrudnić analizę komuś innemu .
    Może jakoś się przekonam do AS w wersji 4



    Ostatnio edytowano 2 maja 2014, o 10:50 przez Zaba, łącznie edytowano 1 raz

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 19:17 
    Offline
    Użytkownik

    Dołączył(a): 07 sty 2013
    Posty: 89
    Pomógł: 5

    Hej ,
    Jeśli to pierwszy raz x.asm, tylko pogratulować ,
    Jednak , nie zniechęcałbym się od razu do AtmelStudio , jeśli masz problemy z AS5, czy AS 6.x to
    zawsze masz jeszcze AtmelStudio 4.18 - ma zdecydowanie mniejsze wymagania.
    Bo AS, to też pewny symulator , to oryginalny kod maszynowy-składnia i rozkazy,
    nie zawsze tak jest przy innych , czasem wygodniejszych narzędziach, dotyczy także eclipse..
    W asemblerze regułą jest ( przynajmniej moim zdaniem ) , puścić sobie symulator , tak niechcący
    zobaczysz wpływ użytego rozkazu na zużycie pamięci flash , na ilość cykli potrzebnych do wykonania..
    jest to super szkoła by zacząć dobierać świadomie typy rozkazów, i konstrukcje logiczne zadań do wykonania.
    Jeśli chciałbyś uwagi , do twojego kodu - bynajmniej nie krytyka , spróbuj przełączać całe porty zamiast
    pojedyncze piny, niekoniecznie musisz dzielić zadania na tak elementarne bloczki , "branch" to aż
    64 pojedyncze rozkazy , często jest to zupełnie wystarczające by zapisać program "liniowo"
    , przynajmniej dla mnie jest to bardziej czytelne( łatwiejsze do interpretacji po latach ).
    Twoja wersja zapisu jest bardzo poprawna logicznie i strukturalnie , jest natomiast nieco "droższa"
    czasowo i objętością flash z powodu użycia niekoniecznej, większej ilości rozkazów rjmp.

    ps. nie wiem dlaczego ale w tej chwili Twój post znikł ?
    na początku popełniłeś nieostrożność próbujesz wpisać do 8-mio bitowego rejestru częstotliwość oscylatora - nie wiem jak tę częstotliwość zdefiniowałeś,
    ale do rejestru AVR wpiszesz zawsze tylko 8 bitów - spodziewaj się złych czasów opóźnień .
    ps2. już sprawdziłem , Twoja częstotliwość jest w MHz , zatem jest OK



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 19:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    Właśnie nie do końca zrozumiałem pdf-a jeśli chodzi o
    o OSCCAL .
    Cytuj:
    Writing the calibration byte to this address will trim the internal Oscillator frequency in
    order to remove process variations. When OSCCAL is zero (initial value), the lowest
    available frequency is chosen. Writing non-zero values to this register will increase the
    frequency of the internal oscillator. Writing $FF to the register selects the highest available
    frequency.


    że jeśli jest zero to jest najmniejsza możliwa częstotliwość a jeśli zapiszę $FF to
    największa, tylko jak zauważyłeś jest to rejestr ośmiobitowy więc nie wiem co i jak.

    @jp_elek no i nie rozumiem zwrotu "branch" :oops:
    jeśli chodzi o optymalizacje to jeszcze jestem zbyt zielony



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 20:13 
    Offline
    Użytkownik

    Dołączył(a): 07 sty 2013
    Posty: 89
    Pomógł: 5

    Hej ,
    Z tego co wyczytałem na szybko , odnośnie oscylatora RC , nominalnie jest wyskalowany na 1,6 MHz , rejestr OSCCAL służy do wprowadzania korekcji do pętli PLL aby
    tę częstotliwość nieco podkręcić w górę - wiadomo iż stabilność tego oscylatora RC jest nie tak znów wielka , zatem wpisując coś większego od 0 do 0x00 podkręcisz tę częstotliwość
    w górę - nie znalazłem na szybko jakiegoś bardziej precyzyjnego wzoru - pozostaje więc eksperyment - zwróć uwagę iż ostrzegają iż podkręcenie powyżej 1,75 MHz moeż spowodować
    problemy z Timer'em 1 , zatem domyślnie zmiana OSCCAL w zakresie 0x01 do 0xFF nie wpływa radykalnie ,lecz łagodnie na zmianę częstotliwości RC
    ad2. Branch ==> część instrukcji skoków to:
    Skip Skip if Bit in Register is Set (C)leard -to najkrótszy skok o jeden rozkaz - nie ma znaczenia czy kod rozkazu jest 16 bitowy czy długi -rozkaz sam rozpoznaje wymaganą długość skoku( inkrementację licznika rozkazów),
    Branch nieco dłuższy skoczek BRxx jest ich ponad tuzin , BRBS,BRBC,..... to takie skoki po najwyżej 64
    potem RJMP ( relative JUmp) do 2048 rozkazów
    a najdłuższy to JMP skok w dowolne miejsce programu .



    Ostatnio edytowano 3 sie 2013, o 20:49 przez jp_elek, łącznie edytowano 2 razy

    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 20:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    Wielkie dzięki za rozjaśnienie tematu
    czyli zamiast RJMP lepiej jest używać BRXX jeśli
    chciałbym zoptymalizować kod ?.

    Co do rejestru OSCCAL to dopiero przetestuje jak będę miał program
    wgrany do procka ale na razie to muszę poczekać aż wrócę
    do swojego "lochu" dostałem brutalny zakaz wstępu na czas nieokreślony :)
    (do końca urlopu)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 20:42 
    Offline
    Użytkownik

    Dołączył(a): 07 sty 2013
    Posty: 89
    Pomógł: 5

    Nie tak z automatu ,
    Skip i Branch to skoki warunkowe ,
    a rjmp to skoki bezwarunkowe , zatem wedle potrzeb - nie z automatu.

    ps. jeśli natomiast potrzebujesz długiego skoku warunkowego , to najprościej:
    Branch if ... ( warunek do pominięcia kolejnego rozkazu)
    Rjmp ( wykonaj ten skok jeśli poprzedni warunek nie jest spełniony)
    Rjmp ( wykonaj ten skok jeśli warunek z pierwszej linii jest spełniony )


    Autor postu otrzymał pochwałę


    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 3 sie 2013, o 20:49 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    No i znowu jaśniej :)
    dzięki



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sie 2013, o 01:57 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 03 sie 2013
    Posty: 44
    Lokalizacja: RFN
    Zbananowany użytkownik

    Pomógł: 2

    Zaba napisał(a):
    (...) AtTiny15 (...)

    Mój błąd może najpierw powinienem doczytać (słabiutki angielsi)
    ,że ten procek nie ma w ogóle pamięci RAM (oczywiście poza rejestrami - jakby nie patrzeć rejestry to też RAM )


    Attiny15 to naprawdę cienki bolek - na jakieś gotowe rozwiązanie problemu, które się zmieści w obrębie tak małej pamięci, może i OK, ale na eksperymentowanie dla początkujących to trochę jak rower na jednym kółku z miniaturowymi pedałami. Największym mankamentem jest ten brak pamięci SRAM, bo... no właśnie... w pamięci SRAM realizujesz sobie stos i operujesz na nim, najlepiej z rezerwą a nie na styk co do jednego bajtu, na tym polega komfort programowania. W tych małych szkrabach jest ponoć jakiś tam minimalny stos zrealizowany sprzętowo, ale w przypadku zaczynania pisania programów w asemblerze to tylko bardziej utrudnia niż pomaga, bo zawsze trzeba o tym małym stosie pamiętać, żeby nie przekroczyć jego „możliwości” - wystarczy wywołać kilka podprogramów w sobie i jesteś ugotowany. Ten mikrokontroler chyba nawet nie ma rozkazów PUSH i POP - ratowania i przywracania wartości rejestrów. Ja na pierwsze eksperymenty z 8-pinowym Attinem kupiłem sobie maksimum, jakie udało mi się kupić - Attiny85 - który ma 8 kilobajtów pamięci programu (tak naprawdę to 4 kilo kodu) i co ważniejsze - 512 bajtów SRAMu i tym samym możliwość realizacji normalnego stosu. Ktoś, kto programował trochę na C51/52, na pewno będzie wiedział co to jest mały stos, mało pamięci SRAM i jak niekiedy trzeba się nagimnastykować, żeby starczyło na wszystko i jak niewygodne jest pośrednie adresowanie za pomocą @r0. Z czegoś takiego będzie się śmiał ktoś, kto pisze program na 68000 i ma pod ręką kilka megabajtów RAMu.

    Ale wracając do Atmela... Tak samo postąpiłem z 28-nóżkowymi i 40-nóżkowymi procesorami - od razu Atmega16 i Atmega32 a w przypadku 40DIP Atmega1284P, nie ma się co szczypać i mlaskać przy zamawianiu. Oszczędzanie na pamięci jest tylko złudnym zaoszczędzeniem, bo zaoszczędziłeś 2 zł a potem przy pisaniu programu robisz coraz większe oczy i zaczyna się łykanie śliny, bo koniec pamięci się zbliża wielkimi krokami i w pewnym momencie i tak będziesz zmuszony kupić sobie tego lepszego scalaka, jeżeli będzie ci na tym wszystkim zależało. Oczywiście jeśli chcemy zapalać tylko LEDa i patrzeć na niego jak ładnie mruga, gdy naciskamy na „jeden jedynie słuszny” klawisz w naszym układzie a potem to walniemy w kąt, to nie ma to większego znaczenia - nie trzeba stosu, nie trzeba RAMu, a 1 kilobajt pamięci Flash to nawet już grzech i za dużo.

    Dodam może jeszcze, że oczywiście nie wykluczam sytuacji, kiedy się umyślnie wybiera procesor z mniejszymi zasobami, ale to wtenczas już jest bardzo przemyślana i dojrzała decyzja - np. mamy już dopracowany i skończony program albo bierzemy takiego scalaka, który ze względu na swoje właściwości i parametry jest nam potrzebny w układzie - one się między sobą różnią, choćby nawet czymś takim podstawowym i banalnym jak maksymalną częstotliwością taktowania albo poborem mocy.


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

    To trochę dzieło artystyczne, tym bardziej że Attiny15 ma chyba rozkaz do zerowania rejestrów i nawet on tyle samo pamięci i taktów procesora zużywa - lepiej korzystać z mnemoników tak jak zostały one do tego przeznaczone, bo to ułatwia późniejszą analizę i poprawianie (często własnego) programu. Tak samo jak robienie samemu sobie komentarzy przy pisaniu programu, który być może za rok będziemy czytali i przy ich braku na nowo odkrywali i zastanawiali się o co nam w tym miejscu programu chodziło. W asemblerze jest taka jedna zasada: jeżeli napisałeś jakiś dobry fragment programu, opisz go sobie dobrze i nie kasuj go, bo z pewnością go za jakiś czas będziesz na nowo potrzebował. W ten sposób robimy przy okazji sukcesywnie swoje własne biblioteki i podprogramy, z których zawsze możemy w nowych projektach skorzystać, co z kolei zaoszczędzi nam wiele czasu, trudu i nerwów. Pisanie czegoś dwa razy, żeby się czegoś nauczyć, na pewno nie jest głupie, ale pisanie czegoś zawsze od nowa, bo tak postępować się „nauczyliśmy”, nie jest najlepszą opcją - na dlugą metę to zniechęci każdego zapaleńca. To samo zresztą jest z naszymi schematami i bibliotekami w EAGLEu albo jakimś ekwiwalentnym programie.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 4 sie 2013, o 08:50 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    @Grzegorz zgadzam się z Tobą mój kod na pewno nie jest optymalny a
    jeśli chodzi o wybór procka to miałem znikomy wpływ na to, po prostu
    taki dostałem (mogłem go umieścić w koszu) ale chciałem jakoś go
    wykorzystać i powstało takie "Cóś" .

    (EOR rejestru samego ze sobą) do wyzerowania rejestru użyłem
    tak dla testu i zadziałało więc zostawiłem ale zgadzam się ,że
    nie jest to eleganckie rozwiązanie .



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 25 sie 2013, o 22:53 
    Offline
    Nowy

    Dołączył(a): 25 sie 2013
    Posty: 12
    Pomógł: 2

    Jako, że to mój pierwszy post witam wszystkich.

    Zaba, masz błędy przy końcu obsługi przerwania INT0, przy kasowaniu flagi przerwania INTF0. (choć w Twoim programie nie mają one negatywnych skutków).

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

    - Najpierw odtwarzasz rejestr SREG, a wykonujesz później jeszcze operacje które mogą zmienić jego zawartość.
    Polecenie "ori" modyfikuje bity Z,N,V w SREG.

    - Jeśli w odczytanej zawartości GIFR byłyby ustawione flagi innych przerwań, jeśli wykonasz "ori temp, (1<<INTF0) " i zapiszesz zmienioną wartość do GIFR je też skasujesz oprócz flagi INTF0.
    Możesz zmienić na:
    Składnia: [ Pobierz ] [ Ukryj ]
    język asm
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Autor postu otrzymał pochwałę


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

    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:  
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO