שְׁאֵלָה:
מדוע הקוד שלי לא פועל בפונקציה, אך עובד בצורה מקוונת?
Joris Groosman
2015-05-10 16:18:45 UTC
view on stackexchange narkive permalink

אני מנסה לכתוב פונקציה shiftOut מהירה יותר, שאינה משתמשת ב digitalWrite איטי . בקוד שלי יש לי את shiftOut המקורי, את shiftOutFast החדש, וזהה ל- shiftOutFast, אך מוטבע. שלושת הבלוקים מופרדים על ידי עיכובים כדי להבדיל ביניהם על היקפי. הנה הקוד:

  #define CLR (x, y) (x & = (~ (1 << y))) #define SET (x, y) (x | = (1 << y)) חלל shiftOutFast (uint8_t dataPort, uint8_t dataBit, uint8_t clkPort, uint8_t clkBit, uint8_t bitOrder, uint8_t val) {for (uint8_t i = 0; i < 8; i ++ST) = if = bit & 0x01) {SET (dataPort, dataBit); } אחר {CLR (dataPort, dataBit); } val >> = 1; } אחר {if (val & 0x80) {SET (dataPort, dataBit); } אחר {CLR (dataPort, dataBit); } val << = 1; } CLR (clkPort, clkBit); SET (clkPort, clkBit); }} # הגדר dataPin 4 # הגדר שעון PIN 5 # הגדר dataPort PORTD # הגדר dataBit PORTD4 # הגדר שעון PORTD # הגדר clockBit PORTD5 הגדרת () {pinMode (dataPin, OUTPUT); pinMode (clockPin, OUTPUT);} loop loop () {shiftOut (dataPin, clockPin, LSBFIRST, 0x55); עיכוב (1); shiftOutFast (dataPort, dataBit, clockPort, clockBit, LSBFIRST, 0x5C); עיכוב (1); bool bitOrder = LSBFIRST; uint8_t val = 0x5C; עבור (uint8_t i = 0; i < 8; i ++) {if (bitOrder == LSBFIRST) {if (val & 0x01) {SET (dataPort, dataBit); } אחר {CLR (dataPort, dataBit); } val >> = 1; } אחר {if (val & 0x80) {SET (dataPort, dataBit); } אחר {CLR (dataPort, dataBit); } val << = 1; } CLR (clockPort, clockBit); SET (clockPort, clockBit); } עיכוב (1); }  

הבעיה היא שקריאה ל- shiftOutFast לא מתרחשת בזילק. בהחלט שום דבר. נראה שזה לא ההיגיון, כי כשאני עושה את אותו המובנה זה עובד. יש רעיונות?

שתיים תשובות:
Majenko
2015-05-10 17:50:09 UTC
view on stackexchange narkive permalink

הבעיה היא שאתה מעביר את ערך היציאות לפונקציה, ולא את הכתובת של היציאות.

אתה צריך להעביר "לפי הפניה" או כמצביע, כדי לשנות משתנה היציאה משנה את משתנה היציאה בפועל ולא את עותק הערך שאתה מעביר.

הדרך הפשוטה ביותר היא לשנות את הפונקציה שלך כך שהיא תהיה:

  void shiftOutFast (נדיף uint8_t &dataPort, uint8_t dataBit, נדיף uint8_t &clkPort, uint8_t clkBit, uint8_t bitOrder, uint8_t val) {....}   נמצא ביציאה בזמן לפונקציה (לעבור לפי ערך) היא יוצרת במקום משתנה חדש שנמצא באותה כתובת כמו המשתנה שאתה מעביר (לעבור לפי הפניה) ולכן שינויים של משתנה אחד משנים את השני. / p> 

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

Edgar Bonet
2015-05-10 17:02:41 UTC
view on stackexchange narkive permalink

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

אתה מתכוון ל- `void shiftOutFast (נדיף uint8_t dataPort, נדיף uint8_t dataBit, נדיף uint8_t clkPort וכו '...? ניסיתי את זה אבל זה לא פותר את הבעיה.
רק את הנמלים, וכפי שאמר @Majenko, עליך להעביר אותם בהפניה.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...