Nếu bạn đang muốn sử dụng truyền dữ liệu phần mềm, bạn không muốn sử dụng các chức năng digitalWrite. Chúng rất chậm, điều này là do chúng cần dịch số pin thông qua một bảng thành một thanh ghi thực tế (PORTx), che dấu đúng bit và thay đổi nó. Tất cả các chân trong arduino được ánh xạ tới các số, trong khi bên dưới chúng có thể thuộc về cổng A, B, C, và thậm chí nhiều hơn trên phiên bản MEGA của Arduino.
Nó nhanh hơn nhiều để sửa đổi trực tiếp các thanh ghi AVR. Chẳng hạn như PORTB và a-like. Bạn thực sự cần phải bước qua từng bit. Tôi sẽ tạo một vòng lặp for từ 0 đến 15 và thực hiện một số thay đổi và mặt nạ bit.
Bởi vì tôi không biết cấu hình ghim nên tôi không thể đưa ra một ví dụ chính xác. Tuy nhiên nó có thể sẽ trông rất gần với điều này. Với 'rất gần' tôi có nghĩa là điều này chưa được kiểm tra.
void ShiftOut(UI16_t data)
{
// Initialize (you may want to set CLK to low) - as we're toggling later on.
// step from bit 0 to 15
for(UI08_t i = 0; i < 15; i++)
{
// Check the content of this data bit
// Shift data so this bit is LSB, and mask it with 1 so we only look at this bit.
if ((data >> i) & 0x1 == 1)
{
// set data pin high, like PORTB |= 1<<4;
// when pin 4 of portB is your data pin
// Doing an OR will make pin B4 always high
}
else
{
// set data pin low, like PORTB &= ~(1<<4);
// Doing an AND with the inverse means all pins except B4 will be unchanged
}
// Generate clk to 'transfer' the bit:
// This can likely be done by using PORTB ^= 1 << 5; (pin B5 in this example)
// ^= toggle
// Do this TWICE, so CLK goes high/low
}
// as you're using a shift register, you may want to toggle LATCH pin as well..
}
Để tìm ra
số pin phần cứng nào (đừng cho rằng chân 4 là chân B4 hoặc A4!) Bạn cần xem sơ đồ của Arduino.
Tôi đã chạy một mã tương tự trên PIC32 (chạy ở tốc độ 80 MHz). PIC32 có thể thực hiện điều này ở khoảng 1,5 MHz, nhưng một vài dòng mã bổ sung đang chạy trong main () để tính toán một đầu ra mới. Tuy nhiên, nó có thể được thực hiện rất nhanh.