Stránka 1 z 2

Přerušení u ATTiny2313

Napsal: 20 led 2011, 15:10
od epes
Potřeboval bych pomoci s externím přerušením u Tiny2313 apod. Přerušení s INT0 a s INT1 jasem už jakž takž zvládl, ale stále nejsem schopen používat přerušení PCIE. Zřejmě neumím nastavit řádně příslušné registry a také vlastně nevím, kde se dají nastavit alternativní fce všech pinů - tedy hlavně PCINT0-7.
Poradí mi někdo?
Díky

Napsal: 20 led 2011, 15:15
od Andrea
Alternativní fce PCINT se nikde nenastavuje, prostě jen povolíš PCINT od konkrétního pinu v registru PCMSK a povolíš PCINT v GIMSK (bit PCIE).

Napsal: 20 led 2011, 16:08
od epes
Andreo,

díky za radu, problém je ale v tom, že to co mi radíš jsem zkusil alespoň 10x a stejně to nefunguje. Problém je dost možná v adresaci obslužné rutiny, nebo také v AVR Studio, kde ručně měním nastavení registrů. Také je možné, že už pro oči nevidím a tak podobně. Pro jistotu, zde je můj zkušební kód.
Díky

Napsal: 20 led 2011, 16:17
od Andrea
Asi taky pro samé oči nevidím ten kód. Ale tohle chodí:

Kód: Vybrat vše

   ldi R16,(1<<2)      ; Povoleni PCINT2
   out PCMSK,R16
   ldi R16,(1<<PCIF)   ; Shozeni PCIF
   out EIFR,R16
   in R16,GIMSK
   sbr R16,(1<<PCIE)   ; Povoleni preruseni od Pin Change
   out GIMSK,R16

Napsal: 20 led 2011, 17:14
od epes
Neboj Andreo, oči máš určitě dobré, to jen mně už šedá kůra nějak neslouží.
Tak tady je ten kod?

int cnt = 0;
// Global variable cnt

void interrupt_ISR() org 0x0b
{ // Interrupt rutine
SREG_I_bit = 0; // Disable Interrupts
cnt++; // Increment variable cnt
SREG_I_bit = 1; // Enable Interrupts
}

void main()
{ int a; // Main program


DDRD = 0xF7; // Set PD3 as input
DDRB = 0xFF; // Set PortB as output

PORTD = 0x00;
PORTB = 0xFF; // Starting value for PortD
// Set the Interrupts
// MCUCR = 0b00000100; // Configure Interrupt for falling edge on PortD.3
// gimsk=0b10000000;
SREG_I_bit = 1; // Enable Interrupts

while(1){ // Unending loop
PORTB = cnt; // Write on PortB value of varibale cnt
}
}

Jinak assembler jsem už asi 50 let neviděl, ale řekl bych, že je to co dělám ručně v AVR Studiu.

Napsal: 20 led 2011, 18:09
od Andrea
Nějak v tom kódu nevidím nic kolem toho PCINT.

Napsal: 20 led 2011, 18:16
od piitr
Zkusil jsi ten cnt definovat takhle?

Kód: Vybrat vše

volatile int cnt = 0; 

Napsal: 20 led 2011, 18:18
od epes
V kodu to není, dělám to ručně v AVR studiu. Nastavuji bity přímo při krokování programu. Při laborování nemusím tak stále přepisovat program.

Napsal: 20 led 2011, 18:20
od Andrea
Tak do toho, co tam datluješ, nevidím, ale jak chceš používat PCINT, když máš celý PortB nastavený jako výstup?

Napsal: 20 led 2011, 18:27
od epes
Hned to jdu zkusit

Napsal: 20 led 2011, 18:41
od epes
Tak jsem z toho jelen.
Nastavím PCIE v GIMSK a PCMSKO v PCMSK - takže jestli se nemýlím, PINB0 by měl reagovat na změnu hodnoty vyvoláním přerušení.

Při krokování programu ve smyčce WHILE změním hodnotu pinu B0 - nato reaguje pouze bit PCIF v EIFRu a nic jiného se neděje, jprogram pokračuje stále ve smyčce While.
Přitom pokud použiji INT0 či INT1 a nastavím MCUR a GIMSK, tak to funguje.

Napsal: 20 led 2011, 19:28
od epes
Port B se pochopitelně dá v AVR studiu kdykoliv nastavit jinak.Nicméně zkusil jsem vše nastavit přímo v kódu a zjistil jsem jednu věc nemilou. Kódem mi nejde nastavit 5. bit v registru GIMSK -onen bit PCIE. 6. a 7. bit přitom nastavit programově lze. Ať zadám GIMSK=0x20, nebo GIMSK=0b00100000 do registru se uloží hodnota 0x08!!! Přito ručně ten bit nastavit lze správně. Buď je něco shnilého v překladači, nebo spíše v AVR Studiu.
Vzhledem k tomu, že už mě máš nejspíš dost a patrně si už dáváš nějakou dobrou večeřičku, jdu dělat něco podobného, neboť mám plné zuby a prázdný bachor.

Přeji hezký večer

Přerušení u ATTiny2313

Napsal: 21 led 2011, 13:31
od epes
Milá Andreo, bose týmový!

I když se již neozýváš, chtěl bych Ti touto cestou poděkovat za snahu pomoci mně s mým trápením.
Problém se vyřešil v momentě kdy jsem naprogramoval jednu AT2313 a zapojil ji s pár ledkami a spustil program. Přerušení fungovalo jak mělo!!! i když simulátor v AVR Studiu ukazoval něco jiného. AVR Studio jsem odinstlaloval a nainstaloval jej znovu se všemi aktualizacemi. Chování simulátoru se troch změnilo k lepšímu - přerušení začalo fungovat, nic méně signalizace nastavení registru GIMSK nefunguje stejně. A vzhledem k tomu, že se takto AVR Studio chová na dvou PC stejně, usuzuji spíše na chybu ve Studiu než na nepodařené instalaci.
Pokud máte někdo podobné zkušenosti, dejte vědět.

Hezký víkend všem.

Napsal: 21 led 2011, 14:06
od Andrea
Možná proto žádné simulátory nepoužívám, simuluju v hlavě a ladím v reálném hardwaru, takže mi stačí textový editor a assembler. I když i assemblerský překladač umí vypéct. V jedné z prvních verzí avrasm byla chyba, ldi Rx,y se občas přeložilo jako ldi Rx,0. :roll:

Napsal: 21 led 2011, 15:08
od epes
Tedy Andreo,
jseš Ty vůbec ženská? Moje dcera simulovala a simuluje dodnes kde co, ale hlavu má spíše plnou kluků. Není náhodou Andrea jen krycí název pro utajovanou pobočku Mensy? Ať už je to jak jeto, díky.