Открытый проект универсального зарядника
Ага!
Нужны примеры по WinAvr (с прерываниями и всякими строковыми структурами). Где почитать?
Из полезного нашел вот: www.myrobot.ru/stepbystep/mc_winavr.php
Кто-нибудь знает можно ли AVRDUDE - программатор (из комплекта winavr) настроить на PoniProg(овское) железо?
Говорят компилятор winavr слабее оптимизирует код чем IAR, т.е. неиспользуемое включает.
Заранее спасибо!
Ага!
Нужны примеры по 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;
;
Ага!
Нужны примеры по 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++;
оптимизация - мне часто надо на скоростные процессы обслуживать - поэтому кодогенерацию смотрю часто, очень даже прилично все.
Спасибо!
Всегда очень трудно сделать первые шаги.
- Про генерацию файла проекта ясно. Используем утилитку MFile
- Про стандартный язык ясно. В целом все как обычно в си и названия битов притянуты из даташита.
- Про особенности прерываний ясно. Из предыдущего коментария.
??? 4. Про особенности описания строковых переменных и работы с различными видами памяти (флэш озу ппзу) не совсем ясно. Подсмотреть бы. - Про компиляцию ясно. Из программерс нотепада
- Про прошивание ясно. От тудаже.
Про ОЗУ все ясно - обычное использование строковых переменных
А вот про 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
Вот нашел инфу: avr.h15.ru/index.php?page=winavr
- Про генерацию файла проекта ясно. Используем утилитку MFile
достаточно руками в мэйкфайле из примера поправить тип процессора и имя исходника
??? 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(“эта строка в флеш-памяти программ”);
}
Вот такие штуковины:
Это силовая SEPIC
Броневой сердечник 35мм судя по цвету HM2000
Зазор 0.5мм
L1=39 скрутка/0.315мм/7 витков=11мкГн
L2=13 скрутка/0.315мм/10 витков=26мкГн
Это силовая BUCK
Броневой сердечник 35мм без зазора судя по цвету HM2000
L=1.2мм/до заполнения=5300мкГн
Это все вместе
Думаю засунуть все в старуюкоробку от АТ блока питания.
Красивую алюминивую коробку в чипе дипе купил (о которой говорилось ранее), крутил и так и сяк - не лезет.
Надо переразводить.
Цифровая заработала!!!
Силовые не включал - прогу переписываю.
Мне подкинули книжку djvu
shpak_yu_a__programmirovanie_na_jazyke_s_dlja_avr_i_pic_mikr.djvu
Программирование на языке Cи для AVR и PIC микроконтроллеров.
Там про WinAvr все подробно расписано.
Чё-то bool gcc не признает!!! Какаято ерунда не пойму.
Чё-то bool gcc не признает!!! Какаято ерунда не пойму.
#incl*ude “stdbool.h” поможет 😒
Помогло однако!!!
shpak_yu_a__programmirovanie_na_jazyke_s_dlja_avr_i_pic_mikr.djvu
Программирование на языке Cи для AVR и PIC микроконтроллеров.
Там про WinAvr все подробно расписано.
Можете поделиться?
Сюда или на bob5024 [sobacka] mail.ru
Вот некоторые рассуждения, которые посетили меня.
Я постараюсь реализовать их именно в этом виде.
Возможно, они будут полезны комунибудь.
// Отображение информации на 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
Ацтой!!!
То, что под IAR занимало 65%FLASH и 80%SRAM
под WinAvr занимает 104%FLASH и 130%SRAM
В обоих случаях выбрана максимальная оптимизация.
А мне надо значительно переписать прогу. Количество текстов увеличится. С учетом наработанного опыта многие самопальные функции уйдут в пользу библиотечных и объектная ориентированность уменьшит количество вызовов объем и скорость. Короче под IAR закончить проект на этом проце - реально. Для WinAvr надо брать другой проц раза в 2 больше по всему.
Можно отказаться от float и написать свой класс целочисленный floor(float*100)=long
Т.е. IAR показывает, что экономить есть возможность.
Но посвятить себя экономии - 😃
Где заработать $5000, чтоб стать чесным и работать на лучшем?
Ацтой!!!
То, что под 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);
Наверняк я сам налобал ошибок.
printf scanf не использую вообще
синусы косинусы степени и тд тоже нет у меня только умножение и деление флоат
по этому поводу думаю вообще от флоат отказаться и перейти на long=float*1000
Но здесь есть подводный камень. Например суммирование интегрального полученного/отданного заряда. Точность уплывет.
Всвязи с этим решил переписывать все так как вижу много кривых мест в старой проге.
И по мере переписи контролировать память.
Облазил все файлы не могу найти где посмотреть в какой вид памяти указатели на строки разместились.
И вообще где смотреть размер и расчет стэка, кучи и т.д.
Должна же быть там какаянибудь подбивка итогов?
Использую только
#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
и т.д.
синусы косинусы степени и тд тоже нет у меня только умножение и деление флоат
по этому поводу думаю вообще от флоат отказаться и перейти на long=float*1000Но здесь есть подводный камень. Например суммирование интегрального полученного/отданного заряда. Точность уплывет.
Всвязи с этим решил переписывать все так как вижу много кривых мест в старой проге.
И по мере переписи контролировать память.
при компиляции смотреть на окно вывода, там видно сколько кода\данных (ну можно еще начало *.lss посмотреь)
описали переменную\константу, запомнили сколько было - скомпилировали, посмотрели сколько стало.
если просто написать строка=‘АБВГ’, то компилятор сосздаст ее в озу, и стартапом скопирует в нее это АБВГ, что весьма криво.
код получается весьма плотный, глядя по листингу видно. иногда на входе в функцию пара команд бывает, которые мне несовсем понятно зачем нужны, но все смотреть просто смысла нет.
мелкий совет - если совсем с памятью кода туго, строки в еепром можно засунуть частично. или внешнюю и2ц на 64кб прицепить под текст меню 😃
Как в 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)))
Как в 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
Как в 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