- మనకు ఆలస్యం () ఉన్నప్పుడు టైమర్ ఎందుకు?
- పిఐసి మైక్రోకంట్రోలర్ టైమర్స్:
- ప్రోగ్రామింగ్ మరియు వర్కింగ్ వివరణ:
- సర్క్యూట్ రేఖాచిత్రం మరియు ప్రోటీస్ అనుకరణ:
ఇది మా PIC ట్యుటోరియల్ సిరీస్లోని ఐదవ ట్యుటోరియల్ అవుతుంది, ఇది PIC16F877A లో టైమర్లను తెలుసుకోవడానికి మరియు ఉపయోగించడానికి మీకు సహాయపడుతుంది. మా మునుపటి ట్యుటోరియల్లో, మేము PIC మరియు MPLABX IDE పరిచయంతో ప్రారంభించాము, ఆపై PIC ని ఉపయోగించి LED ని రెప్పపాటు చేయడానికి మా మొదటి PIC ప్రోగ్రామ్ను వ్రాసాము మరియు PIC మైక్రోకంట్రోలర్లో ఆలస్యం ఫంక్షన్ను ఉపయోగించి LED బ్లింక్ సీక్వెన్స్ చేసాము. మునుపటి ట్యుటోరియల్ హార్డ్వేర్లో మనం ఉపయోగించిన అదే ఎల్ఇడి బ్లింకింగ్ సీక్వెన్స్ను ఇప్పుడు ఉపయోగిద్దాం మరియు దీనితో మన పిఐసి ఎంసియులో టైమర్లను ఎలా ఉపయోగించాలో నేర్చుకుంటాము. ఈ ట్యుటోరియల్ కోసం ఎల్ఈడీ బోర్డులో మరో బటన్ను చేర్చుకున్నాము. మరింత తెలుసుకోవడానికి ట్యుటోరియల్ ద్వారా వెళ్ళండి.
ఎంబెడెడ్ ప్రోగ్రామర్కు టైమర్లు ముఖ్యమైన వర్క్హార్స్లలో ఒకటి. మేము రూపకల్పన చేసే ప్రతి అనువర్తనం ఏదో ఒక నిర్దిష్ట సమయ వ్యవధి తర్వాత ఏదైనా ఆన్ లేదా ఆఫ్ చేయడం వంటి టైమింగ్ అప్లికేషన్ను కలిగి ఉంటుంది. సరే, కానీ మనకు ఇప్పటికే ఆలస్యం మాక్రోలు (__delay_ms ()) అదే పని చేస్తున్నప్పుడు టైమర్లు ఎందుకు అవసరం !!
మనకు ఆలస్యం () ఉన్నప్పుడు టైమర్ ఎందుకు?
ఆలస్యం స్థూలతను "డంప్" ఆలస్యం అంటారు. ఎందుకంటే ఆలస్యం ఫంక్షన్ అమలు సమయంలో MCU ఆలస్యాన్ని సృష్టించడం ద్వారా డంప్లో కూర్చుంటుంది. ఈ ప్రక్రియలో MCU దాని ADC విలువలను వినదు లేదా దాని రిజిస్టర్ల నుండి ఏదైనా చదవదు. అందువల్ల సమయం ఆలస్యం ఖచ్చితమైనది లేదా ఎక్కువ కాలం ఉండవలసిన అవసరం లేని చోట LED బ్లింక్ వంటి అనువర్తనాలు మినహా ఆలస్యం ఫంక్షన్లను ఉపయోగించడం మంచిది కాదు.
ఆలస్యం మాక్రోస్ కింది చిన్న రాకడలను కలిగి ఉంది,
- ఆలస్యం యొక్క విలువ ఆలస్యం మాక్రోలకు స్థిరంగా ఉండాలి; ప్రోగ్రామ్ అమలు సమయంలో దీన్ని మార్చలేరు. అందువల్ల ఇది ప్రోగ్రామర్ నిర్వచించబడింది.
- టైమర్లను ఉపయోగించడంతో పోలిస్తే ఆలస్యం ఖచ్చితమైనది కాదు.
- మాక్రోలను ఉపయోగించి ఆలస్యం యొక్క పెద్ద విలువలు సృష్టించబడవు, ఉదాహరణకు ఆలస్యం మాక్రోల ద్వారా అరగంట ఆలస్యం సృష్టించబడదు. ఉపయోగించగల గరిష్ట ఆలస్యం క్రిస్టల్ ఓసిలేటర్ ఆధారంగా ఉంటుంది.
పిఐసి మైక్రోకంట్రోలర్ టైమర్స్:
భౌతికంగా, టైమర్ అనేది ఒక రిజిస్టర్, దీని విలువ నిరంతరం 255 కి పెరుగుతుంది, ఆపై అది మళ్లీ మొదలవుతుంది: 0, 1, 2, 3, 4… 255…. 0, 1, 2, 3…… మొదలైనవి.
PIC16F877A PIC MCU మూడు టైమర్ గుణకాలు కలిగి. అవి టైమర్ 0, టైమర్ 1 మరియు టైమర్ 2 అని పేర్లు. టైమర్ 0 మరియు టైమర్ 2 8-బిట్ టైమర్లు మరియు టైమర్ 1 16-బిట్ టైమర్. ఈ ట్యుటోరియల్లో మేము మా అప్లికేషన్ కోసం టైమర్ 0 ని ఉపయోగిస్తాము. మేము టైమర్ 0 ను అర్థం చేసుకున్న తర్వాత టైమర్ 1 మరియు టైమర్ 2 లలో కూడా పని చేయడం సులభం అవుతుంది.
టైమర్ 0 మాడ్యూల్ టైమర్ / కౌంటర్ కింది లక్షణాలను కలిగి ఉంది:
- 8-బిట్ టైమర్ / కౌంటర్
- చదవగలిగే మరియు వ్రాయగల
- 8-బిట్ సాఫ్ట్వేర్ ప్రోగ్రామబుల్ ప్రీస్కాలర్
- అంతర్గత లేదా బాహ్య గడియారం ఎంచుకోండి
- FFh నుండి 00h వరకు ఓవర్ఫ్లో అంతరాయం
- బాహ్య గడియారం కోసం ఎడ్జ్ ఎంచుకోండి
టైమర్ను ఉపయోగించడం ప్రారంభించడానికి మేము 8-బిట్ / 16-బిట్ టైమర్, ప్రెస్కాలర్, టైమర్ అంతరాయాలు మరియు ఫోక్స్ వంటి కొన్ని ఫాన్సీ పదాలను అర్థం చేసుకోవాలి. ఇప్పుడు, ప్రతి ఒక్కరికి నిజంగా అర్థం ఏమిటో చూద్దాం. ఇంతకుముందు చెప్పినట్లుగా, మా పిఐసి ఎంసియులో 8-బిట్ మరియు 16-బిట్ టైమర్లు రెండూ ఉన్నాయి, వాటి మధ్య ఉన్న ప్రధాన వ్యత్యాసం ఏమిటంటే, 16-బిట్ టైమర్ 8-బిట్ టైమర్ కంటే మెరుగైన రిజల్యూషన్ కలిగి ఉంది.
ప్రెస్కాలర్ అనేది మైక్రోకంట్రోలర్ యొక్క భాగానికి ఒక పేరు, ఇది టైమర్ స్థితిని పెంచే తర్కానికి చేరుకోవడానికి ముందు ఓసిలేటర్ గడియారాన్ని విభజిస్తుంది. ప్రీస్కాలర్ ఐడి యొక్క పరిధి 1 నుండి 256 వరకు ఉంటుంది మరియు ప్రెస్కాలర్ యొక్క విలువను ఆప్షన్ రిజిస్టర్ ఉపయోగించి సెట్ చేయవచ్చు (పుల్ అప్ రెసిస్టర్ల కోసం మేము ఉపయోగించినది అదే). ఉదాహరణకు ప్రీస్కాలర్ విలువ 64 అయితే, ప్రతి 64 వ పల్స్ కోసం టైమర్ 1 పెరుగుతుంది.
టైమర్ పెరుగుతున్నప్పుడు మరియు అది దాని గరిష్ట విలువ 255 కి చేరుకున్నప్పుడు, ఇది అంతరాయాన్ని ప్రేరేపిస్తుంది మరియు మళ్లీ 0 కి తిరిగి ప్రారంభిస్తుంది. ఈ అంతరాయాన్ని టైమర్ అంతరాయం అంటారు. ఈ అంతరాయం MCU కి ఈ నిర్దిష్ట సమయం ముగిసిందని తెలియజేస్తుంది.
Fosc ఓసిలేటర్ యొక్క ఫ్రీక్వెన్సీ ఉన్నచో, దానిని ఉపయోగించలేదు క్రిస్టల్ యొక్క ఫ్రీక్వెన్సీ. టైమర్ రిజిస్టర్ కోసం తీసుకున్న సమయం ప్రెస్కాలర్ విలువ మరియు ఫాస్క్ విలువపై ఆధారపడి ఉంటుంది.
ప్రోగ్రామింగ్ మరియు వర్కింగ్ వివరణ:
ఈ ట్యుటోరియల్లో మనం రెండు బటన్లను రెండు ఇన్పుట్లుగా, 8 ఎల్ఈడీని 8 అవుట్పుట్లుగా సెట్ చేస్తాం. మొదటి బటన్ సమయం ఆలస్యాన్ని సెట్ చేయడానికి ఉపయోగించబడుతుంది (ప్రతి పుష్కి 500 మీటర్లు) మరియు రెండవ బటన్ టైమర్ సీక్వెన్స్ బ్లింక్ ప్రారంభించడానికి ఉపయోగించబడుతుంది. ఉదాహరణకు, మొదటి బటన్ను మూడుసార్లు నొక్కితే (500 * 3 = 1500 మీ) ఆలస్యం 1.5 సెకన్ల కోసం సెట్ చేయబడుతుంది మరియు బటన్ రెండు నొక్కినప్పుడు ప్రతి ఎల్ఇడి ముందే నిర్వచించిన సమయ ఆలస్యం తో ఆన్ మరియు ఆఫ్ అవుతుంది. ఈ ట్యుటోరియల్ చివరిలో ప్రదర్శన వీడియోను తనిఖీ చేయండి.
ఇప్పుడు, ఈ ప్రాథమికాలను దృష్టిలో పెట్టుకుని కోడ్ విభాగంలో చివరిలో ఇచ్చిన మా ప్రోగ్రామ్ను చూద్దాం.
మీరు ప్రోగ్రామ్ పొందకపోతే ఫర్వాలేదు, కానీ మీరు చేస్తే !! మీకు మీరే కుకీ ఇవ్వండి మరియు మీ అవుట్పుట్ను ఆస్వాదించడానికి ప్రోగ్రామ్ను డంప్ చేయండి. ఇతరుల కోసం నేను ప్రోగ్రామ్ను అర్ధవంతమైన భాగాలుగా విడదీసి ప్రతి బ్లాక్లో ఏమి జరుగుతుందో మీకు వివరిస్తాను.
కోడ్ యొక్క మొదటి కొన్ని పంక్తులు కాన్ఫిగరేషన్ సెట్టింగులు మరియు హెడర్ ఫైల్స్, నేను ఇంతకుముందు నా మునుపటి ట్యుటోరియల్లో చేసినందున నేను దీనిని వివరించబోతున్నాను.
తరువాత, అన్ని పంక్తులను దాటవేసి, శూన్యమైన ప్రధాన ఫంక్షన్లోకి నేరుగా దూకుదాం, దాని లోపల టైమర్ 0 కొరకు పోర్ట్ కాన్ఫిగరేషన్ ఉంది.
void main () {/ ***** టైమర్ కోసం పోర్ట్ కాన్ఫిగరేషన్ ****** / OPTION_REG = 0b00000101; // బాహ్య ఫ్రీక్తో టైమర్ 0 మరియు ప్రెస్కాలర్గా 64 / PULL UP లను కూడా ప్రారంభిస్తుంది TMR0 = 100; // 0.0019968 లకు సమయ విలువను లోడ్ చేయండి; delayValue 0-256 మధ్య ఉంటుంది TMR0IE = 1; // PIE1 రిజిస్టర్ GIE = 1 లో టైమర్ అంతరాయ బిట్ను ప్రారంభించండి; // గ్లోబల్ ఇంటరప్ట్ PEIE = 1 ను ప్రారంభించండి; // పరిధీయ అంతరాయాన్ని ప్రారంభించండి / *********** ______ *********** /
దీన్ని అర్థం చేసుకోవడానికి మన పిఐసి డేటాషీట్లోని ఆప్షన్ రిజిస్టర్ను చూడాలి.
మునుపటి ట్యుటోరియల్లో చర్చించినట్లుగా, PORTB కోసం బలహీనమైన పుల్ అప్ రెసిస్టర్ను ప్రారంభించడానికి బిట్ 7 ఉపయోగించబడుతుంది. పై బొమ్మను చూడండి, బిట్ 3 MCU కి సూచించడానికి 0 గా తయారు చేయబడింది, ఇది సెట్ చేయబడుతున్న కింది ప్రీస్కాలర్ టైమర్ కోసం ఉపయోగించబడాలి మరియు వాచ్డాగ్ టైమర్ (WDT) కోసం కాదు. బిట్ 5 టి 0 సిఎస్ క్లియర్ చేయడం ద్వారా టైమర్ మోడ్ ఎంపిక చేయబడింది
(OPTION_REG <5>)
ఇప్పుడు, bits2-0 టైమర్ కోసం prescaler విలువ సెట్ ఉపయోగిస్తారు. 64 యొక్క ప్రీస్కాలర్ విలువను సెట్ చేయడానికి పై పట్టికలో చూపినట్లుగా, బిట్స్ తప్పనిసరిగా 101 గా సెట్ చేయాలి.
తరువాత, టైమర్ 0 తో అనుబంధించబడిన రిజిస్టర్లను పరిశీలిద్దాం
టైమర్ సెట్ చేసిన తర్వాత పెరుగుదల మరియు 256 విలువను చేరుకున్న తర్వాత ఓవర్ఫ్లో ప్రారంభమవుతుంది, ఈ సమయంలో టైమర్ అంతరాయాన్ని ప్రారంభించడానికి TMR0IE రిజిస్టర్ అధికంగా సెట్ చేయాలి. టైమర్ 0 కూడా ఒక పరిధీయమైనందున, మేము PEIE = 1 ను తయారు చేయడం ద్వారా పరిధీయ అంతరాయాన్ని ప్రారంభించాలి. చివరగా మేము గ్లోబల్ ఇంటరప్ట్ను ప్రారంభించాలి, తద్వారా ఏదైనా ఆపరేషన్ సమయంలో MCU అంతరాయం గురించి తెలియజేయబడుతుంది, ఇది GIE = 1 చేయడం ద్వారా జరుగుతుంది .
ఆలస్యం = ((256-REG_val) * (ప్రెస్కాల్ * 4)) / ఫోస్క్
ఆలస్యం యొక్క విలువను లెక్కించడానికి పై సూత్రం ఉపయోగించబడుతుంది.
ఎక్కడ
REG_val = 100;
ప్రెస్కాల్ = 64
ఫోస్క్ = 20000000
ఇది గణనపై ఇస్తుంది, ఆలస్యం = 0.0019968 సె
తదుపరి పంక్తుల సెట్ I / O పోర్టులను సెట్ చేయడం.
/ ***** I / O కొరకు పోర్ట్ కాన్ఫిగరేషన్ ****** / TRISB0 = 1; // PORTB పిన్ 0 బటన్ 1 కోసం ఇన్పుట్గా ఉపయోగించబడుతుందని MCU కి సూచించండి. TRISB1 = 1; // PORTB పిన్ 1 బటన్ 1 కోసం ఇన్పుట్గా ఉపయోగించబడుతుందని MCU కి సూచించండి. TRISD = 0x00; // PORT D లోని అన్ని పిన్లు అవుట్పుట్ PORTD = 0x00 అని MCU కి సూచించండి; // అన్ని పిన్లను 0 / *********** ______ *********** / కు ప్రారంభించండి
మేము అదే హార్డ్వేర్ను ఉపయోగిస్తున్నందున ఇది మా మునుపటి ట్యుటోరియల్ మాదిరిగానే ఉంటుంది. మేము మరొక బటన్ను ఇన్పుట్గా జోడించాము తప్ప. ఇది TRISB1 = 1 లైన్ ద్వారా జరుగుతుంది .
తరువాత, లోపల అనంతం బయటకు అయితే మేము కోడ్ యొక్క రెండు బ్లాక్లు లూప్. ఒకటి యూజర్ నుండి టైమర్ ఇన్పుట్ పొందడానికి మరియు మరొకటి LED లపై ఆలస్యం యొక్క క్రమాన్ని అమలు చేయడానికి ఉపయోగించబడుతుంది. ప్రతి పంక్తికి వ్యతిరేకంగా వ్యాఖ్యలను ఉపయోగించడం ద్వారా నేను వాటిని వివరించాను.
(1) {count = 0; // ప్రధాన లూప్లో ఉన్నప్పుడు టైమర్ను అమలు చేయవద్దు // ******* వినియోగదారు నుండి సంఖ్య ఆలస్యం పొందండి **** ////// if (RB0 == 0 && ఫ్లాగ్ == 0) // ఎప్పుడు ఇన్పుట్ ఇవ్వబడింది {get_scnds + = 1; // get_scnds = get_scnds + http: // పెరుగుదల వేరియబుల్ ఫ్లాగ్ = 1; } if (RB0 == 1) // నిరంతర పెంపు పతాకాన్ని నివారించడానికి = 0; / *********** ______ *********** /
వినియోగదారు బటన్ను నొక్కిన ప్రతిసారీ get_scnds అని పిలువబడే వేరియబుల్ పెరుగుతుంది. వినియోగదారుడు తన వేలిని బటన్ నుండి తొలగించే వరకు పెరుగుతున్న ప్రక్రియను నిర్వహించడానికి ఒక ఫ్లాగ్ (సాఫ్ట్వేర్ నిర్వచించిన) వేరియబుల్ ఉపయోగించబడుతుంది.
// ******* ఆలస్యం తో క్రమాన్ని అమలు చేయండి **** ////// అయితే (RB1 == 0) {PORTD = 0b00000001 <
బటన్ రెండు నొక్కితే తదుపరి బ్లాక్ చర్యలోకి వస్తుంది. బటన్ వన్ ఉపయోగించి అవసరమైన సమయం ఆలస్యాన్ని వినియోగదారు ఇప్పటికే నిర్వచించినందున మరియు ఇది వేరియబుల్ get_scnds లో సేవ్ చేయబడింది . మేము hscnd అని పిలువబడే వేరియబుల్ని ఉపయోగిస్తాము, ఈ వేరియబుల్ ISR (ఇంటరప్ట్ సర్వీస్ రొటీన్) చే నియంత్రించబడుతుంది.
ఆటంకాన్ని సర్వీస్ రొటీన్ ప్రతిసారీ Timer0 ఓవర్ఫ్లో ఉంది అని ఉంటుంది ఆటంకం ఉంది. ప్రతి బ్లాక్లో ISR చేత ఎలా నియంత్రించబడుతుందో చూద్దాం, ప్రతి బటన్ ప్రెస్లో సమయం ఆలస్యాన్ని సగం సెకను ( 0.5 సె) పెంచాలనుకుంటున్నాము , అప్పుడు ప్రతి అర్ధ సెకనుకు వేరియబుల్ hscnd ని పెంచాలి . ప్రతి 0.0019968s (ms 2ms) కోసం మా టైమర్ను ఓవర్ ఫ్లోకు ప్రోగ్రామ్ చేసినందున, సగం సెకను లెక్కింపు వేరియబుల్ 250 గా ఉండాలి ఎందుకంటే 250 * 2ms = 0.5 సెకన్లు. కాబట్టి కౌంట్ 250 (250 * 2ms = 0.5 సెకన్లు) పొందినప్పుడు, అది అర సెకను అయిందని అర్థం, కాబట్టి మనం hscnd ని 1 పెంచండి మరియు గణనను సున్నాకి ప్రారంభిస్తాము.
void interrupt timer_isr () {if (TMR0IF == 1) // టైమర్ ఓవర్ఫ్లో కారణంగా టైమర్ ఫ్లాగ్ ప్రారంభించబడింది {TMR0 = 100; // టైమర్ విలువను లోడ్ చేయండి TMR0IF = 0; // క్లియర్ టైమర్ ఇంటరప్ట్ ఫ్లాగ్ కౌంట్ ++; } if (కౌంట్ == 250) {hscnd + = 1; // ప్రతి సగం సెకనుకు hscnd పెరుగుతుంది = 0; }}
కాబట్టి మేము ఈ విలువను ఉపయోగిస్తాము మరియు దానిని మా hscnd తో పోల్చండి మరియు వినియోగదారు నిర్వచించిన సమయం ఆధారంగా మా LED ని మార్చండి . ఇది చివరి ట్యుటోరియల్తో కూడా చాలా పోలి ఉంటుంది.
మా ప్రోగ్రామ్ అర్థం మరియు పని ఉంది.
సర్క్యూట్ రేఖాచిత్రం మరియు ప్రోటీస్ అనుకరణ:
ఎప్పటిలాగే మొదట ప్రోటీస్ను ఉపయోగించి అవుట్పుట్ను ధృవీకరించడానికి అనుమతిస్తుంది, నేను ఇక్కడ ప్రోటీయస్ యొక్క స్కీమాటిక్ ఫైల్లను లింక్ చేసాను.
మా మునుపటి LED బోర్డ్కు ఒక బటన్ను జోడించండి మరియు మా హార్డ్వేర్ సిద్ధంగా ఉంది. ఇది ఇలా ఉండాలి:
కనెక్షన్ పూర్తయిన తర్వాత, కోడ్ను అప్లోడ్ చేసి, అవుట్పుట్ను ధృవీకరించండి. మీకు ఏమైనా సమస్య ఉంటే దయచేసి వ్యాఖ్యల విభాగాన్ని ఉపయోగించండి. మొత్తం ప్రక్రియను అర్థం చేసుకోవడానికి క్రింది వీడియోను కూడా తనిఖీ చేయండి.