AVR మైక్రోకంట్రోలర్లు పెద్ద సంఖ్యలో పరిధీయ పరికరాలు (ADC, టైమర్/కౌంటర్లు, EXTI, అనలాగ్ కంపారేటర్, EEPROM, USART, SPI, I2C, మొదలైనవి) కలిగి ఉంటాయి, వీటిలో ప్రతి ఒక్కటి డేటా/సిగ్నల్స్ మరియు ఇతర సమాచారంపై నిర్దిష్ట చర్యలను చేయగలవు. AVR మైక్రోకంట్రోలర్ల ఆధారంగా అన్ని రకాల పరికరాలను అభివృద్ధి చేసేటప్పుడు అప్లికేషన్ సామర్థ్యాన్ని మెరుగుపరచడానికి మరియు ఖర్చులను తగ్గించడానికి ఈ పరికరాలు మైక్రోకంట్రోలర్లో విలీనం చేయబడ్డాయి.
ప్రాసెసర్ డేటా మెమరీలో ఉన్న I/O రిజిస్టర్ల ద్వారా పరిధీయ పరికరాలను కమ్యూనికేట్ చేస్తుంది/నియంత్రిస్తుంది, వాటిని సాధారణ వేరియబుల్స్ వలె ఉపయోగించడానికి అనుమతిస్తుంది. ప్రతి పరికరం దాని స్వంత I/O రిజిస్టర్లను కలిగి ఉంటుంది.
అన్ని I/O రిజిస్టర్లను మూడు గ్రూపులుగా విభజించవచ్చు: డేటా రిజిస్టర్లు, కంట్రోల్ రిజిస్టర్లు మరియు స్టేటస్ రిజిస్టర్లు.
కంట్రోల్ రిజిస్టర్లను ఉపయోగించి, పరికరం నిర్దిష్ట పౌనఃపున్యం, ఖచ్చితత్వం మొదలైనవాటితో ఒక మోడ్లో లేదా మరొక రీతిలో పనిచేయడానికి కాన్ఫిగర్ చేయబడింది మరియు డేటా రిజిస్టర్లను ఉపయోగించి, ఈ పరికరం యొక్క ఆపరేషన్ ఫలితం చదవబడుతుంది (అనలాగ్-టు-డిజిటల్ మార్పిడి, స్వీకరించబడింది డేటా, టైమర్/కౌంటర్ విలువ మొదలైనవి). ఇక్కడ సంక్లిష్టంగా ఏమీ లేదని అనిపిస్తుంది (వాస్తవానికి, ఇక్కడ నిజంగా సంక్లిష్టంగా ఏమీ లేదు :)), పరికరాన్ని ఆన్ చేసి, కావలసిన ఆపరేటింగ్ మోడ్ను సూచించింది, ఆపై కూపన్లను క్లిప్ చేయడం, రెడీమేడ్ డేటాను చదవడం మాత్రమే మిగిలి ఉంది మరియు వాటిని గణనలలో ఉపయోగించండి. ఈ డేటాను “ఎప్పుడు” చదవాలనేది మొత్తం ప్రశ్న (పరికరం దాని పనిని పూర్తి చేసిందా లేదా ఇప్పటికీ డేటాను ప్రాసెస్ చేస్తోంది), ఎందుకంటే అన్ని పరిధీయ పరికరాలు మైక్రోకంట్రోలర్ కోర్తో సమాంతరంగా పనిచేస్తాయి మరియు వివిధ పౌనఃపున్యాల వద్ద కూడా కమ్యూనికేషన్ను అమలు చేయడంలో ప్రశ్న తలెత్తుతుంది మరియు ప్రాసెసర్ మరియు పెరిఫెరల్స్ పరికరం మధ్య సమకాలీకరణ.
మీరు బహుశా ఇప్పటికే ఊహించినట్లుగా, పరికరం మరియు ప్రాసెసర్ మధ్య కమ్యూనికేషన్ మరియు సమకాలీకరణను అమలు చేయడానికి, "స్టేటస్ రిజిస్టర్లు" ఉపయోగించబడతాయి, ఇది పరికరంలో ఉన్న ప్రతి రాష్ట్రం యొక్క ప్రస్తుత ఆపరేటింగ్ స్థితిని నిల్వ చేస్తుంది రిజిస్టర్ స్టేట్లో” (ఫ్లాగ్), ఈ పరికరం యొక్క ప్రస్తుత స్థితి లేదా దాని వ్యక్తిగత ఫంక్షన్ గురించి “మాట్లాడుతుంది” ప్రస్తుత విలువ (పని పూర్తయింది/పూర్తి కాలేదు, డేటా ప్రాసెసింగ్లో లోపం, ఖాళీగా నమోదు చేయడం మొదలైనవి).
ప్రాసెసర్ మరియు పరిధీయ పరికరం మధ్య కమ్యూనికేషన్ మెకానిజం ఫ్లాగ్ పోలింగ్ ద్వారా అమలు చేయబడుతుంది, ఇవి ఈ పరికరం యొక్క నిర్దిష్ట పనితీరుకు బాధ్యత వహిస్తాయి. నిర్దిష్ట ఫ్లాగ్ (పరికర స్థితి) విలువపై ఆధారపడి, మీరు ప్రోగ్రామ్ అమలు (బ్రాంచింగ్) యొక్క ప్రవాహాన్ని మార్చవచ్చు. ఉదా:
నిర్దిష్ట ఫ్లాగ్ సెట్ చేయబడిందో లేదో తనిఖీ చేస్తోంది (కొన్ని ఈవెంట్ జరిగింది):
ఉంటే (RegX & (1<<
Flag)
)
// RegX రిజిస్టర్లో ఫ్లాగ్ సెట్ చేయబడితే
{
// ఏదో ఒకటి చేయి
}
కొంత చర్య (ఈవెంట్) పూర్తయ్యే వరకు వేచి ఉంది:
అయితే(!(RegX & (1< ఫ్లాగ్లను ప్రశ్నించడం అనేది ప్రోగ్రామ్ పరిమాణం మరియు ప్రోగ్రామ్ స్పీడ్ పరంగా రెండూ కాకుండా వనరు-ఇంటెన్సివ్ టాస్క్. AVR మైక్రోకంట్రోలర్లలో మొత్తం ఫ్లాగ్ల సంఖ్య చాలా పెద్దది (ప్రయోజనం), పోలింగ్ ఫ్లాగ్ల ద్వారా ప్రాసెసర్ మరియు పరికరం మధ్య కమ్యూనికేషన్ అమలు చేయడం వలన మీరు వ్రాసే ప్రోగ్రామ్ యొక్క సామర్థ్యం (కోడ్ వేగం / కోడ్ పరిమాణం) తగ్గుతుంది, అదనంగా, ప్రోగ్రామ్ చాలా గందరగోళంగా మారుతుంది, ఇది కోడ్ యొక్క వివరణాత్మక డీబగ్గింగ్తో కూడా గుర్తించడం కష్టతరమైన లోపాల రూపానికి దోహదం చేస్తుంది. AVR మైక్రోకంట్రోలర్ల కోసం ప్రోగ్రామ్ల సామర్థ్యాన్ని పెంచడానికి, అలాగే ఈ ప్రోగ్రామ్లను సృష్టించే మరియు డీబగ్ చేసే ప్రక్రియను సులభతరం చేయడానికి, డెవలపర్లు అన్ని పరిధీయ పరికరాలను “ఇంటరప్ట్ సోర్సెస్”తో అమర్చారు ( మూలాలను అంతరాయం కలిగించండి), కొన్ని పరికరాలు బహుళ అంతరాయ మూలాలను కలిగి ఉండవచ్చు. అంతరాయ మూలాలను ఉపయోగించి, ఇది అమలు చేయబడుతుంది సమకాలీకరణ విధానం, ప్రాసెసర్ మరియు పరిధీయ పరికరం మధ్య, అంటే, పరికరం దీనికి సిద్ధంగా ఉన్నప్పుడు మాత్రమే ప్రాసెసర్ పరిధీయ పరికరంలో డేటా, పోలింగ్ ఫ్లాగ్లు మరియు ఇతర చర్యలను స్వీకరించడం ప్రారంభిస్తుంది (ఇది డేటా ప్రాసెసింగ్ పూర్తయినట్లు నివేదిస్తుంది, సమయంలో లోపం డేటా ప్రాసెసింగ్, రిజిస్టర్ ఖాళీగా ఉంది మొదలైనవి) మొదలైనవి), “ఇంటరప్ట్ రిక్వెస్ట్” (ఇంటరప్ట్ రిక్వెస్ట్)ని రూపొందించడం ద్వారా అంతరాయ అభ్యర్థన), కొంత ఫ్లాగ్ విలువను బట్టి (పరికరం/ఫంక్షన్/ఈవెంట్ స్థితి). సాహిత్యంలో, చాలా తరచుగా, "ఇంటరప్ట్ రిక్వెస్ట్" (IRQ) నుండి "ఇంటరప్ట్ సర్వీస్ ప్రొసీజర్" (ISR) వరకు మొత్తం సంఘటనల గొలుసు అంతరాయంగా సంక్షిప్తీకరించబడుతుంది ( అంతరాయం కలిగించు).
అంతరాయం అంటే ఏమిటి?
అంతరాయం అనేది ఈవెంట్ సంభవించిన దాని గురించి ప్రాసెసర్కు తెలియజేసే సిగ్నల్. ఈ సందర్భంలో, ఆదేశాల యొక్క ప్రస్తుత శ్రేణి యొక్క అమలు సస్పెండ్ చేయబడింది మరియు నియంత్రణ ఈ ఈవెంట్కు సంబంధించిన అంతరాయ నిర్వహణ విధానానికి బదిలీ చేయబడుతుంది, ఆ తర్వాత కోడ్ అమలు అంతరాయం కలిగించిన స్థానం నుండి ఖచ్చితంగా కొనసాగుతుంది (నియంత్రణ తిరిగి రావడం). (వికీ)
దినచర్యకు అంతరాయం కలిగించండి(ఇంటరప్ట్ సర్వీస్ రొటీన్) అనేది ఒక నిర్దిష్ట సంఘటన జరిగినప్పుడు అమలు చేయవలసిన ఫంక్షన్/సబ్రౌటిన్ తప్ప మరేమీ కాదు. అన్ని ఇతర ఫంక్షన్ల నుండి దాని వ్యత్యాసాన్ని నొక్కి చెప్పడానికి మేము "విధానం" అనే పదాన్ని ఉపయోగిస్తాము. ప్రక్రియ మరియు సాధారణ ఫంక్షన్ల మధ్య ప్రధాన వ్యత్యాసం ఏమిటంటే, సాధారణ “ఫంక్షన్ నుండి రిటర్న్” (అసెంబ్లీ కమాండ్ RET) బదులుగా, మీరు “రిటర్న్ ఫ్రమ్ ఇంటరప్ట్” (అసెంబ్లర్ కమాండ్ RETI) - " అంతరాయం నుండి తిరిగి వెళ్ళు".
AVR అంతరాయ లక్షణాలు: రీసెట్ అంతరాయాన్ని, అన్నింటిలా కాకుండా, నిలిపివేయబడదు. ఇటువంటి అంతరాయాలను నాన్-మాస్కేబుల్ అంతరాయాలు అని కూడా అంటారు.
GICR రిజిస్టర్లో IVSEL బిట్ను సెట్ చేయడం ద్వారా రీసెట్ వెక్టర్ మినహా అంతరాయ వెక్టర్ పట్టికను ఫ్లాష్ మెమరీ యొక్క బూట్ విభాగం ప్రారంభానికి తరలించవచ్చు. ఫ్యూజ్ బిట్ - BOOTRSTని ప్రోగ్రామింగ్ చేయడం ద్వారా రీసెట్ వెక్టర్ను ఫ్లాష్ మెమరీ యొక్క బూట్ విభాగం ప్రారంభానికి కూడా తరలించవచ్చు.
Fig.1 ATmega16 అంతరాయ వెక్టర్ పట్టిక రొటీన్ ప్రోటోటైప్కు అంతరాయం కలిగించండి
ఒక ఫంక్షన్ను అంతరాయ నిర్వహణ దినచర్యగా ప్రకటించడానికి, మీరు తప్పనిసరిగా నిర్దిష్ట ప్రోటోటైపింగ్ నియమాలను అనుసరించాలి, తద్వారా కంపైలర్/లింకర్ మీకు అవసరమైన అంతరాయాన్ని దాని హ్యాండ్లింగ్ రొటీన్తో సరిగ్గా గుర్తించగలదు మరియు అనుబంధించగలదు. ముందుగా, అంతరాయ సేవ రొటీన్ దేనినీ ఆర్గ్యుమెంట్ (శూన్యం)గా అంగీకరించదు మరియు దేనినీ తిరిగి ఇవ్వదు (శూన్యం). AVRలోని అన్ని అంతరాయాలు అసమకాలికంగా ఉండటమే దీనికి కారణం, కాబట్టి ప్రోగ్రామ్ యొక్క అమలు ఎక్కడ అంతరాయం కలిగిస్తుంది, ఎవరి నుండి స్వీకరించాలి మరియు ఎవరికి విలువను తిరిగి ఇవ్వాలి మరియు ప్రవేశ సమయాన్ని తగ్గించడం కూడా తెలియదు. అంతరాయం నుండి నిష్క్రమించండి. శూన్యం isr (శూన్యం) రెండవది, ఫంక్షన్ ప్రోటోటైప్కు ముందు, ఇది అంతరాయ నిర్వహణ ప్రక్రియ అని మీరు సూచించాలి. మీకు తెలిసినట్లుగా, C భాషలో ప్రధాన ఫంక్షన్లో ఉపయోగించిన కోడ్ మాత్రమే అమలు చేయబడుతుంది. ప్రధాన ఫంక్షన్లోని అంతరాయ నిర్వహణ విధానం ఎక్కడా ఉపయోగించబడనందున, కంపైలర్ దానిని అనవసరంగా "త్రోసివేయదు" కాబట్టి, ప్రొటోటైప్కు ముందు ఈ ఫంక్షన్ అంతరాయ నిర్వహణ ప్రక్రియ అని సూచించబడాలి. AVR స్టూడియో వాతావరణంలో అంతరాయ నిర్వహణ ప్రక్రియ యొక్క నమూనా
#చేర్చండి ISR (XXX_vect) AVR స్టూడియో (AVR GCC)లో, ప్రతి అంతరాయ దినచర్య ISR స్థూల నిర్వచనంతో ప్రారంభమవుతుంది, ఆ తర్వాత కుండలీకరణాల్లో కింది నిర్మాణం ఉంటుంది: XXX_వెక్ట్ ఇక్కడ "XXX" అనేది ఒక నిర్దిష్ట AVR మైక్రోకంట్రోలర్ యొక్క అన్ని వెక్టర్ పేర్లను మైక్రోకంట్రోలర్ డేటాషీట్ యొక్క "ఇంటరప్ట్ వెక్టర్ టేబుల్"లో లేదా దాని హెడర్ ఫైల్లో కనుగొనవచ్చు. ఉదాహరణకు, ATmega16 మైక్రోకంట్రోలర్ కోసం "ఇంటరప్ట్ వెక్టర్ టేబుల్" అంజీర్ 1లో చూపబడింది, ఇక్కడ మూల కాలమ్లో అంతరాయ వెక్టర్స్ యొక్క అన్ని పేర్లు ఈ మైక్రోకంట్రోలర్ యొక్క హెడర్ ఫైల్లో కూడా కనుగొనబడతాయి :\Program Files\Atmel\AVR Tools\AVR Toolchain\avr\include\avr\iom16.h), అంజీర్ 2 చూడండి. మనం చేయాల్సిందల్లా టేబుల్లో మనకు అవసరమైన వెక్టార్ పేరును కనుగొని, ప్రత్యయం జోడించడం దానికి “_vect”.
{
}
AVR స్టూడియో కోసం Fig.2 ATmega16 హెడర్ ఫైల్
ఉదాహరణకు, USART (USART, Rx Complete) ద్వారా బైట్ను స్వీకరించడానికి అంతరాయ నిర్వహణ విధానాన్ని వ్రాద్దాం:
ISR (USART_RXC_vect)
{
// అంతరాయం హ్యాండ్లర్ బాడీ
}
మార్గం ద్వారా: AVR స్టూడియోలో ఏదైనా అంతరాయాన్ని ఉపయోగించే ముందు, మీరు ప్రాజెక్ట్లో io.h మరియు interrupt.h అనే హెడర్ ఫైల్లను చేర్చాలి:
#చేర్చండి
#చేర్చండి
మీరు AVR స్టూడియో (AVR GCC)లో ఇంట్రడక్షన్ టు avr-libc యొక్క అంతరాయ హ్యాండ్లింగ్ విభాగంలో అంతరాయ హ్యాండ్లర్ల గురించి మరింత చదవవచ్చు.
ఇమేజ్క్రాఫ్ట్ వాతావరణంలో అంతరాయ నిర్వహణ ప్రక్రియ యొక్క నమూనా
#ప్రాగ్మా అంతరాయ_హ్యాండ్లర్
శూన్యం<
handler_name>(శూన్యం)
{
// అంతరాయం హ్యాండ్లర్ బాడీ
}
ఇమేజ్క్రాఫ్ట్ వాతావరణంలో, ప్రోటోటైప్ అంతరాయ రొటీన్ ఇలా కనిపిస్తుంది:
శూన్యం< handler_name>(శూన్యం)
ఎక్కడ
#ప్రాగ్మా అంతరాయ_హ్యాండ్లర్
ఎక్కడ
ImageCraft IDE కోసం Fig.3 ATmega16 హెడర్ ఫైల్
ఉదాహరణకు, ImageCraft వాతావరణంలో USART (USART, Rx Complete) ద్వారా బైట్ను స్వీకరించడానికి అంతరాయాన్ని నిర్వహించే విధానం ఇలా ఉంటుంది:
#pragma interrupt_handler usart_rxc_isr: iv_USART_RXC
శూన్యం usart_rxc_isr(శూన్యం)
{
// అంతరాయం హ్యాండ్లర్ బాడీ
}
ImageCraft IDEలో అంతరాయ నిర్వహణ విధానాల గురించి మరింత సమాచారం సహాయం->ప్రోగ్రామింగ్ AVR->అభివృద్ధి పర్యావరణం యొక్క అంతరాయ హ్యాండ్లర్స్ మెనులో చూడవచ్చు.
కొన్నిసార్లు, అనేక అంతరాయ హ్యాండ్లర్లు అదే పనిని చేయవలసి వస్తే, ప్రోగ్రామ్ మెమరీని సేవ్ చేయడానికి, మీరు అనేక అంతరాయ వెక్టర్లను ఒకే అంతరాయ రొటీన్కు మళ్లించవచ్చు.
AVR స్టూడియో వాతావరణంలో ఇది ఇలా కనిపిస్తుంది:
ISR (INT0_vect)
{
// ఏదో ఒకటి చేయి
}
ISR(INT1_vect, ISR_ALIASOF(INT0_vect) );
ముందుగా ఒక నిర్దిష్ట వెక్టర్ కోసం అంతరాయ ప్రాసెసింగ్ విధానం వస్తుంది, ఈ సందర్భంలో INT0. అన్ని ఇతర విధానాలు నిర్మాణాన్ని ఉపయోగించి ఏదైనా అంతరాయ హ్యాండ్లర్ను సూచించవచ్చు:
ISR (YYY_vect, ISR_ALIASOF(XXX_vect) );
ఇక్కడ YYY అనేది వెక్టార్ XXX కోసం గతంలో ప్రకటించిన అంతరాయ హ్యాండ్లర్ను సూచించే అంతరాయ వెక్టర్ పేరు.
ఇమేజ్క్రాఫ్ట్లో ఇది ఇలా కనిపిస్తుంది:
#ప్రాగ్మా అంతరాయ_హ్యాండ్లర్
శూన్యం<
handler_name>(శూన్యం)
{
// అంతరాయం హ్యాండ్లర్ బాడీ
}
#ప్రాగ్మా అంతరాయ_హ్యాండ్లర్
#ప్రాగ్మా అంతరాయ_హ్యాండ్లర్
శూన్యం<
handler_name>(శూన్యం)
{
// అంతరాయం హ్యాండ్లర్ బాడీ
}
ఇక్కడ వెక్టర్స్ XXX మరియు YYY ఒకే అంతరాయ హ్యాండ్లర్ను సూచిస్తాయి
AVR మైక్రోకంట్రోలర్లలో అంతరాయాలు ఎలా పని చేస్తాయి?
1. "జరిగింది" అనుకుందాం అంతరాయం అభ్యర్థన”(IRQ).
మార్గం ద్వారా: అంతరాయ ప్రాసెసింగ్ కోసం అనేక అభ్యర్థనలు ఏకకాలంలో సంభవించినట్లయితే, అత్యధిక ప్రాధాన్యత కలిగిన అంతరాయానికి ముందుగా ప్రాసెస్ చేయబడుతుంది, అన్ని ఇతర అభ్యర్థనలు అధిక-ప్రాధాన్యత అంతరాయాన్ని పూర్తి చేసిన తర్వాత ప్రాసెస్ చేయబడతాయి.
2. పరీక్ష.
ఈ అంతరాయానికి ఎనేబుల్ బిట్ సెట్ చేయబడి ఉంటే (ఇంటరప్ట్ ఎనేబుల్ బిట్), మరియు ప్రాసెసర్ స్టేటస్ రిజిస్టర్ (SREG) యొక్క I-బిట్ (జనరల్ ఇంటరప్ట్ ఎనేబుల్ బిట్) సెట్ చేయబడితే, ప్రాసెసర్ అంతరాయ సర్వీస్ రొటీన్ను సిద్ధం చేయడం ప్రారంభిస్తుంది, అయితే సాధారణ అంతరాయాన్ని ప్రారంభించే బిట్ (రిజిస్టర్ SREG యొక్క I-బిట్) రీసెట్ చేయబడింది, తద్వారా అన్ని ఇతర అంతరాయాలను నిలిపివేస్తుంది. ప్రస్తుత అంతరాయం యొక్క ప్రాసెసింగ్కు మరే ఇతర ఈవెంట్ అంతరాయం కలిగించకుండా ఇది జరుగుతుంది.
మార్గం ద్వారా: అంతరాయ నిర్వహణ విధానంలో మీరు I-bitని లాగ్ స్థితికి సెట్ చేస్తే. యూనిట్లు, ఆపై ఏదైనా సక్రియం చేయబడిన అంతరాయాలు ప్రస్తుత అంతరాయాన్ని ప్రాసెసింగ్కు అంతరాయం కలిగించవచ్చు. ఇటువంటి అంతరాయాలను నెస్టెడ్ అంతరాయాలు అంటారు.
3. తయారీ.
ప్రాసెసర్ ప్రస్తుత అసెంబ్లీ సూచనల అమలును పూర్తి చేస్తుంది, ఆపై తదుపరి సూచనల చిరునామాను స్టాక్పై ఉంచుతుంది (PC->STACK). తరువాత, ప్రాసెసర్ ఏ అంతరాయ మూలాన్ని "ఇంటరప్ట్ అభ్యర్థన" (IRQ) సమర్పించిందో తనిఖీ చేస్తుంది, ఆ తర్వాత, వెక్టర్ టేబుల్ నుండి ఈ మూలం (లింక్) యొక్క వెక్టర్ను ఉపయోగించి (ఇది ప్రతి అంతరాయ మూలానికి గట్టిగా కేటాయించబడుతుంది), ఇది కొనసాగుతుంది అంతరాయ ప్రాసెసింగ్ విధానం (JMP సూచన) అంతే, ప్రాసెసర్ కనీసం 4 గడియార చక్రాలను గడుపుతుంది (అభ్యర్థన కనిపించే క్షణం మరియు ప్రస్తుత సూచనల అమలు వ్యవధిని బట్టి ఇది IRQకి చాలా మంచి ప్రతిస్పందన సమయం ఇతర తయారీదారుల నుండి మైక్రోకంట్రోలర్లు.
మార్గం ద్వారా: మైక్రోకంట్రోలర్ స్లీప్ మోడ్లో ఉన్నప్పుడు IRQ సంభవించినట్లయితే, IRQకి ప్రతిస్పందన సమయం మరో నాలుగు క్లాక్ సైకిళ్ల ద్వారా పెరుగుతుంది, అలాగే ఫ్యూజ్ బిట్స్ SUT1 మరియు SUT0 (ప్రారంభ సమయం)లో నిల్వ చేయబడిన సమయం.
బాహ్య అంతరాయాలు దేనికి ఉపయోగించబడతాయి?
అంతరాయం అనేది ప్రధాన ప్రోగ్రామ్ కోడ్ (ఉదాహరణకు, ప్రధాన ఫంక్షన్) అమలులో అంతరాయం కలిగించే ఒక సంఘటన మరియు నియంత్రణ అనేది ఫంక్షన్ యొక్క అంతరాయ హ్యాండ్లర్కు బదిలీ చేయబడుతుంది. దీని ప్రకారం, బాహ్య అంతరాయాలు ప్రధాన ప్రోగ్రామ్ కోడ్ అమలుకు అంతరాయం కలిగించే కొన్ని బాహ్య సంఘటనలు.
బాహ్య అంతరాయాలు బాహ్య ఈవెంట్లకు శీఘ్ర, హామీతో కూడిన ప్రతిస్పందనను పొందడానికి మిమ్మల్ని అనుమతిస్తాయి. అందువల్ల, పల్స్ కౌంటర్ల అమలు, ఫ్రీక్వెన్సీ లేదా పల్స్ వ్యవధి యొక్క కొలత, uart యొక్క సాఫ్ట్వేర్ అమలు, వన్-వైర్, i2c, spi, అలాగే బాహ్య పరిధీయ పరికరాల నుండి సంకేతాలను ప్రాసెస్ చేయడం బాహ్య అంతరాయాల యొక్క అత్యంత సాధారణ ఉపయోగం.
AVRలో బాహ్య అంతరాయాల ఆపరేషన్ సూత్రం
మైక్రోకంట్రోలర్ బాహ్య సంఘటనల గురించి తెలుసుకోవడానికి, వివిక్త ఇన్పుట్లు INT0 INT1, మొదలైనవి ఉపయోగించబడతాయి. వివిక్త అంటే అవి తార్కిక స్థాయిలతో పని చేస్తాయి: 0 మరియు 1.
0 అనేది ఇన్పుట్ వద్ద వోల్టేజ్ కాదు
1 - ఇన్పుట్ వద్ద వోల్టేజ్ ఉనికి, ఇది మైక్రోకంట్రోలర్ యొక్క సరఫరా వోల్టేజ్కు సమానం.
బాహ్య అంతరాయాలను రెండు రకాలుగా విభజించవచ్చు:
- స్థాయి ద్వారా బాహ్య అంతరాయాలు
- బాహ్య అంచు అంతరాయాలు
స్థాయి వారీగా బాహ్య అంతరాయాలు
బాహ్య అంతరాయ ట్రిగ్గర్ తక్కువగా లేదా ఎక్కువగా ఉండేలా కాన్ఫిగర్ చేయబడుతుంది. ఉదాహరణకు, అంతరాయాన్ని తర్కం తక్కువగా సెట్ చేస్తే, INT ఇన్పుట్ వద్ద వోల్టేజ్ సున్నా అయినప్పుడు అది జరుగుతుంది. అంతరాయాన్ని అధిక స్థాయికి సెట్ చేస్తే, ఇన్పుట్ లాజికల్ 1 అయినప్పుడు అది జరుగుతుంది.
స్థాయి-ఆధారిత అంతరాయాలతో పని చేస్తున్నప్పుడు, INT ఇన్పుట్ తగిన స్థాయిని కలిగి ఉన్నంత వరకు, అంతరాయం నిరంతరం సంభవిస్తుందని మీరు గుర్తుంచుకోవాలి. ఆ. అంతరాయం ఏర్పడితే, ఉదాహరణకు తక్కువ స్థాయిలో, మరియు ప్రోగ్రామ్ దానిని ప్రాసెస్ చేస్తుంది, అయితే, అంతరాయ హ్యాండ్లర్ నుండి నిష్క్రమించినప్పుడు, ఇన్పుట్ తక్కువగా ఉంటే, అప్పుడు అంతరాయం మళ్లీ కాల్చబడుతుంది మరియు అంతరాయ హ్యాండ్లర్ మళ్లీ కాల్ చేయబడుతుంది మరియు ఇది ఇన్పుట్ అధిక స్థాయి కనిపించే వరకు కొనసాగుతుంది. ఇది జరగకుండా నిరోధించడానికి, మీరు హ్యాండ్లర్లో ఈ రకమైన అంతరాయాన్ని నిలిపివేయాలి లేదా దాన్ని మరొక స్థాయికి రీకాన్ఫిగర్ చేయాలి.
బాహ్య అంచు అంతరాయం
INT ఇన్పుట్ వద్ద సిగ్నల్ స్థాయి 0 నుండి 1కి మారినప్పుడు పెరుగుతున్న అంచుపై అంతరాయం లేదా, వారు కొన్నిసార్లు చెప్పినట్లు, పెరుగుతున్న సిగ్నల్ ఏర్పడుతుంది. INT ఇన్పుట్ 1 నుండి 0కి మారుతుంది.
INT ఇన్పుట్లో ఏదైనా మార్పుకు ప్రతిస్పందించేలా అంతరాయాన్ని కాన్ఫిగర్ చేయడం కూడా సాధ్యమే, అనగా. ఇది లీడింగ్ మరియు వెనుక అంచులు రెండింటిలోనూ జరుగుతుంది.
AVRలో బాహ్య అంతరాయాలను కాన్ఫిగర్ చేస్తోంది
లోపలికి బాహ్య అంతరాయాలు avr atmega8 బిట్స్ ఉపయోగించి కాన్ఫిగర్ చేయబడింది ISCxx నమోదు MCUCR .
avr atmega8లో MCUCR రిజిస్టర్ యొక్క ISC0x బిట్పై బాహ్య అంతరాయ INT0 యొక్క ట్రిగ్గరింగ్ స్థితిపై ఆధారపడి ఉంటుంది
బాహ్య అంతరాయం కోసం INT1 , సెటప్ అదే విధంగా జరుగుతుంది, బిట్స్ మాత్రమే ఉపయోగించబడతాయి ISC11 ISC10 .
ఉదాహరణavr atmega8 కోసం బాహ్య అంతరాయ సెట్టింగ్లు:
//అన్ని ISCxx బిట్లను రీసెట్ చేయండి MCUCR &= ~( (1 <<ISC11) | (1<<ISC10) | (1<< ISC01) | (1<< ISC00) ) MCUCR |= (1 << ISC01) | (1 << ISC00) ; |
//అన్ని బిట్లను ISCxx MCUCRని రీసెట్ చేయండి &= ~((1< బాహ్య అంతరాయాలు పని చేయడానికి, రిజిస్టర్లోని సంబంధిత బిట్లను 1కి సెట్ చేయడం ద్వారా వాటిని తప్పనిసరిగా ప్రారంభించాలి. GICR
. బిట్ INT0
బాహ్య అంతరాయాలను ప్రారంభించడం/నిలిపివేయడం బాధ్యత INT0
, మరియు బిట్ INT1
, వరుసగా, బాహ్య అంతరాయానికి INT1
. గ్లోబల్ ఇంటరప్ట్ ఎనేబుల్ ఫ్లాగ్ సెట్ చేయడం కూడా అవసరం. avr atmega8 కోసం బాహ్య అంతరాయాన్ని INT0 ప్రారంభించడం కోసం ఉదాహరణ కోడ్:
//బాహ్య అంతరాయాన్ని ప్రారంభించు INT0 GICR |= (1< ఉదాహరణగా, నేను పల్స్ కౌంటర్ ప్రోగ్రామ్ ఇస్తాను. ప్రోగ్రామ్ INT0 ఇన్పుట్ వద్ద పప్పుల సంఖ్యను గణిస్తుంది మరియు సెకనుకు ఒకసారి కౌంటింగ్ ఫలితాన్ని uartలో ప్రదర్శిస్తుంది. #చేర్చండి స్టాక్ అనేది సబ్రూటీన్ల నుండి రిటర్న్ చిరునామాలను నిల్వ చేయడానికి మరియు పునరుద్ధరించడానికి CPU ఉపయోగించే మెమరీ ప్రాంతం. మైక్రోప్రాసెసర్ rcall/call/ecall/icall/eicall అనే కాల్ సూచనలలో ఒకదానిని ఎదుర్కొన్నప్పుడు, ప్రోగ్రామ్ మెమరీలోని తదుపరి పదం యొక్క చిరునామా హార్డ్వేర్ ద్వారా స్టాక్పైకి కాపీ చేయబడుతుంది. ret కమాండ్ సబ్ట్రౌటిన్ నుండి నిష్క్రమించినప్పుడు, రిటర్న్ చిరునామా స్టాక్ నుండి ప్రోగ్రామ్ కౌంటర్కు పునరుద్ధరించబడుతుంది. 128 మరియు 256 kwordల ప్రోగ్రామ్ మెమరీ సామర్థ్యం ఉన్న మోడల్లలో, స్టాక్లో PCని సేవ్ చేయడానికి 3 బైట్లు అవసరం, మిగతా వాటికి - 2 బైట్లు. ప్రతి బైట్ను నిల్వ చేసినప్పుడు, SP యొక్క కంటెంట్లు ఒకటి తగ్గుతాయి మరియు పునరుద్ధరించబడినప్పుడు, అవి తదనుగుణంగా పెంచబడతాయి. Fig.9 డేటా మెమరీలో స్టాక్ స్థానం ప్రోగ్రామర్ ప్రోగ్రామ్ ప్రారంభంలోనే స్టాక్ యొక్క స్థానాన్ని స్వతంత్రంగా నిర్ణయించాలి. దాని గరిష్ట లోతు యొక్క దృక్కోణం నుండి, అంజీర్ 9లో చూపిన విధంగా స్టాక్ యొక్క పైభాగాన్ని SRAM యొక్క చివరి భాగంలో ఉంచాలి: "m8def.inc" ldi టెంప్, తక్కువ(RAMEND) ;సెట్ SP = RAMEND అవుట్ SPL,temp ప్రామాణిక m8def.inc హెడర్ ఫైల్ నుండి RAMEND స్థిరాంకం చివరి SRAM సెల్ చిరునామా విలువను కలిగి ఉంటుంది. అప్లికేషన్ ప్రోగ్రామ్ వేరియబుల్స్ RBB మరియు ప్రస్తుత SP స్థానం మధ్య SRAM చిరునామా పరిధిలో ఉన్నాయి. అందువల్ల, ముందుగా గరిష్ట స్టాక్ పరిమాణాన్ని (స్టాక్ డెప్త్) అంచనా వేయడం చాలా ముఖ్యం. స్టాక్ యొక్క పైభాగం చాలా ఎక్కువగా పెరుగుతుంది మరియు వినియోగదారు డేటాను "ఓవర్రైట్" చేయడం ప్రారంభమవుతుంది మరియు ఇది గుర్తించడానికి చాలా కష్టమైన లోపాలలో ఒకటి! AVR స్టాక్, రిటర్న్ అడ్రస్లను నిల్వ చేయడంతో పాటు, మరొక ముఖ్యమైన ప్రయోజనం కూడా ఉంది. ఈ ప్రయోజనం కోసం ప్రత్యేకంగా రూపొందించిన పుష్ Rr (స్టాక్కు లోడ్ చేయండి) మరియు పాప్ Rd (స్టాక్ నుండి అన్లోడ్) ఆదేశాలను ఉపయోగించి ఏదైనా డేటాను సేవ్ చేయడానికి ఇది మిమ్మల్ని అనుమతిస్తుంది. పుష్ Rr అమలు చేయబడిన ప్రతిసారి, Rr యొక్క కంటెంట్లు స్టాక్పైకి కాపీ చేయబడతాయి, ఆ తర్వాత SP ఒకటి తగ్గుతుంది. పాప్ Rr అమలు చేయబడినప్పుడు, SP ద్వారా సూచించబడిన స్టాక్ సెల్ యొక్క కంటెంట్లు Rrకి పునరుద్ధరించబడతాయి మరియు SP విలువ కూడా పెరుగుతుంది. ఈ రకమైన స్టాక్లో లాస్ట్ ఇన్ ఫస్ట్ అవుట్ ఆర్గనైజేషన్ ఉంది: చివరి పుష్ కమాండ్ ద్వారా సేవ్ చేయబడిన రిజిస్టర్ మొదటి పాప్ కమాండ్ ద్వారా పునరుద్ధరించబడుతుంది: ; పుష్ కమాండ్ R16 తర్వాత SP స్టాక్ స్థాయి ;R16 0x045F R16ని సేవ్ చేయాలా? ? R17 పుష్ ;R17 0x045E R16 R17ని సేవ్ చేయాలా? R18 పుష్ ;R18 0x045D R16 R17 R18 ̣̣̣̣̣̣̣ పాప్ R18 సేవ్ ;R18 0x045D R16 R17 పునరుద్ధరించు ? పాప్ R17 ;R17 0x045E R16ని పునరుద్ధరించాలా? ? పాప్ R16 ;R16 0x045Fని పునరుద్ధరించాలా? ? ? స్టాక్ని ఉపయోగించి, మీరు రిజిస్టర్ల కంటెంట్లను చాలా సులభంగా మార్చుకోవచ్చు: ; మార్పిడి R16<->పుష్ కమాండ్ R16 తర్వాత R17 SP స్టాక్ స్థాయి ;R16 0x045F R16ని సేవ్ చేయాలా? R17 పుష్ ;R17 0x045E R16 R17 పాప్ R16 సేవ్ ;R16 0x045E R16 పునరుద్ధరించు ? పాప్ R17 ;R17 0x045Fని పునరుద్ధరించాలా? ? టోగుల్ సబ్ట్రౌటిన్లోకి ప్రవేశించేటప్పుడు మరియు నిష్క్రమించేటప్పుడు స్టాక్ను మార్చడం మరియు రిజిస్టర్ R17ని సేవ్ చేయడం మరియు పునరుద్ధరించడం వంటి దశల వారీ ప్రక్రియను చూపే చిన్న కోడ్ ముక్కను మూర్తి 10 చూపిస్తుంది. పుష్/పాప్ సూచనలు అవసరమయ్యే సాధారణ ఉదాహరణ ఇది. టోగుల్ సబ్రొటీన్ దాని అవసరాల కోసం R17 RONని ఉపయోగిస్తుంది, అయితే అదే రిజిస్టర్ను ప్రధాన ప్రోగ్రామ్ సమయంలో కూడా ఉపయోగించవచ్చు. అందువల్ల, డేటా అవినీతిని నివారించడానికి, R17 సవరించడానికి ముందు స్టాక్లోకి లోడ్ చేయబడుతుంది మరియు ret కమాండ్కు ముందు దాని నుండి పునరుద్ధరించబడుతుంది. ATmega8 మైక్రోకంట్రోలర్ యొక్క ప్రయోజనాల్లో ఒకటి దాని విస్తృత శ్రేణి విభిన్న అంతరాయాలు. అంతరాయం కలిగించుప్రధాన ప్రోగ్రామ్ యొక్క అమలు తాత్కాలికంగా నిలిపివేయబడిన సంఘటన మరియు ఒక నిర్దిష్ట రకం యొక్క అంతరాయాన్ని నిర్వహించే ఒక ఫంక్షన్ అంటారు. అంతరాయాలు అంతర్గత మరియు బాహ్యంగా విభజించబడ్డాయి. అంతర్గత అంతరాయాల మూలాలలో అంతర్నిర్మిత మైక్రోకంట్రోలర్ మాడ్యూల్స్ (టైమర్లు, USART ట్రాన్స్సీవర్ మొదలైనవి) ఉన్నాయి. బాహ్య సంకేతాలు మైక్రోకంట్రోలర్ పిన్ల వద్దకు వచ్చినప్పుడు బాహ్య అంతరాయాలు ఏర్పడతాయి (ఉదాహరణకు, రీసెట్ మరియు INT పిన్లలో సిగ్నల్లు). అంతరాయం సంభవించడానికి దారితీసే సంకేతాల స్వభావం నియంత్రణ రిజిస్టర్లో సెట్ చేయబడింది MCUCR, ప్రత్యేకించి బిట్స్లో - INT 0 ఇన్పుట్ కోసం ISC00 (బిట్ 0) మరియు ISC01 (బిట్ 1); INT1 ఇన్పుట్ కోసం ISC10 (bit2) మరియు ISC11 (bit3). ATmega8 మైక్రోకంట్రోలర్లో, ప్రతి అంతరాయానికి దాని స్వంత ఉంటుంది అంతరాయం వెక్టర్(ప్రోగ్రామ్ మెమరీ ప్రాంతం ప్రారంభంలో చిరునామా, దీనిలో పేర్కొన్న అంతరాయ రొటీన్కు జంపింగ్ కోసం కమాండ్ నిల్వ చేయబడుతుంది). మెగా8లో, అన్ని అంతరాయాలకు ఒకే ప్రాధాన్యత ఉంటుంది. అనేక అంతరాయాలు ఏకకాలంలో సంభవించినట్లయితే, తక్కువ వెక్టర్ సంఖ్యతో అంతరాయం ముందుగా ప్రాసెస్ చేయబడుతుంది. Atmega8లో అంతరాయం వెక్టర్స్ ATmega8లో అంతరాయాలను నిర్వహించడానికి 4 రిజిస్టర్లు బాధ్యత వహిస్తాయి: GIMSK(అకా GICR) - ఇన్పుట్ల INT0, INT1 వద్ద సిగ్నల్ల ఆధారంగా అంతరాయాలను నిషేధించండి/ప్రారంభించండి GIFR- అన్ని బాహ్య అంతరాయాల నిర్వహణ TIMSK, TIFR- టైమర్లు/కౌంటర్ల నుండి అంతరాయాల నిర్వహణ నమోదు చేసుకోండి GIMSK(GICR) INTFx=1: INTx ఇన్పుట్ వద్ద అంతరాయం ఏర్పడింది. అంతరాయ నిర్వహణ రొటీన్లోకి ప్రవేశించినప్పుడు, INTFx స్వయంచాలకంగా లాగ్ స్థితికి రీసెట్ చేయబడుతుంది. 0 నమోదు చేసుకోండి TIMSK TOIE1=1: T/C1 ఓవర్ఫ్లో అంతరాయం ప్రారంభించబడింది OCIE1A=1పోలిక రిజిస్టర్ A కౌంటర్ T/C1 ఎనేబుల్ చేయబడిన కంటెంట్లతో సరిపోలినప్పుడు అంతరాయం కలిగించండి OCIE1B=1: పోలిక రిజిస్టర్ B కౌంటర్ T/C1 ఎనేబుల్ చేయబడిన కంటెంట్లతో సరిపోలినప్పుడు అంతరాయం కలిగించండి TICIE=1: క్యాప్చర్ షరతు నెరవేరినప్పుడు అంతరాయం ప్రారంభించబడుతుంది TOIE0=1: T/C0 ఓవర్ఫ్లో అంతరాయం ప్రారంభించబడింది నమోదు చేసుకోండి TIFR TOV1=1: T/C1 ఓవర్ఫ్లో సంభవించింది OCF1A=1: పోలిక రిజిస్టర్ A కౌంటర్ T/C1 అనుమతించబడిన కంటెంట్లతో సమానంగా ఉంటుంది OCF1B=1: పోలిక రిజిస్టర్ B అనుమతించబడిన కౌంటర్ T/C1 కంటెంట్లతో సరిపోలుతుంది ICF=1: సంగ్రహ పరిస్థితులు కలుసుకున్నారు TOV0=1: T/C0 ఓవర్ఫ్లో సంభవించింది అంతరాయ నిర్వహణ సబ్రూటీన్లోకి ప్రవేశించేటప్పుడు, అంతరాయానికి సంబంధించిన TIFR రిజిస్టర్ ఫ్లాగ్ స్వయంచాలకంగా లాగ్ స్థితికి రీసెట్ చేయబడుతుంది. 0 SREG స్థితి రిజిస్టర్ (బిట్ 7 = 1)లో సాధారణ అంతరాయాలు ప్రారంభించబడినప్పుడు మాత్రమే అంతరాయాలు పని చేస్తాయి. అంతరాయం ఏర్పడినప్పుడు, ఈ బిట్ స్వయంచాలకంగా 0కి రీసెట్ చేయబడుతుంది, తదుపరి అంతరాయాలను నిలిపివేస్తుంది. ఈ ఉదాహరణలో, INT0 పిన్ పుల్-అప్ ఇన్పుట్ మోడ్లో ప్రారంభించబడింది. బటన్ను ఉపయోగించి పిన్ను భూమికి తగ్గించినప్పుడు, దానిపై లాజిక్ 0 సెట్ చేయబడుతుంది (సిగ్నల్ అంచు సరఫరా వోల్టేజ్ నుండి 0కి పడిపోతుంది) మరియు అంతరాయ హ్యాండ్లర్ ట్రిగ్గర్ చేయబడుతుంది, పోర్ట్ జీరో పిన్కి కనెక్ట్ చేయబడిన లైట్ బల్బ్ను ఆన్ చేస్తుంది. బి శూన్యం దీపంON() అంతరాయం శూన్యం ext_int0_isr(శూన్యం) DDRD.2=0; SREG|= (1 అయితే(1) ( కోడ్ విజన్ AVR (ఇంటరప్ట్ శూన్య ext_int0_isr(శూన్యం))లో అంతరాయ వెక్టర్స్ ఎలా సెట్ చేయబడిందో కూడా పై ఉదాహరణ చూపిస్తుంది. ఇతర సందర్భాల్లో కూడా అంతరాయ వెక్టర్స్ సెట్ చేయబడ్డాయి: EXT_INT0 2 ఈ రోజు మనం అంతరాయ భావన మరియు దానిని ఎలా ఉపయోగించాలో చూద్దాం. సహజంగానే, మేము శిక్షణా కార్యక్రమం లేకుండా చేయము, కానీ ఈసారి మేము LED లను బ్లింక్ చేయము. ఇప్పటికే బాగుంది. డోర్బెల్ లాంటిది తయారు చేద్దాం. విధి:బటన్ను నొక్కినప్పుడు మైక్రోకంట్రోలర్ బీప్ను విడుదల చేసేలా చేయండి. మేము పాత వర్క్స్పేస్లో రింగ్ ప్రాజెక్ట్ను సృష్టిస్తాము. మైక్రోకంట్రోలర్ రకాన్ని ఎంచుకోండి. హెడర్ ఫైల్లో నిర్వచించిన బిట్ పేర్ల వినియోగాన్ని అనుమతించండి అవుట్పుట్ ఫైల్ రకాన్ని మార్చండి. ప్రాజెక్ట్ మరియు కార్యస్థలాన్ని సేవ్ చేయండి. పరిస్థితిని ఊహించుకోండి. మీరు పనిలో కూర్చుని మరొక మైక్రోకంట్రోలర్ ప్రోగ్రామ్ను చూస్తున్నారు. బాస్ మీ వద్దకు వచ్చి ఇలా అంటాడు: “వినండి, పాష్, మేము మా డిపార్ట్మెంట్ కోసం ఓసిల్లోస్కోప్లను కొన్నాము - టెక్ట్రానిక్స్, ఫోర్-ఛానల్. వాటిని లాగడానికి వాస్యకు సహాయం చేయండి. మీరు ఇలా అనుకుంటారు: "సరే, నా, ఆలోచన దారిలోకి వచ్చింది... మరియు మీపై." మరియు బాస్ మిమ్మల్ని అలా చూస్తాడు, మరియు అతని కళ్ళు చాలా దయగా, చాలా దయగా ఉన్నాయి. మీరు అతనిని ఎలా తిరస్కరించగలరు? సరే, మీరు అన్నింటినీ వదిలివేసి, ఓసిల్లోస్కోప్లను కొనుగోలు చేయడానికి స్నేహితుడితో వెళ్లండి. వాళ్ళు తెచ్చారు. మేము నివేదించాము. మరియు వారు మళ్ళీ తమ కార్యక్రమానికి కూర్చున్నారు. ఇంటరప్ట్ మెకానిజం ఇలా కనిపిస్తుంది. చాలా సులభం, కానీ అనేక ప్రాథమిక అంశాలు ఉన్నాయి. రెండవది: ఇదంతా మైక్రోకంట్రోలర్లో జరిగే దానికి చాలా పోలి ఉంటుంది. AVR మైక్రోకంట్రోలర్లు మొత్తం పరిధీయ పరికరాలను కలిగి ఉంటాయి (టైమర్లు/కౌంటర్లు, అనలాగ్-టు-డిజిటల్ కన్వర్టర్, అనలాగ్ కంపారిటర్, అసమకాలిక ట్రాన్స్సీవర్... మొదలైనవి). మైక్రోకంట్రోలర్ యొక్క శక్తి ఏమిటంటే, ఈ పరికరాలన్నీ ఒకదానికొకటి సమాంతరంగా మరియు స్వతంత్రంగా పని చేయగలవు, అలాగే అమలు చేయబడిన ప్రోగ్రామ్కు సమాంతరంగా ఉంటాయి. ఒక నిర్దిష్ట సంఘటన జరిగినప్పుడు ప్రతి పరిధీయ పరికరం అంతరాయాన్ని ప్రేరేపిస్తుంది. ఇది ప్రారంభించబడితే మాత్రమే అంతరాయం ఏర్పడుతుంది. ప్రతి పరికరానికి విడిగా అంతరాయ ఎనేబుల్ సెట్ చేయబడింది. అదనంగా, అన్ని అంతరాయాలకు గ్లోబల్ ఎనేబుల్/డిసేబుల్ ఫ్లాగ్ ఉంది - ఇది SREG రిజిస్టర్లోని I ఫ్లాగ్. అంతరాయం సంభవించినప్పుడు, మైక్రోకంట్రోలర్ PC ప్రోగ్రామ్ కౌంటర్ యొక్క కంటెంట్లను స్టాక్లో నిల్వ చేస్తుంది, అంటే, అది అంతరాయం కలిగించిన స్థానాన్ని గుర్తుంచుకుంటుంది. ప్రోగ్రామ్ కౌంటర్లో సంబంధిత అంతరాయ వెక్టర్ చిరునామాను లోడ్ చేస్తుంది మరియు ఆ చిరునామాకు జంప్ చేస్తుంది. ఇది షరతులు లేని జంప్ కమాండ్ను తాకుతుంది, ఇది అంతరాయ ప్రాసెసింగ్ సబ్ట్రౌటిన్కి వెళుతుంది. I ఫ్లాగ్ని రీసెట్ చేయడం ద్వారా అంతరాయాలను నిలిపివేస్తుంది, సబ్ట్రౌటిన్ని అమలు చేస్తుంది. అంతరాయ నిర్వహణ దినచర్యను అమలు చేసిన తర్వాత, మైక్రోకంట్రోలర్ I ఫ్లాగ్ను సెట్ చేయడం ద్వారా అంతరాయాలను ప్రారంభిస్తుంది మరియు ప్రోగ్రామ్ కౌంటర్ యొక్క కంటెంట్లను పునరుద్ధరిస్తుంది, అంటే, ప్రోగ్రామ్లో అంతరాయం కలిగించిన అదే స్థానానికి తిరిగి వస్తుంది. సిద్ధాంతంలో, అంతరాయ హ్యాండ్లర్ మైక్రోకంట్రోలర్ రిజిస్టర్ల కంటెంట్లను పాడు చేయకూడదు, ఎందుకంటే అవి ఆ సమయంలో అమలు చేయబడిన ప్రోగ్రామ్ నుండి డేటాను కలిగి ఉండవచ్చు. ఇది చేయుటకు, అంతరాయ నిర్వహణ సబ్ట్రౌటిన్ ప్రారంభంలో, మైక్రోకంట్రోలర్ రిజిస్టర్ల యొక్క కంటెంట్లు స్టాక్లో నిల్వ చేయబడతాయి మరియు సబ్ట్రౌటిన్ చివరిలో అవి పునరుద్ధరించబడతాయి. అందువలన, అంతరాయాన్ని నిష్క్రమించిన తర్వాత, మైక్రోకంట్రోలర్ ఏమీ జరగనట్లుగా ప్రోగ్రామ్ను అమలు చేయడాన్ని కొనసాగించగలదు. అసెంబ్లర్లో ప్రోగ్రామింగ్ చేస్తున్నప్పుడు, ప్రోగ్రామర్ స్వయంగా సిలో రిజిస్టర్ సేవింగ్ను సూచిస్తాడు, ఇది కంపైలర్ ద్వారా జరుగుతుంది. ఇప్పుడు టైమర్ గురించి మాట్లాడుకుందాం. ATmega8535 బోర్డులో మూడు టైమర్లు/కౌంటర్లు ఉన్నాయి - రెండు ఎనిమిది-బిట్ (T0, T2) మరియు ఒక పదహారు-బిట్ (T1). మేము ఎనిమిది-బిట్ టైమర్/కౌంటర్ T0ని ఉపయోగిస్తాము. ఈ టైమర్ మూడు రిజిస్టర్లను కలిగి ఉంటుంది - కంట్రోల్ రిజిస్టర్ TCCR0, కౌంటింగ్ రిజిస్టర్ TCNT0 మరియు కంపారిజన్ రిజిస్టర్ OCR0. టైమర్ ప్రారంభించబడినప్పుడు, కౌంటర్ రిజిస్టర్ TCNT0 ప్రతి గడియారపు అంచుకు దాని విలువను ఒకటి చొప్పున పెంచుతుంది. కంట్రోల్ రిజిస్టర్ TCCR0లోని అనేక సాధ్యమైన విలువల నుండి క్లాక్ ఫ్రీక్వెన్సీ ఎంపిక చేయబడింది. అలాగే, ఈ రిజిస్టర్ ఉపయోగించి, టైమర్ యొక్క ఆపరేటింగ్ మోడ్ సెట్ చేయబడింది. టైమర్ T0 “ఓవర్ఫ్లో” ఈవెంట్ సంభవించినప్పుడు అంతరాయాన్ని కలిగిస్తుంది - ఇది కౌంటింగ్ రిజిస్టర్ TCNT0 ఓవర్ఫ్లో అయినప్పుడు మరియు “యాదృచ్చికం” ఈవెంట్ సంభవించినప్పుడు - ఇది కౌంటింగ్ రిజిస్టర్ TCNT0 విలువకు సమానం అయినప్పుడు పోలిక రిజిస్టర్ OCR0 విలువ. ఈ అంతరాయాలను ప్రారంభించే ఫ్లాగ్లు TIMSK రిజిస్టర్లో ఉన్నాయి. ఇప్పుడు ప్రోగ్రామ్ గురించి. లైన్ ద్వారా ప్రోగ్రామ్ను వ్రాయడం ఇకపై సాధ్యం కాదు, కాబట్టి నేను వెంటనే దాని వచనాన్ని ఇస్తాను. క్రింద మేము దాని అన్ని పంక్తులను ఒక్కొక్కటిగా విశ్లేషిస్తాము మరియు ప్రతిదీ స్పష్టమవుతుంది. నేను ఉద్దేశపూర్వకంగా మాక్రోలను ఉపయోగించలేదు; intప్రధాన ( శూన్యం
) //టైమర్ T0ని సెటప్ చేయండి //అంతరాయాలను ప్రారంభించండి //ప్రధాన ప్రోగ్రామ్ లూప్ - బటన్ను పోలింగ్ చేయడం //టైమర్ T0 కోసం అంతరాయ హ్యాండ్లర్ పోర్ట్ సెట్టింగులు మా సర్క్యూట్లో, ఒక బటన్ మరియు పైజో స్పీకర్ పోర్ట్ Dకి కనెక్ట్ చేయబడ్డాయి. బటన్ కనెక్ట్ చేయబడిన పిన్ తప్పనిసరిగా ఇన్పుట్గా కాన్ఫిగర్ చేయబడాలి మరియు పుల్-అప్ రెసిస్టర్ను తప్పనిసరిగా ఆన్ చేయాలి. పియెజో స్పీకర్ కనెక్ట్ చేయబడిన పిన్ తప్పనిసరిగా అవుట్పుట్కి సెట్ చేయబడాలి. DDRD = (0< టైమర్ని సెట్ చేస్తోంది T0 టైమర్ ఆపరేటింగ్ మోడ్ CTC (యాదృచ్ఛికంగా రీసెట్ చేయబడింది), క్లాక్ సిగ్నల్ clk/8. మేము దీనిని TCCR0 రిజిస్టర్లో ప్రతిబింబిస్తాము TCCR0 = (1< ఒకవేళ, మేము కౌంటింగ్ రిజిస్టర్ TCNT0ని రీసెట్ చేస్తాము పోలిక రిజిస్టర్ OCR0కి 0xc8 అని వ్రాయండి. ఎందుకు? ఎందుకంటే నేను దానిని లెక్కించాను కాలిక్యులేటర్. బాగా, కాగితంపై ఈ గణన ఇలా కనిపిస్తుంది. T0 టైమర్ యొక్క వివరణాత్మక వివరణ కోసం, ATMega8535 కోసం డాక్యుమెంటేషన్ చూడండి. మేము టైమర్ను కాన్ఫిగర్ చేసాము మరియు అంతర్నిర్మిత ఫంక్షన్ని ఉపయోగించి సాధారణ అంతరాయాన్ని ప్రారంభించాము. __enable_interrupt();
పోల్ బటన్ బటన్ను నొక్కినప్పుడు, మైక్రోకంట్రోలర్ అవుట్పుట్ అంతర్గత పుల్-అప్ రెసిస్టర్ ద్వారా పవర్కి కనెక్ట్ చేయబడింది, అనగా, బటన్ను నొక్కినప్పుడు అవుట్పుట్లో ఒకటి ఉంటుంది, అవుట్పుట్ భూమికి తగ్గించబడుతుంది, అంటే అవుట్పుట్లో సున్నా. బటన్ నొక్కబడిందో లేదో తెలుసుకోవడానికి, మీరు PIND రిజిస్టర్లోని కంటెంట్లను చదవాలి మరియు జీరో బిట్ విలువను తనిఖీ చేయాలి (ఒక బటన్ PD0కి కనెక్ట్ చేయబడింది). మేము అంతులేని లూప్లో బటన్ను పోల్ చేస్తాము. అయితే
(1) మర్చిపోవద్దు == అసైన్మెంట్ ఆపరేటర్ కాదు =. హ్యాండ్లింగ్ బటన్ ప్రెస్/విడుదల బటన్ను నొక్కడం ద్వారా మేము టైమర్ T0 యొక్క అంతరాయాన్ని ప్రారంభిస్తాము మరియు దానిని విడుదల చేయడం ద్వారా మేము దానిని నిలిపివేస్తాము. దీన్ని చేయడానికి, మేము TIMSK రిజిస్టర్ యొక్క OCIE0 బిట్ను తారుమారు చేస్తాము TIMSK = (1< TIMSK = 0; //అంతరాయాన్ని నిలిపివేయండి మేము ఒకే టైమర్ని ఉపయోగిస్తున్నందున, వ్యక్తిగత బిట్లను సెట్ చేయడం లేదా రీసెట్ చేయడం అవసరం లేదు. అంతరాయ ఫంక్షన్ #pragma vector= డైరెక్టివ్ మరియు ఫంక్షన్ వర్డ్ ఉపయోగించి పేర్కొనబడింది __అంతరాయం.ఫంక్షన్ తప్పనిసరిగా శూన్యంగా ఉండాలి మరియు ఏ పారామితులను తీసుకోకూడదు. #pragma vector = చిరునామా పేరు- ఫంక్షన్ పేరు, మా అభీష్టానుసారం ఎంచుకోండి మా పని కోసం, అంతరాయ హ్యాండ్లర్ ఫంక్షన్ ఇలా కనిపిస్తుంది #ప్రాగ్మా వెక్టర్ = TIMER0_COMP_vect సరే, అంతే. ప్రతిదీ స్పష్టంగా ఉందని నేను ఆశిస్తున్నాను. avr atmegaలో బాహ్య అంతరాయాలను ప్రారంభించండి
AVR atmegaలో బాహ్య అంతరాయాలను ఉపయోగించే ఉదాహరణ
#చేర్చండి
దాదాపు అన్ని AVR మైక్రోకంట్రోలర్లు SRAMలో స్టాక్ను కలిగి ఉంటాయి. ప్రస్తుత మూలకాన్ని (స్టాక్ పైన) పరిష్కరించడానికి, స్టాక్ పాయింటర్ SP (స్టాక్ పాయింటర్) ఉపయోగించబడుతుంది. ఇది 256 బైట్ల వరకు డేటా మెమరీ సామర్థ్యం కలిగిన మోడల్ల కోసం ఒక-బైట్ RVV SPL లేదా రెండు-బైట్ SPH:SPL (SPH - హై బైట్, SPL - తక్కువ బైట్).
అత్తి 10 స్టాక్ ఆపరేషన్ యొక్క ఉదాహరణచిరునామా
అంతరాయం మూలం
వివరణ
0x0000
రీసెట్ చేయండి
సిగ్నల్ రీసెట్ చేయండి
0x0001
INT0
INT0 ఇన్పుట్ వద్ద బాహ్య అంతరాయ అభ్యర్థన
0x0002
INT1
INT1 ఇన్పుట్ వద్ద బాహ్య అంతరాయ అభ్యర్థన
0x0003
T/C1
టైమర్ క్యాప్చర్ T/C1
0x0004
T/C1
T/C1 టైమర్ సరిపోల్చండి రిజిస్టర్ A
0x0005
T/C1
టైమర్ T/C1 యొక్క కంపేర్ రిజిస్టర్ Bతో సరిపోల్చండి
0x0006
T/C1
T/C1 కౌంటర్ ఓవర్ఫ్లో
0x0007
T/C0
T/C0 కౌంటర్ ఓవర్ఫ్లో
0x0008
SPI
SPI డేటా బదిలీ పూర్తయింది
0x0009
UART
UART ట్రాన్స్సీవర్ డేటాను స్వీకరించడం పూర్తి చేసింది.
0x000A
UART
UART డేటా రిజిస్టర్ ఖాళీగా ఉంది
0x000B
UART
UART ట్రాన్స్సీవర్ ద్వారా డేటా ట్రాన్స్మిషన్ పూర్తయింది
0x000C
ANA_COMP
అనలాగ్ కంపారిటర్ నుండి అంతరాయం
నిర్వహణకు అంతరాయం కలిగించండి
7
6
5
4
3
2
1
0
TOIE1
OCIE1A
OCIE1B
-
TICIE
-
TOIE0
-
7
6
5
4
3
2
1
0
TOV1
OCF1A
OCF1B
-
ICF1
-
TOV0
-
{
PORTB.0=1;
DDRB.0=1;
}
{
lampON ();
}
PORTD.2=1;
EXT_INT1 3
TIM2_COMP 4
TIM2_OVF 5
TIM1_CAPT 6
TIM1_COMPA 7
TIM1_COMPB 8
TIM1_OVF 9
TIM0_OVF 10
SPI_STC 11
USART_RXC 12
USART_DRE 13
USART_TXC 14
ADC_INT 15
EE_RDY 16
ANA_COMP 17
TWI 18
SPM_READY 19
మా ఉదాహరణ కోసం రేఖాచిత్రం. ప్రాజెక్ట్ ఫైల్స్.
విడుదల కాన్ఫిగరేషన్ కోసం ప్రాజెక్ట్ సెట్టింగ్లను సెట్ చేయండి:
సాధారణ ఎంపికలు > టార్గెట్ > ప్రాసెసర్ కాన్ఫిగరేషన్
నా దగ్గర ఈ ATmega8535 ఉంది.
సాధారణ ఎంపికలు > సిస్టమ్లో, I/O-Include ఫైల్లలో బిట్ నిర్వచనాలను ప్రారంభించు పెట్టెను ఎంచుకోండి
మేము ఇప్పటివరకు బిట్ పేర్లను ఉపయోగించలేదు, కానీ ఈ రోజు మనకు అవి అవసరం.
లింకర్ > అవుట్పుట్.
అవుట్పుట్ ఫైల్ ఫీల్డ్లో, ఓవర్రైడ్ డిఫాల్ట్ బాక్స్ను చెక్ చేసి, d90 ఎక్స్టెన్షన్ను హెక్స్తో భర్తీ చేయండి
ఫార్మాట్ ఫీల్డ్లో, ఇతర ఎంపికను ఎంచుకోండి మరియు అవుట్పుట్ ఫార్మాట్ డ్రాప్-డౌన్ మెనులో, ఫైల్ రకాన్ని ఇంటెల్-స్టాండర్ట్ ఎంచుకోండి______________________________ అంతరాయం ___________________________
ముందుగా:
- మీరు మీ పని చేసారు
- అదే సమయంలో, ఎవరో ఓసిల్లోస్కోప్లను కొనుగోలు చేస్తున్నారు
- "కొనుగోలు చేసిన ఓసిల్లోస్కోప్లు" ఈవెంట్ సంభవించినప్పుడు - మీరు మీ పనికి అంతరాయం కలిగిస్తారు
- కొంత కాలంగా మీరు వేరే పని చేస్తున్నారు - ఒస్సిల్లోస్కోప్లను మోస్తున్నారు
- తర్వాత మీరు మీ కార్యాలయానికి తిరిగి వెళ్లి, మీరు ఎక్కడి నుండి అక్కడే మీ పనిని కొనసాగించండి
- మీరు మీ యజమానిని సులభంగా పంపవచ్చు మరియు ఎక్కడికీ వెళ్లకూడదు
- ఒస్సిల్లోస్కోప్ల కోసం బయలుదేరిన తర్వాత, మీరు అక్కడ ఎక్కువసేపు ఉండవచ్చు లేదా తిరిగి రాకపోవచ్చు
- మీరు మీ కార్యాలయానికి తిరిగి వచ్చినప్పుడు, మీరు ఇప్పటికే మీ అద్భుతమైన ఆలోచనలను మరచిపోయి ఉండవచ్చు_______________________________________________________________
మేము 5 kHz వద్ద "మ్యాచ్" ఈవెంట్ అంతరాయాన్ని ట్రిగ్గర్ చేయడానికి T0 టైమర్/కౌంటర్ని కాన్ఫిగర్ చేస్తాము. హ్యాండ్లర్ ఫంక్షన్లో మనం పైజో స్పీకర్ కనెక్ట్ చేయబడిన మైక్రోకంట్రోలర్ అవుట్పుట్ స్థితిని విలోమం చేస్తాము. అందువలన, పియెజో సౌండ్ ఫ్రీక్వెన్సీ 2.5 kHzకి సమానంగా ఉంటుంది. (ఇది కనెక్ట్ చేయబడిన పైజోస్పీకర్! దీనిని కంగారు పెట్టవద్దు. పైజోస్పీకర్ యొక్క ప్రతిఘటన ఫ్రీక్వెన్సీపై ఆధారపడి ఉంటుంది మరియు 2.5 KHz వద్ద ఇది సాధారణంగా Com యూనిట్లు, కాబట్టి ఇది పరిమితి నిరోధకం లేకుండా నేరుగా మైక్రోకంట్రోలర్ అవుట్పుట్కు కనెక్ట్ చేయబడుతుంది) .
{
//I/O పోర్ట్లను సెటప్ చేయండి
DDRD = (0<
TCCR0 = (1<
OCR0 = 0xc8;
__enable_interrupt();
అయితే(1){
ఉంటే((PIND & (1<
TIMSK = 0;
}
తిరిగి
0;
}
__అంతరాయం శూన్యం
Timer0CompVect( శూన్యం)
{
PORTD ^= (1<
మైక్రోకంట్రోలర్ క్లాక్ ఫ్రీక్వెన్సీ 8 MHz
టైమర్ క్లాక్ సిగ్నల్ 8000000 Hz/8 = 1000000 Hz.
ఒక టైమర్ గడియారం సమయం 1/1000000 = 1 µs
మనకు అవసరమైన ఫ్రీక్వెన్సీ యొక్క ఒక చక్రం యొక్క సమయం 1/5000 Hz = 200 μs
200 µsకి ఎన్ని టైమర్ టిక్లు సరిపోతాయి? 200/1 = 200 టిక్లు
హెక్సాడెసిమల్లో 200 = 0xс8
{
ఉంటే((PIND & (1<
}
లేకపోతే
{
//లేకపోతే చేపలా మౌనంగా ఉండు
}
}
అంతరాయం ఫంక్షన్_____________________ అంతరాయం ఫంక్షన్ సింటాక్స్ _____________________
__అంతరాయం
శూన్యంపేరు( శూన్యం)
{
//మా కోడ్ ఇక్కడ ఉంది
}
చిరునామా- అంతరాయ వెక్టర్ చిరునామా, సంఖ్య ద్వారా లేదా మైక్రోకంట్రోలర్ హెడర్ ఫైల్లో నిర్వచించబడిన పేర్ల ద్వారా పేర్కొనవచ్చు (iom8535.h – అంతరాయ వెక్టర్ నిర్వచనాల విభాగం)______________________________________________________________
__అంతరాయం శూన్యం
Timer0CompVect( శూన్యం)
{
PORTD ^= (1<
}
తర్వాతి ఆర్టికల్లో మైక్రోకంట్రోలర్ని శ్రావ్యంగా ప్లే చేస్తాం.
విజయవంతం కాని పదానికి అర్థం
Samsung Galaxy A7 (2017) యొక్క సమీక్ష: నీటికి భయపడవద్దు మరియు ఆదా చేయడం samsung a7ని కొనుగోలు చేయడం విలువైనదేనా
ఆండ్రాయిడ్లో ఫర్మ్వేర్ బ్యాకప్ చేయడం
స్వాప్ ఫైల్ను ఎలా కాన్ఫిగర్ చేయాలి?
విండోస్లో అనుకూలత మోడ్ని సెట్ చేస్తోంది