Gast
#1405780
Hi @ all
Ich habe ein globales unsigned char array mit 512 Elemente. Dieses
möchte ich über die SPI-Schnittstelle ausgeben. Mein Code ist aber um
Faktor 2 zu langsam. Ich benutze einen ATMEGA 2561 µC von Atmel. Laut
meinen Berechnungen muss es locker möglich sein dies um Faktor 2 zu
beschleunigen, jeoch ist mein C-Code wohl zu schlecht. Vielleicht kann
mir ja jemand weiterhelfen.
Ich löse alle 7,8µs einen Timerinterrupt aus. (dies funktioniert auch
bereits) In der Timerinterruptserviceroutine setze ich mir dann das Flag
modus auf 1 und beende die Serviceroutine. Im Hauptprogramm frage ich
dann das Flag immer ab. Ist dieses 1 so gebe ich 4 Elemente aus dem
globalen Array über die SPI-Schnittstelle aus und setze anschließend das
Modus-Flag auf 0 zurück.
// hier st mein globales Array und meine anderen globalen Variablen
volatile unsigned char spiegelpositionen[512];
volatile unsigned char modus;
volatile unsigned int aktuelle_scanspiegelposition;
// jetzt zum Hauptprogramm
while (1)
{
if(modus == 1)
{
// CS für die SPI Übertragung auf 0 setzen
CS_DAC_SIGNAL = 0;
SPDR = spiegelpositionen[aktuelle_scanspiegelposition];
aktuelle_scanspiegelposition = aktuelle_scanspiegelposition +
1;
while(!(SPSR & 0x80));
SPDR = spiegelpositionen[aktuelle_scanspiegelposition];
aktuelle_scanspiegelposition = aktuelle_scanspiegelposition +
1;
while(!(SPSR & 0x80));
SPDR = spiegelpositionen[aktuelle_scanspiegelposition];
aktuelle_scanspiegelposition = aktuelle_scanspiegelposition +
1;
while(!(SPSR & 0x80));
SPDR = spiegelpositionen[aktuelle_scanspiegelposition];
aktuelle_scanspiegelposition = aktuelle_scanspiegelposition +
1;
while(!(SPSR & 0x80));
CS_DAC_SIGNAL = 1;
if(aktuelle_scanspiegelposition == 512)
{
aktuelle_scanspiegelposition = 0;
}
modus = 0;
TestPin0 = 0;
}
else
{
//Leerlaufmodus
}
Im Hauptprogramm gebe ich 4 Arrayelement aus und zähle die Position
hoch. Jedoch dauert es zu lange. Kann man dies besser lösen?