PeterBeklemishev / mila

Arduino alternative based on MILANDR processor
6 stars 0 forks source link

Предложение по организации портов #5

Open dubkov opened 9 years ago

dubkov commented 9 years ago

Предпосылки

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

Док

В документе 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

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

Лал

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

ReDetection commented 9 years ago

Думаю, ссылку на файл с идеями тоже надо сюда вставить, там тоже есть дискуссии на эту тему https://docs.google.com/document/d/12RIDl4r5kiGJtICcBlIlFFWj7MZ_OjPcSUu7LgRWlJw/view

dubkov commented 9 years ago

Унификация нумерации пинов

Я на самом деле больше не вижу смысла использования отдельных port_from_pin и port_from_virtual_pin.

Достаточно сделать #define A0 0 #define A1 1 ............ #define B0 8 #define B1 9 ............ #define D0 16 ............ #define C7 30

и все унифицируется.

Виртуальный 32-битный регистр

@ko10ok говорил, что можно завести uint32_t мапу всех пинов всех используемых портов, и использовать ее. Я теперь думаю, что это не такая безумная идея, как мне казалось изначально. Буду думать, что с этим можно сделать.

Например, сделать "виртуальный регистр", который содержит отображение младших байтов регистров PA, PB, PD, PF. Писать всё в него, а программа будет масками раскидывать виртуальный регистр по реальным. Но! тогда каждый раз будет производиться запись в четыре регистра. Жирный минус

Что может дать номер пина

Я заметил, что в pinDoSomething(pin_num, WHAT) параметр pin_num получается довольно интересным.

Предположим, что пины нумеруются 0-31, это соответствует по очереди младшим байтам в портах A, B, D, F.

Тогда в pin_num получается биты 0-2 - признак бита, а 3-4 признак порта. Например,

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

Для определения можно придумать что-то аналогичтное, если учесть, что их адреса:

Попробовал криво реализовать: https://github.com/PeterBeklemishev/mila/pull/7