2016-12-23 2 views
0

Hallo Ich schreibe in C mit einem olimexino (arduino). Ich bin mit dem folgenden Code 2 Register zu laden (ATmega328):atmega: Registerdaten werden durch Divisionsoperation beschädigt

asm (
"ldi r20, 0 \n" //load register r20 with 0 
"ldi r21, 16 \n" //load register r21 with 16 
: : : "r20","r21" //compiler directive to reserve the two registers); 

dann verwende ich diese:

asm ("out 0x05, r21 \n"); //write '0' to portB 
asm ("out 0x05, r20 \n"); //write '10000' to portB 

aus den beiden Registern zu Port B zu schreiben, aber unter Verwendung der beiden Register r20 und r21 erzeugt ein Problem. Ein Konflikt tritt auf, wenn ich eine Divisionsoperation mache. Wenn zum Beispiel irgendein Teil meines Programms eine Aussage wie "x = x/6" oder "y = x% 9" hat, scheinen sich die Zahlen, die ich in diesen Registern gespeichert habe, zu ändern. Wenn ich eine einfache Division wie "x/4" oder "x% 8" mache, gibt es kein Problem. aber jede Operation, die komplexer ist als eine einfache Schichtteilung, macht mir zu schaffen.

Irgendwelche Hilfe? Dank

Antwort

0

Tun Sie es als eine einzige, mehrzeiligen Anweisung:

asm (
"ldi r20, 0 \n" //load register r20 with 0 
"ldi r21, 16 \n" //load register r21 with 16 
"out 0x05, r21 \n" //write '0' to portB 
"out 0x05, r20 \n" //write '10000' to portB 
: : : "r20","r21" //compiler directive to reserve the two registers); 

Oder vielleicht noch besser:

asm (
    "out %0, %1 \n" 
    "out %0, %2 \n" 
    : : "i"(5), "r"(16), "r"(0)); 

Oder wie wäre es eine Routine:

void WriteToPort5(unsigned char b) 
{ 
    asm ("out 0x05, %0" 
    : : "r"(b)); 
} 

Das können Sie so nennen:

WriteToPort5(16); 
WriteToPort5(0); 
Verwandte Themen