peterbeklemishev / mila Goto Github PK
View Code? Open in Web Editor NEWArduino alternative based on MILANDR processor
Arduino alternative based on MILANDR processor
В рамках #11.
@ko10ok
Организация делея: Интерфейс, внутренние константы.mS *10^-3 nS *10^-6 S 1 kS *10^3 MS *10^6 delay(10mS)
если сработате) если нет то вторым параметром как вариант.. (
тожедефайном степень, тогда можно и степень написать и mS nS ипрочая#define ms *0.001 delay(10ms); ???
боюсь, не сработает
@ReDetection
Отличная идея! это может избавить от кучиdelay_ms()
delay_us()
.
Только тогда надо делать примерно вот так:#define ms(A) (A) #define s(A) ((A)*1000) #define ks(A) ((A)*1000*1000) #define Ms(A) ((A)*1000*1000*1000)
delay(ks(10)); delay(ms(400));
@dubkov
Синтаксически такая конструкция -- полный ад. как-будто ты вызвал делэй от функции кс от 10.@PeterBeklemishev
можно не дефайнитьMS *10^6
а задефайнитьMS 10^6
и писатьdelay(100,MS);
а в делее уже умножать@ReDetection
ну тогда ужdelay(100 * MS)
? :)
#11.
@ko10ok
Как часто меняется функционал пина? Может это для экстренной смены функции использовать только, а для инициализации использовать инитмассив какого нить формата типа
PINS={
(PIN,ANALOG,OUTPUT),
(PIN,TYPE,MODE),
({PIN,PIN}, I2C) <
({PIN,PIN,PIN,PIN,PIN},ANALOG,OUTPUT), <
(PINGROUP, TYPE, [MODE]) < например такой общий формат
…}
или более удобоваримый формат какой нить ибо нету смысла писать каждый раз "инитПин".
И парсить это макросом на этапе компиляции например)@PeterBeklemishev
Идея интересная@dubkov
Массовое объявление пинов и массовое дерганье пинами - моя мечта! парсить это конечно адок будет…{PIN,PIN}, I2C - не вижу смысла, пины для i2c забиндены и должны резервироваться прямо в библиотеке. Остальное неплохо
@ReDetection
Идея задавать чуть более высокоуровнево — правильная, пользователям проще будет.
Смысл писать каждый раз пинИнит есть. Это — всего лишь семь символов, шесть из которых тебе подставит sublime прямо сразу (а если ты выучишь хоткей на мультикурсор, то совсем халява.
Напоминаю для тех, кто забыл: раньше для этого надо какие-то разные маски по каким-то разным адресам распихать, а тут — всего пара пинИнитов ;)@ReDetection
макросы сильно ограничены, там надо неплохо костылить и хакать, чтобы получить функционал. хуже, чем в баше, но лучше, чем в брайнфаке. короче для чего-нибудь не очень сложного можно макросы, для чего-нибудь сложнее — DSL или екстеншны
"0х04 OE[15:0] MDR_PORTx->OE" means 16bit of "uint32_t mode" used?
Use part of param "mode" as exclusion(inversion) mask, instead of multiply overrided "portInit"
How to planed now:
exaple usage:
portInit(port, OUT/IN);
----- any PORT
portInit(port, OUT/IN, OUT/IN, OUT/IN)
----- PORTC only
portInit(port, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN)
----- PORTE only
portInit(port, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN)
----- PORTADF
portInit(port, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN, OUT/IN)
----- PORTB
Suggestion:
#define IN 0x0000?
#define OUT 0xFFFF?
#define OUT_P(pin) ~((1) << (pin+16))
#define IN_P(pin) ((1) << (pin+16))
if(mode&&0x0000FFFF == OUT)..
...
port->OE |= 0xFFFFFFFFF && (mode&&0xFFFF0000 >> 16)
...
elif(mode&&0x0000FFFF == IN)
...
port->OE |= 0x000000000 | (mode&&0xFFFF0000 >> 16)
...
example usage:
portInit(PB,IN | OUT_P(2) | OUT_P(3) ) //kinda windows-like style of parameter portInit(PB,OUT | IN_P(2) | IN_P(6) | IN_P(7) ) //kinda windows-like style of parameter compilation
#11.
@dubkov
Смотри док “Функционал пинов КР1986ВЕ92QI”
PE1 и PE0 - это ЦАП. Как насчет сделать прям на плате специальные разъемы или коннекторы для ЦАП? Помоему будет пушка!@ko10ok
Обычно на цапы ставят клеммники всякие. Да - это удобно достаточно.@PeterBeklemishev
Продублировать пины с ЦАП - ок идея
Документ:
https://docs.google.com/document/d/12RIDl4r5kiGJtICcBlIlFFWj7MZ_OjPcSUu7LgRWlJw/edit
Как организовать переезд?
Нужен план срочно
#11.
@dubkov
Предлагаю такой маппинг пинов:
0xWP0p
W - whole port
P - port
0 - zero
p - pinцелые порты типа PA, PB дефайнить как 0x1000 0x2000
пин на порту типа B2 B3 дефайнить как 0x0202 0x0203
сквозная нумерация пинов делается с пустым значением WP например 0х000А 0х00В2
тогда всё это сможет кушать pinWrite.@ReDetection
Мне не нравится такой подход в целом: внутри каждого пинврайт будет N проверок на пины. Но простого решения пока тоже нет.В идеале надо DSL и при компиляции анализировать:
если пришла константа — т.е. pinWrite(A4, k) — прямо на компиляции подставить нужные маски и никаких особых проверок
если пришло значение переменной — pinWrite(dstPin, k) — то тогда уже вставлять код со всеми проверками
Я пока не нагуглил, можно ли зделать проверку на константность на уровне препроцессора.На самом деле, в идеале надо вообще не программировать императивно, а лишь декларировать зависимости и сводить количество явных последовательностей к минимуму. Это позволило бы компилятору точно знать, где что можно соптимизировать, и вывело бы программирование на качественно новый уровень. Пока не видел хороших реализаций такого, чтобы не было много оверхеда — все почему-то делают это в рантайме, а не на этапе компиляции. :(
@dubkov
Не совсем понимаю, что такое DSL (для меня это способ организации проводной передачи данных).@ReDetection
это свой язык или расширение языка существующего, вносящее новые синтаксические конструкции, направленные на решение задач определённого круга (на самом деле, не обязательно, но это значение слова domain) http://en.wikipedia.org/wiki/Domain-specific_language@dubkov
Не получится ли, что сделать восемь пинврайтов с константами по очереди сделать будет быстрее, чем пинврайт в цикле с итератором от 0 до 7? м?@ReDetection
получится, и это большой вин, я считаю — без этой фичи оно всегда было бы одинаково медленно.
один фиг 99% пользователей ардуино не думают об оптимальности выполнения кода@dubkov
Мне как пользователю лениво писать 8 пинврайтов, я пишу цикломВот что неплохо было бы сделать, так это переписать компилятор так, чтобы он, видя рядом два пинврайта в один порт, складывал их в один.
@ReDetection
ну, я думаю, достаточно объявить pinWrite как inline и компилятору указать ключ оптимизации -O2, например@dubkov
я тебе не верю, что это так просто, поэтому проверюЯ могу ошибаться, но дизассембли идентичный в двух случаях
После #11 все утихли. Исправим-с.
@dubkov
Все помнят, какая фигня с ШИМом в ардуино - она включена по умолчанию, и каждый дигиталврайт её выключает ><. Почему бы нам при инициализации пина не заставить пользователя явно указать, хочет он шим или гпио. Например вот так:
initPin(pin, digital, INPUT)
initPin(pin, digital, OUTPUT)
initPin(pin, analog, INPUT)
initPin(pin, analog, OUTPUT)
тут еще АЦП затесался :)@ko10ok
Направление норм. Но да, немного дофига писать, хотя если такая же константа ANALOG как и оутпут, то автокомплит затащит.
Как часто меняется функционал пина? Может это для экстренной смены функции использовать только а для инициализации использовать инитмассив какого нить формата лучше > репредложение 2@PeterBeklemishev
оч круто, но мб слишком многословно@ReDetection
Это обязательно надо делать. Только, я считаю, надо объединить второй и третий параметр, чтобы было вот так:
initPin(pin, DIGITAL_INPUT)
initPin(pin, DIGITAL_OUTPUT)
initPin(pin, ANALOG_INPUT)
initPin(pin, ANALOG_OUTPUT)
initPin(pin, PWM)
initPin(pin, EXTERNAL_INTERRUPT)
initPin(pin, UART_RX) ??
etcкстати, init подразумевает что мы один раз настроили и забыли, а чуваки, в принципе, могут менять режим работы на лету. как насчёт configPin/configPort?
@dubkov
DIGITAL_INPUT и т.п. долго писать, я бы сократил до DIN, AOUT.... Но оставить и так и так проблем вообще нет.
Сейчас мы называем проект mila
.
mila.ru - пардон, вызов шлюх
.su - магазин одежды для детей
.org и .net у сквоттеров
Нужно придумать новое название :(
Я пообщался с товарищем из Зеленограда.
Я: Добрый день! На сайте Миландра есть информация, что после 15 февраля камни K1986BE92QI заказываться будут по 407 рублей. А сейчас, вроде, по 150. Можно как-то через вас заказать штук 20, пока не поднялись цены?
Товарищ: Добрый день! Позвонил я к ним в отдел продаж (495) 981-54-33, в первую очередь спросил про возможность покупки в Новосибирске. Для юрлиц они могут отправить почтой или экспресс-почтой. Но выяснилось, что 92ых в пластиковом корпусе нет в наличии, будут через две недели, и на них заказ идет уже с ценой 407рублей. Но я на всякий случай продублировал вопрос о цене при самовывозе на почту, а то как-то странно, пишут про повышение с 15 февраля, а по телефону говорят, что уже повысили. Вот такие у них "конкурентноспосособные" цены. Я неделю назад в Китае STM32F405RGT6 с FPU и двумя USB за 360 рублей заказал. Всякие STM32F103 и STM32F105 продаются от 1.6$ и 1.8$ соответственно.
Я: Иван, спасибо за помощь! 407 р это уже ни в какие ворота, а так хотелось поддержать отечественного производителя... Но оказывается, что он нас не хочет поддерживать. Не знаете, с чем может быть связано такое внезапное повышение цен? У Миландра есть свои линии, но производят этот камень не на них, а за рубежом?
Товарищ: Они пишут, что сами выращивают кристаллы имея лицензию на ядро ARM.
Но есть предположение, что даже если и выращивают, то только для военки, а для коммерческого пластика не хватает производственных мощностей. Поэтому заказывают где-то за границей изготовление пластин, а у себя только нарезают и пакуют в пластик. А может и полностью там все делается.
после #13 возникли вопросы. @dubkov, расскажи мне, почему ты хочешь разом сделать всё? почему нельзя сделать оформить поддержку миландра внутри arduino ide (и получить возможность легко замещать atmega миландром), а потом уже сделать остальной набор (и этим получить независимость)? тебе не кажется, что более итеративный подход помимо большей стабильности сулит тебе большим рынком и меньшим порогом вхождения?
Там всё удалено, есть только два почти пустых файла и месяц ничего не происходило.
Предлагаю удалить ветку. Есть возражения?
Вчера я был против и предлагал опять это сделать дефайнами. Но я не учёл одного: пользователь может вызвать pinInit
с переменной. Если он так может сделать, то нам было бы удобно иметь подобную таблицу.
pinInit
, где нога или режим — переменные? Часто такое нужно вообще?Можешь переименовать репу в mila ?
Windows 7 SP1 64 бита:
uname -s не выполняется как из cmd, так и из PowerShell
Допустим, он вызвал pinInit
с несуществущей ногой, а мы задетектили это, но уже во время выполнения. Если продолжить выполнение, то плюсов нет, имхо — затруднится поиск ошибки, да и пользователь вообще может не заметить, что сделал что-то не так. Если остановить выполнение, то ему придётся разобраться, почему же программа перестала работать. Ещё можно какой-нибудь служебный светодиод подсветить, например.
Какие ещё аспекты и варианты действитй есть?
just for history ^__^
write to port in 'write(PB,PB3,PB4,PC..,(long)0X012312341FDH)'- like format
ports = 43 bits;
4 highest should be 0x0000 .... .... .... .....
size of long = 64 bit
type(porttypesize p)
{
//например префикс и постфикс 01 - порт, ff - пин
if(0xFFFF & p == 0x0000)
return чиселко
else: if(0xF000 & p == 0x0000)
return пин
else
return порт
}
вот сюда выше идея:
0xWP0p
W - whole port
P - port
p - pin
целые порты типа PA, PB дефайнить как 0x1000 0x2000
пин на порту типа B2 B3 дефайнить как 0x0202 0x0203
сквозная нумерация пинов делается с пустым значением WP например 0х000А 0х00В2
тогда всё это сможет кушать pinWrite.
void write(porttypesize port, ...) {
MDR_PORT_TypeDef *port;
porttypesize ports[100];
index = 0;
porttypesize *p = &first;
while (type(p) != чиселко) {
ports[index++]=p;
p++;
}
long value = p;
bitOffset=0;
//запись значения
for(i=0;i<count;i++)
if(type(ports[i])==порт):
{
port = port_from_pin( (ports[i] >> 2) & 0x0F);
port->RXTX = (value << bitOffset) 0xFFFFFFFF;
bitOffset+=_sizeofbytesinint_;
break;
}
else:
{
//для скорости не делаем пинврайт
if (value == 1){
port->RXTX |= ( 1 << bit );
}
else if (val == 0){
port->RXTX &= ~( 1 << bit );
}
bitOffset+=_sizeofbytesforbit_;
break;
}
}
Никто еще не задумывался, как будут организовываться выводы на плате. Многие задумались, что нестандартизованные порты - это очень коряво.
В документе https://docs.google.com/spreadsheets/d/1_A__mS1dGBmSGELw2Ocl_VE5S5aANFM1sRQrPwT0EE0/edit#gid=0 описывается какими функциями обладает каждый пин. (у кого нет доступа, тыкайте меня)
PORTA 0...7 - просто порт
PORTB 0...7 - просто порт
PORTD 0...7 - порт или ацп
PORTF 0...6 (FUUUUU) - просто порт
Получаем более менее что-то удобоваримое для работы с портами.
Куда я дел остальное? Жестко забиндил ноги на функции. Хардкод при инициализации, и красивые блоки пинов на плате.
B8 - выход компаратора, B9 и B10 либо оба внешние прерывания либо ИК-приемопередатчик.
C1 и C2 - I2C, С3 не разводить (или как-то присобачить к обкусанному порту Ф, но помоему жопа)
E0 - выход ЦАП, E1 - референц ЦАП, E2-E3 - входы компаратора, E6-E7 - реалтаймовый клок.
Среди 0-26 ШИМ будет так:
(T - timer, C - channel)
T1C1 - F6
T1C2 - A3
T1C3 - A5
T2C1 - A1
T3C1 - C2
T3C2 - D2
T3C3 - B5
T3C4 - D7
Смотрел другие варианты, не рационально.
UARTов два. Один будет использоваться для передачи прямо в ПК, другой - для периферии.
UART1 может быть на пинах B5-B6 и A6-A7
UART2 может быть на пинах F0-F1, D0-D1 (здесь АЦП референц, кстати)
То, что на пинах забинденных на функции, можно делать что-то еще, будет недокументированной фичей.
#11.
@ko10ok
Орагнизовать планер на одном из таймеров
крутить счетчики и иметь список колбаков и значений таймера для данного колбака.@dubkov
Для планировщика в АРМ кортекс М3 есть специальный таймер sysTick@ReDetection
Да, хорошая идея, но не в первую очередь. Надо сначала весь базовый функционал и, вероятно, массовая запись пинов
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.