Stránka 2 z 2

Napsal: 07 úno 2011, 14:55
od piitr
Aha, blik. Tím ORem se vlastně teda shodí všechno nahozené. Dobrý postřeh.

Napsal: 07 úno 2011, 17:17
od Andrea
Tak ne, beru zpět, jak to radí piitr to není v tomhle případě správně, ACSR není jen stavový registr (jako třeba TIFR), ale i řídicí a ten zápis

Kód: Vybrat vše

reg = 1 << bitnum;

by ovlivnil i nastavení funkce komparátoru.

Takže buď

Kód: Vybrat vše

ACSR |=(1<<ACI); // zrusenie priznakoveho bitu

nebo to původní

Kód: Vybrat vše

ACSR |=(0<<ACI); // zrusenie priznakoveho bitu

obojí ve výsledku udělá totéž, shodí ACI.

Napsal: 07 úno 2011, 18:41
od AB1
ACSR |=(1<<ACI); // zrusenie priznakoveho bitu

nebo to původní
kód:
ACSR |=(0<<ACI); // zrusenie priznakoveho bitu

obojí ve výsledku udělá totéž, shodí ACI.


Myslím, že ne!
Z datašítu vyplývá, že příznak se dá vynulovat zapsáním "1".
Zapsání nuly příznak nezmění.

A kromě toho příkaz
ACSR |=(0<<ACI);
nemá absolutně žádný efekt. Nevynuluje ACI bit.

Napsal: 07 úno 2011, 19:20
od Andrea
Myslím, že jo, pokud to překladač při optimalizaci nevyhodí. Přečti si co jsem napsala na předchozí straně.

Edit: Programátorsky čisté je to samozřejmě s tou jedničkou.

Napsal: 07 úno 2011, 20:11
od piitr
Aha, tak jsem si k tomu něco našel v datasheetu od atmega8 (to bude snad stejný a mám to rozečtený) a je to tak - je tam hrozná spousta dalších bitů, které by se tím mým = smazaly. Já jsem právě předtím přečetl jen pár stránek, kde jsem narazil na to, že se příznaky mažou jedničkou, ale na konkrétní registry jsem ještě nedošel. A tak nějak jsem si myslel, že je jeden registr se všema příznakama, protože pak by to mazání zápisem jedničky bylo prima řešení. To mě nenapadlo, že jsou ty příznaky přerušení takhle rozstrkaný po řídících registrech, protože to mi přijde jako docela blbý řešení. Takže jsem to takhle zmotal. :oops: Ale jinak se mi to AVR líbí, jen tohle mě teda zklamalo. Jak se to má teda správně mazat? Načíst a hned zpátky beze změny zapsat? Ono se to ale asi moc nepoužívá, když se to při vyvolání rutiny maže samo, co?

Napsal: 07 úno 2011, 20:18
od piitr
Taky je blbý, že když ten příznak přerušení smazat naopak nechci a přiORuju něco k té konfiguraci (protože ji chci změnit), tak se to smaže samo. Zatím mi přijde jako nejlepší mít tu hodnotu konfigurace uloženou někde mimo a jen ji tam psát. To je ale teda vážně pitomý takhle míchat ty příznaky do řídících registrů.

Napsal: 07 úno 2011, 20:35
od Andrea
Ono to není tak hrozné, většinou když měníš nastavení nějaké periferie, tak nechceš, aby se ti od té změny nastavení (třeba přepnutí reference) vyvolalo přerušení, takže ten příznak tak jako tak budeš chtít shodit. Nebo tu hodnotu zapíšeš přímo bez čtení a tak ten příznak neovlivníš. Myslím, že to není nic, co by tě mělo hned na úvod nějak strašit. Jen je dobré o tom vědět. :)

Napsal: 07 úno 2011, 21:03
od piitr
Což to je pravda, většinou je to asi OK. Ale jak na to člověk zapomene, tak má na pár večerů vystaráno. :D

Napsal: 08 úno 2011, 11:14
od AB1
Vyzkoušel jsem různé příkazy pro vymazání příznaků a tady je výsledek:

Kód: Vybrat vše

//mega88   
   TIFR1 |= (0<<TOV1);   // vymaže všechny příznaky v registru
   TIFR1 |= 0;           // vymaže všechny příznaky v registru

   TIFR1  = 0;           // nevymaže žádný příznak (ale vynuluje nepříznakové bity)
   TIFR1 &= ~(1<<TOV1);  // nevymaže žádný příznak (bez optimalizace vymaže všechny kromě TOV1)
 
   
   TIFR1  = (1<<TOV1);   // vymaže jenom TOV1 (ale vynuluje nepříznakové bity)
   TIFR1 |= (1<<TOV1);   // vymaže jenom TOV1  (bez optimalizace vymaže všechny)

   asm volatile("sbi TIFR1,TOV1"); // vymaže jenom TOV1

Takže jsem se mýlil, když jsem napsal že
ACSR |=(0<<ACI);
nevynuluje ACI bit.
Vynuluje, ale pokud by v registru byly další příznaky, tak je vynuluje všechny.

Zdá se že pro nulování příznaku je jedině správné
TIFR1 |= (1<<TOV1);
(se zapnutou optimalizací)

U registrů, které obsahují jenom příznaky, jako např. TIFR, se dá použít i
TIFR1 = (1<<TOV1);

Někde je rozdíl mezi kódem s optimalizací a bez ní protože
s optimalizací použije překladač instrukce SBI, CBI,
bez ní použije ORI, ANDI.