Hallo erstmal, ich habe ein Problem mit meinem Programm und verstehe einfach nicht wodurch der Fehler entsteht. Vielleicht hat ja jemand von euch erfahren damit. Es geht um folgendes: Mein Programm liest alle 200us einen Sensorwert von einem 16bit AD-Wandler über die SPI-Schnittstelle ein und speichert den Wert in einem Ringpuffer,welcher im externen RAM (32KB) liegt. Das einlesen der Werte und abspeichern wird über ISR realisiert. Die gespeicherten Werte werden über die USART1 an den PC gesendet. Folgendes Problem tritt nun auf: Während des Einlesen der Werte und des Füllens des Ringpuffers sind die meisten der über USART gesendeten Werte Schwachsinn. Wenn der Ringpuffer voll ist wird zwar der Interrupt der SPI Schnittstelle noch ausgelößt, aber kein neuer Wert mehr abgespeichert. Ab diesem Zeitpunkt kommen dann konstant gültige Werte am PC an. Genauso sind alle vom PC empfangenen Werte gültig/richtig wenn ich mit der Übertragung warte bis der Ringpuffer gefüllt wurde und kein Wert mehr hineingeschrieben wird. Bin ratlos wieso das so ist... Hier der relevante Code: (unvollständig) Initialisierungen: ...
1 | #define top 0x7DC0
|
2 | #define bottom 0x2000
|
3 | |
4 | volatile typedef struct SData |
5 | {
|
6 | uint8_t Sensorvalue_high; |
7 | uint8_t Sensorvalue_low; |
8 | uint8_t Zeitstempel1; |
9 | uint8_t Zeitstempel2; |
10 | uint8_t Zeitstempel3; |
11 | uint8_t Zeitstempel4; |
12 | }Sensordaten; |
13 | |
14 | volatile Sensordaten * Schreibpointer= NULL; |
15 | volatile Sensordaten * Lesepointer= NULL; |
16 | volatile Sensordaten * Hilfspointer= NULL; |
17 | volatile Sensordaten * bottompointer= NULL; |
18 | volatile Sensordaten * toppointer= NULL; |
19 | |
20 | |
21 | Schreibpointer = (Sensordaten *)bottom; |
22 | Lesepointer = (Sensordaten *)bottom; |
23 | toppointer= (Sensordaten *)top; |
24 | bottompointer =(Sensordaten *)bottom; |
...
1 | ISR(SPI_STC_vect) |
2 | {
|
3 | //Ruft die Schreibfunktion auf um den Wert aus dem SPI-Dataregister in den Ringpuffer zu übertragen
|
4 | if (error == 0) |
5 | {
|
6 | //Einlesen des High-Byte des Sensorwerts und starten der Übertragung des Low-Bytes
|
7 | |
8 | (Schreibpointer->Sensorvalue_high) = SPDR; |
9 | SPDR=0; |
10 | //Einlesen des Low-Byte des Sensorwerts
|
11 | //warten bis LOW Byte übertragen ist
|
12 | while ( !( SPSR & (1<<SPIF)) ); |
13 | Schreibpointer->Sensorvalue_low = SPDR; |
14 | //Zeitstempel zu Wert abspeichern
|
15 | Schreibpointer->Zeitstempel1 = Zeit>>24; |
16 | Schreibpointer->Zeitstempel2 = Zeit>>16; |
17 | Schreibpointer->Zeitstempel3 = Zeit>>8; |
18 | Schreibpointer->Zeitstempel4 = Zeit; |
19 | //Ringpuffermanagment
|
20 | Schreibpointer++; |
21 | Anzahl_Pufferelemente++; |
22 | if (Schreibpointer == toppointer) Schreibpointer=bottompointer; |
23 | |
24 | if ((Schreibpointer == Lesepointer)&&(Anzahl_Pufferelemente != 0)) |
25 | {
|
26 | //Überlauf-Fehler: Rote LED zeigt Fehler an
|
27 | PORTF |= (1<<PF1); |
28 | error = 1; |
29 | };
|
30 | };
|
31 | }
|
...
1 | int main(void) |
2 | {
|
3 | |
4 | //ruft sie Initialisierung des uC (USART, Timer, SPI etc auf)
|
5 | |
6 | Haupt_init(); |
7 | |
8 | |
9 | while (1) |
10 | {
|
11 | if (Anzahl_Pufferelemente > 0) |
12 | {
|
13 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
14 | UDR1 = (Lesepointer->Sensorvalue_high); |
15 | TCCR1B |= (1<<CS12); |
16 | PORTF |= (1<<PF3); |
17 | |
18 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
19 | UDR1 = (Lesepointer->Sensorvalue_low); |
20 | |
21 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
22 | UDR1 = (Lesepointer->Zeitstempel1); |
23 | |
24 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
25 | UDR1 = (Lesepointer->Zeitstempel2); |
26 | |
27 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
28 | UDR1 = (Lesepointer->Zeitstempel3); |
29 | |
30 | while ( !( UCSR1A & (1<<UDRE1)) || (PIND & (1<<PIND1)) ); |
31 | UDR1 = (Lesepointer->Zeitstempel4); |
32 | Lesepointer++; |
33 | |
34 | if (Lesepointer == toppointer) Lesepointer = bottompointer; |
35 | Anzahl_Pufferelemente--; |
36 | };
|
37 | };
|
38 | }
|