Dlaczego zerowanie flag przerwań w AVR następuje po wpisaniu 1

Czytasz archiwalną wersję tematu "Dlaczego zerowanie flag przerwań w AVR następuje po wpisaniu 1" z forum pl.misc.elektronika

slawek7 - 13 Lip 2007, 01:19

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:
http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intbits

Maciej Wywrocki - 13 Lip 2007, 03:04

| CZeść.
| Czy zastanawiał się ktś z Was kiedyś dlaczego a uC AVR zerownaie flag
| przerwań następuje poprzez wpisanie do nich wartości =1.


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

Maciek

slawek7 - 13 Lip 2007, 03:25


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.

Maciej Wywrocki - 13 Lip 2007, 04:19

| I dlaczego zapis 1 jeśli było tam zero nie spowoduje wygenerowania
| programowego przerwania.


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

slawek7 - 13 Lip 2007, 06:46

A czytałeś ten FAQ podany w linku:

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intbits

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

Maciej Wywrocki - 13 Lip 2007, 07:06

| A czytałeś ten FAQ podany w linku:
| http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intbits


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

slawek7 - 13 Lip 2007, 08:43

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.

gdzie.

czyli inaczej dlaczego własnie kasowanie jest poprzez 1.

Maciej Wywrocki - 13 Lip 2007, 08:57

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


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

Adam Dybkowski - 13 Lip 2007, 21:02


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.


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).

avr; wydajnosc pradowa dla '0' i '1' (?!)
avr-gcc: Czy mozna wywołać funkcje z wnętzra SIGNAL() ?
Do znawców AVR'ów, szczególnie ATMegi16 - problem z klawiaturą
karta IO do PC (ISA) oparta na AVR
  • agencja restruktF3ryzacji rolnictwa
  • program do ciEAcia avi
  • pasma sprzegajace shure beta 58
  • wolczyn parafia
  • TEKA GKST 60 I 4 B sklep Pi9C4i9B9i9C2i982yty elektryczne
  • urzad pisz bip
  • ciagnik pronar opinie
  • jak zmienic fuge w plytkach
  • v360 instrukcja obslugi i problem z kablem
  • Kolekcja wypowiedzi z grup dyskusyjnych : Index