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



Teraz jest 18 sty 2025, o 10:08


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