Hallo zusammen, ich möchte 4 bytes pro 50µsec Zyklus empfangen. Mein Controller (ADuC7021) hat keine FIFO sondern nur ein 1 byte Senderegister und Empfangsregister, welches ständig im Interrupt nachgeladen bzw. geräumt werden muß (siehe folgender Code). Im Moment speichere ich die geräumten bzw zum senden vorbereiteten Daten in 2 Feldern. Ich habe ziemliche Rechenzeitprobleme mit dem Nachladen und ich habe gesehen, dass Speichern in ein feld bzw laden aus einem Feld, recht aufwendig ist, weil zuerst der Index geholt werden muß etc..... Wie kann man das effizienter und doch elegant machen. Gibt es ausser der verwendung von Einzelvariablen eine andere Möglichkeit? Gruß Samuel unsigned char rec_data[4]; unsigned char snd_data[4]; ISR() { if(fiqsta&SPI_SLAVE) { rec_data[num_spi_idx]=SPIRX; num_spi_idx++; SPITX=snd_data[num_spi_idx; //.................. //............. } else if(....) //................ }
hallo samuel. auf einem 16bit-µC mit 40MHz hast du rechenzeitprobleme, eine 640kHz-SPI zu bedienen? kann ich ja kaum glauben... was machst du denn sonst noch mit dem teil? mein vorschlag: ein zeiger auf ein 8-byte-array. dann müßte der µC nur das empfangsregister lesen, die zeigervariable inkrementieren (die ja auch auf ein array zeigen kann) und das senderegister schreiben. also im idealfall zwei assemlberbefehle (ohne ISR-overhead und ohne rücksetzen des zeigers). bei dieser möglichkeit liegt abwechselnd ein empfangenes und ein zu sendendes byte im selben array. nicht wirklich sauber, aber schnell. gruß michael
upsi. es wären natürlich drei assembler-befehle. :-) gruß michael
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.