Вопросы по С/С++ (СИ)
Re: Вопросы по С/С++ (СИ)
Можно конечно, но я IAR полюбил в последнее время. В AVR студии я кодил только на асме, там еще компилятор сишный нормальный надо искать и т. д.
Прогу пишу для работы, так что возиться хочется по минимуму.
А что, с портированием сильно замучаюсь? Вот статью нашел:
http://we.easyelectronics.ru/Yanichar/p ... stm8l.html
Щас пытаюсь повторить то же, но для АВР.
Что-то вообще примеров мало как библиотекой пользоваться... Я думал такая вещь распространенная должна быть, чуть ли не единственная нормальная библиотека...
Прогу пишу для работы, так что возиться хочется по минимуму.
А что, с портированием сильно замучаюсь? Вот статью нашел:
http://we.easyelectronics.ru/Yanichar/p ... stm8l.html
Щас пытаюсь повторить то же, но для АВР.
Что-то вообще примеров мало как библиотекой пользоваться... Я думал такая вещь распространенная должна быть, чуть ли не единственная нормальная библиотека...
Re: Вопросы по С/С++ (СИ)
Здравствуйте, что-то не как с компилятором(IAR) не могу разобраться.
Есть у меня гигантский массив что бы он не мозолил глаза (и не только он делается автоматически) я его запихал и отдельный файл romfile.c
и добавил в проект #include <romfile.c> но вот все типы переменные типа u_char и структуры он там(в файле romfile.c) перестаёт понимать. Хотя выше стройкой стоит #include <types.h> в котором всё объявлено. Если вытащить всё из файла то всё нормально работает.
Как с этим быть?
Есть у меня гигантский массив что бы он не мозолил глаза (и не только он делается автоматически) я его запихал и отдельный файл romfile.c
и добавил в проект #include <romfile.c> но вот все типы переменные типа u_char и структуры он там(в файле romfile.c) перестаёт понимать. Хотя выше стройкой стоит #include <types.h> в котором всё объявлено. Если вытащить всё из файла то всё нормально работает.
Как с этим быть?
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Доброго времени суток!
Такое дело, МК ATmega32, пишу в Atmel Studio 6.0, на СИ (при создании проекта выбираю С++). Опытным путём получается, что будь то:
В любом случае диапазон значения переменной -32768 ... 32767.
А как сделать больше?
Код: Выделить всё
unsigned int
unsigned long int
unsigned long
В любом случае диапазон значения переменной -32768 ... 32767.
А как сделать больше?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Мikа писал(а):А как сделать больше?
long long
pokk писал(а):Как с этим быть?
А понаглядней можно?
Re: Вопросы по С/С++ (СИ)
Мikа, какой там компилятор в этом Atmel Studio?
По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
ploop, пишут, что GCC (пост №6).
Щас попробовал так:
Правильно написал? результат отрицательный, диапазон значений t и S -32768 ... 32767.
Вот ещё нашёл, щас попробую...
UPD:
На выходе получается трижды треш О_о
UPD: А ведь при написании кода на си можно делать ассемблерные вставки. А может быть можно сделать вставку, в которой объявить нужную переменную нужного размера, и указать где в памяти выделить под неё место? Если можно, можете дать пример кода? Ассемблер я сейчас соооовсем не помню
UPD:
Не сработало
Щас попробовал так:
Код: Выделить всё
uint32_t S=0;
uint32_t t=0;Правильно написал? результат отрицательный, диапазон значений t и S -32768 ... 32767.
Вот ещё нашёл, щас попробую...
UPD:
Код: Выделить всё
uint32_t t EEMEM;
uint32_t S EEMEM;На выходе получается трижды треш О_о
UPD: А ведь при написании кода на си можно делать ассемблерные вставки. А может быть можно сделать вставку, в которой объявить нужную переменную нужного размера, и указать где в памяти выделить под неё место? Если можно, можете дать пример кода? Ассемблер я сейчас соооовсем не помню
UPD:
Код: Выделить всё
asm("t: .byte 32");Не сработало
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Эти типы в avr-lib определены в stdint.h.ploop писал(а):По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
Каким именно путём вы это получили?Мikа писал(а):Опытным путём получается
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Код: Выделить всё
#include <stdint.h>
uint32_t t=0;
uint32_t S=0;
Это не работает.
Kavka, работаю с часами. Храню время в секундах. Опытным путём выяснил, что хранится нормально 09 часов, 06 минут (секунды не подсчитывал - они в программе считаются, но на индикаторе только ЧЧ:ММ). Итак, 09 часов и 06 минут это:
09 * 3600 = 32400 сек
06 * 60 = 360 сек
32400 + 360 = 32760 сек.
16 битная переменная со знаком находится в -32768 ... 32767
32760 сек и 32767 очень похожи.
На индикаторе я вижу нормально отображение до времени 09:06, после чего абракадабру.
Отсюда я делаю вывод, что в Atmel Studio с GCC любые
Код: Выделить всё
unsigned int =0;
unsigned long int =0;
unsigned long =0;
uint32_t =0;
Фактически получают 16 бит, причём число там хранится со знаком. То есть unsigned копмпилятор тоже игнорирует.
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Мikа писал(а):На индикаторе я вижу нормально отображение до времени 09:06, после чего абракадабру
Так проверяйте функцию вывода на индикатор.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Функция в порядке.
Пересчёт секунд в ЧЧ:ММ:СС и вычисление значений, которые должен показать индикатор
ФУнкция динамической индикации
Пересчёт секунд в ЧЧ:ММ:СС и вычисление значений, которые должен показать индикатор
Спойлер
Код: Выделить всё
void SEC(void)
{
// --- Вычисление часов, минут и секунд из секунд
h=(t/3600);//Вычисление часов
m=((t-(h*3600))/60);//Вычисление минут
s=((t-(h*3600))-(m*60));//Вычисление секунд
// --- END Вычисление часов, минут и секунд из секунд
// --- Вычисление старшего разряда часов
hh=0; //Это обнуление нужно для того, чтобы каждый новый пересчёт (который ниже) прибавление было с 0
while (h>9)//Если часы больше 9
{
h=(h-10);//Часы минус 10
hh++; //Увеличить старший разряд часов на 1
}
// --- END Вычисление старшего разряда часов
hl=0;
// --- Вычисление младшего разряда часов
while (h>0)//Если часы больше 9
{
h--;//Часы минус 10
hl++; //Увеличить младший разряд минут на 1
}
// --- END Вычисление младшего разряда часов
mh=0;
// --- Вычисление старшего разряда минут
while (m>9)
{
m=(m-10);
mh++;
}
// --- END Вычисление старшего разряда минут
ml=0;
// --- Вычисление старшего разряда минут
while (m>0)
{
m--;
ml++;
}
// --- END Вычисление младшего разряда часов
sh=0;
// --- Вычисление старшего разряда секунд
while (s>9)
{
s=(s-10);
sh++;
}
// --- END Вычисление старшего разряда секунд
sl=0;
// --- Вычисление старшего разряда минут
while (s>0)
{
s--;
sl++;
}
// --- END Вычисление младшего разряда секунд
ФУнкция динамической индикации
Спойлер
Код: Выделить всё
void DICHM(void)
{
//Цикл динамической индикации
PORT_SEG=digits[hh]; //Часы старший
PORT_DIGITS ^= (1 << PINA4);//Инвертирую только один бит, потому что на порту кроме индикатора есть другие устройства
_delay_us(100);
PORT_DIGITS ^= (1 << PINA4);
if (d)//Это мигание двоеточием ЧЧ : ММ, d инвертируется в прерывании оп таймеру
{
PORT_SEG=digits[hl]; //Часы Младший - тут : не будет гореть
}
else
{
PORT_SEG=digitsd[hl]; //Часы Младший - тут : будет гореть
}
PORT_DIGITS ^= (1 << PINA5);
_delay_us(100);
PORT_DIGITS ^= (1 << PINA5);
PORT_SEG=digits[mh]; //Минуты старший
PORT_DIGITS ^= (1 << PINA6);
_delay_us(100);
PORT_DIGITS ^= (1 << PINA6);
PORT_SEG=digits[ml]; //Минуты младший
PORT_DIGITS ^= (1 << PINA7);
_delay_us(100);
PORT_DIGITS ^= (1 << PINA7);
}
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Вопросы по С/С++ (СИ)
так вроде проще:
и т.д.
Код: Выделить всё
// --- Вычисление старшего разряда часов
hh=0; //Это обнуление нужно для того, чтобы каждый новый пересчёт (который ниже) прибавление было с 0
while (h>9)//Если часы больше 9
{
h=(h-10);//Часы минус 10
hh++; //Увеличить старший разряд часов на 1
}
// --- END Вычисление старшего разряда часов
// --- Вычисление младшего разряда часов
hl=h;
// --- END Вычисление младшего разряда часови т.д.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
Да, проще. Но суть вопроса не в этом. Эти 2 функции работают нормально, а компилятор не даёт мне 32 бита под беззнакоове число
Что делать?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
- oleg110592
- Друг Кота
- Сообщения: 3832
- Зарегистрирован: Сб сен 10, 2011 17:46:25
Re: Вопросы по С/С++ (СИ)
так попробовать
h=(uint8_t)(t/3600U);//Вычисление часов
h=(uint8_t)(t/3600U);//Вычисление часов
Re: Вопросы по С/С++ (СИ)
бррр.... в код не полезу, и так уже глаза враскось...
Мikа, если прямо в коде задать константу, выводит нормально?
Мikа, если прямо в коде задать константу, выводит нормально?
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
ploop, я щас пытаюсь понять чё он там компилирует в disassembly. Я не совсем понял ваш вопрос. Вы имеете ввиду объявить переменную в теле int main(void) ?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Вы имеете ввиду объявить переменную в теле int main(void) ?
Нет, просто там, где используется переменная, заместо неё просто впишите число заведомо положительное, например 35000.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
35000 - сработал правильно, 65000 - начал показывать абра-кадабры. Причём начал их показывать почти сразу (не уходя далеко от 35000). Щас переделаю программу, чтобы работала с 16 бит переменными, но, бле, вопрос, всё-таки, интересный О_о
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Так это и есть 16 бит 
Надо на 32 переделывать.
Надо на 32 переделывать.
- Мikа
- Потрогал лапой паяльник
- Сообщения: 343
- Зарегистрирован: Пн апр 01, 2013 15:13:40
- Откуда: Москва
Re: Вопросы по С/С++ (СИ)
У мння убеждённость, что компилятор выдаёт мне знаковые переменные из 16 бит. 65000 - это беззнаковые 16 бит 
Ещё одна идея есть. Щас напишу простую программку, которая будет работать так:
Ещё одна идея есть. Щас напишу простую программку, которая будет работать так:
Код: Выделить всё
unsigned long i = 1000000000; (МИЛЛИАРД!!!11)
if(i == 1000000000)
{
включить лампочку!!!
}Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
Потому что хочу научиться.
Re: Вопросы по С/С++ (СИ)
Щас напишу простую программку, которая будет работать так:
Правильно. Только не забудь оптимизатор отключить или обмануть
А то вся программа превратится в
Код: Выделить всё
// включить лампочку!!!