Hallo Ruppi,
hatte einen Totalausfall des PC's. Jetzt kann ich wieder.
Ich würde wie folgt vorgehen:
Zunächst nur die Übertragung testen, d.h. keine Meßwerte auslesen, sondern einfach nur fortlaufende Zahlen schicken. Kommen alle an oder gibt es Aussetzer? Wie hoch ist die Übertragungsrate?
Dann Timerwerte senden. Kommen die gleichmäßig an oder gibt es Lücken?
Du sprichts von "Handshake". Meinst du eine eigenes z.B. Blocksicherung, CRC o.ä. oder ein Hardware-Handshake (CTS/RTS etc)? Kann dich dabei der Empänger "ausbremsen", d.h. der kommt nicht genügend schnell mit der Verarbeitung klar und gibt die Verbindung nicht frei? Ich hatte bei einem Übertragungsprogramm festgestellt, dass der Thread, der die Daten abnimmt, nur etwa alle 13 mSec zu Zuge kommt. Bei der hohen Datenübertragung kann es sein, dass die internen Puffer überlaufen.
Ist dein Code zu lang? Du hast pro Byte nur ca. 180 Takte (18 Mhz Takt / 1 Mbps * 10 Bit).
Hast du eine ähnlich einfache Sende-Routine wie die folgende?
Code:
void SerialWrite(unsigned char *data, unsigned char length)
{
unsigned char i = 0;
while (length > 0) {
if (UCSRA & 0x20) { // wait for empty transmit buffer
UDR = data[i++];
length --;
}
}
}
Diese benötigt ca. 40 Takte. Achte auf die Routine zum Auslesen des AD-Wandlers. Da muss es eine Schleife geben, die für jedes Bit einmal durchlaufen wird, also 12 mal.
Gruß Redbaron.
Lesezeichen