Moin! Ich habe folgende ISR geschrieben: SIGNAL(SIG_UART_RECV) { instring[Buff++] = UDR; } Kann es sein, dass die zu langsma ist, um auf vier sehr kurz hintereinander folgende Bytes bei 9600 Baud zu reagieren? Wie würde eine schneller (ASM?) aussehen? Vielen Dank im Vorraus Rahul
Sieh Dir doch einfach das Assemblerlisting an und zähl die Befehle. Deinen Quarztakt kennst Du ja und schon hast Du die Abarbeitungszeit raus. Die Baudrate kennst Du auch und damit wie lange ein Byte dauert. Nun vergleiche beides miteinander. Peter
So, ich habe mir den ASM-Code angeguckt. Die ISR geht von 5C bis 9B als insgesamt 3F Taktperioden(63 µs). Der µC hat eine Frequenz von 4MHz und somit eine Verarbeitungszeit von 0,25µs pro Anweisung (1Byte). Ein komplettes Byte bei 9600 Baud hat eine Länge von 1,04ms als 1040µs. Somit wäre es dem AVR möglich, während der Übertragung eines Byte 977 Anweisungen auszuführen. Aber leider verschluckt er immer das Startbit des letzten Byte, und empfängt es deswegen wohl auch nicht. Ich werde mich jetzt wohl doch zu einer ASM-Routine durchschlagen müssen. Schönen Gruß Rahul
"Ich werde mich jetzt wohl doch zu einer ASM-Routine durchschlagen müssen." Das wird Dir bloß nichts nützen. Du hast doch erkannt, daß Du nur 63µs jede 1040µs brauchst, also keinerlei zeitliche Probleme hast. Dann muß es ein anderer Fehler sein und den must Du finden (z.B. Anzahl der Daten-,Stopbits, Baudrate, Parity). Peter
Hallo Peter! Lesen bildet! Hätte ich mich etwas genauer mit AVR-Studio und dem dazugehörenden Handbuch beschäftigt, wäre mir auchfgefallen, dass der AVR gar nicht mit 4MHz, sondern nur mit 3,69MHz betrieben wird. Sämtliche ISR funktionieren jetzt einwandfrei! Danke noch mal. Schönen Gruß Rahul
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.