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