struct array nimmt daten nicht an -help

OP #586989
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
}

  
Angehängte Dateien:
OP #587030
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???
#587038
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.
OP #587046
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 ???
#587050
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...

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.