Открытый проект универсального зарядника

R2D2

V1.1 заработала (пока только цифровая). В програматоре есть глюк r11 надо прицепить к X2:3, а не X2:9.
Чуть с ума не сошел пока выловил. Теперь знаю - проверять нужно все!!!

Дроссель SEPIC тоже пищит в старой схеме зараза. Может есть какая прормышленная теплопроводная смола с нормальным температурным коэффициентом.
Конечно интересно в смысле схемы. Постараюсь ее тоже приделать чуть позже.

Больше всего времени в проекте сожрали интерфейс пользователя и алгоритмы с химией.
А заделать еще одну силовую легко.
При человеческом прописывании меню и всех настроек подстроек, деже без учета двухканальности (которая в основном отъела только ОЗУ) в 16кБ проги уместиться не возможно (как мне кажется).

Очень я озаботился лицензиозностью и доступностью проекта.
Bulder стоит ~$2000 с возможностью распостронять прогу.
IAR AVR стоит ~$3000
Ну вот для программеров одиночек любителей разве такая политика принесет доход?

Посему хочу “макро” прогу переписать на жабе jdk это займет время на изучение. Мне и по работе надо заодно.
Искал ченить бесплатное чтобы в КОМ лазить и график нарисовать. Visual Studio Express тормозючий… на моем ноуте.
Ява тоже тормозючая, но там с переносом на разные платформы говорят хорошо??? да и вообще интересно.
Да вот узнал - ява и яваскрипт что в браузере это совершенно разные языки.
Ява может все!!!, но медленнее чем Си. Яваскрипт это так - “по мелочи”.

И микро прогу хочу переписать на АВРовском вин-си. Тоже время на изучение оболочки по часу в день.
В остальное время правлю микропрограмму по старому с учетом новых особенностей и выбросом аттавизмов.

Vasily_A
R2D2:

Очень я озаботился лицензиозностью и доступностью проекта.
Bulder стоит ~$2000 с возможностью распостронять прогу.
IAR AVR стоит ~$3000
Ну вот для программеров одиночек любителей разве такая политика принесет доход?

WinAvr (это gcc сборка под виндовс - все в комплекте, включая простенькую иде)
бесплатный, хорошо документированный, в дистрибутиве есть примеры, куча примеров в инете. куча библиотек.
я на нем последние года 4 под авр пишу, проблем нет (были мелкие в ранних версиях, но легко обходились)
при необходимости могу подсказать по переходу с иара (хотя все и так просто, может только строковые константы во флеше описываются своеобразно). код получается весьма приличный.

8 days later
R2D2

Ага!
Нужны примеры по WinAvr (с прерываниями и всякими строковыми структурами). Где почитать?

Из полезного нашел вот: www.myrobot.ru/stepbystep/mc_winavr.php

Кто-нибудь знает можно ли AVRDUDE - программатор (из комплекта winavr) настроить на PoniProg(овское) железо?

Говорят компилятор winavr слабее оптимизирует код чем IAR, т.е. неиспользуемое включает.

Заранее спасибо!

alex_grach
R2D2:

Ага!
Нужны примеры по WinAvr (с прерываниями). Где почитать?

Из полезного нашел вот: www.myrobot.ru/stepbystep/mc_winavr.php

Кто-нибудь знает можно ли AVRDUDE - программатор настроить на PoniProg(овское) железо?

Можно, причем в конфигурационном файле (avrdude.conf) уже есть вот такой:
programmer
id = “pony-stk200”;
desc = “Pony Prog STK200”;
type = par;
buff = 4, 5;
sck = 6;
mosi = 7;
reset = 9;
miso = 10;
pgmled = 8;
;

Vasily_A
R2D2:

Ага!
Нужны примеры по WinAvr (с прерываниями и всякими строковыми структурами). Где почитать?
Говорят компилятор winavr слабее оптимизирует код чем IAR, т.е. неиспользуемое включает.

по прерываниям: как битики в регистрах конфигурить - это у любого компилятора одинаково, пример кода обработчика:
откуда брать подобное SIG_OVERFLOW0 и SIG_INPUT_CAPTURE1, чтоб не нибивать руками и не ошибаться - смотрим соответствующий процу h-файл в (например для меги8 iom8.h)

звездочки “*” куда попало движок форума вставил, я не виноват 😃

#incl*ude <type.h>
#incl*ude <avr/io.h>
#incl*ude <avr/interrupt.h>

SIGNAL (SIG_INPUT_CAPTURE1) //это прерывание по входу захвата, ну далее ясно…
{
icp_cur=ICR1-icp_last;
icp_last=ICR1;
icp_flg=1;
}
/************************************************************************************/
SIGNAL (SIG_OVERFLOW0)
{
pos++;

оптимизация - мне часто надо на скоростные процессы обслуживать - поэтому кодогенерацию смотрю часто, очень даже прилично все.

R2D2

Спасибо!

Всегда очень трудно сделать первые шаги.

  1. Про генерацию файла проекта ясно. Используем утилитку MFile
  2. Про стандартный язык ясно. В целом все как обычно в си и названия битов притянуты из даташита.
  3. Про особенности прерываний ясно. Из предыдущего коментария.
    ??? 4. Про особенности описания строковых переменных и работы с различными видами памяти (флэш озу ппзу) не совсем ясно. Подсмотреть бы.
  4. Про компиляцию ясно. Из программерс нотепада
  5. Про прошивание ясно. От тудаже.
R2D2

Про ОЗУ все ясно - обычное использование строковых переменных

А вот про flash и eeprom???

Например в IAR я делал так:

typedef BYTE __flash * Txt; // Тип данных строка, оканчивающаяся нулем во флаш
typedef __flash BYTE __flash * pTxt; // Тип данных массив указателей, находящийся во флаш, на строки, находящиеся во флаш

// Пункты меню
pTxt pMn[]=
{
(Txt)“1.Канал-1 пуск”, //Запуск диалога первого канала (не запускать)
(Txt)“2.Канал-2 пуск”, //Запуск диалога второго канала (не запускать)
(Txt)“3.Список аккум”, //Заголовок
(Txt)“3.1.Просмотр акк”, //Просмотр всех аккумуляторов

}

Далее зная номер указателя на строку можно ее побайтно например рисовать на ЖКИ.
Да еще забыл спросить про определение фузов прямо в программе. Кажется такое возможно в WinAvr

Vasily_A
R2D2:
  1. Про генерацию файла проекта ясно. Используем утилитку MFile

достаточно руками в мэйкфайле из примера поправить тип процессора и имя исходника

R2D2:

??? 4. Про особенности описания строковых переменных и работы с различными видами памяти (флэш озу ппзу) не совсем ясно. Подсмотреть бы.

вот, посмотри…
надергал строчек из реального проекта.

#incl*ude <avr/pgmspace.h>
#define P(s) ({static const char c[] __attribute__ ((progmem)) = s;c;})
#define Tx_Str(str) PutStringP(P(str))
void PutStringP(const char *Str);
//============================================================
void Uart_Tx(u_char bt)
{
while ( !(UCSRA & (1<<UDRE)) ); //atmega wait for empty transmit buffer
UDR = bt; // start transmittion
}
//============================================================
void PutStringP(const char *Str)
{
char c;
while ((c = pgm_read_byte(Str++))) Uart_Tx©;
}
//============================================================
int main(void)
{
UBRRH = 0;
UBRRL = 47; //7.3728M 9600
UCSRB = (1<<RXEN)|(1<<TXEN); // Enable Receiver and Transmitter
UCSRC = (1<<URSEL)|(3<<UCSZ0); // Set frame format: 8data, 1stop bit
Tx_Str(“эта строка в флеш-памяти программ”);
}

R2D2

Вот такие штуковины:

Это цифровая часть


Это силовая SEPIC
Броневой сердечник 35мм судя по цвету HM2000
Зазор 0.5мм
L1=39 скрутка/0.315мм/7 витков=11мкГн
L2=13 скрутка/0.315мм/10 витков=26мкГн


Это силовая BUCK
Броневой сердечник 35мм без зазора судя по цвету HM2000
L=1.2мм/до заполнения=5300мкГн

Это все вместе


Думаю засунуть все в старуюкоробку от АТ блока питания.
Красивую алюминивую коробку в чипе дипе купил (о которой говорилось ранее), крутил и так и сяк - не лезет.
Надо переразводить.

Цифровая заработала!!!
Силовые не включал - прогу переписываю.

R2D2

Мне подкинули книжку djvu

shpak_yu_a__programmirovanie_na_jazyke_s_dlja_avr_i_pic_mikr.djvu

Программирование на языке Cи для AVR и PIC микроконтроллеров.

Там про WinAvr все подробно расписано.

Чё-то bool gcc не признает!!! Какаято ерунда не пойму.

mega_john
R2D2:

Чё-то bool gcc не признает!!! Какаято ерунда не пойму.

#incl*ude “stdbool.h” поможет 😒

Xetrix
R2D2:

shpak_yu_a__programmirovanie_na_jazyke_s_dlja_avr_i_pic_mikr.djvu
Программирование на языке Cи для AVR и PIC микроконтроллеров.
Там про WinAvr все подробно расписано.

Можете поделиться?
Сюда или на bob5024 [sobacka] mail.ru

R2D2

Вот некоторые рассуждения, которые посетили меня.
Я постараюсь реализовать их именно в этом виде.
Возможно, они будут полезны комунибудь.

// Отображение информации на LCD происходит в 2 уровня как и раньше.

// Высокий уровень:
// Доступен из основной программы в “любой момент времени”.
// Вызов отрисовки прозводится через подпрограмму PrnScr(BYTE SHABLON, BYTE PERIOD)
// Шаблон это командная последовательность байтов. Например: очистить экран, вывести
// строку S, вывести переменную P, поставить курсор, стереть подстроку. Указанные элементы шаблона
// могут быть прорисованы единожды или обновляемы при каждой прорисовке.
// Шаблоном может быть стандартное отображение Меню или Экран хода зарядки или тестирования.
// Механизм шаблонов позволяет гибко настраиваться на разного размера экраны (2х16 или 4х20)
// и производить русификацию, англификацию.
// После вызова шаблон становится текущим и обновляется (его изменяемая часть) в основной программе
// при наступлении PERIOD.
// Прорисовка шаблона происходит в видеопамять.
// Если низкий уровень не доделал свое задание (не послал видеопамять в ЖКИ),
// прорисовка шаблона не происходит до следующего PERIOD.
// Во время прорисовки шаблона низкий уровень ждет.

// Низкий уровень
// Во время работы низкого уровня высокий уровень ждет.
// Любой вид LCD может быть подменен заменой низкоуровневой подпрограммы (драйвера LCD).
// В случае текстового LCD каждая буква видеопамяти превращается в
// низкоуровневую последовательность байтов-команд для установки и сбрасывания
// битов управления LCD через равные промежутки времени, определенные прерыванием.
// В случае графического LCD, посылка каждой буквы происходит посылкой адреса
// спрайта и самого спрайта (например из 8 байт).
// В случае графического LCD интегрированного с железным драйвером-процом, происходит передача
// управляющих последовательностей процу, который сам работает со своим LCD.
// Посылка низкоуровневых команд в LCD, происходит, используя прерывания, через равные промежутки
// времени - позволит избавиться от ожиданий готовности LCD и равномерно распределит
// вычисления на процессор вперемешку с основной задачей - контроля заряда.

// Т.о. мы имеем одно неизменяемое программное ядро работы с зарядкой и гибкое решение по привязке к различным LCD

R2D2

Ацтой!!!

То, что под IAR занимало 65%FLASH и 80%SRAM
под WinAvr занимает 104%FLASH и 130%SRAM
В обоих случаях выбрана максимальная оптимизация.

А мне надо значительно переписать прогу. Количество текстов увеличится. С учетом наработанного опыта многие самопальные функции уйдут в пользу библиотечных и объектная ориентированность уменьшит количество вызовов объем и скорость. Короче под IAR закончить проект на этом проце - реально. Для WinAvr надо брать другой проц раза в 2 больше по всему.

Можно отказаться от float и написать свой класс целочисленный floor(float*100)=long
Т.е. IAR показывает, что экономить есть возможность.
Но посвятить себя экономии - 😃

Где заработать $5000, чтоб стать чесным и работать на лучшем?

Vasily_A
R2D2:

Ацтой!!!

То, что под IAR занимало 65%FLASH и 80%SRAM
под WinAvr занимает 104%FLASH и 130%SRAM
В обоих случаях выбрана максимальная оптимизация.

А мне надо значительно переписать прогу. Количество текстов увеличится. С учетом наработанного опыта многие самопальные функции уйдут в пользу библиотечных и объектная ориентированность уменьшит количество вызовов объем и скорость. Короче под IAR закончить проект на этом проце - реально. Для WinAvr надо брать другой проц раза в 2 больше по всему.

Можно отказаться от float и написать свой класс целочисленный floor(float*100)=long
Т.е. IAR показывает, что экономить есть возможность.
Но посвятить себя экономии - 😃

Где заработать $5000, чтоб стать чесным и работать на лучшем?

math вроде вполне приличный, я достатосно его использовал.

а листинг смотреть не пробовали? странный эффет - по коду еще можно поверить (с большим трудом), а по озу непонятно: все структуры данных описываете сами, откуда перерасход?
что смотреть:
строковые константы как описаны (я выше пример приводил, ниже еще кусок)
стандартный printf не используете? я предпочитаю вывод сам писать.
может лишние библиотеки подключены?
оптимизация какая стоит? самая большая циферка не значит самая лучшая…

пример констант:
#incl*ude <avr/pgmspace.h>
prog_char const SinTable[] = “\x80\x98\xB0\xC5\xD8\xE8\xF3\xFB\xFD\xFB\xF3\xE8\xD8\xC5\xB0\x98\x80\x68\x50\x3B\x28\x18\x0D\x05\x03\x05\x0D\x18\x28\x3B\x50\x68”;
а это ее использование (в прерывании)
OCR2=pgm_read_byte(SinTable+phase);

R2D2

Наверняк я сам налобал ошибок.

printf scanf не использую вообще
синусы косинусы степени и тд тоже нет у меня только умножение и деление флоат
по этому поводу думаю вообще от флоат отказаться и перейти на long=float*1000

Но здесь есть подводный камень. Например суммирование интегрального полученного/отданного заряда. Точность уплывет.

Всвязи с этим решил переписывать все так как вижу много кривых мест в старой проге.
И по мере переписи контролировать память.

R2D2

Облазил все файлы не могу найти где посмотреть в какой вид памяти указатели на строки разместились.

И вообще где смотреть размер и расчет стэка, кучи и т.д.
Должна же быть там какаянибудь подбивка итогов?

Использую только

#incl*ude <avr/io.h>
#incl*ude <avr/fuse.h>
#incl*ude <avr/interrupt.h>
#incl*ude <avr/pgmspace.h>
#incl*ude <avr/eeprom.h>
#incl*ude <avr/wdt.h>

Написал свое определение битов ног проца по совету старших товарищей.
Теперь можно в ноги писать и читать по названию как в IAR
Пока не проверял, но компилятор пропускает.
Идею содрал из другого форума
Мог напортачить только с номером(адресом) порта их бывает 2, но кажись не напортачил.

typedef struct _bit_struct {unsigned char Bit0:1, Bit1:1, Bit2:1, Bit3:1, Bit4:1, Bit5:1, Bit6:1, Bit7:1; }bit_field;

#ifdef PORTA
#define PORTA_Bit0 (*((volatile bit_field*) (PORTA))).Bit0
#define PORTA_Bit1 (*((volatile bit_field*) (PORTA))).Bit1
#define PORTA_Bit2 (*((volatile bit_field*) (PORTA))).Bit2
#define PORTA_Bit3 (*((volatile bit_field*) (PORTA))).Bit3
#define PORTA_Bit4 (*((volatile bit_field*) (PORTA))).Bit4
#define PORTA_Bit5 (*((volatile bit_field*) (PORTA))).Bit5
#define PORTA_Bit6 (*((volatile bit_field*) (PORTA))).Bit6
#define PORTA_Bit7 (*((volatile bit_field*) (PORTA))).Bit7
#endif

#ifdef DDRA
#define DDRA_Bit0 (*((volatile bit_field*) (DDRA))).Bit0
#define DDRA_Bit1 (*((volatile bit_field*) (DDRA))).Bit1
#define DDRA_Bit2 (*((volatile bit_field*) (DDRA))).Bit2
#define DDRA_Bit3 (*((volatile bit_field*) (DDRA))).Bit3
#define DDRA_Bit4 (*((volatile bit_field*) (DDRA))).Bit4
#define DDRA_Bit5 (*((volatile bit_field*) (DDRA))).Bit5
#define DDRA_Bit6 (*((volatile bit_field*) (DDRA))).Bit6
#define DDRA_Bit7 (*((volatile bit_field*) (DDRA))).Bit7
#endif

#ifdef PINA
#define PINA_Bit0 (*((volatile bit_field*) (PINA))).Bit0
#define PINA_Bit1 (*((volatile bit_field*) (PINA))).Bit1
#define PINA_Bit2 (*((volatile bit_field*) (PINA))).Bit2
#define PINA_Bit3 (*((volatile bit_field*) (PINA))).Bit3
#define PINA_Bit4 (*((volatile bit_field*) (PINA))).Bit4
#define PINA_Bit5 (*((volatile bit_field*) (PINA))).Bit5
#define PINA_Bit6 (*((volatile bit_field*) (PINA))).Bit6
#define PINA_Bit7 (*((volatile bit_field*) (PINA))).Bit7
#endif

и т.д.

Vasily_A
R2D2:

синусы косинусы степени и тд тоже нет у меня только умножение и деление флоат
по этому поводу думаю вообще от флоат отказаться и перейти на long=float*1000

Но здесь есть подводный камень. Например суммирование интегрального полученного/отданного заряда. Точность уплывет.

Всвязи с этим решил переписывать все так как вижу много кривых мест в старой проге.
И по мере переписи контролировать память.

при компиляции смотреть на окно вывода, там видно сколько кода\данных (ну можно еще начало *.lss посмотреь)

описали переменную\константу, запомнили сколько было - скомпилировали, посмотрели сколько стало.

если просто написать строка=‘АБВГ’, то компилятор сосздаст ее в озу, и стартапом скопирует в нее это АБВГ, что весьма криво.
код получается весьма плотный, глядя по листингу видно. иногда на входе в функцию пара команд бывает, которые мне несовсем понятно зачем нужны, но все смотреть просто смысла нет.

мелкий совет - если совсем с памятью кода туго, строки в еепром можно засунуть частично. или внешнюю и2ц на 64кб прицепить под текст меню 😃