Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.140.198.43] |
|
Сообщ.
#1
,
|
|
|
У меня есть плата Banana Pro
У нее есть порты ввода вывода (распиновка), есть документация на плату. Для управления портами ввода- Прикреплённая картинка
вывода есть библиотека wiringPi, я ее использовал, проблем нет. Но я хочу разобраться с управлением напрямую с записью в регистр процессора/, смотрю в документацию, вижу фигу, объясните как это связать и понять.Например меня интересует управление 31, 33, 35, 37 портом. Прикреплённый файлBanana_Pro_Schematic.pdf (1,62 Мбайт, скачиваний: 152) |
Сообщ.
#2
,
|
|
|
Цитата ter_nk_ @ Но я хочу разобраться с управлением напрямую с записью в регистр процессора Посмотрите тут, я мигал светодиодиками (делал тест для распи)на этом.Может , переделаете для банана. |
Сообщ.
#3
,
|
|
|
Спасибо, но не то. Там библиотека есть под raspberry. Но я спрашивал как разобраться, а не как строчку кода написать.
|
Сообщ.
#4
,
|
|
|
Цитата ter_nk_ @ Но я спрашивал как разобраться, а не как строчку кода написать. Тебе нужна документация на используемый процессор (контроллер). Там и найдёшь подробное описание всех портов и регистров для управления ими. |
Сообщ.
#5
,
|
|
|
Эта та что в аттачмент? Не надо писать читай документация и поймешь. Суть вопроса была - читал документацию - не понял.
|
Сообщ.
#6
,
|
|
|
Цитата ter_nk_ @ Эта та что в аттачмент? Нет. Ты читал не ту документацию. Надо "UserGuide" на процессор. Судя по плате это "A20". Но лучше точно узнать его полную маркировку и искать документацию на сайте производителя. Примерно так выглядит документация Перелистывая страницы одну за другой, там можно обнаружить такое (по каждой подсистеме ЦПУ): --- Ещё можно порыцца в заголовочных файлах, для работы с этим процессором... |
Сообщ.
#7
,
|
|
|
Нашел таблицу
1.19.1. Port Description The chip has several ports for multi-functional input/out pins. They are shown below: Port A(PA): 18 input/output port Port B(PB): 24 input/output port Таблица 1.19.2. Port Configuration Table Port A(PA) Multiplex Function Select Меня например интересует PA15 ECRS UART7_RX UART1_DSR GTXCK/ECRS I2S1_LRCK Дальше высчитываю адрес исходя из Module Name Base Address PIO 0x01C20800 Register Name Offset Description Pn_CFG0 n*0x24+0x00 Port n Configure Register 0 (n from 0 to 9) Pn_CFG1 n*0x24+0x04 Port n Configure Register 1 (n from 0 to 9) Pn_CFG2 n*0x24+0x08 Port n Configure Register 2 (n from 0 to 9) Pn_CFG3 n*0x24+0x0C Port n Configure Register 3 (n from 0 to 9) For Т.е. я буду плясать от этого адреса - 0x01C20800 Pn_DAT n*0x24+0x10 Port n Data Register (n from 0 to 9) 1.19.4.2. PA CONFIGURE REGISTER 1 Offset: 0x04 Register Name: PA_CFG1 Default Value: 0x0000_0000 Bit Read/Write Default Description 31 / / / 30:28 R/W 0 PA15_SELECT 000: Input 001: Output 010: ECRS 011: UART7_RX 100: UART1_DSR 101: GTXCK/ECRS 110: I2S1_LRCK 111: Reserved Т.е. я должен для конфигурации OUTPUT чтоб мне управлять портом со смещением 0x01C20800 + 4 и в четырех байтах 28 бит установить в единицу? |
Сообщ.
#8
,
|
|
|
Цитата ter_nk_ @ 0x01C20800 + 4 и в четырех байтах 28 бит установить в единицу? Вероятно, да. Надо пробовать. я именно с таким процессором не работал. Делай по документации и всё получится. --- Обрати внимание, в каком состоянии биты после RESET. И, насколько я знаю, у ARM порцессоров вроде бы имеется возможность устанавливать биты (интерфесных портов) непосредственно, без операций чтения-модификация-запись. Возможно, не у всех. Но могу и ошибаться. |
Сообщ.
#9
,
|
|
|
Это я пока до конфигурации, а запись что-то типа open("/dev/mem", O_RDWR) и write(...
Добавлено Цитата ЫукпШ @ Обрати внимание, в каком состоянии биты после RESET. Биты меня интересующие портов ввода-вывода как и настройки их в нулях вроде. Там библиотечка есть wiringPi я писал, там можно посмотреть состояние, так вот показывает, что ничего. Кстати только при включении что-то происходит на портах. У меня сервоприводы подключены, так вот при включении проехаться успевают. |
Сообщ.
#10
,
|
|
|
Цитата ter_nk_ @ У меня сервоприводы подключены, так вот при включении проехаться успевают. "Что-то не то". Не должно такого быть в принципе, согласись. А если ЦП вообще не запустится (сломалось) - и что тогда будет с механическими приводами ? Надо спаять схему таким образом, чтобы по аппаратному сигналу RESET всё гарантированно останавливалось. Проснувшийся интеллект процессора после сброса должен всё правильно сконфигурировать-подключить-поуправлять. Никакой самостоятельной "механической жизни" быть не должно. |
Сообщ.
#11
,
|
|
|
Цитата ЫукпШ @ "Что-то не то". Не должно такого быть в принципе, согласись. А если ЦП вообще не запустится (сломалось) - и что тогда будет с механическими приводами ? Надо спаять схему таким образом, чтобы по аппаратному сигналу RESET всё гарантированно останавливалось. Проснувшийся интеллект процессора после сброса должен всё правильно сконфигурировать-подключить-поуправлять. Никакой самостоятельной "механической жизни" быть не должно. Ну там что происходит... сервопривод имеет три контакта - питание, управление и земля. Земля и питания сразу включаются, а управляется от управляющим портом, который подает управляющий сигнал условно на 1,5 мл секунды, потом надо давать паузу условно 18,5 мл секунд. Вот с таким приблизительно периодом он и управляется и чуть больше чуть меньше указывают отклонение куда ему двигаться. Вот в процессе подачи питания на пинах какой-то шум во время инициализации. Как вариант что я могу сделать, это подавать питание через обычный полевой транзистор (друзья из Китая прислали) тогда эти шумы ничего не сделают, вопрос надо ли |
Сообщ.
#12
,
|
|
|
Цитата ter_nk_ @ Вот в процессе подачи питания на пинах какой-то шум во время инициализации. Как вариант что я могу сделать, это подавать питание через обычный полевой транзистор (друзья из Китая прислали) тогда эти шумы ничего не сделают, вопрос надо ли Если по другому нельзя, конечно надо. (А я так и делал, кстати) Но для начала необходимо понять, что появляется на управляющем входе привода. Вероятно, лучше всего соединить его допустимым по значению резистором к пассивному уровню напряжения. Поскольку после старта процессора его интерфейсные пины включены "на ввод" имеют высокое входное сопротивление. Как отреагирует внешняя электроника на висящий в воздухе провод - это "вопрос". Может и гореть будет. Вместе с процессором. Из-за возможных внешних наводок. После старта процессора он должен перепрограммировать управляющий пин "на выход" и взять управление приводом на себя. А до этого на управляющий вывод привода должен подаваться пассивный сигнал. |
Сообщ.
#13
,
|
|
|
Цитата ЫукпШ @ Но для начала необходимо понять, что появляется на управляющем входе привода. Как я предполагаю скачки 3.3 В Цитата ЫукпШ @ Вероятно, лучше всего соединить его допустимым по значению резистором к пассивному уровню напряжения. Э... что значит к пассивному уровню напряжения? Цитата ЫукпШ @ Поскольку после старта процессора его интерфейсные пины включены "на ввод" имеют высокое входное сопротивление. Как отреагирует внешняя электроника на висящий в воздухе провод - это "вопрос". Может и гореть будет. Вместе с процессором. Из-за возможных внешних наводок. Не ну если провод как бы висит в воздухе управляющих у сервопривода, ничего не будет с ним. Хоть с наводками хоть без. А читать писать open("/dev/mem", O_RDWR) ? Добавлено Состояние видимо этим определяется... 1.19.4.5. PA DATA REGISTER Offset: 0x10 Register Name: PA_DAT Default Value: 0x0000_0000 Bit Read/Write Default Description 31:18 / / / 17:0 R/W 0 PA_DAT If the port is configured as input, the corresponding bit is the pin state. If the port is configured as output, the pin state is the same as the corresponding bit. The read bit value is the value setup by software. If the port is configured as functional pin, the undefined value will be read. |
Сообщ.
#14
,
|
|
|
Цитата ter_nk_ @ Э... что значит к пассивному уровню напряжения? Наверное, ты и сам мог бы догадаться. Если некое устройство включается логической "1" (3.3V), а выключается логическим "0" (0V), значит пассивный уровень - "0" (0V) Добавлено Цитата ter_nk_ @ Не ну если провод как бы висит в воздухе управляющих у сервопривода, ничего не будет с ним. Хоть с наводками хоть без. Откуда ты знаешь ? И что будет с пином ЦП, если рядом кто-то неудачно выключит электрочайник или лампу дневного света ? (фрезерный станок, электросварку..) |
Сообщ.
#15
,
|
|
|
Цитата ЫукпШ @ Откуда ты знаешь ? Ну когда управляющий пин не подсоединен, в сервоприводе в любом же случае цепь будет разомкнута что ты там не делай. Цитата ЫукпШ @ И что будет с пином ЦП, если рядом кто-то неудачно выключит электрочайник или лампу дневного света ? (фрезерный станок, электросварку..) Жена угрожала, что будет пыль протирать и "мало ли что может случиться с моим железом", а о таком варианте не думал. |
Сообщ.
#16
,
|
|
|
Цитата ter_nk_ @ Жена угрожала, что будет пыль протирать и "мало ли что может случиться с моим железом", а о таком варианте не думал. Такие инциденты не редко бывают. ..Однажды одна "типа программисточка" додумалась включить электрочайник в розетку фильтра, от которого питался её комп. Там же индуктивность в фильтре. Когда чайник вскипел и автоматически отключился, выгорели все сетевые карты компов, подключенных к отрезку сети (коаксиальным кабелем) вместе с входом свича. ..Однажды один так называемый профессианальный инженер выдернул руками источник питания настольной лампы дневного света из сети. К компу поблизости был подсоеденен дивайc посредством COM-порта проводом 5 м. COM-порт выгорел. Таких историй я знаю множество. ..Однажды я сам забыл нагузить входы контроллера, подключенные к проводу 1м. Они выгорели от наводок от управляемого этим же контроллером привода. |
Сообщ.
#17
,
|
|
|
Понял, буду аккуратнее. До записи еще не дошел.
|
Сообщ.
#18
,
|
|
|
Что-то у меня
gpio = (unsigned long *)mmap(NULL, BLOCK_SIZE, PROT_WRITE, MAP_SHARED, fd, 0x01C20800); где fd - дескриптор /dev/mem не работает Добавлено Возможно ошибься адресом... |
Сообщ.
#19
,
|
|
|
Не, все вроде работает. Запись в память сразу вешает в плату.
|
Сообщ.
#20
,
|
|
|
Какая - то проблема с записью в память процессора.
int fd = open ("/dev/mem", O_RDWR | O_SYNC); unsigned long* gpio1 = (unsigned long *)mmap(NULL, 8*1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x01C20000); *(gpio1 + 0x800) = 0x31111111; munmap((void*)gpio1, 8*1024); close(fd); fd = open ("/dev/mem", O_RDWR | O_SYNC); unsigned long* gpio2 = (unsigned long *)mmap(NULL, 8*1024, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0x01C20000); При считывании память измененная, но если заново запустить программу там уже прежнее значение. |
Сообщ.
#21
,
|
|
|
Цитата ter_nk_ @ Какая - то проблема с записью в память процессора. тут я не могу помочь. я только собираюсь заниматься программированием ARM-контроллеров. Ближе к осени. ----- Могу лишь посоветовать поискать исходники и проекты для похожего на твой контроллер дивайса. На сайте производителя могут быть примеры. |
Сообщ.
#22
,
|
|
|
Спасибо.
|