- అవసరాలు:
- UART కమ్యూనికేషన్ కోసం ప్రోగ్రామింగ్ PIC మైక్రోకంట్రోలర్:
- మా ప్రోగ్రామ్ను అనుకరించడం:
- హార్డ్వేర్ సెటప్ మరియు అవుట్పుట్ను పరీక్షించడం:
ఈ ట్యుటోరియల్లో PIC మైక్రోకంట్రోలర్తో UART కమ్యూనికేషన్ను ప్రారంభించడం మరియు మీ కంప్యూటర్కు మరియు డేటాను ఎలా బదిలీ చేయాలో నేర్చుకుంటాము. ఇప్పటివరకు, మేము ADC, టైమర్స్, PWM వంటి అన్ని ప్రాథమిక మాడ్యూళ్ళను కవర్ చేసాము మరియు LCD లు మరియు 7-సెగ్మెంట్ డిస్ప్లేలను ఎలా ఇంటర్ఫేస్ చేయాలో కూడా నేర్చుకున్నాము. ఇప్పుడు, చాలావరకు మైక్రోకంట్రోలర్ ప్రాజెక్టులలో విస్తృతంగా ఉపయోగించబడే UART అనే కొత్త కమ్యూనికేషన్ సాధనంతో మన స్వీయతను సిద్ధం చేస్తాము. MPLAB మరియు XC8 ఉపయోగించి మా పూర్తి PIC మైక్రోకంట్రోలర్ ట్యుటోరియల్స్ ఇక్కడ తనిఖీ చేయండి.
ఇక్కడ మేము PIC16F877A MCU ని ఉపయోగించాము, దీనికి USART అని పిలువబడే “అడ్రసబుల్ యూనివర్సల్ సింక్రోనస్ ఎసిన్క్రోనస్ రిసీవర్ అండ్ ట్రాన్స్మిటర్” అనే మాడ్యూల్ ఉంది. USART అనేది రెండు వైర్ కమ్యూనికేషన్ సిస్టమ్, దీనిలో డేటా క్రమంగా ప్రవహిస్తుంది. USART కూడా పూర్తి-డ్యూప్లెక్స్ కమ్యూనికేషన్, అంటే మీరు అదే సమయంలో డేటాను పంపవచ్చు మరియు స్వీకరించవచ్చు, అంటే CRT టెర్మినల్స్ మరియు వ్యక్తిగత కంప్యూటర్లు వంటి పరిధీయ పరికరాలతో కమ్యూనికేట్ చేయడానికి ఉపయోగించవచ్చు.
USART క్రింది చర్య రీతులను లో అమర్చవచ్చు:
- అసమకాలిక (పూర్తి-డ్యూప్లెక్స్)
- సింక్రోనస్ - మాస్టర్ (సగం-డ్యూప్లెక్స్)
- సింక్రోనస్ - బానిస (సగం-డ్యూప్లెక్స్)
8-బిట్ మరియు 9-బిట్ మోడ్ అనే రెండు వేర్వేరు మోడ్లు కూడా ఉన్నాయి, ఈ ట్యుటోరియల్లో మేము USART మాడ్యూల్ను 8-బిట్ కమ్యూనికేషన్ సిస్టమ్తో అసమకాలిక మోడ్లో పనిచేయడానికి కాన్ఫిగర్ చేస్తాము, ఎందుకంటే ఇది ఎక్కువగా ఉపయోగించే కమ్యూనికేషన్ రకం. ఇది అసమకాలికమైనందున డేటా సిగ్నల్లతో పాటు క్లాక్ సిగ్నల్ పంపాల్సిన అవసరం లేదు. UART రెండు డేటా లైన్లను పంపడం (Tx) మరియు స్వీకరించడం (Rx) డేటాను ఉపయోగిస్తుంది. రెండు పరికరాల మైదానాన్ని కూడా సాధారణం చేయాలి. ఈ రకమైన కమ్యూనికేషన్ ఒక సాధారణ గడియారాన్ని పంచుకోదు, అందువల్ల సిస్టమ్ పనిచేయడానికి ఒక సాధారణ మైదానం చాలా ముఖ్యం.
ఈ ట్యుటోరియల్ చివరలో మీరు మీ కంప్యూటర్ మరియు మీ PIC మైక్రోకంట్రోలర్ మధ్య కమ్యూనికేషన్ (UART) ను ఏర్పాటు చేయగలరు మరియు మీ ల్యాప్టాప్ నుండి PIC బోర్డులో LED ని టోగుల్ చేయవచ్చు. LED యొక్క స్థితి PIC MCU నుండి మీ ల్యాప్టాప్కు పంపబడుతుంది. మేము కంప్యూటర్లో హైపర్ టెర్మినల్ ఉపయోగించి అవుట్పుట్ను పరీక్షిస్తాము. ఈ ట్యుటోరియల్ చివరిలో వివరణాత్మక వీడియో కూడా ఇవ్వబడింది.
అవసరాలు:
హార్డ్వేర్:
- PIC16F877A పెర్ఫ్ బోర్డు
- RS232 నుండి USB కన్వర్టర్ మాడ్యూల్
- కంప్యూటర్
- పిక్కిట్ 3 ప్రోగ్రామర్
సాఫ్ట్వేర్:
- MPLABX
- హైపర్ టెర్మినల్
ఒక USB పరివర్తకం RS232 కంప్యూటర్ రీడబుల్ రూపం సీరియల్ డేటా మార్చేందుకు అవసరం. మీ స్వంత మాడ్యూల్ కొనడానికి బదులుగా మీ స్వంత సర్క్యూట్ను రూపొందించడానికి మార్గాలు ఉన్నాయి, కానీ అవి శబ్దానికి లోనవుతున్నందున అవి నమ్మదగినవి కావు. మేము ఉపయోగిస్తున్నది క్రింద చూపబడింది
గమనిక: ప్రతి RS232 నుండి USB కన్వర్టర్ వరకు ప్రత్యేక డ్రైవర్ను ఇన్స్టాల్ చేయాలి; మీరు పరికరాన్ని ప్లగ్ చేసిన వెంటనే వాటిలో చాలావరకు స్వయంచాలకంగా ఇన్స్టాల్ చేయబడతాయి. కానీ, అది విశ్రాంతి తీసుకోకపోతే !!! వ్యాఖ్య విభాగాన్ని ఉపయోగించండి మరియు నేను మీకు సహాయం చేస్తాను.
UART కమ్యూనికేషన్ కోసం ప్రోగ్రామింగ్ PIC మైక్రోకంట్రోలర్:
అన్ని మాడ్యూల్స్ (ADC, టైమర్, PWM) మాదిరిగానే మన PIC16F877A MCU యొక్క USART మాడ్యూల్ను కూడా ప్రారంభించాలి మరియు UART 8-బిట్ కమ్యూనికేషన్ మోడ్లో పనిచేయమని సూచించాలి. కాన్ఫిగరేషన్ బిట్లను నిర్వచించి, UART ప్రారంభ ఫంక్షన్ తో ప్రారంభిద్దాం.
PIC మైక్రోకంట్రోలర్ యొక్క UART మాడ్యూల్ను ప్రారంభించడం:
Tx మరియు Rx పిన్స్ భౌతికంగా పిన్స్ RC6 మరియు RC7 వద్ద ఉంటాయి. డేటాషీట్ ప్రకారం TX ను అవుట్పుట్ మరియు RX ను ఇన్పుట్గా ప్రకటిద్దాం.
// **** UART కోసం I / O పిన్లను అమర్చుట **** // TRISC6 = 0; // TX పిన్ అవుట్పుట్ TRISC7 = 1 గా సెట్ చేయబడింది; // RX పిన్ ఇన్పుట్గా సెట్ చేయబడింది // ________ I / O పిన్స్ సెట్ __________ //
ఇప్పుడు బాడ్ రేట్ సెట్ చేయాలి. బాడ్ రేటు అంటే కమ్యూనికేషన్ ఛానెల్లో సమాచారం బదిలీ చేయబడిన రేటు. ఇది చాలా డిఫాల్ట్ విలువలలో ఒకటి కావచ్చు, కానీ ఈ ప్రోగ్రామ్లో మేము 9600 ను ఎక్కువగా ఉపయోగిస్తున్న బాడ్ రేటు నుండి ఉపయోగిస్తున్నాము.
/ ** అవసరమైన బాడ్ రేటు కోసం SPBRG రిజిస్టర్ను ప్రారంభించండి మరియు వేగంగా baud_rate కోసం BRGH ని సెట్ చేయండి ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // అధిక బాడ్_రేట్ కోసం // _________ బాడ్_రేట్ సెట్టింగ్ ముగింపు _________ //
బౌడ్ రేటు యొక్క విలువను రిజిస్టర్ SPBRG ఉపయోగించి సెట్ చేయాలి, విలువ బాహ్య క్రిస్టల్ ఫ్రీక్వెన్సీ విలువపై ఆధారపడి ఉంటుంది, బాడ్ రేటును లెక్కించే సూత్రాలు క్రింద చూపించబడ్డాయి:
SPBRG = ((_XTAL_FREQ / 16) / బౌడ్_రేట్) - 1;
హై స్పీడ్ బిట్ రేట్ను ప్రారంభించడానికి బిట్ బిఆర్జిహెచ్ను అధికంగా చేయాలి. డేటాషీట్ (13 వ పేజీ) ప్రకారం, దీన్ని ప్రారంభించడం ఎల్లప్పుడూ ప్రయోజనకరంగా ఉంటుంది, ఎందుకంటే ఇది కమ్యూనికేషన్ సమయంలో లోపాలను తొలగించగలదు.
ఇంతకు ముందే చెప్పినట్లుగా, మేము అసమకాలిక మోడ్లో పని చేస్తాము, అందువల్ల బిట్ SYNC ను సున్నాగా చేయాలి మరియు సీరియల్ పిన్లను (TRISC6 మరియు TRICSC5) ప్రారంభించడానికి బిట్ SPEM ను అధికంగా చేయాలి.
// **** అసమకాలిక సీరియల్ పోర్ట్ను ప్రారంభించండి ******* // SYNC = 0; // అసమకాలిక SPEN = 1; // సీరియల్ పోర్ట్ పిన్లను ప్రారంభించండి // _____ అసమకాలిక సీరియల్ పోర్ట్ ప్రారంభించబడింది _______ //
ఈ ట్యుటోరియల్లో మనం MCU మరియు కంప్యూటర్ మధ్య డేటాను పంపడం మరియు స్వీకరించడం రెండూ అవుతాము, అందువల్ల మేము TXEN మరియు CREN బిట్లను రెండింటినీ ప్రారంభించాలి.
// ** ప్రసారం & రిసెప్షన్ కోసం సిద్ధం చేద్దాం ** // TXEN = 1; // ప్రసారాన్ని ప్రారంభించండి CREN = 1; // రిసెప్షన్ను ప్రారంభించండి // __ UART మాడ్యూల్ అప్ మరియు ప్రసారం మరియు రిసెప్షన్ కోసం సిద్ధంగా ఉంది __ //
బిట్స్ TX9 మరియు RX9 సున్నా తయారు చేయబడ్డాయి కాబట్టి మేము 8-బిట్ మోడ్ నడుస్తుంటుంది. అధిక విశ్వసనీయత ఏర్పడాలంటే 9-బిట్ మోడ్ను ఎంచుకోవచ్చు.
// ** 8-బిట్ మోడ్ను ఎంచుకోండి ** // TX9 = 0; // 8-బిట్ రిసెప్షన్ ఎంచుకున్న RX9 = 0; // 8-బిట్ రిసెప్షన్ మోడ్ ఎంచుకోబడింది // __ 8-బిట్ మోడ్ ఎంచుకోబడింది __ //
దీనితో మేము మా ప్రారంభ సెటప్ను పూర్తి చేస్తాము. మరియు ఆపరేషన్ కోసం సిద్ధంగా ఉంది.
UART ఉపయోగించి డేటాను ప్రసారం చేస్తుంది:
దిగువ ఫంక్షన్ UART మాడ్యూల్ ద్వారా డేటాను ప్రసారం చేయడానికి ఉపయోగించవచ్చు:
// ** తేదీ యొక్క ఒక బైట్ను UART కి పంపే ఫంక్షన్ ** // శూన్యమైన UART_send_char (char bt) {అయితే (! TXIF); // TX బఫర్ ఉచితం అయ్యే వరకు ప్రోగ్రామ్ను పట్టుకోండి TXREG = bt; // అందుకున్న విలువతో ట్రాన్స్మిటర్ బఫర్ను లోడ్ చేయండి ________ // _____________ ఫంక్షన్ ముగింపు ________________ //
మాడ్యూల్ ప్రారంభించిన తర్వాత రిజిస్టర్లో లోడ్ చేయబడిన విలువ TXREG UART ద్వారా ప్రసారం చేయబడుతుంది, కాని ప్రసారం అతివ్యాప్తి చెందుతుంది. అందువల్ల మేము ఎల్లప్పుడూ ట్రాన్స్మిషన్ ఇంటరప్ట్ ఫ్లాగ్ TXIF కోసం తనిఖీ చేయాలి . ఈ బిట్ తక్కువగా ఉంటేనే మనం ప్రసారం కోసం తదుపరి బిట్తో ముందుకు సాగవచ్చు, లేకపోతే ఈ జెండా తక్కువగా వచ్చే వరకు వేచి ఉండాలి.
ఏదేమైనా, పై ఫంక్షన్ ఒక బైట్ డేటాను మాత్రమే పంపడానికి మాత్రమే ఉపయోగించబడుతుంది, పూర్తి స్ట్రింగ్ పంపడానికి క్రింది ఫంక్షన్ ఉపయోగించాలి
// ** స్ట్రింగ్ను బైట్గా మార్చడానికి ఫంక్షన్ ** // శూన్యమైన UART_send_string (char * st_pt) {అయితే (* st_pt) // చార్ ఉంటే UART_send_char (* st_pt ++); // దీన్ని బైట్ డేటాగా ప్రాసెస్ చేయండి} // ___________ ఫంక్షన్ ముగింపు ______________ //
ఈ ఫంక్షన్ పాయింటర్లను కలిగి ఉన్నందున అర్థం చేసుకోవడానికి కొంచెం గమ్మత్తైనది కావచ్చు, కాని నన్ను నమ్మండి పాయింటర్లు అద్భుతమైనవి మరియు అవి ప్రోగ్రామింగ్ను మరింత సులభతరం చేస్తాయి మరియు దీనికి మంచి ఉదాహరణ.
మీరు గమనించినట్లుగా, మేము మళ్ళీ UART_send_char () అని పిలిచాము, కాని ఇప్పుడు లూప్ లోపల. మేము స్ట్రింగ్ను వ్యక్తిగత అక్షరాలుగా విభజించాము, ఈ ఫంక్షన్ను పిలిచిన ప్రతిసారీ, ఒక చార్ TXREG కి పంపబడుతుంది మరియు అది ప్రసారం అవుతుంది.
UART ఉపయోగించి డేటాను స్వీకరిస్తోంది:
UART మాడ్యూల్ నుండి డేటాను స్వీకరించడానికి కింది ఫంక్షన్ ఉపయోగించవచ్చు:
// ** UART ** నుండి ఒక బైట్ తేదీని పొందే ఫంక్షన్ ** // చార్ UART_get_char () {if (OERR) // లోపం కోసం తనిఖీ చేయండి {CREN = 0; // లోపం ఉంటే -> CREN = 1 ను రీసెట్ చేయండి; // లోపం ఉంటే -> రీసెట్} అయితే (! RCIF); // RX బఫర్ ఉచిత రిటర్న్ RCREG అయ్యే వరకు ప్రోగ్రామ్ను పట్టుకోండి; // విలువను స్వీకరించి ప్రధాన ఫంక్షన్కు పంపండి} // _____________ ఫంక్షన్ ముగింపు ________________ //
UART మాడ్యూల్ ద్వారా డేటాను స్వీకరించినప్పుడు అది దాన్ని తీసుకొని RCREG రిజిస్టర్లో నిల్వ చేస్తుంది. మనం విలువను ఏదైనా వేరియబుల్కు బదిలీ చేసి ఉపయోగించుకోవచ్చు. కానీ అతివ్యాప్తి లోపం ఉండవచ్చు లేదా వినియోగదారు నిరంతరం డేటాను పంపుతూ ఉండవచ్చు మరియు మేము వాటిని ఇంకా వేరియబుల్కు బదిలీ చేయలేదు.
అలాంటప్పుడు రిసీవ్ ఫ్లాగ్ బిట్ RCIF రక్షించడానికి వస్తుంది. డేటా స్వీకరించబడినప్పుడు మరియు ఇంకా ప్రాసెస్ చేయబడనప్పుడు ఈ బిట్ తక్కువగా ఉంటుంది. అందువల్ల మేము ఆ విలువతో వ్యవహరించే వరకు ప్రోగ్రామ్ను పట్టుకోవటానికి ఆలస్యాన్ని సృష్టిస్తూ టైమ్ లూప్లో ఉపయోగిస్తాము.
PIC మైక్రోకంట్రోలర్ యొక్క UART మాడ్యూల్ ఉపయోగించి LED ని టోగుల్ చేయడం:
ఇప్పుడు ప్రోగ్రామ్ యొక్క చివరి భాగం, శూన్యమైన ప్రధాన (శూన్యమైన) ఫంక్షన్కు వద్దాం, ఇక్కడ మేము PIC మరియు కంప్యూటర్ మధ్య UART కమ్యూనికేషన్ ఉపయోగించి కంప్యూటర్ ద్వారా LED ని టోగుల్ చేస్తాము.
మేము “1” అక్షరాన్ని పంపినప్పుడు (కంప్యూటర్ నుండి) LED ఆన్ చేయబడుతుంది మరియు “RED LED -> ON” అనే స్థితి సందేశం కంప్యూటర్కు తిరిగి పంపబడుతుంది (PIC MCU నుండి).
అదేవిధంగా మేము “0” (కంప్యూటర్ నుండి) అక్షరాన్ని పంపుతాము, LED ఆపివేయబడుతుంది మరియు “RED LED -> OFF” అనే స్థితి సందేశం కంప్యూటర్కు తిరిగి పంపబడుతుంది (PIC MCU నుండి).
అయితే (1) // అనంతమైన లూప్ {get_value = UART_get_char (); if (get_value == '1') // వినియోగదారు "1" పంపితే {RB3 = 1; // LED UART_send_string ("RED LED -> ON") ఆన్ చేయండి; // కంప్యూటర్కు నోటిఫికేషన్ పంపండి UART_send_char (10); // ASCII విలువ 10 క్యారేజ్ రిటర్న్ కోసం (కొత్త పంక్తిలో ముద్రించడానికి) ఉపయోగించబడుతుంది} if (get_value == '0') // వినియోగదారు "0" పంపితే {RB3 = 0; // LED UART_send_string ("RED -> OFF") ఆఫ్ చేయండి; // కంప్యూటర్కు నోటిఫికేషన్ పంపండి UART_send_char (10); // ASCII విలువ 10 క్యారేజ్ రిటర్న్ కోసం ఉపయోగించబడుతుంది (కొత్త లైన్లో ముద్రించడానికి)}}
మా ప్రోగ్రామ్ను అనుకరించడం:
ఎప్పటిలాగే మా ప్రోగ్రామ్ను ప్రోటీస్ను ఉపయోగించి అనుకరించండి మరియు అది.హించిన విధంగా పనిచేస్తుందో లేదో తెలుసుకుందాం.
పై చిత్రం వర్చువల్ టెర్మినల్ను చూపిస్తుంది, దీనిలో ఇది LED యొక్క స్వాగత సందేశం మరియు స్థితిని చూపుతుంది. రెడ్ కలర్ ఎల్ఈడీని పిన్ ఆర్బి 3 కి కనెక్ట్ చేసినట్లు గమనించవచ్చు. అనుకరణ యొక్క వివరణాత్మక పని చివరిలో వీడియోలో చూడవచ్చు.
హార్డ్వేర్ సెటప్ మరియు అవుట్పుట్ను పరీక్షించడం:
ఈ సర్క్యూట్ కోసం కనెక్షన్ నిజంగా సులభం, మేము మా PIC పెర్ఫ్ బోర్డ్ను ఉపయోగిస్తాము మరియు మూడు వైర్లను RS232 కు USB కన్వర్టర్కు కనెక్ట్ చేస్తాము మరియు క్రింద చూపిన విధంగా USB డేటా కేబుల్ ఉపయోగించి మా కంప్యూటర్కు మాడ్యూల్ను కనెక్ట్ చేస్తాము.
తరువాత మేము హైపర్ టెర్మినల్ అప్లికేషన్ను ఇన్స్టాల్ చేస్తాము (దాన్ని ఇక్కడ నుండి డౌన్లోడ్ చేసుకోండి) మరియు దానిని తెరవండి. ఇది ఇలాంటిదే చూపించాలి
ఇప్పుడు మీ కంప్యూటర్లో పరికర నిర్వాహికిని తెరిచి, మీ మాడ్యూల్ ఏ కామ్ పోర్ట్కు అనుసంధానించబడిందో తనిఖీ చేయండి, క్రింద చూపిన విధంగా గని COM పోర్ట్ 17 కి కనెక్ట్ చేయబడింది
గమనిక: మీ మాడ్యూల్ కోసం COM పోర్ట్ పేరు మీ విక్రేత ప్రకారం మారవచ్చు, ఇది సమస్య కాదు.
ఇప్పుడు హైపర్ టెర్మినల్ అప్లికేషన్కు తిరిగి వెళ్లి, సెటప్ -> పోర్ట్ కాన్ఫిగరేషన్కు నావిగేట్ చేయండి లేదా ఆల్ట్ + సి నొక్కండి, కింది పాప్ అప్ బాక్స్ను పొందడానికి మరియు పాప్-అప్ విండోలో కావలసిన పోర్ట్ను (నా విషయంలో COM17) ఎంచుకుని, కనెక్ట్పై క్లిక్ చేయండి.
కనెక్షన్ స్థాపించబడిన తర్వాత మీ PIC perf బోర్డును ఆన్ చేయండి మరియు మీరు క్రింద ఇలాంటివి చూడాలి
మీ కర్సర్ను కమాండ్ విండోలో ఉంచండి మరియు 1 ఎంటర్ చేసి ఎంటర్ నొక్కండి. LED ఆన్ చేయబడుతుంది మరియు క్రింద చూపిన విధంగా స్థితి ప్రదర్శించబడుతుంది.
అదే విధంగా, మీ కర్సర్ను కమాండ్ విండోలో ఉంచి 0 ఎంటర్ చేసి ఎంటర్ నొక్కండి. LED ఆపివేయబడుతుంది మరియు క్రింద చూపిన విధంగా స్థితి ప్రదర్శించబడుతుంది.
క్రింద పూర్తి కోడ్ మరియు వివరణాత్మక వీడియో ఇవ్వబడ్డాయి , ఇది “1” మరియు “0” లకు LED నిజ సమయంలో ఎలా స్పందిస్తుందో చూపిస్తుంది.
అబ్బాయిలు, మేము మా కంప్యూటర్తో PIC UART ని ఇంటర్ఫేస్ చేసాము మరియు హైపర్ టెర్మినల్ ఉపయోగించి LED ని టోగుల్ చేయడానికి డేటాను బదిలీ చేసాము. మీరు అర్థం చేసుకున్నారని ఆశిస్తున్నాము, కాకపోతే, మీ ప్రశ్న అడగడానికి వ్యాఖ్య విభాగాన్ని ఉపయోగించండి. మా తదుపరి ట్యుటోరియల్లో మనం మళ్ళీ UART ని ఉపయోగిస్తాము కాని బ్లూటూత్ మాడ్యూల్ ఉపయోగించి డేటాను మరింత ఆసక్తికరంగా చేస్తాము మరియు డేటాను గాలి ద్వారా ప్రసారం చేస్తాము.
రెండు ATmega8 మైక్రోకంట్రోలర్ల మధ్య UART కమ్యూనికేషన్ మరియు ATmega8 మరియు Arduino Uno మధ్య UART కమ్యూనికేషన్ను కూడా తనిఖీ చేయండి.