mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Interrupts, wie muss ich das hier machen


Autor: reflection (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Salu zusammen

Irgendwie drängen sich immer noch Fragen auf, ich weiss nicht genau ob 
ich da grundsätzlich einen Überlegungsfehler drin habe, oder ob es so 
einfach nicht funktionieren kann.

Folgendes:

Ich habe eine Interruptroutine die angesprochen wird wenn Zeichen im 
Uart RX reinkommen:

unsigned char nmeabuffer[512];

interrupt (UART1RX_VECTOR) usart1_rx(void)
    {
       _DINT();
          {
          nmeabuffer[j] = RXBUF1;
           j++;
       }
       _EINT();
    }

Im main habe ich dann einfach irgendwo gefragt

if(j > 505)
{
....
}

Nun ist mir das immer abgestürzt.

Habe es nun folgendermassen gelöst:

interrupt (UART1RX_VECTOR) usart1_rx(void)
    {
       _DINT();
       if(j < 505)
       {
          nmeabuffer[j] = RXBUF1;
           j++;
       }
       _EINT();
    }

if (j >= 504)
  {
  ....
         }

das läuft, aber ich frage mich ob das so richtig ist. Eigentlich möchte 
ich nicht irgendwann nachdem die 505 Zeichen im nmeabuffer erreicht sind 
den buffer verarbeiten sondern DIREKT nachdem er voll ist. Wie löse ich 
das? Ich programmiere auf einem MSP430 mit mspgcc

Danke schonmal im Voraus

Greets

Autor: Ronny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich vermute mal,das j ein Integer ist. Sonst wären nämlich nur 256 Byte 
im Puffer ansprechbar.

Lösung 1:

Woher weiß der Interrupt, dass dein Puffer voll ist? Richtig,garnicht. 
Und so wird munter alles Überschrieben was darin und dahinter im 
Speicher steht.

Lösung 2:

Das geht, da nur in den Speicher geschrieben wird, wenn j nicht ein 
Element hinter dem Array indiziert.

Grundsätzlich solltest du den Zugriff auf j in main() verriegeln. Was 
passiert denn, wenn in main gerade auf j zugegriffen wird und in mitten 
der Operation ein Interrupt auftritt der j hochzählt? Dann hast du 
vielleicht das niedere Byte von j angefangen zu verarbeiten und dann 
kommt der Interrupt und schreibt einen neuen Wert in j. Dann wären LOW 
und High-Part von j inkonsitent.

Das mit dem vollen Puffer kann man auch über ein Flag lösen, dass im 
Interrupt gesetzt wird, wenn der Puffer voll ist. Dann kann man anhand 
des Flags auch im Isr sehen, dass keine Daten mehr in den Puffer 
geschrieben werden dürfen. Angenehmer Nebeneffekt: Ein Byte-Zugriff muss 
dann auch nicht zwingend verriegelt werden.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll denn _DINT und _EINT in einem Interrupt? Das ist Unsinn und 
ggf. auch schädlich. Lass es weg!

MFG
Falk

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.