Forum: Mikrocontroller und Digitale Elektronik AVR-gcc inlineassembler


von Peter J. (hubipet)


Lesenswert?

Hallo Forum


in meinem Programm will ich vier Werte einlesen, getriggert durch den 
externen Interrupt Int1. Da ich in der ISR sehr schnell sein muss will 
ich die in Assembler schreiben sprich mit dem Inline Assembler umsetzen.

in C sind folgende Variablen global definiert:
unsigned char DeviceNumber;
unsigned char LedNumber;
unsigned char LedValue;
unsigned char Temp1;


struct Device_t
{
  unsigned char Value[8];
  unsigned char Changed[8];
}Device[16];


Die Interruptroutine sieht z.Zt folgendermassen aus:

ISR(INT1_vect)
{

asm volatile( "in %0, %3 \n\t"
              "swap %0 \n\t"
              "andi %0, 0x0F \n\t"
              "CBI %4, 0 \n\t"
              "in %1, %5 \n\t"
              "SBI %4, 0 \n\t"
              "CBI %4, 1 \n\t"
              "in %2, %5 \n\t"
              "SBI %4, 1 \n\t"
             :  "=r" (DeviceNumber),  "=r" (LedNumber) , "=r" (LedValue)
            :  "I" (_SFR_IO_ADDR(PIND)), "I" (_SFR_IO_ADDR(PORTD)), "I" 
(_SFR_IO_ADDR(PINA))
           );

asm volatile( "ST z, %0"
             : "=r" (LedValue)
             : "e" (Device[DeviceNumber].Value[LedNumber])
           );


}

Der erste Teil funktioniert problemlos.

Jetzt möchte ich folgenden C-Code mittels de Inlineassemblers umsetzen:
Device[DeviceNumber].Value[LedNumber] = LedValue;
Device[DeviceNumber].Changed[LedNumber]++;
(Teil 2)

Das kriege ich nicht hin :-(

Kann mir da jemand auf die Sprünge helfen?

Gruß
Peter

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Peter Jänsch schrieb:

> asm volatile( "ST z, %0"
>              : "=r" (LedValue)
>              : "e" (Device[DeviceNumber].Value[LedNumber])
>            );

Nö,korrekt ist so:
1
asm volatile ("ST %a1, %0"
2
              :: "r" (LedValue), "e" (&Device[DeviceNumber].Value[LedNumber])
3
              : "memory");
denn in %1 steht sinnigerweise eine Adresse.

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.