Forum: Compiler & IDEs struct array nimmt daten nicht an -help


von Patrick K. (kaplan)


Angehängte Dateien:

Lesenswert?

Hallo,

ich hab ein ganz komisches problem. der Code unten funktioniert ab und 
zu aber nicht immer. ich hab ein screenshot von der uebertragung im 
anhang. Es wird 0xDDDD gesendet. danach eine Zahl wieviele Pakete meines 
Structs folgen. die pakete sollten immer folgende Form haben:
0xAABBCC
manchmal klappt, manchmal nicht. und ich find den fehler nicht.
WinAVR 20070122, AVRSTUDIO 4.13Build528
wenn ich folgende Zeile
1
SPI_data[SPI_i].ADC_value = 0xAA;    // <= ist nur ein test
durch
1
SPI_data[SPI_i].ADC_value = data2[i];   //<= so sollte es sein
ersetze, dann kommen nur noch 0x00 !?!?!???

bitte um hilfe...
gruss
Patrick

1
typedef struct {
2
  uint8_t x_coord;
3
  uint8_t y_coord;
4
  uint8_t ADC_value;
5
} SPI_data_type;
6
7
uint8_t SPI_packets_to_send;
8
uint8_t SPI_i;
9
10
SPI_data_type SPI_data[16];    
11
SPI_data_type test;
12
13
14
/*********
15
  main
16
*********/
17
18
int main(){
19
  sei();
20
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
21
  
22
  while(1) {
23
    ADC_8Channels(data1_p);             //fuellen des arrays #1
24
    
25
    ADC_8Channels2(data2_p);            //fuellen des arrays #2 
26
27
    SPI_i = 0;
28
    
29
    test.ADC_value = 0xAB;
30
    test.x_coord = 0xCD;
31
    test.y_coord = 0xEF;       // das hier klappt wunderbar
32
33
    
34
    for (i=0; i<8; i++){
35
      if (data2[i]<ADC_threshold) {
36
          SPI_data[SPI_i].ADC_value = 0xAA; //data2[i];
37
          SPI_data[SPI_i].x_coord = 0xBB;    //def_coord_x + i;
38
          SPI_data[SPI_i].y_coord = 0xCC;    //def_coord_y + 1;
39
          SPI_i++;
40
      }      
41
    }
42
    
43
    SPI_packets_to_send=SPI_i;
44
        
45
    _delay_ms(200);
46
    uart_putc(0xDD);                           //damit ich weiss wann es los geht
47
    uart_putc(0xDD);
48
    uart_putc(SPI_packets_to_send);            //wieviele pakete a 3 byte werden geschickt.
49
    
50
    for (i=0; i<SPI_packets_to_send; i++){        // dies ausgabe klappt ab und zu aber nicht immer
51
      uart_putc(SPI_data[SPI_i].ADC_value);
52
      _delay_ms(200);  
53
      uart_putc(SPI_data[SPI_i].x_coord);
54
      uart_putc(SPI_data[SPI_i].y_coord);
55
      _delay_ms(200);
56
    }
57
                uart_putc(test.ADC_value);       //diese ausgabe klappt wunderbar
58
    uart_putc(test.x_coord);
59
    uart_putc(test.y_coord);    
60
  }
61
}

  

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Ich finde die Definition von data2[] in deiner Source nicht (um 
Bufferoverflow und Inhalt zu checken).

Auch scheinen includes zu fehlen bzw. es ist ungewöhnlich, dass keine 
vorhanden sind.

von Patrick K. (kaplan)


Lesenswert?

Oh man, ich hab den Fehler gefunden. NEVER EVER COPY PASTE 
PROGRAMMING!!!
1
for (i=0; i<SPI_packets_to_send; i++){
2
      uart_putc(SPI_data[i].ADC_value);    //<= i nicht SPI_i!!!!!;
3
      _delay_ms(200);  
4
      uart_putc(SPI_data[i].x_coord);      //<= i nicht SPI_i!!!!!;
5
      uart_putc(SPI_data[i].y_coord);      //<= i nicht SPI_i!!!!!;
6
      _delay_ms(200);
7
    }

Allerdings ist noch ein Punkt offen:

muss ich meine array mit "volatile" deklarieren???

von Johannes M. (johnny-m)


Lesenswert?

Läuft Dein Controller mit weniger als 1,3 MHz? Wenn nicht, dann wirst Du 
mit dem _delay_ms(200) Probleme kriegen.

von Johannes M. (johnny-m)


Lesenswert?

> muss ich meine array mit "volatile" deklarieren???
Allgemein (hab mir Deinen Code jetzt nicht genau angesehen): volatile 
ist i.d.R. nur dann erforderlich, wenn eine Variable im Hauptprogramm 
UND in Interrupt-Handlern verarbeitet werden soll. Variablen, die nur 
in einem von beiden verändert bzw. gelesen werden, brauchen nicht mit 
volatile versehen zu werden. Ob in Deinem Falle volatile angebracht ist, 
müsstest Du anhand Deines Programms selbst entscheiden.

von Patrick K. (kaplan)


Lesenswert?

ok danke, dann brauch ichs wohl nicht.

von Patrick K. (kaplan)


Lesenswert?

Johannes M. wrote:
> Läuft Dein Controller mit weniger als 1,3 MHz? Wenn nicht, dann wirst Du
> mit dem _delay_ms(200) Probleme kriegen.

Das delay nutze ich um auf dem UART mit Docklight kein buffer overflow 
zu bekommen :)

der Controller laeuft mit 20 MHz. aber warum problem. Laut delay.h:
1
/**
2
   \ingroup util_delay
3
4
   Perform a delay of \c __ms milliseconds, using _delay_loop_2().
5
6
   The macro F_CPU is supposed to be defined to a
7
   constant defining the CPU clock frequency (in Hertz).
8
9
   The maximal possible delay is 262.14 ms / F_CPU in MHz.
10
 */
d.h. mein maximals delay ist 262.14 / 20 also ungefaehr 13.107ms ???

von Johannes M. (johnny-m)


Lesenswert?

Patrick Ka wrote:
> der Controller laeuft mit 20 MHz. aber warum problem. Laut delay.h:
>...
> d.h. mein maximals delay ist 262.14 / 20 also ungefaehr 13.107ms ???
Eben. Und 200ms >> 13,107ms. Das geht schief. Aber Du hast ja wenigstens 
schon mal die Formel. Dann erübrigen sich ja weitere Fragen...

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.