Dlaczego zerowanie flag przerwa? w AVR nast?puje po wpisaniu 1

Jul 13, 2007 8 Replies

CZeść. Czy zastanawiał się ktś z Was kiedyś dlaczego a uC AVR zerownaie flag przerwań następuje poprzez wpisanie do nich wartości =1. Nie miałen okazji tego przetestować ale czy to prawda, że jeśli jest zero i wpiszemy na miejsce flagi danego przerwania to nie zostanie zgłoszone przerwanie, natomiast jeśli było wartość 1 to zostanie po prostu wyzerowana.



Ale najawżniejsze pytanie. Jaka mogła być intencja twórców AVRów aby zerowanie odbyło się poprzez wpisanie 1. Bo przezcież w uC serii 8051 jest jakoś logicznie i nawet dzięki temu można wygenerować przerwanie programowo, a AVR ta sztuczka nie działa.



Czytałem ten FAQ ale nie wiele mi on wyjaśnia:

formatting link


Użytkownik "slawek7" snipped-for-privacy@wp.pl napisał w wiadomości news: snipped-for-privacy@g4g2000hsf.googlegroups.com...

Zapewne między innymi po to, żeby można było wyzerować taką flagę jednym rozkazem - zapisu rejestru.

Maciek

No niby tak na tej stronie jest napisane, ale przecież jak dajesz zapis 1 to to samo byłoby jakbym zapisał 0, czy nie? I dlaczego zapis 1 jeśli było tam zero nie spowoduje wygenerowania programowego przerwania.

Użytkownik "slawek7" snipped-for-privacy@wp.pl napisał w wiadomości news: snipped-for-privacy@w3g2000hsg.googlegroups.com...

No bo właśnie zapis "1" powoduje skasowanie flagi przerwania. Jeżeli przerwanie chcesz wywołać programowo - po prostu wywołaj funkcję obsługującą je.

Maciek

A czytałeś ten FAQ podany w linku:

formatting link
Oni tam o tym piszą ale niezbyt zrozumiale, jakoś pokrętnie, czy nie?

Użytkownik "slawek7" snipped-for-privacy@wp.pl napisał w wiadomości news: snipped-for-privacy@q75g2000hsh.googlegroups.com...

No i właśnie tak jest. Generalnie chodzi o to, by móc jednym rozkazem OUT _skasować_ wybraną flagę w rejestrze. To, czy kasujemy ją wpisując wartość bitu równą 0 czy 1, jest sprawą drugorzędną (w AVR jest o akurat 1).

No a w czym tkwi problem?

Maciek

Nie chodzi mi właśnie o sprawę techiczną tylko dlaczego projektanci AVRów założyli że kasowanie odbywa się 1. Chodzi mi o ta drugorzędną sprawę. Był na pewno jakiś cel w tym że zmienili to w stosunku od

8051. To na pewno gdzieś jest napisane tylko ja nie mogę dostać się do tegop gdzie.

czyli inaczej dlaczego własnie kasowanie jest poprzez 1.

Użytkownik "slawek7" snipped-for-privacy@wp.pl napisał w wiadomości news: snipped-for-privacy@q75g2000hsh.googlegroups.com...

Najistotniejszą różnicą jest chyba to, że w 51 można było kasować i ustawiać flagi przerwań, a w AVR tylko kasować. A czy zerem czy jedynką, to już chyba akademickie rozważania ... Pewnie tak ze względu na hardware procka wygodniej było.

Maciek

slawek7 pisze:

A czy 8051 to ich projekt? AFAIR Intela. Więc po prostu się na niego nie oglądali i zrobili tak, jak im było wygodniej albo wg nich słuszniej.

BTW: W procesorach ARM od Atmela dopiero jest fajnie. Najczęściej w rejestrach konfigurujących peryferia, przerwania czy przestrzeń I/O większość operacji robi się wpisując jedynki na odpowiednie bity. Czyli na przykład aby ustawić jakiś pin wyjściowy, wystarczy wpisać jedynkę na odpowiadającą mu pozycję w rejestrze "zapalania pinów". Aby wyzerować pin, trzeba wpisać jedynkę do rejestru "gaszenia pinów". W każdej chwili można też odczytać bieżącą wysyłaną kombinację z rejestru "stanu wyjścia pinów" no i oczywiście bieżący stan linii z całkiem innego rejestru "stanu pinów" (coś jak rejestry np. PORTA i PINA w AVRach).

To bardzo wygodne podejście, pozwalające zmieniać stan dowolnego pinu lub kilku, nie ruszając przy tym pozostałych i to bez potrzeby sprawdzania, jak są obecnie skonfigurowane inne piny. Prawie tak samo sprawy się mają z włączaniem/wyłączaniem przerwań (niezależne rejestry "włączania" i "wyłączania", gdzie zawsze wpisuje się jedynki) i innych ustawień dwustanowych. IMHO bardzo wygodne rozwiązanie tyle że mocno zwiększa liczbę rejestrów SFR (nieistotne w ARMach mających adresowanie

32-bitowe).

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required