2016-12-23 6 views
0

Привет, я пишу на C с olimexino (arduino). Я использую следующий код для загрузки 2 регистра (ATmega328):atmega: данные регистратора повреждаются делением операции

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); 

тогда я использую это:

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

писать из двух регистров в порт B. Но с помощью двух регистров r20 и r21 создает проблему. Конфликт возникает, если я выполняю операцию деления. например, если какая-либо часть моей программы имеет оператор типа «x = x/6» или «y = x% 9», то числа, хранящиеся в этих регистрах, могут измениться. если я делаю простое разделение типа «x/4» или «x% 8», проблем нет. но любая операция, которая сложнее, чем простое сменное деление, меня замахивает.

Любая помощь? Благодаря

ответ

0

ли это как сингл, многострочного выражения:

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); 

Или, возможно, даже лучше:

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

Или как насчет рутина:

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

Это можно сделать так:

WriteToPort5(16); 
WriteToPort5(0);