Технический форум по робототехнике.
Michael_K » 01 окт 2010, 13:10
По поводу I2C - ясно.
1. Из вики -
mediawiki/images/4/4a/Orfa-manual.pdf2. да там перлы на каждом шагу... Типичная фраза (орфография и пунктуация сохранена):
Процедура чтения регистра: сначала нужно записать адрес регистра, а за тем прочитать N байт. Пример чтение из регистра 0x20 3 байта на устройстве 0x10 – S 10 20 S 11 03 P
=DeaD= » 01 окт 2010, 14:00
Ясно, я могу полностью отвечать только за инструкцию к нашим модулям, там могу всё сделать красиво

Писать общую инструкцию к ORFA без конкретного модуля не решаюсь потому что новички умрут, а надо рассчитывать на них. Сейчас переделаем протоколы - может быть тогда можно будет что-то типа общей инструкции сделать, но всё равно конкретные инструкции будут понятней для использования с нашими модулями, потому что не надо будет лезть куда-то и смотреть - а есть эта шняга в этом модуле или нет.
Michael_K » 01 окт 2010, 14:05
Понятно. Я то полез в общую, потому что пытался вообще понять, используется ли для I2C какой-то "специфический" протокол, или можно как попало разговаривать, не вмешиваясь в фирмварь.
Grem » 01 окт 2010, 18:06
Michael_K писал(а):Или тот же вопрос с другой стороны - допустим, я хочу сделать I2C датчик. Что мне нужно знать, чтобы ОРФЕ было хорошо?
Тоже интересен ответ на данный вопрос

=DeaD= » 01 окт 2010, 21:19
Вообще орфе пофиг, делайте обычную поддержку i2c-протокола, только очень длинные запросы не делайте и всё.
Т.е. ORFA может делать сколь угодно длинные запросы с множественными рестартами и переключением между read\write режимами. Всё ограничено только буфером команды внутри ORFA, сейчас он вроде 65 символов, можно увеличить.
Добавлено спустя 2 часа 53 минуты 32 секунды:
Какие команды сделать для GPIO и АЦП?
Вот накидал эскиз:
АЦП:
AS=(Int|AVCC|Ext) - определить источник опорного напряжения
AP=(8|10) - выбрать нужную точность 8 или 10 бит
AM=(0|1)*8 - определить какие каналы АЦП включены (7..0)
AR(0..7) - прочитать значение канала АЦП 0..7 если он включен
GPIO:
GD(A..F)=(0|1)*8 - побитовая маска направления ввода-вывода порта A..F
GO(A..F)=(0|1)*8 - байт который надо вывести в порт A..F
GI(A..F) - прочитать байт из порта A..F
BD(A..F)(0..7)=(In|Out) - установить режим линии порта
BO(A..F)(0..7)=(0|1) - вывести бит в порт
BI(A..F)(0..7) - прочитать бит из порта
Кто что скажет?
Grem » 01 окт 2010, 21:36
Это, например, #AP 0А ?
=DeaD= » 01 окт 2010, 21:44
Нет

это, например:
AS=AVCC //опорное - AVCC
AP=8 //8 бит
AM=00000001 //включить АЦП на 0 линии
AR0 //прочитать 0 линию АЦП
BDA0=Out //выставить линию PORTA.0 как выход
BOA0=1 //выставить линию PORTA.0 которая выход в высокий уровень (1)
BDA1=In //выставить линию PORTA.1 как вход
BOA1=1 //выставить линию PORTA.1 которая вход в режим включения (1) подтягивающего резистора
BIA1 //прочитать линию PORTA.1
Grem » 01 окт 2010, 21:52
Конечно понятнее будет, чем S 40 0D S 41 04 P, но мне старый вариант парсера ИзбыORFA по нраву.
=DeaD= » 01 окт 2010, 21:58
Ладно, вариант 2, он же сокращенный через @ и еще через @ что происходит:
PinModeA0=In @ PMA0I @ выставляем порт A линию 0 в режим цифрового входа
PinModeA0=Out @ PMA0O @ выставляем порт A линию 0 в режим цифрового выхода
PinModeF0=ADC @ PMF0A @ выставляем порт F линию 0 в режим АЦП
PinGetA0 @ PGA0 @ читаем значение на линии 0 порта A
PinSetA0=1 @ PSA01 @ пишем значение в линию 0 порта A (если она настроена как вход - 1 включает подтяжку)
PinAdcRef=(Int|Ext|AVCC) @ PR(I|E|A) @ выставить источник опорного напряжения для АЦП - внутренний, питание, внешний
PinAdcBits=(8|10) @ PB(8|A) @ выбрать режим работы АЦП - 8 или 10 бит
Grem » 01 окт 2010, 22:08
Вот этот уже на порядок лучше.
=DeaD= » 01 окт 2010, 22:26
Вот так тогда еще более улучшено и с группен-командами для дальнейшей реализации:
PinModeA0=In @ PMA0I @ выставляем порт A линию 0 в режим цифрового входа
PinModeA0=Out @ PMA0O @ выставляем порт A линию 0 в режим цифрового выхода
PinModeF0=ADC @ PMF0A @ выставляем порт F линию 0 в режим АЦП
PinGetA0 @ PGA0 @ читаем значение на линии 0 порта A
PinSetA0=1 @ PSA01 @ пишем значение в линию 0 порта A (если она настроена как вход - 1 включает подтяжку)
AdcRef=(Int|Ext|AVCC) @ AR(I|E|A) @ выставить источник опорного напряжения для АЦП - внутренний, питание, внешний
AdcBits=(8|10) @ AB(8|A) @ выбрать режим работы АЦП - 8 или 10 бит
PortModeF=I*O*AIOA @ OMF=I*O*AIOA @ выставляем режим работы порта F - биты 2,7 вход, биты 1,5 выход, биты 0,3 вход ацп, биты 4,6 без изменения
PortSetF=0011**01 @ OSF=0011**01 @ выставить у порта F линии 0,4,5 в высокий уровень, линии 1, 6 и 7 в низкий уровень, линии 2 и 3 оставить без изменения
PortGetF @ OGF @ получить побитовые значения со входа порта F
=DeaD= » 05 окт 2010, 00:19
Пишу сейчас парсер, ответы будут типа:
AdcRef:AVCC
AdcBits:8
ModeF0:ADC
F0:2.43
A0:0
Michael_K » 05 окт 2010, 00:42
Если уж вот настолько от железа абстрагироваться:
PortModeF=I*O*AIOA @ OMF=I*O*AIOA @ выставляем режим работы порта F - биты 2,7 вход, биты 1,5 выход, биты 0,3 вход ацп, биты 4,6 без изменения
...то какой смысл вообще говорить о каких-то "портах", буковках каких-то.
Сделайте один большой порт.
=DeaD= » 05 окт 2010, 00:44
Спокойствие, только спокойствие. Это вообще пока опция которую может и не будем делать.
Vooon » 05 окт 2010, 01:05
Вообще идея не плоха.
Сделать как в ардуине.