piiri
Kellon keskeytyksen ilmaisupiiri, joka käsittää: sisääntulon kellotaajuuden eri skaalausarvoon ja antaa ulos useita kellon taajuudenjakajapiirejä; tulokello ja useita taajuusjaetun kellon "ja" "ja" piiritoimintoja; invertterin, jossa on käänteinen taajuusjaettu kello, joka jakaa maksimiarvon; jäljellä oleva sisääntulokellotaajuusjaettu kello ja invertterin lähtö "ja ja "toiminta" "piiri; on järjestetty vastaaville ensimmäiselle ja toiselle kytkimelle, jossa on lähtöpiirin" ohjausliitin ", ensimmäisen ja toisen kondensaattorin purkauspolun ohjaus PÄÄLLE/POIS; puskuripiirin ensimmäinen ja toinen aaltomuoto syötetään ensimmäisen ja toisen kondensaattorin napajännitteeseen; saadaan viivepiirin pituuden mukaan manipulointiinvertteri tuottaa ennalta määrätyn aikaviiveen valinnan ohjaussignaalin lähtöpuskuripiirin, joka muodostuu ensimmäisestä ja toisesta aaltomuodon valintapiiristä. Joka aiheuttaa tulokellon yhden järjestelmän kellokeskeytykset voidaan havaita helpommin integroida, ja kellon keskeytysaika voidaan havaita tarkasti.
Esimerkki
ja alkuarvo ajastimen keskeytyksen syklin kellokeskeytys ilman liian usein, ja yleensä 20 mS (50 Hz) voi olla. Aikakantasignaalin on oltava sekunnin sadasosia, mieluiten 10 mS (100 Hz). Tässä otetaan 20 mS, T0 ajastin, joka toimii 16-bittisessä ajastintilassa (tila 1). T0 toimii seuraavasti: jokaista konesykliä kasvatetaan automaattisesti, kun luku on täynnä 0FFFFh, ylivuodon vuoksi se luo keskeytyksen asettamalla vastaavan lippubittilaitteiston ohjelmistokyselyyn. Konejakson jälkeen N + 1 kuin keskeytyksen alku. Joten, me vain esitallennettu T0 pienempään määrään kuin täysi arvo 0FFFFh N, ja käynnistämme sitten ajastimen, se luo keskeytyksen N konejakson jälkeen. Tämä arvo on niin kutsuttu "alkuarvo". Alkuarvon laskenta, jota tarvitsemme: kello on 6MHz, konejakson 12 kellojaksoa, 20mS konejaksoja on 10 000. (10 000) = 10 (2710) 16, 0FFFFh-2710h + 1 = 0D8F0h. Koska vastaus keskeytykseen ja uudelleenlataukseen alkuarvon kentän suojaus vaati 7-8 konesykliä, tämä arvo plus 7, eli T0 on alkuarvo, tulee ladata 0D8F7h. Jokaisen keskeytyksen jälkeen PSW A:n arvo työnnetään ensin pinoon, eli 0D8F7h ladataan sitten T0.
asetusyksikkö, plus 1 kutakin keskeytystä sisäinen RAM, voimme ottaa yksikön nimeltä INCPI (Increase Per Interrupt), keskeytyksessä alkuarvo T0 Bahrain, käskyllä INC INCPI se on plus. Tästä yksiköstä, pääohjelmasta tai ohjelman keskeytyksestä signaali voidaan saada mistä tahansa 20 mS:n kokonaislukukerrannaisesta välillä 256 ~ 1. Esimerkiksi: Digitaaliseen ohjelmaan syötettiin merkittävä määrä, joka on suoritettava kerran 0,5 sekunnin välein. näytön päivittämiseksi sille voidaan antaa yksikkö (jota kutsutaan odottavaksi soluksi) W_DISP, jossa / MOV A, INCPI / ADD A, # 25 / MOV W_DISP , a / lausekkeet sallitaan suurempia kuin INCPI 25:n nykyinen arvo ja tarkista sitten, ovatko kaikki INCPI-keskeytykset samat. Jos sama, mikä osoittaa 25 keskeytysjaksoa, lähettää merkittävän ohjelman suorituksen ja antaa W_DISP plus 25 odottaa seuraavat 0,5 sekuntia. Voimme odottaa useita yksiköitä poimiaksemme joukon eri aikapohjaa. Anna keskeyttää ohjelman joka kerta, kun keskeytät, ja napsauta sitten Kysely onko jokainen yksikkö yhtä suuri ja odota INCPI yhtä suuri, jos sama, vastaava prosessi suoritetaan, ja nollaa odotusyksikön arvo, muussa tapauksessa ohita. Esim: 0,5 sekuntia tai vilkkuva näytön virkistyssignaali, neliöaaltoa muodostava reaaliaikakello tai vakiotaajuinen lähtösignaali yhdellä sekunnilla, väliajoin kyselyn tulolaitteita.
lue keskeytyspainikkeessa Yleensä luemme näppäimistön pääohjelmassa, vaiheet: näppäimistön skannaus, jos jotain näppäintä painetaan, viive kymmeniä millisekunteja ravistamiseen, todellakin Paina tätä painiketta uudelleen vahvistaaksesi ja yrittää uudelleen sen jälkeen, kun yllä oleva näppäintoimintoa vastaava vaiheprosessi on valmis. Mutta on kaksi puutetta: 1 ei voi lukita syöttönäppäimiä vastaava käsittelytyö, joka voi vuotaa näppäintä. 2. Viive CPU ei voi tehdä muita asioita ravistaa, kun tehokkuus ei ole korkea. Jos kellon lukunäppäin keskeyttää, voit välttää nämä puutteet. Menetelmä: Jos nämä kaksi ovat vierekkäin keskeytyksen lukemiseksi samaa näppäintä painetaan, näppäin on kelvollinen (debounce-tarkoituksiin) ja se on lukittu FIFO-näppäimistöpuskuriin (jono) ja muuhun pääohjelmaan. . Näin ollen, vaikka pääohjelman näppäimet, silti vastauksena näppäimistön syöttöön. Tyypillisesti syvyyspuskuri voidaan asettaa arvoon 8, jos avainten määrä on suurempi kuin salpa 8, uusi avain ohitetaan ja uusi hälytys käyttäjäavain on virheellinen. Jos näppäimistön puskurin jonon pysähtymisaika on paljon pidempi kuin pääavaimen käsittelyaika, joka vaaditaan maksimissaan, mikä osoittaa, että pääohjelma on karannut tai virheellinen, järjestelmä voidaan keskeyttää nollauskäskyllä, jonka tarkoituksena on vahtikoiratoimintoja.
päärutiinissa, koska normaalisti auki oleva viivekello keskeyttää, pääohjelma, kun tarvittava aika on lyhyempi, mitä suurempi on viiveen tarkkuus, kellokeskeytys tulee tilapäisesti sulkea. Kun ohjelma pidempään, suurta tarkkuutta ei vaadita viiveellä, se voidaan mallintaa vaaditun kirjoitustavan mukaan sisäkkäisen silmukan viiveen välttämiseksi.
Esimerkki: P1.1 1 sekunnissa korkean tason pulssilähtö
MOV A, INCPI
INC A
CJNE A , INCPI $; odota, että seuraava keskeytyskäsittely on valmis
SETB P1.1; P1.1 on H, pulssi alkaa
LISÄÄ A, # 50; 50 th 20 ms 1 s < / p>
CJNE a, INCPI, $; ja keskeytä INCPI plus 50
CLR P1.1; P1.1 asetettu L:ksi, pulssin loppu
alla esimerkiksi MCS-51:n kanssa:
MCS-51 keskeytysvastausprosessi:
1, vastauksena keskeytystilaan: täällä puhutaan, tunnemme edelleen taikakeskeytyksen, jotta tietokone vastaa, me ihmiset voimme reagoida ulkoisiin tapahtumiin, koska meillä on useita "antureita" - silmät, korvat voivat hyväksyä erilaisia tietoa, miten tietokone tekee sen? Suoraan sanottuna ei ole yllättävää, että kun MCS51 työskentelee jokaisessa konesyklissä, menee tarkistamaan, mitä kukin keskeytyslippu on "1", jos se on 1, se tarkoittaa, että on keskeytyspyyntö, ns. itse asiassa kyselyn, mutta jokainen sykli tarkistaa sen. Että aikuiset haluavat muuttaa, olet vastaava lukeminen, katsoi ylös nähdäkseen joka toinen, tarkistaa, mikä ei ole joku soitti ovikelloa, jos on puhelin. . . . Tyhmää, eikö? Tietokone saattoi olla tällainen, se ei fiksu ihmisiä.
Ymmärtää yllä kuvatun keskeytysprosessin, keskeytysehto ei ole epäselvä. Kun jokin seuraavista kolmesta tapauksesta, CPU estää vastauksen keskeytyksiä:
CPU käsittelee keskeytyspyynnön samaa tai korkeampaa tasoa. Nykyinen konesykli ei ole viimeinen käskyä parhaillaan suorittava jakso. Tiedämme, että on olemassa yksisiruinen yksisyklinen, kaksijaksoinen, kolmijaksoinen käsky, tällä hetkellä suorittava ohje on yksitavuinen ei ole väliä, jos se on kaksitavuinen tai neljä tavua, joutuisi odottamaan koko käsky suoritetaan yli, jotta voidaan vastata keskeytykseen (koska kysely keskeytyy jokaisessa konesyklissä, todennäköisesti löytyy).
on nykyinen komento, jota suoritetaan eräkomennon (RETI) tai IP-pääsyn, käskyrekisterin IE palauttamiseksi, silloin vähintään yhden käskyn suorittavan CPU:n tulisi vain keskeyttää. Nämä liittyvät siihen, jos käytät IP-osoitetta, IE saattaa avata ja keskeyttää pois päältä keskeyttää keskeytyksen tai muuttaa keskeytyksen prioriteettia. Palautusohje on kuvattu tässä keskeytystä ei ole käsitelty, joten on odotettava tämän direktiivin käsittelyn loppua ja suorittaa sitten yhden käskyn ennen kuin he voivat vastata keskeytuksiin.
2, keskeytysprosessi
Kun CPU keskeyttää, ensimmäinen nykyisen käskyn seuraavasta käskystä (eli palattuaan suoritettavasta keskeytyskäskystä) pinon osoitteeseen ja sitten keskeytyslipun mukaisesti vastaava keskeytysmerkintä. osoite PC, ohjelma osoitin PC, prosessori hakee PC arvon mukaan, arvo mitä PC, mistä se poimia käskyn, joten ohjelma haarautuu keskeyttää sisäänkäynti jatkuu. Tämän työn tekee laitteisto, meidän ei tarvitse ottaa huomioon. On myös ongelma, jos olet huomannut, jokainen keskeyttää vektorin osoitteet erotettu vain kahdeksan yksikköä, kuten 0003-000B, kuinka suorittaa keskeytysrutiini niin pienessä tilassa se? Hyvin yksinkertainen, järjestät LJMP-ohjeen paikoilleen, et voi keskeyttää ohjelmaa hypätäksesi mihinkään vielä?
täydellisen pääohjelman pitäisi näyttää tältä:
ORG 0000H
LJMP ALOITUS
ORG 0003H
LJMP INT0; transfektoitu ulkoinen keskeytys 0
ORG 000BH
RETI; 0 ei ajastinkeskeytystä, RETI laittaa tänne yhden, jos "ei välitä" keskeyttää, ei ole paljon vaikutusta. Jälkeen
keskeytysprosessi on valmis, muista suorittaa RETI-käsky tämän käskyn suorittamisen jälkeen, CPU pino pitää osoitteen ulos, takaisin PC:lle, sitten ohjelma keskeytyy pääohjelmasta Osasto jatkoi täytäntöönpanoa alas. Huomautus: CPU-suojaustyö on hyvin rajallista, vain osoitteen suojaus ja kaikki muut asiat eivät ole suojattuja, joten jos haluat käyttää A:ta, PSW:tä pääohjelmassa jne., mutta myös keskeytysrutiinilla niitä, mutta myös varmistaaksesi paluu pääohjelmaan sen jälkeen, kun dataa on tai ei suoritettu ennen keskeytysdataa, olet suojannut itsesi.
arvioida
Kellokeskeytyksen, keskeytyksen ja rationaalisen tehtävien kohdistamisen pääohjelmaan joustavana soveltamisena nähtynä, ja molemmat haluavat tyhjentää työnjaon, yksinkertainen käyttöliittymä. Tämä on yksi niistä taidoista, joita tarvitsemme myös paljon yritystä ja erehdystä sekä kokemusta käytännössä. Huomaa myös: tulisi yrittää lyhentää keskeytyskäsittelijän suoritusaikaa, enintään 20 ms.