mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Zeitkritische Interrupt-Routine bei XC886


Autor: Chris (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe ein Problem mit der sich im Anhang befindlichen Interrupt 
Routine; bei einem Timer Interrupt wird einfach ein weiteres Bit (aus 
einem Array) rausgeschiftet und auf einen PortPin gelegt.
Ab einer Geschwindigkeit von 56 kBit/s dauert die Routine aber zu lange 
und eine höhere Geschwindigkeit wird nicht erreicht.

Ich wäre sehr dankbar, wenn mir jemand helfen könnte, diese Routine 
schneller zu gestalten?

LG Chris

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Muß die Funktion Set_CS_TDA5150(NOT_ACTIVE) unbedingt extern sein?
Damit zwingst Du den Compiler, alle 12 Register zu push/popen.
Besser also als Macro schreiben.

Was soll denn die Funktion überhaupt machen?
Wenn Du nur einen Pin setzen mußt, nimm besser Bitbefehle (Pin als 
sfr8).


Peter

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, toll!

Set_CS_TDA5150(NOT_ACTIVE) setzt tatsächlich nur einen PortPin.
Hab nun diesen Aufruf durch P1_DATA &= ~0x40;  // CS-line to NOT_ACTIVE 
erstzt. Das bringt natürlich schon einiges!



Mir macht der Ausdruck

P1_DATA =  (((TXFifo0[TXiterations] << BitsPerByte)& 0x80) >> 4) | 
(P1_DATA & 0x44);

noch Kopfzerbrechen. Könnte ich das noch irgendwie verbessern?

LG

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dein Kommentar
// set the data to pin 3 ...
legt eine Bitmanipulation des einen Pins nahe.
Warum beackerst du den ganzen Port?
Mach das doch im Stil des
> P1_DATA &= ~0x40;
also etwa so:
if( (TXFifo0[TXiterations] << BitsPerByte)& 0x80 ) 
   P1_DATA |=  0x8;
else 
   P1_DATA &= ~0x8;

EDIT:
Noch besser wäre es, nicht einen Zähler zu verwenden, sondern die Maske 
zu schieben, dann bleibt es bei einer Abfrage:
if (TXFifo0[TXiterations] & BitMask) 
   P1_DATA |=  0x8;
else 
   P1_DATA &= ~0x8;

if(BitMask>>=1) {   // after 1 byte is shifted out,      
   TXiterations++;  // increment TXiterations which is an index of an array and 
   BitMask = 0x80;  // reset the bit-mask which is necessary for the mask operation above
}

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, guter Einwand, aber beim Setzen des Pins (via P1_DATA |= 0x40;) 
benötigt man einen anderen Befehl als beim Zurücksetzen (P1_DATA &= 
~0x40;).
Zusätzlich bräuchte ich noch eine teure if-Abfrage...

Das heißt eine direkte Zuweisung in einer Zeile ist nicht mehr möglich, 
oder überseh ich da was?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aah, danke Lothar. Hab's zu spät gesehn...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du solltest mal versuchen mit Bitvariablen zu arbeiten, das macht vieles 
leichter (und schneller).

Ganz aufwendig ist ein variables Shift, nimm besser ne Maske, die man 
immer nur einmal schiebt.

Definier dochmal alle Variablen, damit man den Code compilieren kann, 
dann ist es viel einfacher zu optimieren.


Peter

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So,
ich hab's nun so gelöst, dass ich die Maske verschiebe.

Aber Peter, wie meinst du das mit den Bitvariablen?

LG Christoph

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.