Арифметические программы на языке С для AVR и PIC

Обсуждаются темы не относящиеся к журналу "РАДИО"

Арифметические программы на языке С для AVR и PIC

Сообщение Ewgen » 03 ноя 2013, 18:39

При выполнении арифметических действий оба числа должны иметь одинаковую размерность или могут быть разной объявленной длины ? Мне нужны примеры вычислений.
Ewgen
 
Сообщения: 221
Зарегистрирован: 13 ноя 2009, 20:40
Откуда: Ульяновск

Re: Арифметические программы на языке С для AVR и PIC

Сообщение ASD » 04 ноя 2013, 10:59

Наберите в любом поисковике "Приведение типов".
ASD
 
Сообщения: 644
Зарегистрирован: 11 мар 2008, 15:52

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Pavel » 04 ноя 2013, 11:37

Здравствуйте, Ewgen.
Нет размерность в битах не имеет значения. Например, число с размерностью 1 байт можно приравнять к числу с размерностью в 2 байта.
Например,
a-размерность 2 байта
b-размерность 1 байт

a=4200; b=a;

b, после выполнения операции присваивания значения a, будет равно 104, так как b максимально может иметь условное значение 256 (0..255). Значит b=4200-16*256. То есть число b 16 раз переполнится (обнулится), прежде чем операция присваивания значения будет выполнена.
Pavel
 
Сообщения: 71
Зарегистрирован: 22 мар 2010, 21:46

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Pavel » 04 ноя 2013, 12:13

И да, забыл добавить.
Если совсем просто считать, то однобайтовая переменная будет равна первому байту двухбайтового числа, то есть
a=20450 (или в двоичной системе отсчета 01001111 11100010)
b=a;
b будет равно после операции присваивания 226 (или в двоичной системе отсчета 11100010)
Pavel
 
Сообщения: 71
Зарегистрирован: 22 мар 2010, 21:46

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Ewgen » 05 ноя 2013, 10:14

ASD спасибо.
Уважаемый Pavel, спасибо за пример. В правилах приведения типов говорится о том, что при присвоении значения длинной переменной короткой, у длинной переменной младшие биты отбрасываются и короткой переменной присваиваются старшие биты.
В арифметических программах, как я понял, желательно к коротким переменным подставлять тип наибольшего.
Например :
int x;
char c=30;
x=(int)c*10;
Величина char c=30 будет взята как int c=30 для вычислений. Здесь char восьмибитная а int шестнадцатибитная переменная.
Ewgen
 
Сообщения: 221
Зарегистрирован: 13 ноя 2009, 20:40
Откуда: Ульяновск

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Pavel » 05 ноя 2013, 14:52

"В правилах приведения типов говорится о том, что при присвоении значения длинной переменной короткой, у длинной переменной младшие биты отбрасываются и короткой переменной присваиваются старшие биты."

Это правило, как говорится, на все случаи жизни, но люди создающие компиляторы выбирают простой путь, так как память МК не позволяет разгуляться на переменных. Пример на C и на ассемблере (как переводит компилятор с C в ассемблер).

a=2000.

b=a.

MOVLW 208
MOVWF _a+0
MOVLW 7
MOVWF _a+1

MOVLW 208
MOVWF _b+0

Что касается вашего примера, то тут есть два случая:
1) Если переменной char присвоено значение (в вашем случае 30) то строчки x=(int)c*10 и x=c*10 будут иметь одинаковое количество команд на ассемблере, то есть компилятор сам все подсчитает и упростит.
2) Если переменной char не присвоено значение, то строчка x=(int)c*10 будет занимать больше команд на ассемблере, чем строчка x=c*10, так как грамотно написанный компилятор подсчитает все возможные варианты и выделит памяти по максимуму.

Я эти примеры привел к тому, что компилятор для МК не есть компилятор для ПК, так как количество команд для компиляторов для ПК и МК разное.
Pavel
 
Сообщения: 71
Зарегистрирован: 22 мар 2010, 21:46

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Ewgen » 26 июл 2018, 21:03

Как присвоить значения таймера TMR1H TMR1L ( контроллер PIC16) двухбайтной или четырёхбайтной переменной ?
Ewgen
 
Сообщения: 221
Зарегистрирован: 13 ноя 2009, 20:40
Откуда: Ульяновск

Re: Арифметические программы на языке С для AVR и PIC

Сообщение Ewgen » 17 апр 2019, 10:25

В Micro C PRO for PIC v 4.15
unsigned int Taimer1; // 16 bit
unsigned short TH. TL; // 8 bit

TH=TMR1H;// старший байт
TL=TMR1L; // младший байт

Taimer1=0;
Taimer1=Taimer1+TH; // сложить c TH
Taimer1=Taimer1<<8; // сдвинуть влево на 8 бит сделать старшим байтом в двухбайтной переменной Taimer1
Taimer1=Taimer1+TL; // сложить с младшим байтом TL всё работает нормально
Ewgen
 
Сообщения: 221
Зарегистрирован: 13 ноя 2009, 20:40
Откуда: Ульяновск


Вернуться в Всё остальное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13

cron