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ć.
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
Moderatorzy:Jacek Bogusz, procesorowiec, r-mik, Moderatorzy
- Jacek Bogusz
- -
- Posty:470
- Rejestracja:12 maja 2010, o 17:37
- Lokalizacja:Poznań
- Kontaktowanie:
Re: ATMega8 - filtrowanie
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ą"
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ą"
Re: ATMega8 - filtrowanie
Dziękuję bardzo! Myślę, że zrozumiałam, zaraz zabiorę się do pracy. W razie problemów dam znać.
Kto jest online
Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 29 gości