Процедура чтения регистра: сначала нужно записать адрес регистра, а за тем прочитать N байт. Пример чтение из регистра 0x20 3 байта на устройстве 0x10 – S 10 20 S 11 03 P
Ясно, я могу полностью отвечать только за инструкцию к нашим модулям, там могу всё сделать красиво
Писать общую инструкцию к ORFA без конкретного модуля не решаюсь потому что новички умрут, а надо рассчитывать на них. Сейчас переделаем протоколы - может быть тогда можно будет что-то типа общей инструкции сделать, но всё равно конкретные инструкции будут понятней для использования с нашими модулями, потому что не надо будет лезть куда-то и смотреть - а есть эта шняга в этом модуле или нет.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Понятно. Я то полез в общую, потому что пытался вообще понять, используется ли для I2C какой-то "специфический" протокол, или можно как попало разговаривать, не вмешиваясь в фирмварь.
Michael_K писал(а):Или тот же вопрос с другой стороны - допустим, я хочу сделать I2C датчик. Что мне нужно знать, чтобы ОРФЕ было хорошо?
Тоже интересен ответ на данный вопрос
"There is nothing better than sliding down snow and flying through the air" (с)Shane McConkey. Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Вообще орфе пофиг, делайте обычную поддержку 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) - прочитать бит из порта
Кто что скажет?
Проект [[Open Robotics]] - Универсальные модули для построения роботов
"There is nothing better than sliding down snow and flying through the air" (с)Shane McConkey. Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
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
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Конечно понятнее будет, чем S 40 0D S 41 04 P, но мне старый вариант парсера ИзбыORFA по нраву.
"There is nothing better than sliding down snow and flying through the air" (с)Shane McConkey. Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Ладно, вариант 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 бит
Проект [[Open Robotics]] - Универсальные модули для построения роботов
"There is nothing better than sliding down snow and flying through the air" (с)Shane McConkey. Lieber ein Brett am Fuß als eins vorm Kopf, aber lieber ein Brett vorm Kopf als zwei am Fuß.
Вот так тогда еще более улучшено и с группен-командами для дальнейшей реализации:
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
Проект [[Open Robotics]] - Универсальные модули для построения роботов