Variable in Interrupt verändern

OP #1955550
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:
1
struct {
2
  unsigned start;
3
  unsigned stop;
4
  unsigned record;
5
  unsigned summertime;
6
  unsigned gps_quali;
7
  unsigned uart;
8
} status;

status.uart soll in der ISR gesetzt werden und mein Flag für neue Daten 
darstellen.
1
SIGNAL(UART0_RECEIVE_INTERRUPT)
2
/*************************************************************************
3
Function: UART Receive Complete interrupt
4
Purpose:  called when the UART has received a character
5
**************************************************************************/
6
{
7
    unsigned char tmphead;
8
    unsigned char data;
9
    unsigned char usr;
10
    unsigned char lastRxError;
11
 
12
   status.uart = 1; //Fürs Hauptprogramm
13
 
14
    /* read UART status register and UART data register */ 
15
    usr  = UART0_STATUS;
16
    data = UART0_DATA;
17
    
18
    /* */
19
#if defined( AT90_UART )
20
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
21
#elif defined( ATMEGA_USART )
22
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
23
#elif defined( ATMEGA_USART0 )
24
    lastRxError = (usr & (_BV(FE0)|_BV(DOR0)) );
25
#elif defined ( ATMEGA_UART )
26
    lastRxError = (usr & (_BV(FE)|_BV(DOR)) );
27
#endif
28
        
29
    /* calculate buffer index */ 
30
    tmphead = ( UART_RxHead + 1) & UART_RX_BUFFER_MASK;
31
    
32
    if ( tmphead == UART_RxTail ) {
33
        /* error: receive buffer overflow */
34
        lastRxError = UART_BUFFER_OVERFLOW >> 8;
35
    }else{
36
        /* store new index */
37
        UART_RxHead = tmphead;
38
        /* store received data in buffer */
39
        UART_RxBuf[tmphead] = data;
40
    }
41
    UART_LastRxError = lastRxError;   
42
}

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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.