Problem mit Interrupt Service Routine

Gast #3353999
Lesenswert?

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];
#3354020
Lesenswert?

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 #3355107
Lesenswert?

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 #3355518
Lesenswert?

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
#3355523
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren