mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Variable in Interrupt verändern


Autor: Jochen R. (josch90)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

leider hat mir die Suche nicht die gewünschten ergebnisse gebracht, 
obwohl ich eigendlich davon ausgehe nicht der erste mit diesem Problem 
zu sein... Vielleicht fehlen mir auch nur die richtigen Stichworte :)

Ich Entwickle gerade ein Programmm, welches Daten eines GPS_Empfängers 
einlesen und auf einem Display ausgeben soll. Soweit funktioniert auch 
alles wie ich es mir vorstelle, nur mit dem Haken, das der Controller 
zwischen den einzelnen Datensätzen knapp eine Sekunde in einer 
Warteschleife hängt und auf die nächsten Daten wartet. Dies will ich 
umgehen, in dem ich in der ISR des Uart empfangs ein Flag setze und 
dieses in der Hauptschleife polle.

Zu meinem Problem:
Ich habe im Hauptprogramm folgende struct:
struct {
  unsigned start;
  unsigned stop;
  unsigned record;
  unsigned summertime;
  unsigned gps_quali;
  unsigned uart;
} status;

status.uart soll in der ISR gesetzt werden und mein Flag für neue Daten 
darstellen.
SIGNAL(UART0_RECEIVE_INTERRUPT)
/*************************************************************************
Function: UART Receive Complete interrupt
Purpose:  called when the UART has received a character
**************************************************************************/
{
    unsigned char tmphead;
    unsigned char data;
    unsigned char usr;
    unsigned char lastRxError;
 
   status.uart = 1; //Fürs Hauptprogramm
 
    /* read UART status register and UART data register */ 
    usr  = UART0_STATUS;
    data = UART0_DATA;
    
    /* */
#if defined( AT90_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#elif defined( ATMEGA_USART0 )
    lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
#elif defined ( ATMEGA_UART )
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
#endif
        
    /* calculate buffer index */ 
    tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;
    
    if ( tmphead == UART_RxTail ) {
        /* error: receive buffer overflow */
        lastRxError = UART_BUFFER_OVERFLOW >> 8;
    }else{
        /* store new index */
        UART_RxHead = tmphead;
        /* store received data in buffer */
        UART_RxBuf[tmphead] = data;
    }
    UART_LastRxError = lastRxError;   
}

Beim kompilieren kommt allerdings ein Error, dass "status.uart" 
undeclarated ist. Die UART-Routine stammt von Peter Fleury.

Wäre nett wenn mir jemand verraten könnte, wie ich die Variable dazu 
bringen kann, auch in der UART-Routine zu existieren. Das ein Volatile 
rein sollte ist mir übrigens bewusst, aber ich weis nicht wie ich dieses 
bei einem struct anwenden soll.

Ich hoffe ihr versteht mein Problem und könnt mir helfen.

Grüße aus dem winterlichen Heidelberg :)

Autor: Fritz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf jeden Fall schonmal ein volatile für Sachen, die in einer ISR 
verändert werden.

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
globale Variable nutzen

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass doch die Fleury Routinen in Ruhe!

Die getchar Funktion (oder wie die heißt) sagt dir perfekt, ob ein noch 
nicht verarbeitetes Zeichen im Buffer vorhanden ist oder nicht.
Da brauchst du nicht rumpfuschen. Du hast die Funktionalität schon. Du 
musst sie nur nutzen!

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe Interrupt.

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.