חומרה Xor עבור סיכות פלט על Microcontrollers AVR

May 20, 2022 category

האם ידעת שבבי AVR רבים יש סוג של חומרה בלעדי או (Xor) אפשרות כאשר הוא נוגע לרמות ההיגיון של סיכות הפלט? אם אתה מסתכל בגיליון הנתונים (התמונה שלמעלה היא צילום מסך מגיליון נתונים של Attiny13), תמצא קטע על הצמד. מתברר שאם אתה מגדיר יציאה כפלט, כתיבת לוגיקה אחת לרשום הפין המתאים תתחליף את רמות ההיגיון של זה. זה באמת קל להזניח אם אתה כותב ב C, אבל אני כבר עובד על למידה קצת של שפה אסמבלר ומצאתי את זה מאוד שימושי. תמשיכו לקרוא אחרי ההפסקה ואני אגיד לך איך אני קרה על מידע זה ומה זה טוב.

אז ראשית, בוא נדבר למה זה לא משנה מאוד אם אתה כותב בקוד C. בדרך כלל אם אתה רוצה לעבור כמה סיכות פלט אתה רק לכתוב אניה אחד כי xor של עם bitmask:

1.
Portb ^ = 0xff;

זהו קצת קצרון (למד הרבה יותר על זה מתוך סדרת הדרכה שלי) שמבצעת את xor על רמות הפלט הנוכחי וכותב את התוצאה בחזרה ליציאה. אבל אותו דבר ניתן לעשות בחומרה על ידי כתיבת bitmask כדי להירשם Pinb:

1.
Pinb = 0xff;

אתה לא ממש אכפת, כי זה רק שורה אחת של קוד. למעשה זה כנראה פשוט יותר Xor את הפורט כי זה עושה הרבה יותר הגיוני מבחינה מושגית. אבל המהדר עלול בסופו של דבר באמצעות הרבה יותר מחזורים מאשר אם כתבת לרשום PIN.

התרחשתי על פני תכונה זו כי הייתי מהבהב כמה נוריות כדרך ללמוד אסמבלר. היה לי ערבוב של קוד בשגרת שירות פסיקה:

1.
2.
3.
4.
LDI Myreg, 0xff
ב Intreg, Portb
EOR INGREG, Myreg
OUT PORTB, ENTRES

זה טוען bitmask לתוך רישום אחד, נטען ההיגיון הנוכחי של PORTB לרשום אחר, מבצע Xor של השניים, וכותב את התוצאה חזרה לפורט. זה לוקח ארבעה מחזורים דורש שני רושמים. החלפת סיביות היא כזה מבצע ראשוני הייתי מופתע לא היה פקודה של Xor Bits ישירות אז התחלתי לחפש מסביב. נתקלתי במאמר קצר זה ב AVR Freaks אשר חקרו אותי לתוך התכונה bit toggle. עכשיו הצלחתי להפחית את קוד האסמבלר שלי כדלקמן:

1.
2.
LDI Intreng2, 0xff; temmmentarity להשתמש intreg2 כמו מסכה קצת
מחוץ Pinb, Intreg2; כתיבה כדי Pinb Effectivley עושה בלעדי או ב portb

התוצאה היא באותו אפקט מחליף, אבל לוקח רק שני מחזורים דורש שימוש רק הרשמה אחת.

מה שמצאתי הרבה מעניין הוא שלא משנה כמה אני משתמש שבבי AVR, לא מחסור בהפתעות הממתינות להימצא בגיליון הנתונים.

Leave a Reply

Your email address will not be published. Required fields are marked *