Hi,
ich habe eine eine serielle Datenübertragung (unidirektional) über
Infrarot realisiert. Auf der Sendeseite wird mein rs232-Signal direkt
auf 38kHz aufmoduliert und am µC (atmega88-20PU) hängt an Pin2 ein
TSOP31238.
Dazu habe ich mir ein Programm in c# geschrieben, mit dem ich beliebige
Daten senden kann. Solange ich nur 1 Byte mit kurzer Pause sende,
funktioniert es wunderbar:
1 | for( int i = 0; i<3; i++)
|
2 | {
|
3 | serialPort.Write(new byte[] { Convert.ToByte(i) }, 0, 1);
|
4 | Thread.Sleep(5); //5ms nix tun
|
5 | }
|
Wenn ich aber mehrere Bytes auf einmal senden möchte, werden maximal 3
Bytes richtig verarbeitet.
1 | serialPort.Write(new byte[] { 0x00, 0x01, 0x02 }, 0, 3);
|
Wenn ich mehr sende, kann ich nicht sagen, was davon tatsächlich
verarbeitet wird.
Das sieht für mich so aus, als ob der µC mit der Verarbeitung nicht
schnell genug hinterherkommt.
Ich benutze einen Quarz mit 7,3728MHz, die Fuse-Bits für die Taktrate
sind deaktiviert bis auf CKSEL3 (CHKDIV8 ist auch deaktiviert). Somit
sollte der µC auch mit 7,3728 MHz getaktet sein. Als Baudrate verwende
ich 2400 Baud, 1 Startbit, 8 Datenbits, 1 Paritätsbit, 2 Stopbit.
Wenn ich richtig rechne, komme ich somit auf eine Übertragungszeit für 1
Byte von 0,0045s. In dieser Zeit hat der µC etwa 3000 Zyklen. Das
AVR-Studio zeigt mir an, dass es für die komplette Ausführung der
Interrupt-routine etwa 200 Zyklen braucht.
Kann mir jemand vielleicht weiterhelfen?
Den Quellcode von der Interrupt-Routine habe ich im Moment leider nicht
zur Verfügung. Ich werde ihn, wenn gewünscht, heute Abend einstellen.