AVR-gcc inlineassembler

OP #2765143
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

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