Mein vollständiger Code befindet sich hier .
Grundsätzlich übertrage ich an ein Arduino und erhalte nicht den richtigen Wert (Sie werden feststellen, dass ich versuche, d'22' zu senden). Hier ist die Methode, bei der ich die Übertragung tatsächlich gebissen habe:
// Method for transmitting value using serial bit banging
void uart_tx_bit_bang(unsigned char val) {
unsigned char i;
Tx_Pin = 0; // Start bit
uart_time_delay();
for ( i = 8 ; i != 0 ; --i ) {
if (val & 0x01) Tx_Pin = 1; // Begin with LSB
else Tx_Pin = 0;
val >>= 1;
uart_time_delay();
}
Tx_Pin = 1; // Stop bit
uart_time_delay();
}
Da die Verzögerung 1/Baud betragen sollte, uart_time_delay()
sollte eine Verzögerung von 104 us vorliegen. Ich verwende __delay_us(104)
aus den PIC-Bibliotheken. Jede Hilfe hierzu wird sehr geschätzt.
Ich bin mir sicher, dass ich an beiden Enden die richtige Baudrate verwende.
Während Ihre Berechnung von 104 uS für 9600 BPS korrekt ist, wird Ihre Schleife und die verschiedenen Operationen, die sie ausführt, eine zusätzliche Verzögerung hinzufügen. Es gibt ein paar Möglichkeiten, wie Sie das Timing optimieren können:
Subtrahieren Sie eine Konstante von Ihrer US-Verzögerung, bis sie zu arbeiten beginnt. Es ist wahrscheinlich am besten, die minimale / maximale Anzahl zu bestimmen, mit der es funktioniert, und den mittleren Wert auszuwählen.
Machen Sie etwas Ähnliches mit einem Oszilloskop, um das endgültige Timing zu überprüfen, falls Sie eines zur Verfügung haben.
Sehen Sie sich die Assembler-Ausgabe des Compilers an und bestimmen Sie, wie viele Zyklen die Schleife benötigt.
Ich sehe auch, dass Sie die RC-Uhr verwenden. Normalerweise halte ich mein serielles Timing für einen zuverlässigen Betrieb gerne innerhalb von 2%, also überprüfen Sie auch, ob das Teil so viel Stabilität hat, wenn Sie die RC-Uhr für einen zuverlässigen Betrieb verwenden.
uart_time_delay()
Routine überhaupt verzögert. Ich verwende die eingebaute __delay_us()
Methode. Irgendwelche Gedanken dazu? Wie kann ich eine zuverlässigere Verzögerung in C erreichen? Ich brauche 1/Baud
PeterJ
Markierungen
Gorloth
Willem Ellis
PeterJ
Willem Ellis
Engelgroß
Engelgroß
Willem Ellis
Engelgroß
Willem Ellis
Tx_Pin
auf dem PIC mit Rx auf dem Arduino verbunden.Markierungen
Engelgroß