www.mikrocontroller.net

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


Autor: Patrick Kaplan (kaplan)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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
SPI_data[SPI_i].ADC_value = 0xAA;    // <= ist nur ein test 
durch
SPI_data[SPI_i].ADC_value = data2[i];   //<= so sollte es sein 
ersetze, dann kommen nur noch 0x00 !?!?!???

bitte um hilfe...
gruss
Patrick

typedef struct {
  uint8_t x_coord;
  uint8_t y_coord;
  uint8_t ADC_value;
} SPI_data_type;

uint8_t SPI_packets_to_send;
uint8_t SPI_i;

SPI_data_type SPI_data[16];    
SPI_data_type test;


/*********
  main
*********/

int main(){
  sei();
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
  
  while(1) {
    ADC_8Channels(data1_p);             //fuellen des arrays #1
    
    ADC_8Channels2(data2_p);            //fuellen des arrays #2 

    SPI_i = 0;
    
    test.ADC_value = 0xAB;
    test.x_coord = 0xCD;
    test.y_coord = 0xEF;       // das hier klappt wunderbar

    
    for (i=0; i<8; i++){
      if (data2[i]<ADC_threshold) {
          SPI_data[SPI_i].ADC_value = 0xAA; //data2[i];
          SPI_data[SPI_i].x_coord = 0xBB;    //def_coord_x + i;
          SPI_data[SPI_i].y_coord = 0xCC;    //def_coord_y + 1;
          SPI_i++;
      }      
    }
    
    SPI_packets_to_send=SPI_i;
        
    _delay_ms(200);
    uart_putc(0xDD);                           //damit ich weiss wann es los geht
    uart_putc(0xDD);
    uart_putc(SPI_packets_to_send);            //wieviele pakete a 3 byte werden geschickt.
    
    for (i=0; i<SPI_packets_to_send; i++){        // dies ausgabe klappt ab und zu aber nicht immer
      uart_putc(SPI_data[SPI_i].ADC_value);
      _delay_ms(200);  
      uart_putc(SPI_data[SPI_i].x_coord);
      uart_putc(SPI_data[SPI_i].y_coord);
      _delay_ms(200);
    }
                uart_putc(test.ADC_value);       //diese ausgabe klappt wunderbar
    uart_putc(test.x_coord);
    uart_putc(test.y_coord);    
  }
}

  

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick Kaplan (kaplan)
Datum:

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

Allerdings ist noch ein Punkt offen:

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

Autor: Johannes M. (johnny-m)
Datum:

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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ok danke, dann brauch ichs wohl nicht.

Autor: Patrick Kaplan (kaplan)
Datum:

Bewertung
0 lesenswert
nicht 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:
/**
   \ingroup util_delay

   Perform a delay of \c __ms milliseconds, using _delay_loop_2().

   The macro F_CPU is supposed to be defined to a
   constant defining the CPU clock frequency (in Hertz).

   The maximal possible delay is 262.14 ms / F_CPU in MHz.
 */
d.h. mein maximals delay ist 262.14 / 20 also ungefaehr 13.107ms ???

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.