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

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кб прицепить под текст меню 😃

R2D2

Как в WinIar сделать над переменной то, что в ассемблере делает “swap”

Пришлось сделать так:

/* Swap BYTE*/
#define __swap_nibbles(_x) ({BYTE _y=_x; asm volatile(“swap %0” : “=&r” (_y) : “0” (_y)); _y;})

И еще для перехода c IAR на WinAvr

/* Set BIT in ADDRESS */
#define SETBIT(ADDRESS,BIT) ((ADDRESS) |= (1<<(BIT)))

/* Clear BIT in ADDRESS */
#define CLEARBIT(ADDRESS,BIT) ((ADDRESS) &= ~(1<<(BIT)))

/* Test BIT in ADDRESS */
#define TESTBIT(ADDRESS,BIT) ((ADDRESS) & (1<<(BIT)))

R2D2

Как в WinAvr работать с фузами

Стандартный пример не компелится

#incl*ude <avr/io.h>
#incl*ude <avr/fuse.h>

FUSES =
{
.low= // Запрограммированные фузы
(
CKOPT& // рекомендуется для зашумленных приборов и для частот больше 8 МГц
BODEN& // разрешить реагирование на уровень напряжения. Для стабильного запуска и защиты от порчи EEPROM.
BODLEVEL // минимальный уровень напряжения 2.7в. Для стабильного запуска и защиты от порчи EEPROM.
),
.high= // Незапрограммированные фузы
(
CKSEL3&CKSEL2&CKSEL1&CKSEL0& // Частота определяется внешним кварцевым резонатором
SUT0&SUT1& // 65мс медленный старт процессора
BOOTRST& // Стартовать из обычного вектора, а не из BOOT-а
BOOTSZ0&BOOTSZ1& // размер бутовой программы безразличен
EESAVE& // EEPROM не защищен
SPIEN& // SPI не важно разрешен или нет
OCDEN& // встроенный отладчик запрещен
JTAGEN // JTAG запрещен
),
};

main.cpp:31: error: expected primary-expression before ‘.’ token
main.cpp:37: error: expected primary-expression before ‘.’ token
make.exe: *** [main.o] Error 1

Vasily_A
R2D2:

Как в WinAvr работать с фузами

даже никогда не думал, что в проекте можно фьюзы описывать…

делаю так:
использую AVREAL (просто замечательный программатор Александра Редчука)
в директории с проектов держу несколько bat файлов - для программирования с прошивкой фьюзов, просто для программирования, и для ресета.

вызов бат-афйлов для программирования и ресета прописаны в иде, чуть ниже маке-алл строчки в меню
программирование фьюзов делаю один раз, при начале работы с новым кристаллом\платой, при отладке только флеш переписываю

под тиражирование бат-файл программирования с прошивкой фьюзов применяется.

вот пример содержимого этих 3-х файлов (1 строка в каждом)

avreal32 -p1 -as -o1000 +mega32 -ew eth_sr.hex -fCKSEL=F,JTAGEN=1,CKOPT=0
avreal32 -p1 -as -o8000 +mega32 -ew eth_sr.hex
avreal32 -p1 -as -o8000 +mega32