PWM-Sinusausgabe interruptgesteuert mit AT91SAM7S256

Gast #458095
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.
Gast #460097
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
Gast #460159
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.
Gast #460364
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
Gast #461300
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
Gast #461725
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).
Gast #462092
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?????

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