PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Array auslesen - falsche Werte



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

Ozzy
03.01.2008, 14:43
Oder kann das vielleicht auch etwas mit der Optimierung zu tun haben? Benutze momentan -O1...

MfG, Ozzy

Ozzy
04.01.2008, 08:24
Hat wirklich niemand von Euch eine Idee? An der Optimierung scheint es auf jeden Fall nicht zu liegen...

MfG, Ozzy

McJenso
04.01.2008, 16:47
Hallo,

g '
m -
h (

hier ist immer das 2. höchste Byte falsch. Ob es Sinnvoll ist die Arrays volatile zu deklarieren, weiß ich nicht. Die Variablen, die im Hauptprogramm und in der ISR verwendet werden, müssen volatile sein.

Mal ehrlich, ich weiß nicht wie es andren geht, aber ich finde durch die paar Codeschnipsel nicht durch. Poste doch mal den ganzen relevanten Code inkl. Variablen definitionen.
Mit welcher Baudrate wird über die RS232 gesendet? Kommt alle 4ms ein Zeichen über den Interrupt? Soll das ganze als Puffer dienen, oder wofür ist das Speichern im Array?

Gruß

Jens

Ozzy
04.01.2008, 18:19
Hi,

ich habe das Problem gelöst; der Fehler lag wohl irgendwie in dem cli(); und und sei();. Seit ich das rausgenommen habe, funktioniert es. Und ja, das Array dient dem Speichern, da es mir wichtiger ist, die Bytes zu empfangen, als über die serielle Schnittstelle wieder zu versenden...

Trotzdem vielen Dank noch einmal für Euer Kopfzerbrechen, Ozzy