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

ATMega32 i interapti

[es] :: Elektronika :: Mikrokontroleri :: ATMega32 i interapti

[ Pregleda: 2441 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon ATMega32 i interapti27.01.2012. u 14:35 - pre 149 meseci
Zeleo bih da naucim koriscenje spoljnih interapta. Realno, kakvo je to programiranje MCU-a bez mogucnosti interakcije sa korisnikom? :) Citao sam i datasheet, i "interrupt.h" ali mi opet nesto nije jasno - ako imam plocu koja sadrzi prekidac koji treba da izazove interrup, da li ja mogu da odredim BILO KOJI pin kao pin na koji cu da nakacim prekidac? Koliko sam ja razumeo datasheet za megu 32, na raspolaganju imam samo 3 "INT" pina (int0,int1,int2 sa vektorima INT0_vect, INT1_vect, INT2_vect)) ali to mi deluje malo, ogranicavajuce, nelogicno...

Ovde sam nasao tutorijal koji objasnjava kako se koristi "timer interrupt", ali nigde ne mogu da nadjem neki tut za "pinchage interrupt". Jel moze neko od vas da mi pomogne? Kom registru, i kako, da kazem da prati promene na, recimo, pinu B5?
 
Odgovor na temu

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon Re: ATMega32 i interapti27.01.2012. u 18:17 - pre 149 meseci
Da bi proveravao promenu na "pinu B5", prvo moras da ga postavis kao "input", zatim u while(1) petlji proveravas da li je stanje na pinu "1" ili "0"... to je ako ti hoces da proveravas...
Postoji i PinOnChange, dobro procitaj datasheet.

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

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: ATMega32 i interapti27.01.2012. u 21:14 - pre 149 meseci
Imas 2 osnovne vrste interapta
1. interni
2. externi

za komunikaciju sa korisnikom te zanimaju externi. Za externe interapte uglavnom imas 2 vrste
1. interrupt
2. pin change

"interrupt" (INT, EXT i slicna imena) pin se konfigurise tako da cima interrupt rutinu na odredjenu vrstu ivice, ti konfigurises da se okida interapt na rastucu ili padajucu ivicu. Na nekim mcu nemas mogucnost konfiguracije nego je uvek rastuca ili padajuca ivica, neki mcu nemaju uopste ovu vrstu externog interapta

"pin change" (PC, POC, IOC, PCINT i slicna imena) pin obicno nema konfiguraciju (osim da ga dozvolis ili ne), obicno je znacajno sporiji od "interrupt" pina i okida interrupt na svaku promenu (dakle uvek i na rastucu i na opadajucu ivicu), neki mcu nemaju uopste ovi vrstu externog interapta (na PIC-u je na primer ovo B4, B5, B6 i B7 najcesce)

Ovo "najcesce" varijante, postoje mesavine, zavisno od mcu-a do mcu-a, uvek moras da overis datasheet

Za atmega32 pogledaj datasheet stranu 66. Jedini externi interapti su INT0, INT1 i INT2

Citat:

The External Interrupts are triggered by the INT0, INT1, and INT2 pins. Observe that, if enabled, the interrupts will trigger even if the INT0..2 pins are configured as outputs. This feature provides a way of generating a software interrupt. The external interrupts can be triggered by a falling or rising edge or a low level (INT2 is only an edge triggered interrupt). This is set up as indicated in the specification for the MCU Control Register – MCUCR – and MCU Control and Status Register – MCUCSR. When the external interrupt is enabled and is configured as level triggered (only INT0/INT1), the interrupt will trigger as long as the pin is held low. Note that recognition of falling or rising edge interrupts on INT0 and INT1 requires the presence of an I/O clock, described in “Clock Systems and their Distribution” on page 24. Low level interrupts on INT0/INT1 and the edge interrupt on INT2 are detected asynchronously. This implies that these interrupts can be used for waking the part also from sleep modes other than Idle mode. The I/O clock is halted in all sleep modes except Idle mode.

Note that if a level triggered interrupt is used for wake-up from Power-down mode, the changed level must be held for some time to wake up the MCU. This makes the MCU less sensitive to noise. The changed level is sampled twice by the Watchdog Oscillator clock. The period of the Watchdog Oscillator is 1 μs (nominal) at 5.0V and 25°C. The frequency of the Watchdog Oscillator is voltage dependent as shown in “Electrical Characteristics” on page 287. The MCU will wake up if the input has the required level during this sampling or if it is held until the end of the start-up time. The start-up time is defined by the SUT fuses as described in “System Clock and Clock Options” on page 24. If the level is sampled twice by the Watchdog Oscillator clock but disappears before the end of the start-up time, the MCU will still wake up, but no interrupt will be
generated. The required level must be held long enough for the MCU to complete the wake up to trigger the level interrupt.




Citat:
Bope: Koliko sam ja razumeo datasheet za megu 32, na raspolaganju imam samo 3 "INT" pina (int0,int1,int2 sa vektorima INT0_vect, INT1_vect, INT2_vect)) ali to mi deluje malo, ogranicavajuce, nelogicno...


Zasto ogranicavajuce? Zavisi sta ti treba. Inace mega32 je prilicno patetican sto se tice externih interapata, ako pogledas npr ATmega640/1280/1281/2560/2561 imas INT0-INT7 + PCINT0-PCINT2 ... etc etc

Inace, sa malo externih komponenti mozes da iskoristis 1 int pin za mnooooog spoljnih desavanja na isti interrupt pin :D ..
 
Odgovor na temu

milanmeh
Novi Sad

Član broj: 206027
Poruke: 213
*.dynamic.sbb.rs.



+7 Profil

icon Re: ATMega32 i interapti27.01.2012. u 21:30 - pre 149 meseci
ATmega32 ima samo tri spoljnja interapta, one sto si naveo, INT0,INT1 i INT2. Neki drugi modeli AVR-a imaju na svakom pinu any change interapt pored standardnih INTx, recimo Atmega168 i pod varijante.

Inace interapti ne trebaju da se koriste za neke jednostavne stvari tipa korisnicki tasteri. Njih treba koristiti za neke vremenski kriticne dogadjaje, recimo kod fazne kontrole naizmenicne struje koristices neki od INTx za detekciju prelaza nule.

Korisnicke tastere ces realizovati kao sto je shpiki rekao. Proveravaces PINxx registre (PINA0,PINA1,...,PINA7, slicno je za sve portove) pinova (koje se postavio kao ulaze) u while petlji (i naravno koristices neki vid debouncinga za tastere).
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: ATMega32 i interapti28.01.2012. u 01:01 - pre 149 meseci
Uredjaj koji pokusavam da napravim na svom izlazu (nazovimo ga "ekran") prikazuje nekoliko razlicitih animacija koje se smenjuju. Glavna while petlja poziva jednu po jednu animaciju, svaka ima neku svoju petlju koja se ponavlja X puta. Razmisljao sam da pritiskom na dugme omogucim da se istog momenta prekine postojeca animacija i zapocne sledeca, zato mi ne bi odgovaralo da na mnogo mesta u kodu dodajem proveru stanja tastera, vec da pomocu interapta "ocistim" "ekran" i zapocnem sledecu animaciju.

Ovo mi je sve taaako konfuzno, ja sam se do sada bavio C# programiranjem tako da....pfff

Recimo, nasao sam ovaj kod za set-up interapta.

GICR |= _BV(INT0);
MCUCR |= (1<<ISC00);
sei();

Znam cemu sluzi "sei", znam sta je interapt, ali do dajvola, cime se pune GICR i MCUCR registri i zasto? :D Sta je ono "_BV"? I ako je vec pomocu tog "_BV" odredjeno koji pin ce da izaziva spoljni interapt, sta jos onda ima da se upise u "MCUCR" registar? Nemojte da mislite da ocekujem odgovor iz neba u rebra, sve ovo pisem citajuci druge forume i datasheet, ali opet... "ces ces po glavi". Zakompliokvase ga :)))) Iskreno, nadao sam se ovakvoj proceduri: "odredi pin koji ce da reaguje na BILO kakvu promenu (pozivanjem odgovarajuce ISR metode), omoguci interapt (sei) i vozi" ali izgleda da to sve zahteva voodoo kako bi se omogucilo prekidanje programa na klik tastera :P
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: ATMega32 i interapti28.01.2012. u 01:53 - pre 149 meseci
Citat:
Bope: Uredjaj koji pokusavam da napravim na svom izlazu (nazovimo ga "ekran") prikazuje nekoliko razlicitih animacija koje se smenjuju. Glavna while petlja poziva jednu po jednu animaciju, svaka ima neku svoju petlju koja se ponavlja X puta. Razmisljao sam da pritiskom na dugme omogucim da se istog momenta prekine postojeca animacija i zapocne sledeca, zato mi ne bi odgovaralo da na mnogo mesta u kodu dodajem proveru stanja tastera, vec da pomocu interapta "ocistim" "ekran" i zapocnem sledecu animaciju.


pravilno razmisljanje. Interapt jeste ono sto ti treba. E sad, ako imas vise od 3 tastera koja hoces da obradis dok "masina nesto radi" stavis jedan veliki OR ili veliki AND zavisno od toga da li su ti dugmici dignuti na Vdd sa pull up-om ili povuceni na Vss sa pull down-om.

Na primer ako su ti dugmici pull up a na prekidac ih spajas sa Vss (dakle na ulazu u mcu ti je logicki 1 kada taster nije pritisnut i logicka 0 kada je taster pritisnut) onda ti treba veliki AND. Tu ti recimo posao zavrsava odlicno 74HC30. To je NAND kolo sa 8 ulaza. Vezes ga kao na semi na slici i sta je fora, sa svojih 8 tastera vodis signal na 8 pinova a izlaz sa NAND kola vozis na INTERRUPT pin. Dok su svi tasteri otpusteni interrupt pin je nula ali cim stisnes neki taster interrupt ce da ode na keca. To ce da prekine tvoj program i zovne tvoju interrapt rutinu. Onda u iterrupt rutini proveris stanje na pinovima 1-8 da vidis koji taster je izazvao interrupt (koji taster je pritisnut) tako sto proveris stanje registara koji cuvaju vrednosti ulaznih pinova. Naravno ako neces 8 tastera ili iskoristi NAND sa manje ulaza (ima ih sa 2, 3, 4 i 8 ako se dobro secam), ili samo neiskoristene ulaze vezi direkt na Vdd.


Citat:
Bope:
Ovo mi je sve taaako konfuzno, ja sam se do sada bavio C# programiranjem tako da....pfff


nije ni cudo, C# i ostale .not tehnologije su napravljene da bi te odvojile od masine te da bi pisao neke bloated virtualne gluposti ... ovde se razmislja na nivou gde je koji bit setovan a ne na nivou "to ce garbage colector pocistit, bas me briga kad i kako" :)

Citat:
Bope:
Recimo, nasao sam ovaj kod za set-up interapta.

GICR |= _BV(INT0);
MCUCR |= (1<<ISC00);
sei();

Znam cemu sluzi "sei", znam sta je interapt, ali do dajvola, cime se pune GICR i MCUCR registri i zasto? :D Sta je ono "_BV"? I ako je vec pomocu tog "_BV" odredjeno koji pin ce da izaziva spoljni interapt, sta jos onda ima da se upise u "MCUCR" registar?


Samo lagano :D

_BV je MAKRO. Znaci Bit Value. i to je u stvari:
Code:

#define _BV(bit) (1 << (bit)) 


Sta je fora AVR nema bit_set i bit_clear instrukcije te se odredjeni bit setuje tako sto se procita sadrzaj registra/mem lokacije pa vrati nazad, dakle ceo bajt.

Kada uradis GICR |= _BV(INT0);

desava se sledece

INT0 je "pozicija bita koji definise da li je INT0 upaljen ili ne u registru GICR" (u ovom slucaju 6)
_BV(INT0) kreira byte vrednost u kojoj je taj bit setovan (u ovom slucaju 0b01000000 )
GICR se procita u memorisku lokaciju
oruje se sa malopre napravljenim bajtom koji ima setovan INT0 bit (dakle upalimo taj bit)
i snimi se rezultat nazad u GICR registar.


Cime se puni GICR .. za atmega32 ti pise na 44 strani i 67 strani :D tacnije GICR je na 47moj. GICR ima 5 bitnih bitova (3 se ne koriste)
IVSEL (bit na poziciji 1) definise gde se nalaze interapt vektori (bitno ako koristis bootloader)
IVCE (bit na poziciji 0) ti definise da li mozes ili ne da pomeris gde se nalaze interapt vektori

cemu sluzi MCUCR, pogledaj data sheet, strana 66
bit 0 i bit 1 definisu kada ce INT0 da generise interapt, da li na "level low" (00), bilo koju ivicu (01), padajucu ivicu (10) ili rastucu ivicu (11)
bit 2 i 3 radi isto to samo za INT1
bitovi 4,5,6,7 su vezani za stvari koje nemaju veze sa interaptima

onda imas MCUCSR (strana 67) gde bit6 definise da li se INT2 okida na rastucu ili opadajucu ivicu, ali tu sada imas dodatne opcije posto INT2 nije "klasican interapt"

pa onda imas GIFR (strana 68) gde ti je flag koji interapt se desio (koji proveravas i cistis u interrupt rutini)


Dakle pomocu _BV(n) samo od generises bajt sa setovanim n-tim bitom. Ako hoces da setujes n-ti bit u nekoj "varijabli/registru"

x |= _BV(n);

Ako hoces da clearujes (upises nulu) u n-ti bit u nekoj varijabli onda:

x &= !_BV(n);

(nadam se da znas da x |= y; znac x = x | y; odnosno x &= y; znaci x = x & y;)

Aj sad probaj da okacis na INT0 da ti pozove tvoj interapt onda kada ti se stisne neki od tastera (preko onog NAND kola) i da saznas koji je :D


Prikačeni fajlovi
 
Odgovor na temu

shpiki
Student
Novi Sad

Član broj: 50342
Poruke: 1651



+62 Profil

icon Re: ATMega32 i interapti28.01.2012. u 11:28 - pre 149 meseci
kecmane, alal ti plajvaz!
cini mi se da se sazetije objasnjenje ne moze pronaci ni u jednom AppNote-u.
Znao sam sve ovo, al' kad procitam izgleda mi jos blize.
Svaka cast!
There are only 10 types of people in the world:
those who understand binary, and those who don't.
 
Odgovor na temu

Bope

Član broj: 62233
Poruke: 291
*.adsl.verat.net.

Sajt: www.shortsms.me


+4 Profil

icon Re: ATMega32 i interapti28.01.2012. u 17:06 - pre 149 meseci
Kecmane, stvarno ,svaka cast na odgovoru! Sad mi je mnogo jasnije sta se tu desava, a i pomocu one sheme mi je sad jasno kako je moguce koristiti jedan interrupt pin za vise tastera!
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
95.180.61.*

Sajt: mysql.rs


+2377 Profil

icon Re: ATMega32 i interapti28.01.2012. u 17:59 - pre 149 meseci
samo napred, najbitnije je da citas datasheet, pre bilo cega procitas ceo data sheet od pocetka do kraja, pa tek onda krenes da radis, pa se onda vracas na datasheet za detalje, ali krenes tako sto ga procitas od korice do korice .. nije mnogo veliki tako da .. onda samo lagano..
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: ATMega32 i interapti

[ Pregleda: 2441 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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