Можно конечно, но я IAR полюбил в последнее время. В AVR студии я кодил только на асме, там еще компилятор сишный нормальный надо искать и т. д.
Прогу пишу для работы, так что возиться хочется по минимуму.
А что, с портированием сильно замучаюсь? Вот статью нашел: http://we.easyelectronics.ru/Yanichar/p ... stm8l.html
Щас пытаюсь повторить то же, но для АВР.
Что-то вообще примеров мало как библиотекой пользоваться... Я думал такая вещь распространенная должна быть, чуть ли не единственная нормальная библиотека...
Здравствуйте, что-то не как с компилятором(IAR) не могу разобраться.
Есть у меня гигантский массив что бы он не мозолил глаза (и не только он делается автоматически) я его запихал и отдельный файл romfile.c
и добавил в проект #include <romfile.c> но вот все типы переменные типа u_char и структуры он там(в файле romfile.c) перестаёт понимать. Хотя выше стройкой стоит #include <types.h> в котором всё объявлено. Если вытащить всё из файла то всё нормально работает.
Как с этим быть?
Доброго времени суток! Такое дело, МК ATmega32, пишу в Atmel Studio 6.0, на СИ (при создании проекта выбираю С++). Опытным путём получается, что будь то:
UPD: А ведь при написании кода на си можно делать ассемблерные вставки. А может быть можно сделать вставку, в которой объявить нужную переменную нужного размера, и указать где в памяти выделить под неё место? Если можно, можете дать пример кода? Ассемблер я сейчас соооовсем не помню
ploop писал(а):По идее должен понимать стандартные uint8_t, uint16_t, uint32_t, uint64_t
Эти типы в avr-lib определены в stdint.h.
Мikа писал(а):Опытным путём получается
Каким именно путём вы это получили?
Когда уже ничего не помогает - прочтите, наконец, инструкцию.
Лучший оптимизатор находится у вас между ушей. (Майкл Абраш, программист Quake и QuakeII)
Избыток информации ведёт к оскудению души - Леонтьев А. (сказано в 1965 г.)
Kavka, работаю с часами. Храню время в секундах. Опытным путём выяснил, что хранится нормально 09 часов, 06 минут (секунды не подсчитывал - они в программе считаются, но на индикаторе только ЧЧ:ММ). Итак, 09 часов и 06 минут это:
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);
}
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
// --- Вычисление старшего разряда часов
hh=0; //Это обнуление нужно для того, чтобы каждый новый пересчёт (который ниже) прибавление было с 0
while (h>9)//Если часы больше 9
{
h=(h-10);//Часы минус 10
hh++; //Увеличить старший разряд часов на 1
}
// --- END Вычисление старшего разряда часов
// --- Вычисление младшего разряда часов
hl=h;
// --- END Вычисление младшего разряда часов
ploop, я щас пытаюсь понять чё он там компилирует в disassembly. Я не совсем понял ваш вопрос. Вы имеете ввиду объявить переменную в теле int main(void) ?
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
35000 - сработал правильно, 65000 - начал показывать абра-кадабры. Причём начал их показывать почти сразу (не уходя далеко от 35000). Щас переделаю программу, чтобы работала с 16 бит переменными, но, бле, вопрос, всё-таки, интересный О_о
Почему я здесь и задаю тупые вопросы?
Потому что хочу научиться.
У мння убеждённость, что компилятор выдаёт мне знаковые переменные из 16 бит. 65000 - это беззнаковые 16 бит
Ещё одна идея есть. Щас напишу простую программку, которая будет работать так: