Wenn Sie eine Software-Datenübertragung verwenden möchten, möchten Sie die Funktionen digitalWrite nicht verwenden. Sie sind sehr langsam, weil sie die Pin-Nummer durch eine Tabelle in ein tatsächliches Register (PORTx) übersetzen, das richtige Bit maskieren und es ändern müssen. Alle Pins in Arduino sind Zahlen zugeordnet, während sie darunter zu Port A, B, C und noch mehr der MEGA-Version des Arduino gehören können.
Es ist viel schneller, die AVR-Register direkt zu ändern. Wie PORTB und a-like. Sie müssen in der Tat jedes Bit durchgehen. Ich würde eine for-Schleife von 0 bis 15 erstellen und ein bisschen verschieben und maskieren.
Da ich die Pinning-Konfiguration nicht kenne, kann ich kein genaues Beispiel nennen. Allerdings wird es wahrscheinlich sehr ähnlich aussehen. Mit "sehr nah" meine ich, dass dies nicht getestet wurde.
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..
}
Um herauszufinden, welche
Hardware-Pin-Nummer (Pin 4 nicht Pin B4 oder A4!) Ist, müssen Sie sich das Schema von Arduino ansehen.
Ich habe einen ähnlichen Code auf einem PIC32 ausgeführt (läuft mit 80 MHz). Der PIC32 konnte dies bei etwa 1,5 MHz tun, aber in main () wurden einige zusätzliche Codezeilen ausgeführt, um eine neue Ausgabe zu berechnen. Trotzdem kann es sehr schnell gehen.