Přerušení u ATTiny2313

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

Přerušení u ATTiny2313

#1 Příspěvek 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
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek 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).
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#3 Příspěvek 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
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#4 Příspěvek 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
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#5 Příspěvek 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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#6 Příspěvek od Andrea »

Nějak v tom kódu nevidím nic kolem toho PCINT.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#7 Příspěvek od piitr »

Zkusil jsi ten cnt definovat takhle?

Kód: Vybrat vše

volatile int cnt = 0; 
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#8 Příspěvek 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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#9 Příspěvek od Andrea »

Tak do toho, co tam datluješ, nevidím, ale jak chceš používat PCINT, když máš celý PortB nastavený jako výstup?
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#10 Příspěvek od epes »

Hned to jdu zkusit
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#11 Příspěvek 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.
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#12 Příspěvek 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
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

Přerušení u ATTiny2313

#13 Příspěvek 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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#14 Příspěvek 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:
Uživatelský avatar
epes
Příspěvky: 120
Registrován: 05 srp 2008, 00:00
Bydliště: Praha 5

#15 Příspěvek 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.
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“