И большего у бога не просил.
Теперь азарт мой возрастом уменьшен.
Теперь уже на книги нету сил."
И. Губерман.
Если вы не отладили, то очевидно что бы не посоветовать то вы этим не пользуетесь...BDDW писал(а):Я, к сожалению, не пользуюсь протеусом.
Откуда узнали?BDDW писал(а):Но, хотелось бы разобраться с тем, что так разносит стек аж на 75% памяти.
С процессором тоже не получилось, но пробуете, а протеус бросили.BDDW писал(а):Я знаю про протеус. И как то пытался его ставить. Но у меня ничего не получилось.
Так это только для того, чтобы проверить, а не просто заменить на более мощный.BDDW писал(а):Можно поставить ATmega328. Но, хотелось бы разобраться с тем,
Все просто или вручную установив нужный бит в нужном регистре или подключить модуль протеуса, а отладку делать в студио(но работает в старой версии студии).BDDW писал(а):А вот как всю программу отладить??? Как имитировать внешние прерывания и другие входящие сигналы?
Библиотеку для работы с float подключили?BDDW писал(а):аж на 75% памяти
Откуда узнали?[/uquote]BDDW писал(а):Но, хотелось бы разобраться с тем, что так разносит стек аж на 75% памяти.
С процессором тоже не получилось, но пробуете, а протеус бросили.[/uquote]BDDW писал(а):Я знаю про протеус. И как то пытался его ставить. Но у меня ничего не получилось.
Так это только для того, чтобы проверить, а не просто заменить на более мощный.[/uquote]BDDW писал(а):Можно поставить ATmega328. Но, хотелось бы разобраться с тем,

да, вместо медленного ЖКИ вы выводите в еще более медленный USART...это категорически неприемлемо - из прерываний выводить на ЖКИ!
У вас обоих неправильное предположение.BDDW писал(а):Значит остальное может занимать стек.
Про то, что стек может наползать на данные, у меня закрадывалась мысль, а ответ Just_Fluffy полностью утвердил меня в моих предположениях.
То был вопрос, а не совет подключить.BDDW писал(а):Пожалуйста, не пинайте меня сильно, но я не знаю как это сделать.
Код: Выделить всё
//Вычисление Тока
uint32_t PZEM_Current (void)
{
uint32_t pzem_data32 = 0;
pzem_data32 = (uart_data[7]<<8|uart_data[8])&0xFFFF;
pzem_data32 = (pzem_data32<<8|uart_data[5])&0xFFFFFF;
pzem_data32 = pzem_data32<<8|uart_data[6];
return pzem_data32;
}
//Вычисление мощности
uint32_t PZEM_Power (void)
{
uint32_t pzem_data32 = 0;
pzem_data32 = (uart_data[11]<<8|uart_data[12])&0xFFFF;
pzem_data32 = (pzem_data32<<8|uart_data[9])&0xFFFFFF;
pzem_data32 = pzem_data32<<8|uart_data[10];
return pzem_data32;
}
//Вычисление потребленной энергии
uint32_t PZEM_Energy (void)
{
uint32_t pzem_data32 = 0;
pzem_data32 = (uart_data[15]<<8|uart_data[16])&0xFFFF;
pzem_data32 = (pzem_data32<<8|uart_data[13])&0xFFFFFF;
pzem_data32 = pzem_data32<<8|uart_data[14];
return pzem_data32;
}
Код: Выделить всё
uint32_t calculate(uint8_t index){
uint32_t data = (uart_data[index+2]<<8 | uart_data[index + 3]) & 0xFFFF;
data = ((data << 8) | uart_data[index]) & 0xFFFFFF;
return data << 8 | uart_data[index+1];
}Код: Выделить всё
int main(void){
// инициализация всей периферии
// обращение к внешней аппаратуре и инициализация её
// подготовка данных (считывание из EEPROM? поиск там каких-то адресов и т.п.)
// вывод на ЖКИ приветствия (или меню, заставки и т.п.)
// запуск прерываний (это не обязательно, может, только некоторых из них)
while(1){
// измерения
// обработка измерений
// вывод результатов
// опрос событий EVENT (пришли данные по UART? нажаты кнопки? повернут энкодер? и т.п.)
switch(EVENT){
case EV_USART: // обработка данных из USART
break;
case EV_KBD: // обработка нажатий кнопок
break;
// и так далее, все события
}
}
}и тем самым отправить в USART две строки с значениями напряжения и тока, чем городить то же самое с помощью кучи массивов, циклов и т.п. неочевидных преобразований... 2 килобайта FLASH ради такого - не великая цена. ну и еще 2К, если никак без float в этом случае не обойтись... нервы дороже.printf("U=%d\nI=%d\n", U, I);