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


von Jochen R. (josch90)


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

von Fritz (Gast)


Lesenswert?

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

von ... (Gast)


Lesenswert?

globale Variable nutzen

von Karl H. (kbuchegg)


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!

von Falk B. (falk)


Lesenswert?

Siehe Interrupt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.