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

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.