Чт окт 03, 2024 12:11:45
Пт окт 04, 2024 09:50:03
Пт окт 04, 2024 11:27:24
Пт окт 04, 2024 16:08:53
Пт окт 04, 2024 16:27:56
Пн окт 21, 2024 20:13:25
Пн окт 21, 2024 21:52:42
Пн окт 21, 2024 22:10:47
Вт окт 22, 2024 14:33:17
BDDW писал(а):Я, к сожалению, не пользуюсь протеусом.
Чт окт 24, 2024 12:27:24
Пт окт 25, 2024 12:43:39
BDDW писал(а):Но, хотелось бы разобраться с тем, что так разносит стек аж на 75% памяти.
BDDW писал(а):Я знаю про протеус. И как то пытался его ставить. Но у меня ничего не получилось.
BDDW писал(а):Можно поставить ATmega328. Но, хотелось бы разобраться с тем,
BDDW писал(а):А вот как всю программу отладить??? Как имитировать внешние прерывания и другие входящие сигналы?
BDDW писал(а):аж на 75% памяти
Сб окт 26, 2024 12:28:24
Сб окт 26, 2024 15:54:23
BDDW писал(а):Но, хотелось бы разобраться с тем, что так разносит стек аж на 75% памяти.
BDDW писал(а):Я знаю про протеус. И как то пытался его ставить. Но у меня ничего не получилось.
BDDW писал(а):Можно поставить ATmega328. Но, хотелось бы разобраться с тем,
Сб окт 26, 2024 16:08:41
Сб окт 26, 2024 17:21:18
Сб окт 26, 2024 17:32:01
Сб окт 26, 2024 17:38:26
Сб окт 26, 2024 21:58:42
да, вместо медленного ЖКИ вы выводите в еще более медленный USART...это категорически неприемлемо - из прерываний выводить на ЖКИ!
Сб окт 26, 2024 22:07:56
BDDW писал(а):Значит остальное может занимать стек.
Про то, что стек может наползать на данные, у меня закрадывалась мысль, а ответ Just_Fluffy полностью утвердил меня в моих предположениях.
BDDW писал(а):Пожалуйста, не пинайте меня сильно, но я не знаю как это сделать.
Сб окт 26, 2024 22:29:48
//Вычисление Тока
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);