Ozzy
03.01.2008, 12:13
Hi,
über eine ISR empfange ich einzelne Bits, und setze diese dann zu einem
Byte zusammen. Ist das Byte vollständig, so wird es in ein Array
geschrieben, und in einem 2ten Array ein Flag gesetzt, dass in dem
entsprechenden Feld ein neues Byte bereit liegt:
if ( receivedBit == 1 ) receivedByte |= (1<<receivedByteDigit);
else receivedByte &= ~(1<<receivedByteDigit);
lastBit = receivedBit;
if ( receivedByteDigit == 7 ) {
bytes[bytescounter] = receivedByte;
bytesready[bytescounter] = 1;
if ( bytescounter == 255 ) bytescounter = 0;
else bytescounter++;
receivedByteDigit = 0;
} else receivedByteDigit++;
In der main-Routine warte ich dann quasi darauf:
cli();
if ( bytesready[bytescounter] == 1 ) {
receivedChar = bytes[bytescounter];
bytesready[bytescounter] = 0;
newByte = 1;
if ( bytescounter == 255 ) bytescounter = 0;
else bytescounter++;
}
sei();
Und gebe es über UART aus:
if (newByte == 1) {
uart_sendchar( receivedChar );
newByte = 0;
}
Doch sind die Zeichen, die ich bekomme vollkommen für die Grütze! Schreibe ich aber die Daten in der Main-Datei so um:
cli();
receivedChar = bytes[0];
sei();
uart_sendchar( receivedChar );
Dann rauscht immer das erste Zeichen durch, und nach einiger Zeit ist es auch "stabil". Das bedeutet zum Beispiel:
Sende ich ein "g", und lasse das durchlaufen, bekomme ich 4 Smilies, 3
Herzen und 4 Hochkomma, bevor das erste g kommt.
Beim "h" sind es mal 3, mal 4 offnende Klammern, bevor das erste h
kommt. Beim "m" steht ein "---" vorm ersten m...
Aber woran liegt das? Dauert das Schreiben echt so lange? Denn
eigentlich wird ja erst das Zeichen ins Array geschrieben, und dann das
Flag gesetzt, dass ein Zeichen da ist, also daran liegt es auch nicht...
Die Array's sind natürlich als volatile gesetzt, und im Header der Interrupt-Datei als extern deklariert, um von der main-Metode drauf zugreifen zu können.
Als Hardware habe ich einen Atmega128 mit 14,7456Mhz. Der Empfang eines Zeichens dauert 4ms, dementsprechend selten ist auch das Schreiben ins Array.
Ich bin echt ratlos; könnt Ihr mir sagen, woran das liegt, oder ich wie ich das verhindern
kann???
MfG, Ozzy
über eine ISR empfange ich einzelne Bits, und setze diese dann zu einem
Byte zusammen. Ist das Byte vollständig, so wird es in ein Array
geschrieben, und in einem 2ten Array ein Flag gesetzt, dass in dem
entsprechenden Feld ein neues Byte bereit liegt:
if ( receivedBit == 1 ) receivedByte |= (1<<receivedByteDigit);
else receivedByte &= ~(1<<receivedByteDigit);
lastBit = receivedBit;
if ( receivedByteDigit == 7 ) {
bytes[bytescounter] = receivedByte;
bytesready[bytescounter] = 1;
if ( bytescounter == 255 ) bytescounter = 0;
else bytescounter++;
receivedByteDigit = 0;
} else receivedByteDigit++;
In der main-Routine warte ich dann quasi darauf:
cli();
if ( bytesready[bytescounter] == 1 ) {
receivedChar = bytes[bytescounter];
bytesready[bytescounter] = 0;
newByte = 1;
if ( bytescounter == 255 ) bytescounter = 0;
else bytescounter++;
}
sei();
Und gebe es über UART aus:
if (newByte == 1) {
uart_sendchar( receivedChar );
newByte = 0;
}
Doch sind die Zeichen, die ich bekomme vollkommen für die Grütze! Schreibe ich aber die Daten in der Main-Datei so um:
cli();
receivedChar = bytes[0];
sei();
uart_sendchar( receivedChar );
Dann rauscht immer das erste Zeichen durch, und nach einiger Zeit ist es auch "stabil". Das bedeutet zum Beispiel:
Sende ich ein "g", und lasse das durchlaufen, bekomme ich 4 Smilies, 3
Herzen und 4 Hochkomma, bevor das erste g kommt.
Beim "h" sind es mal 3, mal 4 offnende Klammern, bevor das erste h
kommt. Beim "m" steht ein "---" vorm ersten m...
Aber woran liegt das? Dauert das Schreiben echt so lange? Denn
eigentlich wird ja erst das Zeichen ins Array geschrieben, und dann das
Flag gesetzt, dass ein Zeichen da ist, also daran liegt es auch nicht...
Die Array's sind natürlich als volatile gesetzt, und im Header der Interrupt-Datei als extern deklariert, um von der main-Metode drauf zugreifen zu können.
Als Hardware habe ich einen Atmega128 mit 14,7456Mhz. Der Empfang eines Zeichens dauert 4ms, dementsprechend selten ist auch das Schreiben ins Array.
Ich bin echt ratlos; könnt Ihr mir sagen, woran das liegt, oder ich wie ich das verhindern
kann???
MfG, Ozzy