объясните оператор PORTE &= ~

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Попалась в одной буржуйской программе не совсем понятная связка бинарных операторов &=~ 

PORTE &= ~(_BV(PE0) | _BV(PE1) | _BV(PE4) | _BV(PE5) | _BV(PE3)); //Так понял устанавливает 0,1,3,4,5 биты в 1
DDRE  |=  (_BV(PE0) | _BV(PE1) | _BV(PE4) | _BV(PE5) | _BV(PE3)); //Настраивает порт 0,1,3,4,5 на чтение

Если не трудно разжуйте как это всё работает и откуда чего берётся " _BV(PE0)". Спасибо.

 

maksim
Offline
Зарегистрирован: 12.02.2012

http://arduino.ru/Tutorial/Upravlenie_portami_cherez_registry

  • & (bitwise and)
  • | (bitwise or)
  • ^ (bitwise xor)
  • ~ (bitwise not)
  • << (bitshift left)
  • >> (bitshift right)
  • &= (compound bitwise and)
  • |= (compound bitwise or)

 

http://myrobot.ru/stepbystep/pr_mcports.php

 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Dmti пишет:
//Так понял устанавливает 0,1,3,4,5 биты в 1

Нет, сбрасывает биты в 0 (в этом примере устанавливает на пинах логический ноль)

Dmti пишет:
//Настраивает порт 0,1,3,4,5 на чтение

Нет, устанавливает биты в 1 (настраивает пины на выход)

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Спасибо большое очень выручили.

 

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Чего-то тогда я совсем в логике программы запутался. Функция читает из меги 8 сигнатуру. Пытаюсь сравнить с мануалом, и ничего не получается.

void mega_data_write(byte data) { // Write a byte to digital lines 0-7 (data = 8 )
    // This is really ugly, thanks to the way that digital lines 0-7 are implemented on the Mega.
 1.   PORTE &= ~(_BV(PE0) | _BV(PE1)  | _BV(PE3)| _BV(PE4) | _BV(PE5));  // clear bits associated with digital pins 0-1, 2-3, 5
 2.   PORTE |= (data & 0x03);   // set lower 2 bits corresponding to digital pins 0-1
 3.   PORTE |= (data & 0x0C) << 2;  // set PORTE bits 4-5, corresponding to digital pins 2-3
 4.   PORTE |= (data & 0x20) >> 2;  // set PORTE bit 5, corresponding to digital pin 5
 6.   DDRE  |= (_BV(PE0) | _BV(PE1) | _BV(PE4) | _BV(PE5) | _BV(PE3));   // set bits we are actually using to outputs
 7.
 8. PORTG &= ~(_BV(PG5));  // clear bits associated with digital pins 4-5
 9. PORTG |=  (data & 0x10) << 1;  // set PORTG bit 5, corresponding to digital pin 4
 10.DDRG  |=  (_BV(PG5));  // set to output
 11.
 12.PORTH &= ~(_BV(PH3) | _BV(PH4));  // clear bites associated with digital pins 6-7
 13.PORTH |=  (data & 0xC0) >> 3;  // set PORTH bits 3-4, corresponding with digital pins 6-7
 14.DDRH  |=  (_BV(PH3) | _BV(PH4));  // set bits to outputs
}

В первой строке сбрасываем 0,1,3,4,5 пин в 0.

в 2 включаем 3 и 4 пин.

в 3  и4 строке сначала включаем 5 и 6 пин и сразу только 4

в 6 строке переключаем 0,1,3,4,5 на выход, а до этого мы что делали как не включали эти пины.

Ну и так далее - логики не понимаю. Помогите разобраться, и как происходит чтение - не понимаю.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, Во первых в меге8 нет портов перечисленных в этой функции. Во -вторых начиная с разжёвывания 2 строки вы почему-то не учитываете что почти везде  фигурирует пришлый байт "data", а команда & 0x3 указывает лишь по каким битам посадить этот байт.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Я же написал чему равен пришлый байт (data = 8)

ардуино мега 2560 выступает в качестве параллельного(высоковольтного) восстановителя фюз. Всё содрал отсюда http://mightyohm.com/blog/2010/12/new-product-hv-rescue-shield-2-0/ , только скеч там есть с расширением, с ним и разбираюсь.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, в эту функцию передаются команды для записи в порт, ( при условии, что плата ардуино мега). Причём тут цифра 8 ? Команда гоняется между битами и портами назначения раскладывая биты "data" в определённом порядке в определённые порты.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

все начинается:

// Читаем сигнатуру
    configs[SIG1] = target_io(HV_CMD_READ_SIG,0,0,SIG_SEL_R);//(8,0,0,8)
    configs[SIG2] = target_io(HV_CMD_READ_SIG,1,0,SIG_SEL_R);//(8,1,0,8)
    configs[SIG3] = target_io(HV_CMD_READ_SIG,2,0,SIG_SEL_R);//(8,2,0,8)

первая чыфра и поступает, как команда в функцию mega_data_write(byte data), но как всё вертается - несовсем понятно, вот и пытаюсь разобраться, потому что всё это не работает - всегда вертает 03, что есть мега8, что её нет, на лицо ошибка. Вот и пытаюсь разобраться.

С остальным кодом вопросов никаких, вопросы в трёх функциях mega_data_write, mega_data_read, mega_data_input. Незнакомая форма, вот и прошу помощи с ней разобраться, чтобы не путаться, разберусь с ней - разберусь со всёй программой.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, Смысл функции mega_data_write (read) в принципе есть в заголовке файла:

Arduino Mega - much more complicated because digital lines 0-7 don't map directly to an AVR hardware port:
 Digital Line  AVR Signal Name
 0  PE0  (PORTE)
 1  PE1  (PORTE)  
 2  PE4  (PORTE)
 3  PE5  (PORTE)
 4  PG5  (PORTG)
 5  PE3  (PORTE) 
 6  PH3  (PORTH)
 7  PH4  (PORTH)
 */

Байт data разложится в соответствии с данной таблицей. Слева 0..7 биты "data", справа адреса, куда положит эти биты функция. Мой вам совет -не лезте в дебри. Если что-то не работает, то явно не из-за скечта. Ищите ошибки подключения.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Не у меня одного не работает http://nnm.me/blogs/oleg_karp/avr-hv-programmer-shield-ili-neudachnaya-popytka-ozhivit-atmega48/ . Сделал плату, как указано, раза на четыре перепроверил разводку, даже специально скеч написал для проверки платки, всё работает, остаётся их скеч.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Скеч который разбираю, расширенный:

 http://mightyohm.com/forum/download/file.php?id=60.

Описание на буржуйском, но в общем и так понятно.

 http://mightyohm.com/forum/viewtopic.php?f=7&t=552

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, не думаю, что это вполне коммерческое изделие имеет нерабочий скетч, что выложен на сайте.  Контроллеры разные пробывали читать? про поддержку атмега8 кажется там не написано. Вобще врятли чем-то можно вам помочь, не пройдя весь путть по изговтовлению этого программатора самому. Я бы всё таки взял оригинальный скетч, который тут упоминается http://mightyohm.com/blog/products/hv-rescue-shield-2-x/source-code/ и именно ту версию Arduino 0020 что советует товарищ Могучий ОМ. Как я понял дело было давно, и не факт, что новые версии работают с этим скетчем в точности так-же как старые.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Да спасибо, вы уже очень помогли, в понимании, а скеч действительно не рабочий. Сейчас разбираюсь с мануалом на атмега, там внятно алгоритм прописан, который совсем не соответствует что делает данная порграмма. Спасибо.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, скетч абсолютно рабочий. Я сейчас неполенился, собрал эту схему на  беспаечной макетке, -всё работает. Фузы пишутся. Вместо преобразователся 5-12 вольт взял аккумулятор 12вольт, вместо транзисторной сборки- коммутатора 12 в- взял слаботочное герконовое реле. Остальное всё точно по схеме.

Dmti
Dmti аватар
Offline
Зарегистрирован: 13.10.2013

Два вечера потратил, всё искал, почему читает всегда одно и тоже 03. Я использую MEGA 2560, а у неё 

0  PE0  (PORTE)
1  PE1  (PORTE)  

используются для общения через USB. Заменил на 22 и24, отрезал дорожки от разьёма и соединил проводками. Все заработало. Скеч дейстительно рабочий, если поменять два прина с РЕ0 и РЕ1 на РА0 и РА2 и перепаять платку.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Dmti, терпение и труд всё победят... :)