Giter Site home page Giter Site logo

mila's People

Contributors

dubkov avatar ko10ok avatar peterbeklemishev avatar redetection avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

mila's Issues

delay: interface

В рамках #11.

@ko10ok
Организация делея: Интерфейс, внутренние константы.

mS *10^-3
nS *10^-6
S 1
kS *10^3
MS *10^6
delay(10mS)

если сработате) если нет то вторым параметром как вариант.. (
тожедефайном степень, тогда можно и степень написать и mS nS ипрочая

@dubkov

#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) ? :)

Global pins configuration

#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 или екстеншны

Extended "mode" param in "portInit()" instead of overriding

"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
Продублировать пины с ЦАП - ок идея

[legacy] Port mapping

#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
я тебе не верю, что это так просто, поэтому проверю

Я могу ошибаться, но дизассембли идентичный в двух случаях

GPIO mode configuring

После #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 миландром), а потом уже сделать остальной набор (и этим получить независимость)? тебе не кажется, что более итеративный подход помимо большей стабильности сулит тебе большим рынком и меньшим порогом вхождения?

delay: implementation

В рамках #11.

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

@dubkov
но все равно же должен быть таймер который тикает с минимальным временем, а потом это домножать, не?

Делать ли таблицу режимов ног как показывал @dubkov

Вчера я был против и предлагал опять это сделать дефайнами. Но я не учёл одного: пользователь может вызвать pinInit с переменной. Если он так может сделать, то нам было бы удобно иметь подобную таблицу.

  1. Пользователь может вызвать pinInit, где нога или режим — переменные? Часто такое нужно вообще?
  2. Какие у нас есть альтернативы этим таблицам? Только кодом реализовывать их же, ещё вопрос, что удобнее.

Crossplatform?

Windows 7 SP1 64 бита:
uname -s не выполняется как из cmd, так и из PowerShell

Что делать, если пользователь дурак?

Допустим, он вызвал pinInit с несуществущей ногой, а мы задетектили это, но уже во время выполнения. Если продолжить выполнение, то плюсов нет, имхо — затруднится поиск ошибки, да и пользователь вообще может не заметить, что сделал что-то не так. Если остановить выполнение, то ему придётся разобраться, почему же программа перестала работать. Ещё можно какой-нибудь служебный светодиод подсветить, например.

Какие ещё аспекты и варианты действитй есть?

Mass pin|ports write

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 - реалтаймовый клок.

Итого

  • блок ГПИО - 27 ног. Их мы нумеруем 0-26
  • аналоговый блок - 5 ног: цап, компаратор (ПОРТБ расположить рядом, чтобы было в тему)
  • блок I2C/EXT_INT - 2 ноги. Расположить, например, в линейке с питанием.

ШИМ

Среди 0-26 ШИМ будет так:
(T - timer, C - channel)
T1C1 - F6
T1C2 - A3
T1C3 - A5
T2C1 - A1
T3C1 - C2
T3C2 - D2
T3C3 - B5
T3C4 - D7
Смотрел другие варианты, не рационально.

UART

UARTов два. Один будет использоваться для передачи прямо в ПК, другой - для периферии.
UART1 может быть на пинах B5-B6 и A6-A7
UART2 может быть на пинах F0-F1, D0-D1 (здесь АЦП референц, кстати)

Лал

То, что на пинах забинденных на функции, можно делать что-то еще, будет недокументированной фичей.

Scheduler

#11.

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

@dubkov
Для планировщика в АРМ кортекс М3 есть специальный таймер sysTick

@ReDetection
Да, хорошая идея, но не в первую очередь. Надо сначала весь базовый функционал и, вероятно, массовая запись пинов

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.