- நமக்கு தாமதம் () இருக்கும்போது டைமர் ஏன்?
- பிஐசி மைக்ரோகண்ட்ரோலர் டைமர்கள்:
- புரோகிராமிங் மற்றும் வேலை விளக்கம்:
- சுற்று வரைபடம் மற்றும் புரோட்டஸ் உருவகப்படுத்துதல்:
இது எங்கள் PIC டுடோரியல் தொடரின் ஐந்தாவது டுடோரியலாக இருக்கும், இது PIC16F877A இல் டைமர்களைக் கற்றுக்கொள்ளவும் பயன்படுத்தவும் உதவும். எங்கள் முந்தைய டுடோரியல்களில், நாங்கள் PIC மற்றும் MPLABX IDE அறிமுகத்துடன் தொடங்கினோம், பின்னர் PIC ஐப் பயன்படுத்தி எல்.ஈ.டியை ஒளிரச் செய்ய எங்கள் முதல் PIC திட்டத்தை எழுதினோம், பின்னர் PIC மைக்ரோகண்ட்ரோலரில் தாமத செயல்பாட்டைப் பயன்படுத்தி எல்.ஈ.டி ஒளிரும் வரிசையை உருவாக்கினோம். முந்தைய டுடோரியல் வன்பொருளில் நாம் பயன்படுத்திய அதே எல்.ஈ.டி ஒளிரும் வரிசையைப் பயன்படுத்துவோம், இதன் மூலம் எங்கள் பி.ஐ.சி எம்.சி.யுவில் டைமர்களை எவ்வாறு பயன்படுத்துவது என்பதைக் கற்றுக்கொள்வோம். இந்த டுடோரியலுக்காக எல்.ஈ.டி போர்டில் மேலும் ஒரு பொத்தானைச் சேர்த்துள்ளோம். மேலும் அறிய டுடோரியல் வழியாக செல்லுங்கள்.
உட்பொதிக்கப்பட்ட புரோகிராமருக்கான முக்கியமான பணிமனைகளில் டைமர்கள் ஒன்றாகும். நாங்கள் வடிவமைக்கும் ஒவ்வொரு பயன்பாடும் ஒரு குறிப்பிட்ட நேர இடைவெளியில் ஏதேனும் ஒன்றை இயக்குவது அல்லது முடக்குவது போன்ற நேர பயன்பாட்டை எப்படியாவது உள்ளடக்கும். சரி, ஆனால் ஏற்கனவே தாமதமான மேக்ரோக்கள் (__delay_ms ()) இதைச் செய்யும்போது நமக்கு ஏன் டைமர்கள் தேவை !!
நமக்கு தாமதம் () இருக்கும்போது டைமர் ஏன்?
தாமத மேக்ரோவை "டம்ப்" தாமதம் என்று அழைக்கப்படுகிறது. ஏனெனில் தாமத செயல்பாட்டை செயல்படுத்தும்போது MCU ஒரு தாமதத்தை உருவாக்குவதன் மூலம் குப்பை அமர்ந்திருக்கும். இந்த செயல்பாட்டின் போது MCU அதன் ADC மதிப்புகளைக் கேட்கவோ அல்லது அதன் பதிவாளர்களிடமிருந்து எதையும் படிக்கவோ முடியாது. எனவே நேர தாமதம் துல்லியமாகவோ அல்லது நீண்டதாகவோ இருக்க வேண்டிய இடத்தில் எல்.ஈ.டி ஒளிரும் போன்ற பயன்பாடுகளைத் தவிர தாமத செயல்பாடுகளை பயன்படுத்துவது நல்லதல்ல.
தாமத மேக்ரோக்களுக்கும் பின்வரும் குறுகிய வருகைகள் உள்ளன,
- தாமதத்தின் மதிப்பு தாமத மேக்ரோக்களுக்கு மாறிலியாக இருக்க வேண்டும்; நிரல் செயல்பாட்டின் போது அதை மாற்ற முடியாது. எனவே இது எஞ்சியிருப்பது புரோகிராமர் வரையறுக்கப்பட்டுள்ளது.
- டைமர்களைப் பயன்படுத்துவதோடு ஒப்பிடும்போது தாமதம் துல்லியமாக இருக்காது.
- மேக்ரோக்களைப் பயன்படுத்தி தாமதங்களின் பெரிய மதிப்புகளை உருவாக்க முடியாது, எடுத்துக்காட்டாக அரை மணிநேர தாமதத்தை தாமத மேக்ரோக்களால் உருவாக்க முடியாது. பயன்படுத்தக்கூடிய அதிகபட்ச தாமதம் பயன்படுத்தப்படும் கிரிஸ்டல் ஆஸிலேட்டரை அடிப்படையாகக் கொண்டது.
பிஐசி மைக்ரோகண்ட்ரோலர் டைமர்கள்:
இயற்பியல் ரீதியாக, டைமர் என்பது ஒரு பதிவு, அதன் மதிப்பு தொடர்ந்து 255 ஆக அதிகரித்து வருகிறது, பின்னர் அது மீண்டும் தொடங்குகிறது: 0, 1, 2, 3, 4… 255…. 0, 1, 2, 3…… முதலியன.
PIC16F877A PIC எம்.சி.யு. மூன்று டைமர் தொகுதிகள் உள்ளது. அவை டைமர் 0, டைமர் 1 மற்றும் டைமர் 2 என பெயர்கள். டைமர் 0 மற்றும் டைமர் 2 ஆகியவை 8-பிட் டைமர்கள் மற்றும் டைமர் 1 16-பிட் டைமர் ஆகும். இந்த டுடோரியலில் எங்கள் பயன்பாட்டிற்கான டைமர் 0 ஐப் பயன்படுத்துவோம். டைமர் 0 ஐப் புரிந்துகொண்டவுடன் டைமர் 1 மற்றும் டைமர் 2 ஆகியவற்றிலும் வேலை செய்வது எளிதாக இருக்கும்.
டைமர் 0 தொகுதி டைமர் / கவுண்டரில் பின்வரும் அம்சங்கள் உள்ளன:
- 8-பிட் டைமர் / கவுண்டர்
- படிக்கக்கூடிய மற்றும் எழுதக்கூடிய
- 8-பிட் மென்பொருள் நிரல்படுத்தக்கூடிய prescaler
- உள் அல்லது வெளிப்புற கடிகாரம் தேர்ந்தெடுக்கவும்
- FFh இலிருந்து 00h வரை நிரம்பி வழிகிறது
- வெளிப்புற கடிகாரத்திற்கு எட்ஜ் தேர்வு
டைமரைப் பயன்படுத்தத் தொடங்க, 8-பிட் / 16-பிட் டைமர், பிரெஸ்கேலர், டைமர் குறுக்கீடுகள் மற்றும் ஃபாக்ஸ் போன்ற சில ஆடம்பரமான சொற்களைப் புரிந்து கொள்ள வேண்டும் . இப்போது, ஒவ்வொன்றும் உண்மையில் என்ன அர்த்தம் என்று பார்ப்போம். முன்னர் கூறியது போல, எங்கள் PIC MCU இல் 8-பிட் மற்றும் 16-பிட் டைமர்கள் இரண்டும் உள்ளன, அவற்றுக்கிடையேயான முக்கிய வேறுபாடு என்னவென்றால், 16-பிட் டைமரில் 8-பிட் டைமருக்கு மிகச் சிறந்த தீர்மானம் உள்ளது.
ப்ரீஸ்கேலர் என்பது மைக்ரோகண்ட்ரோலரின் ஒரு பகுதிக்கான பெயர், இது டைமரின் நிலையை அதிகரிக்கும் தர்க்கத்தை அடையும் முன் ஆஸிலேட்டர் கடிகாரத்தை பிரிக்கிறது. ப்ரீஸ்கேலர் ஐடியின் வரம்பு 1 முதல் 256 வரை உள்ளது மற்றும் ப்ரெஸ்கேலரின் மதிப்பை OPTION பதிவேட்டைப் பயன்படுத்தி அமைக்கலாம் (மின்தடைகளை இழுக்க நாங்கள் பயன்படுத்திய அதே). எடுத்துக்காட்டாக, ப்ரீஸ்கேலரின் மதிப்பு 64 ஆக இருந்தால், ஒவ்வொரு 64 வது துடிப்புக்கும் டைமர் 1 ஆல் அதிகரிக்கப்படும்.
டைமர் அதிகரிக்கும் போது, அதன் அதிகபட்ச மதிப்பு 255 ஐ எட்டும்போது, அது ஒரு குறுக்கீட்டைத் தூண்டும் மற்றும் தன்னை மீண்டும் 0 க்குத் துவக்கும். இந்த குறுக்கீடு டைமர் குறுக்கீடு என அழைக்கப்படுகிறது. இந்த குறுக்கீடு MCU க்கு இந்த குறிப்பிட்ட நேரம் குறைந்துவிட்டது என்று தெரிவிக்கிறது.
Fosc ஆசிலேட்டரின் அதிர்வெண்ணை குறிக்கிறது, அது பயன்படுத்தப்படும் கிரிஸ்டல் அதிர்வெண். டைமர் பதிவேட்டில் எடுக்கப்பட்ட நேரம் ப்ரெஸ்கேலரின் மதிப்பு மற்றும் ஃபோஸின் மதிப்பு ஆகியவற்றைப் பொறுத்தது.
புரோகிராமிங் மற்றும் வேலை விளக்கம்:
இந்த டுடோரியலில் இரண்டு பொத்தான்களை இரண்டு உள்ளீடுகளாகவும் 8 எல்.ஈ.டி 8 வெளியீடுகளாகவும் அமைப்போம். நேர தாமதத்தை அமைக்க முதல் பொத்தான் பயன்படுத்தப்படும் (ஒவ்வொரு உந்துதலுக்கும் 500 மீட்டர்) மற்றும் இரண்டாவது பொத்தானை டைமர் வரிசை ஒளிர ஆரம்பிக்க பயன்படுத்தப்படும். எடுத்துக்காட்டாக, முதல் பொத்தானை மூன்று முறை அழுத்தினால் (500 * 3 = 1500 மீ) தாமதம் 1.5 செக்கிற்கு அமைக்கப்படும், மேலும் பொத்தானை இரண்டு அழுத்தும் போது ஒவ்வொரு எல்.ஈ.யும் முன் வரையறுக்கப்பட்ட நேர தாமதத்துடன் இயக்கப்படும் மற்றும் முடக்கப்படும். இந்த டுடோரியலின் முடிவில் ஆர்ப்பாட்டம் வீடியோவைச் சரிபார்க்கவும்.

இப்போது, இந்த அடிப்படைகளை மனதில் கொண்டு, குறியீடு பிரிவில் இறுதியில் கொடுக்கப்பட்ட எங்கள் நிரலைப் பார்ப்போம்.
நீங்கள் நிரலைப் பெறவில்லை என்றால் பரவாயில்லை, ஆனால் நீங்கள் செய்தால் !! நீங்களே ஒரு குக்கீயைக் கொடுத்து, உங்கள் வெளியீட்டை அனுபவிக்க நிரலைக் கொடுங்கள். மற்றவர்களுக்கு நான் நிரலை அர்த்தமுள்ள பகுதிகளாக உடைத்து ஒவ்வொரு தொகுதியிலும் என்ன நடக்கிறது என்பதை உங்களுக்கு விளக்குகிறேன்.
குறியீட்டின் முதல் சில வரிகள் எப்போதும் உள்ளமைவு அமைப்புகள் மற்றும் தலைப்பு கோப்புகள் என்பதால், இதை நான் ஏற்கனவே எனது முந்தைய டுடோரியல்களில் செய்துள்ளதால் இதை விளக்கப் போவதில்லை.
அடுத்து, எல்லா வரிகளையும் தவிர்த்து, வெற்றிட முக்கிய செயல்பாட்டிற்கு நேராக செல்லலாம், அதற்குள் டைமர் 0 க்கான PORT உள்ளமைவு உள்ளது.
void main () {/ ***** டைமருக்கான போர்ட் உள்ளமைவு ****** / OPTION_REG = 0b00000101; // டைமர் 0 வெளிப்புற ஃப்ரீக் மற்றும் 64 ப்ரெஸ்கலராக // மேலும் PULL UP களை இயக்குகிறது TMR0 = 100; // 0.0019968 களுக்கான நேர மதிப்பை ஏற்றவும்; delayValue 0-256 க்கு இடையில் மட்டுமே TMR0IE = 1; // PIE1 பதிவேட்டில் GIE = 1 இல் டைமர் குறுக்கீடு பிட்டை இயக்கு; // உலகளாவிய குறுக்கீட்டை இயக்கு PEIE = 1; // புற குறுக்கீட்டை இயக்கு / *********** ______ *********** /
இதைப் புரிந்து கொள்ள எங்கள் PIC தரவுத்தாள் உள்ள OPTION பதிவைப் பார்க்க வேண்டும்.

முந்தைய டுடோரியலில் விவாதித்தபடி, PORTB க்கான பலவீனமான புல் அப் ரெசிஸ்டரை இயக்க பிட் 7 பயன்படுத்தப்படுகிறது. மேலே உள்ள உருவத்தைப் பாருங்கள், அமைக்கப்பட்டிருக்கும் பின்வரும் ப்ரீஸ்கேலர் டைமருக்குப் பயன்படுத்தப்பட வேண்டும், ஆனால் வாட்ச் டாக் டைமருக்கு (WDT) பயன்படுத்தப்படக்கூடாது என்று MCU க்கு அறிவுறுத்துவதற்காக பிட் 3 0 செய்யப்படுகிறது. பிட் 5 T0CS ஐ அழிப்பதன் மூலம் டைமர் பயன்முறை தேர்ந்தெடுக்கப்படுகிறது
(OPTION_REG <5>)
இப்போது, டைமருக்கான ப்ரீஸ்கேலர் மதிப்பை அமைக்க பிட்கள் 2-0 பயன்படுத்தப்படுகிறது. 64 இன் ப்ரீஸ்கேலர் மதிப்பை அமைக்க மேலே உள்ள அட்டவணையில் காட்டப்பட்டுள்ளபடி, பிட்களை 101 ஆக அமைக்க வேண்டும்.
அடுத்து, டைமர் 0 உடன் தொடர்புடைய பதிவேடுகளைப் பார்ப்போம்

டைமர் ஒரு முறை அமைக்கப்பட்டதும், 256 மதிப்பை அடைந்தபின் நிரம்பி வழியும். இந்த நேரத்தில் டைமர் குறுக்கீடு செய்ய TMR0IE பதிவேட்டை அதிக அளவில் அமைக்க வேண்டும். டைமர் 0 தானே ஒரு புறம் என்பதால் PEIE = 1 ஐ உருவாக்குவதன் மூலம் நாம் புற குறுக்கீட்டை இயக்க வேண்டும். இறுதியாக நாம் உலகளாவிய குறுக்கீட்டை இயக்க வேண்டும், இதனால் எந்தவொரு செயல்பாட்டின் போதும் குறுக்கீடு குறித்து MCU க்கு அறிவிக்கப்படும், இது GIE = 1 ஐ உருவாக்குவதன் மூலம் செய்யப்படுகிறது .
தாமதம் = ((256-REG_val) * (Prescal * 4%) / Fosc
தாமதத்தின் மதிப்பைக் கணக்கிட மேலே உள்ள சூத்திரம் பயன்படுத்தப்படுகிறது.
எங்கே
REG_val = 100;
ப்ரெஸ்கல் = 64
ஃபோஸ் = 20000000
இது கணக்கீட்டில் கொடுக்கிறது, தாமதம் = 0.0019968 கள்
அடுத்த வரிகளின் தொகுப்பு I / O துறைமுகங்களை அமைப்பதாகும்.
/ ***** I / O க்கான துறைமுக கட்டமைப்பு ****** / TRISB0 = 1; // பொத்தானை 1 க்கான உள்ளீடாக PORTB முள் 0 பயன்படுத்தப்படுகிறது என்று MCU க்கு அறிவுறுத்துங்கள். TRISB1 = 1; // பொத்தானை 1 க்கான உள்ளீடாக PORTB முள் 1 பயன்படுத்தப்படுகிறது என்று MCU க்கு அறிவுறுத்துங்கள். TRISD = 0x00; // PORT D இல் உள்ள அனைத்து ஊசிகளும் PORTD = 0x00 வெளியீடு என்று MCU க்கு அறிவுறுத்துங்கள்; // அனைத்து ஊசிகளையும் 0 / *********** ______ *********** /
நாங்கள் அதே வன்பொருளைப் பயன்படுத்துவதால் இது எங்கள் முந்தைய டுடோரியலைப் போன்றது. தவிர, மற்றொரு பொத்தானை உள்ளீடாக சேர்த்துள்ளோம். இது TRISB1 = 1 வரியால் செய்யப்படுகிறது .
அடுத்து, எல்லையற்ற போது லூப் எங்களிடம் இரண்டு தொகுதிகள் உள்ளன. ஒன்று பயனரிடமிருந்து டைமர் உள்ளீட்டைப் பெறவும், மற்றொன்று எல்.ஈ.டிகளில் தாமதத்தின் வரிசையை இயக்கவும் பயன்படுத்தப்படுகிறது. ஒவ்வொரு வரிக்கும் எதிராக கருத்துகளைப் பயன்படுத்தி அவற்றை விளக்கினேன்.
(1) {எண்ணிக்கை = 0; // பிரதான சுழற்சியில் இருக்கும்போது டைமரை இயக்க வேண்டாம் // ******* பயனரிடமிருந்து எண் தாமதத்தைப் பெறுங்கள் **** ////// if (RB0 == 0 && கொடி == 0) // எப்போது உள்ளீடு கொடுக்கப்பட்டுள்ளது {get_scnds + = 1; // get_scnds = get_scnds + http: // அதிகரிப்பு மாறி கொடி = 1; } if (RB0 == 1) // தொடர்ச்சியான அதிகரிப்புக் கொடியைத் தடுக்க = 0; / *********** ______ *********** /
ஒவ்வொரு முறையும் பயனர் பொத்தானை அழுத்தும்போது get_scnds எனப்படும் மாறி அதிகரிக்கப்படுகிறது 1. பயனர் பொத்தானிலிருந்து விரலை அகற்றும் வரை அதிகரிக்கும் செயல்முறையை நடத்த ஒரு கொடி (மென்பொருள் வரையறுக்கப்பட்ட) மாறி பயன்படுத்தப்படுகிறது.
// ******* தாமதத்துடன் வரிசையை இயக்கவும் **** ////// போது (RB1 == 0) {PORTD = 0b00000001 <
பொத்தானை இரண்டு அழுத்தினால் அடுத்த தொகுதி செயல்படும். பொத்தானை ஒன்றைப் பயன்படுத்தி தேவையான நேர தாமதத்தை பயனர் ஏற்கனவே வரையறுத்துள்ளதால், அது get_scnds என்ற மாறி சேமிக்கப்பட்டுள்ளது. நாங்கள் hscnd எனப்படும் மாறியைப் பயன்படுத்துகிறோம், இந்த மாறி ஐ.எஸ்.ஆர் (குறுக்கீடு சேவை வழக்கம்) ஆல் கட்டுப்படுத்தப்படுகிறது.
குறுக்கீட்டு சேவை நடைமுறையை ஒவ்வொரு முறையும் Timer0 பெருக்கங்களுடன் என அழைக்கப்படுவது என்று ஒரு குறுக்கீட்டு உள்ளது. அடுத்த தொகுதியில் ஐ.எஸ்.ஆரால் இது எவ்வாறு கட்டுப்படுத்தப்படுகிறது என்பதைப் பார்ப்போம், ஒவ்வொரு பொத்தான் அழுத்தத்திலும் நேர தாமதத்தை அரை வினாடி (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 உடன் ஒப்பிட்டு பயனர் வரையறுக்கப்பட்ட நேரத்தின் அடிப்படையில் எங்கள் எல்.ஈ.டி. இது கடைசி டுடோரியலுக்கும் மிகவும் ஒத்திருக்கிறது.
எங்கள் திட்டத்தை புரிந்துகொண்டு செயல்படுகிறோம்.
சுற்று வரைபடம் மற்றும் புரோட்டஸ் உருவகப்படுத்துதல்:

வழக்கம்போல முதலில் புரோட்டியஸைப் பயன்படுத்தி வெளியீட்டைச் சரிபார்க்க உதவுகிறது, புரோட்டியஸின் திட்டக் கோப்புகளை இங்கே இணைத்துள்ளேன்.
எங்கள் முந்தைய எல்.ஈ.டி போர்டில் ஒரு பொத்தானைச் சேர்க்கவும், எங்கள் வன்பொருள் செல்ல தயாராக உள்ளது. இது இப்படி இருக்க வேண்டும்:



இணைப்பு முடிந்ததும், குறியீட்டைப் பதிவேற்றி வெளியீட்டை சரிபார்க்கவும். உங்களுக்கு ஏதேனும் சிக்கல் இருந்தால் கருத்துகள் பகுதியைப் பயன்படுத்தவும். முழு செயல்முறையையும் புரிந்து கொள்ள கீழேயுள்ள வீடியோவையும் சரிபார்க்கவும்.
