-         

Ergebnis 1 bis 5 von 5

Thema: Probleme mit Array auslesen - falsche Werte

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315

    Probleme mit Array auslesen - falsche Werte

    Anzeige

    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:

    Code:
    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:

    Code:
    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:

    Code:
    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:
    Code:
    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

  2. #2
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Oder kann das vielleicht auch etwas mit der Optimierung zu tun haben? Benutze momentan -O1...

    MfG, Ozzy

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    Hat wirklich niemand von Euch eine Idee? An der Optimierung scheint es auf jeden Fall nicht zu liegen...

    MfG, Ozzy

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    20.05.2006
    Ort
    Lippe
    Alter
    48
    Beiträge
    524
    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

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.03.2005
    Ort
    Lübeck
    Beiträge
    315
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •