Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ATTiny2313 interrupti na PORTB

[es] :: Elektronika :: Mikrokontroleri :: ATTiny2313 interrupti na PORTB

[ Pregleda: 2031 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon ATTiny2313 interrupti na PORTB17.02.2011. u 21:07 - pre 159 meseci
Pravim neki joystik sa ATTiny2313 i potrebno mi je vise od 2 interapta (10 tacnije) pa me interesuje kako iskoristiti PCINT interapt rutinu? Da li je moguce registrovati na kom je pinu (PB0-7) interapt i na osnovu toga izvrsiti odredjenu operaciju ili neka druga logika?
Hvala. Pozdrav.
There are only 10 types of people in the world:
those who understand binary, and those who don't.
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.ptt.rs.



+7 Profil

icon Re: ATTiny2313 interrupti na PORTB17.02.2011. u 22:38 - pre 159 meseci
Predpostavljam da ces program pisati u C kompajleru i da na port B nameravas da zakacis tastere (obzirom da si napisao da pravis dzojstik). Kako se za PCINT koristi samo jedna interapt rutina za sve pinove na portu B, u njoj bi odradio debouncing i posle toga proverio sve tastere u nizu da utvrdis koji je pritisnut, i na osnovu toga bi se program dalje granao. Za debouncing bi bio primoran da koristis delay funkciju, ona jeste laka za implementaciju ali vrlo nezgodna jer pauzira izvrsenje koda - 20ms kasnjenja rezultuje gubitkom od 320000 ne izvrsenih instrukcija (ovo je maksimalni teoretski broj za clock od 16MHz) sto je svetu mikrokontrolera izuzetno mnogo. Pored gubitka neizvrsenih instrukcija, imao bi zestokih problema ukoliko ti je program zasnovan na interaptima i brojacima. Mislim da bi najbolje resenje bilo da proveravas status svih taster unutar main funkcije i da debounce funkciju realizujes koristeci overflow rutinu nekog od brojaca.
 
Odgovor na temu

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon Re: ATTiny2313 interrupti na PORTB18.02.2011. u 00:09 - pre 159 meseci
Da, na port bih zakačio tastere.. Zar nije moguće da, kad se desi interapt, skočim u interapt rutinu, proverim na kom pinu je 1 i setujem fleg? Interesuje me samo da li ja mogu u interapt rutini da ispitujem
Code:
if (PCINT0) {...}
if (PCINT1) {...}
itd.

Citat:
milanmeh: Mislim da bi najbolje resenje bilo da proveravas status svih taster unutar main funkcije ...

Misliš da u while(1) proveravam stanje porta? Ili je pametnije da se u interapt rutini postave određeni flegovi a da se u while(1) proverava stanje flegova?
Debouncing je delom odrađen hardverski (kondezator) a razmišljam i o nekom Šmit-trigeru..
There are only 10 types of people in the world:
those who understand binary, and those who don't.
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.ptt.rs.



+7 Profil

icon Re: ATTiny2313 interrupti na PORTB18.02.2011. u 02:02 - pre 159 meseci
Ako ti HW debouncing radi perfektno (ako imas mogucnosti proveri kako radi na DSO), onda mozes da postavljas flagove u ISR. Samo obrati paznju na to da se PCINT ISR okida na bilo koju promenu stanja na pinovima na portu B. Znaci moraces koristiti dodatnu while() petlju u PCINT ISR kako bi dozvolio zavrsetak iste tek kada si odpustio taster, a ovo opet povlaci manu slicnu delay funkcijama. Dokle god ti budes drzao taster, izvrsavanje programa ce biti zaglavljeno u PCINT ISR rutini. Ako bi recimo pravio dzojstika sa ATTiny26 i koristio potenciometre povezane na ADC za X i Y ose, ADC ISR ne bi mogao da se desi sve dok ne odpustis dugme.
 
Odgovor na temu

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon Re: ATTiny2313 interrupti na PORTB18.02.2011. u 10:02 - pre 159 meseci
Citat:
milanmeh: ...Znaci moraces koristiti dodatnu while() petlju u PCINT ISR kako bi dozvolio zavrsetak iste tek kada si odpustio taster...

To mi ništa ne znači, zamisli da za taster NAPRED moram da pritiskam i otpuštam taster.. znači taj pristup otpada.. onda mi preostaje samo da proveravam stanje porta u while() u main funkciji (što brutalno usporava ceo rad uC ali to je cena) i da na osnovu stanja porta izvršava određenu komandu..

milanmeh hvala na odgovorima. Ako još neko ima neku ideju bilo bih mu zahvalan da je podeli ovde.

Unapred hvala. Pozdrav.
There are only 10 types of people in the world:
those who understand binary, and those who don't.
 
Odgovor na temu

Stojan Trifunovic

Član broj: 15156
Poruke: 366
*.rs
Via: [es] mailing liste



+8 Profil

icon Re: ATTiny2313 interrupti na PORTB20.02.2011. u 22:18 - pre 159 meseci
> Ako još neko ima neku ideju bilo bih mu zahvalan da je podeli ovde.

Ja bih na Vašem mestu koristio tajmerski interapt, unutar koga bi se
realizovao debouncing. Takvo rešenje mi se odlično pokazalo na PIC-u, pa što
ne bi i na AVR-u.

Podesite tajmerski interapt tako da se izaziva željeni broj puta (ja obično
uzimam 4, ali budući da se radi o džojstiku, preporučio bih Vam 8) u željenom
roku (za obične tastere ja obično uzimam 20mS, a vi najbolje odredite tačnu
vrednost eksperimentalno. Mislim da će Vam biti dovoljno i 15mS). Znači, tako
da u 15mS izazovete 8 interapta.

U interaptu testirajte redno taster za tasterom. Što brže. Bez ikakvih pauza
ili zastoja. Ukoliko je taster pritisnut, uvećavajte njegov brojač (svaki
taster mora imati sopstveni brojač). Kada se uveća do željenog broja, setujte
flag tog tastera. Ukoliko je kasnije (pri nekom od narednih interapta) taster
i dalje pritisnut, najpre proverite da li je njegov flag već setovan, da ne
biste uvećavali vrednost njegovog brojača. Ukoliko se pak kasnije (opet pri
nekom od narednih interapta) taster otpusti, resetujte njegov flag.

U glavnom programu testirajte samo flagove i na osnovu njih izvršite željenu
akciju. Ukoliko je flag prvog tastera setovan, to znači da je prvi taster
najmanje 15mS bio pritisnut.

Imajte u vidu da se glavni program ne bi trebao previše dugo izvršavati, kako
se ne bi propustio koji pritisnut taster. Apsolutno maksimalno vreme koje
glavni program sme utrošiti iznosi 15mS/8.

Bila je ovde pre oko 2 godine tema softverske realizacije debouncinga, pa
probajte da je nađete pretragom. Možda odatle dobijete još koju ideju. Bolji
način podrazumevao bi rotaciju brojača stanja tastera (umesto brojanja) i
njegovo ispitivanje u interaptu na vrednost 00000000 (8 puta uzastopno nije
pritisnut taster) ili 11111111 (8 puta uzastopno jeste pritisnut taster).
Jedino u tim slučajevima bi se (u interaptu) menjao flag tastera. Glavni
program ostaje isti.
 
Odgovor na temu

korak
Nis

Član broj: 125522
Poruke: 622
*.dynamic.sbb.rs.



+7 Profil

icon Re: ATTiny2313 interrupti na PORTB20.02.2011. u 23:32 - pre 159 meseci
Ja bih uradio ovako:

Napravio bih jedan interrupt na 10ms. Napravio bih 10 vaijabli tipa char ili niz od 10 elemenata tipa char. Takodje i 10 flegova. Neka je niz Rf[10], i flegovi kao skup od 10 elemenata, moze 2-o bajtna varijabla. Sve tastere bih vezao na dva porta kako ti je zgodno.

U interrupt rutini bih ispitivao redom stanje ulaza pinova portova za svaki taster. Za n-ti taster bi napisao:

if Pin <> 0 then Rf[n] := Rf[n] << 1
else Rf[n] := (Rf[n] << 1)+1;
if Rf[n] = 0 then Fn := 1;
if Rf[n] = 0xFF then Fn := 0;

I tako za sve tastere.

Na ovaj nacin skeniras tastere na svakih 10ms i tesko da ces propustiti nesto validno. Postupak podrazumeva i filtriranje jer se fleg postavlja ako je 8 puta skenirana nula ili jedinica. Doduse fleg se setuje posle 80ms, ali ako ti je to sporo onda mozes filtriranje da skratis na 4 bita i imaces odziv za 40ms. Izmena za to bi bila:

if Rf[n] and 0x0F = 0 then Fn := 1;
if Rf[n] and 0x0F = 0x0F then Fn := 0;

Pozdrav.
Nadam se da si razumeo algoritam, pa ce ti biti lako na bilo kom jeziku da napises program.

 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: ATTiny2313 interrupti na PORTB

[ Pregleda: 2031 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.