Forum: Mikrocontroller und Digitale Elektronik PWM-Sinusausgabe interruptgesteuert mit AT91SAM7S256


von Mirko (Gast)


Lesenswert?

Hallo.

Brauche ein Programm zur Sinusausgabe mittels PWM (µC AT91SAM7S256). Die 
PWM-Ausgabe mit unterschiedlichen (statischen) Tastverhältnissen und 
Frequenzen funktioniert soweit. Jetzt möchte ich mit Interrupt, welcher 
am Ende jeder Zählperiode kommt, vordefinierte Tastwerte in PWMC_CDTYR 
reinschreiben und somit einen Sinus ausgeben.
Ich verstehe jedoch nicht ganz wie ich mein Interruptcode zum laufen 
bringe. Bei den AVRs war es einfach:

#include "avr/interrupt.h"
ISR(Vektorname){
...Interruptcode...
}


Kann mir jemand dieses Prinzip beim AT91SAM7S256 erläutern?

Also aus einem Beispiel habe ich es so verstanden.
PWM_Interrupt soll mein Interruptcode sein. Diese Funktion steht bei mir 
außerhalb von  int main(){} .

//-------------------------------------------------------------
__ramfunc void PWM_Interrupt(void)
{
  static unsigned long i=0;
  if(i > PWM_PERIOD_VALUE)
  {
    i=0;
  }
  AT91C_BASE_PWMC_CH0->PWMC_CDTYR = i; // Tastverhältnisänderung für 
Sinusausgabe
}
//-----------------------------------------------------------


In int main(){} steht dann:

-----------------------------------------------------------------
AT91F_AIC_ConfigureIt(AT91C_BASE_AIC,
                            AT91C_ID_PWMC,
                            INTERRUPT_LEVEL,
                            AT91C_AIC_SRCTYPE_INT_POSITIVE_EDGE,
                            PWM_Interrupt);
    AT91F_PWM_InterruptEnable(AT91C_BASE_PWMC,AT91C_PWMC_CHID0);
------------------------------------------------------------------

Mit AT91F_AIC_ConfigureIt werden Initialisierungen für PWM-Interrupt 
durchgeführt und mein Interruptcode sozusagen übergeben, oder????
Wenn es stimmt bekomme ich trotzdem eine Fehlermeldung: "Fatal 
Error[e72]: Segment CODE_ID must be defined in a segment definition 
option (-Z, -b or -P)"
Bitte erleuchtet mich.

von Mirko (Gast)


Lesenswert?

weis denn keiner Rat?

von gerhard (Gast)


Lesenswert?

hallo mirko,
ich würde mir mal das example AT91SAM7S64-PWMAudio-IAR4_30A-1_21 von 
www.at91.com ansehen.

gruss
gerhard

von Mirko (Gast)


Lesenswert?

danke Gerhard für die antwort, aber ich konnte dieses beispiel auf 
at91.com nicht finden. es wäre nett, wenn du den link noch mal posten 
würdest.

von gerhard (Gast)


Lesenswert?

hallo,
leider gibt es keinen direkten link, aber probiwers mal so:
www.at91.com -> in der Auswahlleiste oben "Kit" -> AT91SAM7S-EK -> 
scrollen bis "Software Package" -> AT91SAM7S256 -> das zum verwendeten 
Compiler passende zip-Archiv herunterladen

gruss
gerhard

von Mirko (Gast)


Lesenswert?

leider ist PWM-Audio in diesem file nicht dabei.
aber andere frage. was macht  " __ramfunc " denn? und kann ich dieses 
kürzel einfach weglassen? ohne " __ramfunc " bekomme ich dann auch keine 
fehlermeldung (--Fatal Error[e72]: Segment CODE_ID must be defined in a 
segment definition option (-Z, -b or -P)-- ), interrupt lässt sich aber 
trotzdem nich aufrufen.

von gerhard (Gast)


Lesenswert?

hallo,
pwmaudio findest du in den beispielen für den at91sam7s64.

zu deiner frage betreffend __ramfunc:
__ramfunc bewirkt, das die betreffende funktion beim hochlauf ins ram 
kopiert wird.


gruss
gerhard

von Mirko (Gast)


Lesenswert?

also kann ich __ramfunc auch weglassen?

von gerhard (Gast)


Lesenswert?

ob du __ramfunc weglassen kannst oder nicht hängt von deiner anwendung 
ab. wenn du in das flash schreiben willst, darf die entsprechende 
funktion nicht im flash stehen sondern muss aus dem ram exekutieren.

wenn die funktion mgölichst schnelle ablaufen soll dann macht es auch 
sinn diese aus dem ram zu exekutieren da dann keine waiststates 
notwendig sind.

btw: wäre gut wenn du uns mal deine entwicklungsumgebung verrätst.

gruss
gerhard

von Mirko (Gast)


Lesenswert?

Entwicklungsumgebung: IAR Embedded Workbench und AT91SAM7S-EK mit J-Link
Ich werde verrückt, es funktioniert immer noch nicht.
Genz komisch die Sache. Paar mal hat es funktioniert, dann aber wieder 
nicht (dabei wurde der Code überhaupt nicht verändert).

von Mirko (Gast)


Lesenswert?

Mittlerweile habe ich festgestellt, daß wenn man das board ausmacht dann 
wieder einschaltet und ram_debug startet, wird mein Interrupt ausgelöst 
und meine dynamische PWM ist auf dem Oszi zu sehen. Wenn man jetzt das 
Debugen verläßt und das Debugen dann wieder startet funktioniert das 
Ganze nicht mehr.  Man muß das Board aus- dann wieder einschalten und 
ram_debug klicken dann läufts wieder. Ich habe mit SAM_BA geflascht und 
es funzt alles (Flash_Debug hat keine Wirkung).
Kann mir das jemand erklären?????

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
Noch kein Account? Hier anmelden.