mikrocontroller.net

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


Autor: Junis (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joerg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte immer nur in einem Forum zu einer Zeit fragen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.