אני מנסה לכתוב פונקציה 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
לא מתרחשת בזילק. בהחלט שום דבר. נראה שזה לא ההיגיון, כי כשאני עושה את אותו המובנה זה עובד. יש רעיונות?