Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

ATMega8 - filtrowanie

Lulubell
-
-
Posty: 2
Rejestracja: 7 lis 2016, o 20:49

ATMega8 - filtrowanie

Postautor: Lulubell » 7 lis 2016, o 21:07

Cześć!

Od niedawna na zajęciach przerabiamy ATMega8. Pierwszy raz mam styczność z programowaniem niskopoziomowym i nie mam pojęcia jak rozwiązać konkretne zadanie, google nie pomogło mi zbyt wiele. Muszę wykonać program filtrujący dane z tablicy n=100 elementowej, o wartościach od 99 do 0, do innej, obie zapisane w pamięci SRAM. Warunki filtru:
− liczby parzyste,
− liczby podzielne przez 4,
− liczby dla których bit B3=0,
− liczby dla których bit B3=1 i B1=0,
− liczby dla których bit B3=1 lub B1=0,
− liczby z przedziału <5, 25>,
− liczby spoza przedziału <5, 25>

(assembler, AVR Studio)

Zdaję sobie sprawę z tego, że czeka mnie wiele do nauczenia. Pewnie dla większości zadanie jest trywialne, tak więc proszę o nieco wyrozumiałości dla mnie - początkującej. Naprawdę chciałabym to przede wszystkim zrozumieć i wiedzieć jak wykonać. :)

Awatar użytkownika
Jacek Bogusz
-
-
Posty: 470
Rejestracja: 12 maja 2010, o 17:37
Lokalizacja: Poznań
Kontaktowanie:

Re: ATMega8 - filtrowanie

Postautor: Jacek Bogusz » 8 lis 2016, o 15:54

Na pewno bez trudu znajdziesz kursy programowania AVR w asemblerze (np. tu http://www.easy-soft.net.pl/artykuly/pr ... e/asembler, a są i lepsze). Problem polega na tym, że pomimo pozornie nieskomplikowanego zadania, program będzie dosyć złożony i wymaga wiedzy. Startując z poziomu "zero" musisz się dużo nauczyć.

Bity możesz testować przez operacje logiczne AND tzn. "rejestr" AND "stała".

Aby sprawdzić czy bit B0 jest ustawiony (jest "1") możesz użyć stałej (binarnie) 00000001. Aby sprawdzić B3 - 00001000.

Sprawdzenie czy B3=1 i B1=0 można zrobić (niestety) na wiele sposobów. Można np. za pomocą trzech operacji. Po pierwsze, "zamaskować" wszystkie bity poza testowanymi np. "rejestr" AND 00001010. Po drugie, wyznaczyć sumę modulo 2 (EXOR) z wynikiem operacji - oczywiście, on też musi być zapisany w rejestrze. Symbolicznie będzie to "rejestr" XOR "00000010". Musisz nadać bitom w stałej przeciwne wartości, niż mają być testowane, a więc B3=0 i B1=1 stąd maska "00000010". W wyniku tej operacji bity B3 i B1 powinny zostać ustawione. Ten fakt możesz sprawdzić również za pomocą iloczynu logicznego z maską "00001010" lub poprzez odejmowanie i sprawdzenie czy wynik odejmowania jest 0 i czy nie wystąpiło przeniesienie.

Warunek "lub" sprawdzisz w podobny sposób - maskujesz nieznaczące bity, a następnie sprawdzając czy w wyniku obliczenia iloczynu z maską "00001010" któryś z bitów jest ustawiony. O tym poinformuje cię flaga "Z".

Liczby z przedziału sprawdzisz przez odejmowanie. Od zawartości rejestru odejmujesz "25" i sprawdzasz czy wynik obliczeń jest większy od zera. Jeśli tak, to liczba spoza przedziału. Jeśli nie, to odejmujesz 5. Tym razem sprawdzasz czy wystąpił bit przeniesienia. Jeśli tak, to liczba spoza przedziału.

Tak samo jak wyżej można zrobić w ostatnim zadaniu, ale trzeba inaczej selekcjonować liczby.

Programowanie w asemblerze jest sztuką podzielenia programu na mniejsze, drobne zadania i realizacji złożonych problemów właśnie za pomocą tych prostych, "jednostkowych" kroków. Natomiast samo zadanie można zrealizować na wiele sposobów - wyżej opisałem przykładowe metody, niekoniecznie najbardziej efektywne. Mam też nadzieję, że nie naplątałem, ale jeśli tak, to szybko mnie tu "wyprostują" :D

Lulubell
-
-
Posty: 2
Rejestracja: 7 lis 2016, o 20:49

Re: ATMega8 - filtrowanie

Postautor: Lulubell » 8 lis 2016, o 17:41

Dziękuję bardzo! Myślę, że zrozumiałam, zaraz zabiorę się do pracy. W razie problemów dam znać. :D

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 28 gości