Problem mit Interrupt Service Routine

Gast #3353999
Hallo zusammen,

ich benutze einen TI Mikrocontroller (TMS320F28335). Ich benutze drei 
PWM-Ausgänge, um drei phasenversetzte Sinuse zu modellieren (einen 
Drehstrom).

Dazu habe ich eine Sinus Tabelle und eine ISR, in welcher das Problem 
auftritt. In der ISR update ich den duty cycle der PWM und hole mir dazu 
Werte aus der Tabelle.

Jetzt tritt folgendes Problem aus: Verwende ich 2 der 3 Module, 
funktioniert alles so wie ich mir es vorstelle. Der Witz an der Sache 
ist, es ist egal welche der 2 Module ich verwende, es funktioniert 
immer.

Verwende ich jetzt allerdings alle 3 Module, klappt nichts mehr. Die PWM 
ist einfach je nach Kanal 0 oder 1.

Das macht mich ziemlich ratlos - ich habe keine Idee, woran das liegen 
könnte.

Nachfolgend ein Code-Schnippsel, der Ärger macht (Sinus-Tabelle mit 512 
Werten).

So geht's:
1
EPwm1Regs.CMPA.half.CMPA = Sinustab[(int) aktuell];
2

3
//EPwm2Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 171];
4

5
EPwm3Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 341];

So geht's nicht:
1
EPwm1Regs.CMPA.half.CMPA = Sinustab[(int) aktuell];
2

3
EPwm2Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 171];
4

5
EPwm3Regs.CMPA.half.CMPA = Sinustab[(int) aktuell + 341];
Das
1
                .....
2
                aktuell + 341

hätte ich da so jetzt nicht erwartet.
In so einem Ausdruck taucht normalerweise die Arraygröße in irgendeiner 
Form auf, sodass sich rechnerisch zu große ergebende Indizes wieder bei 
0 anfangen.

Beispiel:
ist dein Array 8 Elemente gross, dann gibt es die Felder mit den Indizes

   0, 1, 2, 3, 4, 5, 6, 7

angenommen aktuell hätte den Wert 6. Welches ist dann das Element 4 
Indizes weiter?
6 + 4 macht 10. 10 kann aber nicht sein, denn das Array hat nur gültige 
Indizes von 0 bis 7. Die richtige Antwort ist

   ( 6 + 4 ) % 8

also

   10 % 8

oder eben 2.
Das Element mit dem Index 2 ist dasjenige, auf welches man stösst, wenn 
man vom Feld mit dem Index 6 ausgehend 4 Elemente nach rechts kommt 
(wobei man wieder vorne anfängt, wenn man hinten rausfällt)

d.h.
da hätte ich erwartet, so etwas zu sehen
1
                .....
2
            ... [ ( aktuell + 341 ) % Sinustab_Grösse ];
Gast
Hallo,

danke erstmal. Ich habe dahinter noch eine einfache if-Abfrage, die 
checkt, ob das Ende meines Arrays erreicht wurde. Ggf. beginnt meine 
Variable 'aktuell' wieder am Anfang des Arrays.
Gast
Max schrieb:
> Jede Idee wäre willkommen :-(

Dann ersetze doch mal
1
(int) aktuell + offsetX
 durch
1
((int) aktuell + offsetX) & 0x01ff

Max schrieb:
> Ich habe dahinter noch eine einfache if-Abfrage, die checkt, ob das Ende
> meines Arrays erreicht wurde. Ggf. beginnt meine Variable 'aktuell'
> wieder am Anfang des Arrays.

Da wird das Problem liegen. Wenn 'aktuell + 341' schon größer als 511 
ist, kann 'aktuell' immer noch kleiner sein.
Warum verwendest du eigentlich einen vorzeichenbehafteten Datentyp für 
einen Array-Index?
Gast
Das wars, besten Dank Wolfgang!

Den (int) verwende ich, weil meine Laufvariable durch die Sinustabelle 
ein double ist. Ich nehme nicht immer sofort den nächsten Wert aus 
meiner Tabelle
1
aktuell += 1;

sondern auch manchmal ein paar Mal den gleichen
1
aktuell += 0.1
Max schrieb:
> Das wars, besten Dank Wolfgang!
>
> Den (int) verwende ich, weil meine Laufvariable durch die Sinustabelle
> ein double ist.

Hä?
Was hat das eine mit dem anderen zu tun?



Kopfklatsch.
Nein. das war nicht gemeint.
Der Index in ein Array kann an dieser Stelle nur positiv sein. Da kann 
(zumindest bei dir hier) keine negative Zahl rauskommen.

Daher wäre ein unsigned int angebracht und kein int.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.