במדריך זה אנו לומדים לאפשר תקשורת UART עם מיקרו-בקר PIC וכיצד להעביר נתונים למחשב שלך וממנו. עד כה, כיסינו את כל המודולים הבסיסיים כמו ADC, טיימרים, PWM וגם למדנו כיצד לממשק מסכי LCD ותצוגות 7 מגזרים. כעת, נצייד את עצמנו בכלי תקשורת חדש בשם UART אשר נמצא בשימוש נרחב ברוב פרויקטים של מיקרו-בקר. עיין כאן בהדרכות PIC המיקרו-בקר המלאות שלנו באמצעות MPLAB ו- XC8.
כאן השתמשנו ב- PIC16F877A MCU, יש לו מודול שנקרא "מקלט ומשדר אסינכרוני סינכרוני אוניברסלי שניתן להתייחס אליו" המכונה בקרוב USART. USART היא מערכת תקשורת דו-חוטית בה הנתונים זורמים באופן סדרתי. USART היא גם תקשורת דו-צדדית מלאה, כלומר ניתן לשלוח ולקבל נתונים בו-זמנית אשר באמצעותם ניתן לתקשר עם התקנים היקפיים, כגון מסופי CRT ומחשבים אישיים.
ניתן להגדיר את ה- USART במצבים הבאים:
- אסינכרוני (דופלקס מלא)
- סינכרוני - מאסטר (חצי דופלקס)
- סינכרוני - עבד (חצי דופלקס)
ישנם גם שני מצבים שונים שהם מצב 8 סיביות ו 9 סיביות, במדריך זה נגדיר את מודול ה- USART לעבוד במצב אסינכרוני עם מערכת תקשורת 8 סיביות, מכיוון שהוא סוג התקשורת הנפוץ ביותר. מכיוון שהוא אסינכרוני אין צורך לשלוח אות שעון יחד עם אותות הנתונים. UART משתמש בשתי קווי נתונים לשליחת (Tx) וקבלת (Rx) נתונים. יש גם להפוך את הקרקע של שני המכשירים למשותפת. תקשורת מסוג זה אינה חולקת שעון משותף ומכאן שקרקע משותפת חשובה מאוד למערכת העבודה.
בסוף הדרכה זו תוכל ליצור תקשורת (UART) בין המחשב שלך למיקרו-בקר PIC שלך ולהעביר נורית על לוח ה- PIC מהמחשב הנייד שלך. הסטטוס של ה- LED יישלח למחשב הנייד שלכם מ- PIC MCU. נבדוק את הפלט באמצעות Hyper Terminal במחשב. סרטון מפורט ניתן גם בסוף הדרכה זו.
דרישות:
חוּמרָה:
- לוח Perf. PIC16F877A
- מודול ממיר RS232 ל- USB
- מַחשֵׁב
- מתכנת PICkit 3
תוֹכנָה:
- MPLABX
- מסוף היפר
ממיר RS232 ל- USB נדרש להמרת הנתונים הטוריים לצורה קריאה במחשב. ישנן דרכים לעצב מעגל משלך במקום לקנות מודול משלך, אך הם אינם אמינים מכיוון שהם נתונים לרעש. זה שאנו משתמשים בו מוצג להלן
הערה: כל ממיר RS232 ל- USB ידרוש התקנת מנהל התקן מיוחד; רובם אמורים להתקין אוטומטית ברגע שתחבר את ההתקן. אבל, אם זה לא נרגע !!! השתמש בסעיף ההערות ואני אעזור לך.
תכנות מיקרו-בקר PIC לתקשורת UART:
כמו כל המודולים (ADC, טיימר, PWM) עלינו לאתחל גם את מודול ה- USART של ה- MCU PIC16F877A שלנו ולהורות לו לעבוד במצב תקשורת UART 8 סיביות. בואו נגדיר את סיביות התצורה ונתחיל בפונקציית האתחול של UART.
אתחול מודול ה- UART של מיקרו-בקר PIC:
סיכות ה- Tx וה- Rx קיימות פיזית בסיכות RC6 ו- RC7. על פי גיליון הנתונים בואו נכריז על TX כפלט ו- RX כקלט.
// **** הגדרת סיכות קלט / פלט עבור UART **** // TRISC6 = 0; // פין TX מוגדר כפלט TRISC7 = 1; // RX פין מוגדר כקלט // ________ I / O פינים מוגדרים __________ //
עכשיו צריך לקבוע את קצב השידור. קצב השידור הוא הקצב בו מועבר המידע בערוץ תקשורת. זה יכול להיות אחד מערכי ברירת המחדל הרבים, אך בתוכנית זו אנו משתמשים ב 9600 מכיוון שקצב השידור הנפוץ ביותר.
/ ** אתחל את רישום SPBRG לקצב שידור נדרש והגדר את BRGH לקצב מהיר מהיר ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // לקבלת שיעור גבוה של baud_rate // _________ הגדרת סוף baud_rate _________ //
יש לקבוע את ערך קצב השידור באמצעות SPBRG של הקופה, הערך תלוי בערך של תדר הגביש החיצוני, הנוסחאות לחישוב קצב השידור מוצגות להלן:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
יש להפוך את הסיבית BRGH לגובה כדי לאפשר קצב סיביות במהירות גבוהה. על פי גליון הנתונים (עמוד 13) תמיד כדאי להפעיל אותו, מכיוון שהוא יכול למנוע שגיאות במהלך התקשורת.
כפי שאמרתי קודם נעבוד במצב אסינכרוני, ומכאן קצת SYNC צריכה להיעשות אפס ונשך SPEM חייב להתבצע גבוהה כדי לאפשר סיכות סדרתי (TRISC6 ו TRICSC5)
// **** אפשר יציאה טורית אסינכרונית ******* // 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) {while (! TXIF); // החזק את התוכנית עד שמאגר TX יהיה חינם TXREG = bt; // טען את חיץ המשדר בערך המתקבל} // _____________ סוף הפונקציה ________________ //
לאחר אתחול המודול כל הערך שנטען במרשם TXREG יועבר באמצעות UART, אך השידור עשוי לחפוף. לפיכך עלינו תמיד לבדוק אם יש דגל הפרעה לשידור TXIF. רק אם הסיבית הזו נמוכה נוכל להמשיך עם הסיבית הבאה להעברה אחרת עלינו לחכות שהדגל הזה יירד.
עם זאת, ניתן להשתמש בפונקציה שלמעלה רק לשליחת בת אחד בלבד של נתונים, כדי לשלוח מחרוזת מלאה יש להשתמש בפונקציה שלמטה.
// ** פונקציה להמרת מחרוזת לבייט ** // בטל UART_send_string (char * st_pt) {בעוד (* st_pt) // אם יש UART_send_char (* st_pt ++); // לעבד אותו כנתוני בתים} // ___________ סוף הפונקציה ______________ //
פונקציה זו עשויה להיות מעט מסובכת להבנה מכיוון שיש לה מצביעים, אך תאמין לי שהמצביעים הם נפלאים והם הופכים את התכנות לקל יותר וזו דוגמה אחת טובה לאותו דבר.
כפי שאתה יכול להבחין התקשרנו שוב ל- UART_send_char () אך כעת בתוך לולאת ה- while. חילקנו את המחרוזת לתווים בודדים, בכל פעם שקוראים לפונקציה זו תשלח char אחת ל- TXREG והיא תועבר.
קבלת נתונים באמצעות UART:
ניתן להשתמש בפונקציה הבאה לקבלת נתונים ממודול ה- UART:
// ** פונקציה לקבלת תאריך תאריך אחד מ- UART ** // char UART_get_char () {if (OERR) // לבדוק שגיאה {CREN = 0; // אם שגיאה -> אפס CREN = 1; // אם שגיאה -> אפס} תוך כדי (! RCIF); // החזק את התוכנית עד שמאגר ה- RX הוא RCREG בחזרה חינם; // קבל את הערך ושלח אותו לפונקציה הראשית} // _____________ סוף הפונקציה ________________ //
כאשר נתונים מתקבלים על ידי מודול ה- UART הוא אוסף אותם ושומר אותו במרשם RCREG. אנו יכולים פשוט להעביר את הערך לכל משתנה ולהשתמש בו. אך עשויה להיות שגיאת חפיפה או שהמשתמש ישלח נתונים ברציפות ועדיין לא העברנו אותם למשתנה.
במקרה זה דגל ה- Receive bit RCIF בא להציל. סיבית זו תעבור נמוכה בכל פעם שנתקבל נתונים וטרם מעובד. לפיכך אנו משתמשים בו בלולאת הזמן ויוצרים עיכוב להחזקת התוכנית עד להתמודדות עם ערך זה.
החלפת נורית באמצעות מודול ה- UART של מיקרו-בקר PIC:
עכשיו בואו נגיע לחלק הסופי של התוכנית, הפונקציה הראשי הריק (הריק) , שם נעבור נורית דרך המחשב באמצעות תקשורת UART בין PIC למחשב.
כאשר אנו שולחים תו "1" (מהמחשב) נורית ה- LED תידלק והודעת הסטטוס "נורית אדומה -> דולקת" תישלח בחזרה (מ- PIC MCU) למחשב.
באופן דומה אנו שולחים תו "0" (מהמחשב) נורית ה- LED תכבה והודעת הסטטוס "נורית אדומה -> כבויה" תישלח בחזרה (מ- PIC MCU) למחשב.
בעוד (1) // לולאה אינסופית {get_value = UART_get_char (); אם (get_value == '1') // אם המשתמש שולח "1" {RB3 = 1; // הפעל את LED UART_send_string ("LED אדום -> דולק"); // שלח הודעה למחשב UART_send_char (10); // ערך ASCII 10 משמש להחזרת הובלה (להדפסה בשורה חדשה)} אם (get_value == '0') // אם המשתמש שולח "0" {RB3 = 0; // כבה את LED UART_send_string ("אדום -> כבוי"); // שלח הודעה למחשב UART_send_char (10); // ערך ASCII 10 משמש להחזרת הובלה (להדפסה בשורה חדשה)}}
מדמה את התוכנית שלנו:
כרגיל בואו לדמות את התוכנית שלנו באמצעות פרוטאוס ולגלות אם היא עובדת כצפוי.
התמונה לעיל מציגה מסוף וירטואלי שבו הוא מציג הודעת קבלת פנים ומצב הנורית. ניתן להבחין בנורת הצבע האדום המחוברת לסיכה RB3. את העבודה המפורטת של הסימולציה תוכלו למצוא בסרטון בסוף.
הגדרת חומרה ובדיקת הפלט:
החיבור למעגל זה הוא ממש פשוט, אנו משתמשים בלוח PIC Perf שלנו ופשוט מחברים את שלושת החוטים לממיר RS232 ומחברים את המודול למחשב שלנו באמצעות כבל נתונים USB כמוצג להלן.
לאחר מכן אנו מתקינים את היישום Hyper Terminal (מורידים אותו מכאן) ופותחים אותו. זה אמור להראות משהו כזה
כעת פתח את מנהל ההתקנים במחשב שלך ובדוק לאיזו יציאת Com המודול שלך מחובר, שלי מחובר ליציאת COM 17 כמוצג להלן
הערה: שם יציאת ה- COM של המודול שלך עשוי להשתנות בהתאם לספק שלך, זו לא בעיה.
עכשיו חזור ליישום Hyper Terminal ונווט אל הגדרת -> תצורת יציאה או לחץ על Alt + C, כדי לקבל את תיבת הקופץ הבאה ובחר את היציאה הרצויה (COM17 במקרה שלי) בחלון הקופץ ולחץ על התחבר.
לאחר שהחיבור נוצר, הפעל את לוח ה- PIC perf שלך וכדאי שתראה משהו כזה למטה
שמור את הסמן בחלון הפקודה והזן 1 ואז לחץ על Enter. נורית הנורית תידלק והמצב יוצג כמוצג להלן.
באותה דרך, שמור על הסמן בחלון הפקודה והזן 0 ואז לחץ על Enter. נורית ה- LED תכבה והמצב יוצג כמוצג להלן.
להלן הקוד הקודם והסרטון המפורט, אשר יראה כיצד ה- LED מגיב בזמן אמת עבור "1" ו- "0".
זהו זה, התממשנו עם PIC UART עם המחשב והעברנו את הנתונים כדי להחליף את ה- LED באמצעות מסוף Hyper. מקווה שהבנתם, אם לא, השתמשו בסעיף ההערות לשאילתכם. בהדרכה הבאה שלנו נשתמש שוב ב- UART אך נעשה את זה מעניין יותר באמצעות מודול Bluetooth ונשדר את הנתונים דרך האוויר.
בדוק גם תקשורת UART בין שני מיקרו-בקרים ATmega8 ותקשורת UART בין ATmega8 ו- Arduino Uno.