1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
1

Atmega32. AVR Studio. Объявление типа Long Int

04.02.2014, 18:50. Показов 5149. Ответов 12
Метки нет (Все метки)

Добрый день.
Программирую на си в AVR Studio 6.
Возникла проблема в том, что тип long int занимает не 32 бита как положено, а только 16, и вообще не смог инициализировать тип размером больше 16 бит. Компилятор не ругается, но при работе программы используются только первые 16 бит, записанных в переменную. Есть ли возможность организовать хранение одной перменной больше 16 бит?
Заранее спасибо !
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.02.2014, 18:50
Ответы с готовыми решениями:

Работа с LCD (ATMega32, AVR Studio)
Здравствуйте , у появилась проблема с программированием в AVR studio , а именно нужно создать...

AVR ассемблер. объявление массива .db Atmel Studio 7, ошибка компиляции?
Столкнулся со странной проблемой. Написал код для дисплея. код рабочий такой: .CSEG ;...

CAVR против AVR Studio, что не так в программе под AVR Studio
Проблема такая, есть исходник, если его компилировать в CAVR заливаю в МК все работает, если этот...

V-USB на AVR ATmega32
Всем привет!) такое у меня случилось.. ставлю прошивку на AVR ATmega 32 c V-USB как HID...

12
142 / 120 / 21
Регистрация: 14.02.2013
Сообщений: 817
04.02.2014, 22:50 2
Попробуйте объявить переменную вот так
unsigned long i=4294967295;
что скажет компилятор?
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
05.02.2014, 10:46 3
Лучший ответ Сообщение было отмечено raxp как решение

Решение

Цитата Сообщение от georgfour Посмотреть сообщение
Возникла проблема в том, что тип long int занимает не 32 бита как положено
Ни кем ни чего не положено, стандарт языка си не определяет абсолютную размерность базовых типов данных. Но с любым компилятором идут два файла определяющих размерность базовых типов данных: limits.h – содержит диапазоны целочисленных значений, float.h – содержит диапазоны вещественных значений.
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
05.02.2014, 12:10  [ТС] 4
VladimirU, пробовал, объявляется, но при работе с данным числом используются только первые 16 бит.
Витальич, а где эти файлы можно посмотреть в AvrStudio 6?
0
1930 / 1245 / 124
Регистрация: 04.01.2010
Сообщений: 4,481
05.02.2014, 12:23 5
Цитата Сообщение от georgfour Посмотреть сообщение
при работе с данным числом используются только первые 16 бит.
покажите пример, как вы с ним работаете, с объявлениями всех участвующих переменных в выражении. Вполне возможно, разрядность теряется в момент вычислений.
1
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
05.02.2014, 12:35 6
georgfour, обычно они лежат там же где и стандартная библиотека ввода/вывода или просто поиском по названию файлов найдите.
P.S. Студией лет пять как не пользуюсь поэтому точно не помню где в ней лежат. Сишный компилятор в студии это GCC
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
05.02.2014, 13:53  [ТС] 7
Всю программу приводить не буду, так как она довольно таки громоздкая, приведу функции, которые используют данную переменную:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void type_number_32(long int number)//Вывод числа в двочиной системе 
{   long int buff=number;
    unsigned char count=0;
    if(buff==0)
    {   type_symbol(0);
    }
    while(buff!=0)
    {   buff=buff>>1;
        count++;
    }
    for(int i=count-1;i>=0;i--)
    {   buff=number;
        buff&=_BV(i);
        buff=buff>>i;
        type_symbol(buff);//Функция принимает значение unsigned char и выводит на ЖК дисплей символ из библиотеки
    }
}
int main(void)
{   DDRD=0b00000000;
    PORTD=0b11111111;
    DDRC=0b00011111;
    PORTC=0b11111111;
    DDRA=0b11111111;
    PORTA=0b11111111;
    lcd_init();//Инициализация ЖК дисплея
    clscr(0);//Очистка ЖК дисплея
    while(1)
    {   
        type_number_32(0b1111111111111111); 
    }
}
В результате данной операции выводит не 0b1111111111111111, а 0b0000000011111111, как будто long int состоит из 16 значащих бит.
0
1930 / 1245 / 124
Регистрация: 04.01.2010
Сообщений: 4,481
05.02.2014, 15:01 8
Ужос в коде. Но ключевая ошибка, по-видимому, в дефайне BV_ - вместо него напишите буквально:
((unsigned long)1)<<i;
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
05.02.2014, 15:26  [ТС] 9
а почему ужас то?)
0
1930 / 1245 / 124
Регистрация: 04.01.2010
Сообщений: 4,481
05.02.2014, 16:05 10
собсно, ужос вот здесь:
Цитата Сообщение от georgfour Посмотреть сообщение
C
1
2
3
4
5
6
for(int i=count-1;i>=0;i--)
* * { * buff=number;
* * * * buff&=_BV(i);
* * * * buff=buff>>i;
* * * * type_symbol(buff);//Функция принимает значение unsigned char и выводит на ЖК дисплей символ из библиотеки
* * }
я бы так написал:
C
1
2
3
4
5
6
7
8
9
buff=((unsigned long)1)<<count;
for(int i=0;i<count;i++)
{
  if (number & buff)
    type_symbol(1);
  else
    type_symbol(0);
  buff>>;
}
1. Написать можно еще лаконичнее, но так понятнее.
2. Работать будет быстрее.
3. Не факт что 'int' у вас знаковый. Иногда он беззнаковый. Соответственно, цикл не закончится.
0
1 / 1 / 0
Регистрация: 10.03.2013
Сообщений: 404
05.02.2014, 19:17  [ТС] 11
Да, это хорошая идея, спасибо большое за помощь!

Добавлено через 2 часа 58 минут
Правильно я понимаю, что 31 байт, если считать с нуля, всегда кодирует знак? В long int

Добавлено через 10 минут
Немного не понимаю просто разницу вот между этими числами:
0b0111....1 (31 единица) и -0b0111...1 (31 единица). Можно ли вообще такой минус ставить перед двоичной записью?
Если можно, тогда чему будет равна такая запись : -0b111...1 (32 единицы).
И как в двоично системе будет выглядит -50 ? Просто получается что минус добавляется просто добавлением единицы в 31 бит (считаем с нуля), но каркулятор Windows, как и компилятор, на -50 выдает
111111111111111111111111111111111111111111111111111111111100 1110, а не -110010. Что=то я где то недопонимаю, не могли бы вы подсказать, большее спасибо заранее.
0
1930 / 1245 / 124
Регистрация: 04.01.2010
Сообщений: 4,481
06.02.2014, 00:35 12
1) Нельзя писать двоичные отрицательные числа с минусом, это неправильно. По крайней мере в общем виде, не зная разрядность числа.
2) Каркулятор выдает в том виде, в котором настроен. В Windows XP правильный калькулятор (самый удобный для этого), в котором можно выбрать количество байт при счете. В зависимости от этого будет количество единиц и нулей.
3) Счет в отрицательных числах в битовом эквиваленте выполняется через "переполнение". То есть
0x00 - 0x01 = 0xFF (а не 0x81, как "величина, с добавлением единицы в последний бит"). Таким образом, не теряется непрерывность числового ряда.

PS: Смена знака в битовых числах осуществляется с помощью инверсии всего числа и добавления единицы к результату
0
1279 / 1185 / 175
Регистрация: 02.12.2013
Сообщений: 4,884
06.02.2014, 06:44 13
http://ru.wikipedia.org/wiki/%... 0%BE%D0%B4
ТС, Почитайте на досуге.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2014, 06:44

Работа SD/MMC карты с микроконтроллером AVR ATMega32
Добрый день! Мне нужна помощь по данной работе. Пожалуйста расскажите как её сделать через...

AVR Studio 6 и AVR Toolchain вопросы!
Всем доброго времени суток. Решил я написать софтинку в новой студии от Атмела AVR Studyo 6. Все...

GCC и AVR Studio 5 и AVR Studio 4.18
Доброго дня Всем! Кто может подсказать следующее - у меня установлена AVR Studio 5 со встроеным...

IAR AVR, объявление переменных
День добрый. Подскажите начинающему. в main.c объявил переменные static unsykned long...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.