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
Peter Jänsch schrieb: > asm volatile( "ST z, %0" > : "=r" (LedValue) > : "e" (Device[DeviceNumber].Value[LedNumber]) > ); Nö,korrekt ist so:
1 | |
2 | |
3 | |
denn in %1 steht sinnigerweise eine Adresse.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.