www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR - Fehler bei SPI-Ausgabe von Array mit 2000 Elementen


Autor: Hazel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich habe ein Problem, mit einer Testsoftware für einen AT90CAN128. Der 
AT90CAN128 ist über die SPI Schnittstelle mit einem 16-Bit 
Digital-Analog-Converter verbunden und ist so in der Lage, einen 
Analog-Spannungswert auszugeben. Die Ausgabe von Werten funktioniert 
bereits. Am DAC hängt noch ein Filter, welches getestet werden soll. 
Dazu soll ein "weißes Rauschen" ausgegeben werden. Hierfür habe ich 
einen Vektor von 2000 Werten mit Matlab erzeugt, die nun über SPI an den 
DAC gegeben werden sollen und dieser dann das Signal ausgeben soll. Ich 
habe die 2000 Werte einfach in einem U16-Array abgelegt. Nun wird in der 
Main-Loop des Programms je Durchlauf ein Wert ausgegeben und ein Index 
inkrementiert, mit dem dann im nächsten Durchlauf das nächste Element 
indiziert wird. Wird das 2000ste Element erreicht, wird der Zähler 
zurückgesetzt und es wird wieder das erste Element verwendet. Die 2000 
Werte werden also zyklisch ausgegeben. Irgendwo scheint aber ein Fehler 
im Programm zu sein. Nach 43 Werten wird nämlich wieder der erste 
ausgegeben. Ich kann das aber nicht verstehen. Sind 2000 U16 Werte zu 
viel? Oder hab ich einen Fehler im Code?
Der SPI-Teil ist getestet und funktioniert, ich werde ihn also hier 
nicht posten. Ich zeige euch einfach mal die Main-Loop:

  U16 data[2000] =
  {
    20597,
    ...
    41083
  };
  U16 i;
  U8 j;

  while(1)                   // Main-Loop
  {
    spi_dac_tx(data[i++]);   // Ausgabe des Wertes data[i] über SPI
    if (i>=1999)
      i = 0;
    for(j=0;j<=1;j++);       // kurze Verzögerung
  }

Das Eigenartige ist, dass selbst bei der Simulation mit AVR Studio, wenn 
ich mir im Watch-Fenster die Variable data anzeigen lasse, nach dem 
43.Wert wieder der erste angezeigt wird. Wo ist der Fehler??

Autor: Hazel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm, mit 1500 Werten im Array scheint alles zu passen. Komisch.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erstens sollte der Code nur 1999 Werte ausgeben, Also Array 9..1998. 
Zumindest macht die if Bedingung das so. PS: warum nicht mit 
for-Schleife?

Wozu ist die "kurze" Verzögerung da?

Soweit ist hier nix zu erkennen.

Poste mal lieber noch den SPI-Code.
So groß kann der ja ne sein

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso: ich glaube, die "kurze" verögerung wird wohl wegoptimiert..

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dir ist schon klar das 2000 U16 Werte fast 4kB ergeben ?
Hat der AT90CAN nicht nur 4kB RAM ? D.h. für den Rest
deines Programmes + Stack bleiben 96 Bytes über.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das würde auch erklären, warum es bei 1500Werten geht ;-)

Aber poste trotzdem mal den SPI-Code

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2000 * 2 Bytes in 4kiB RAM? wird das nicht seehr knapp...
wenn sich das Array nicht zu ändern braucht während das Programm läuft, 
könntest du es in dem Flash auslagern (PROGMEM wäre das stichwort)

hth. Jörg
ps.: gehts nicht auch so:
[c]
uint16_t data[2000] = { ..... };
int i;
for (i =0,i < 2000;i++){
    spi_dac_tx(data[i]);
    _delay(0.0001); // falls du das wirklich brauchst
}
// und die PROGMEM-Version:
#include <avr/pgmspace.h>

const uint16_t PROGMEM data_P[2000] = { ... };
int i;
for (i =0,i < 2000;i++){
    spi_dac_tx(pgm_read_word(data[i]));
    _delay(/* s.o.*/);
}

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Jörg X. (Gast):

Du hast das & vergessen:
const uint16_t PROGMEM data_P[2000] = { ... };
int i;
for (i =0,i < 2000;i++)
{
    spi_dac_tx(pgm_read_word(&data[i])); // pgm_read_word bekommt ne 
addresse
    _delay(/* s.o.*/);
}

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Matthias (Gast)
ups, ja stimmt (und das [ /c]-Tag hab ich wohl auch vergessen :( )

sry --Jörg

Autor: Hazel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Jungs!
War wohl wirklich das Problem, mit dem zu kleinen RAM. Habs nun mit 
PROGMEM in das Flash und es klappt. Hab wohl nicht so weit gedacht.

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.