Forum: Compiler & IDEs Einfügen von Assembler in AVR GCC ; glob. Variable


von Junis (Gast)


Lesenswert?

Ich habe eine software PWM Routine geschrieben. Diese ist aber zu
langsam, deshalb muß ich sie direkt als assembler Sourcecode einfügen.
Dabei ergaben sich aber ein paar Fragen:

Zuerst der code, damit ihr wisst, worum es geht:

// global variables

unsigned char pwmcounter;
unsigned char pwm[8];
unsigned char* pwmptr;
volatile unsigned char* pwmcountptr;
....


void main(void){

unsigned char i;
for (i=0; i<8; i++) pwm[i]=55;
pwmptr=&pwm[0];
pwmcountptr=&pwmcount;

...
}

...

SIGNAL(SIG_OUTPUT_COMPARE2)
{
unsigned char stat1;

asm volatile(
"in %0, __SREG__"
"cli"
"push r16"
"push r30"
"push r31"

"mov r30, %a1"
"mov r31, %a1+1"
"ld r16, Z"           lädt das den pwmcouter nach r16?????

"cpi r16, 100"
"breq overflow"

"mov r30, %a2"
"mov r31, %a2+1"    lädt das die Adresse von pwm[0]nach r30&r31
?????
"ld _tmp_reg_, Z+"  lädt das den Wert von pwm[0] nach temp????

"cp tmp_reg_,r16"
"brne tab1"
"cbi $12,0"           löscht dieser Ausdruck bit 0 in port
d??????????
"tab1:"
"ld _tmp_reg_, Z+"   lädt das den Inhalt von pwm[1] nach temp?????
"cp tmp_reg_,r16"
"brne tab2"


...... pwm routine.....


"mov r30, %a2"
"mov r31, %a2+1"
"st Z,r16"        speichert das den erhöhten pwmzähler in
pwmcounter?
"pop r16"
"pop r30"
"pop r31"
"out _SREG_, %0"    stat1 in SREG??

:"=&r" (stat1)
:"e" (pwmcountptr), "e" (pwmptr)
);


Nun zu meinem Problem. Ich möchte die globalen Variablen pwm[n]im
assembler code verarbeiten(read only). Ich möchte die globale Variable
pwmcounter lesen und deren Inhalt ändern. Die lokale Variable stat1
möchte ich benutzen, um das Statusregister zu speichern.Mache ich das
so richtig?? Ich habe die Knackpunkte im Quellcode kommentiert und
meine Fragen dazu geschrieben. Kann ich die Pointer auf diese weise in
das Z-Register laden, oder geht das noch eleganter. Muß ich pwmcounter
auch als volatile definieren? Ich bekomme viele Fehlermeldungen, wenn
ich versuche, den Code zu kompilieren.

von Joerg Wunsch (Gast)


Lesenswert?

Bitte immer nur in einem Forum zu einer Zeit fragen.

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.