Форум обсуждения оборудования  

Вернуться   Форум обсуждения оборудования "Умный дом" > Разное > Курилка

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 27.09.2016, 21:25   #41
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 770
Вес репутации: 803
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: AVR (mega328p)

Цитата:
Сообщение от Admin Посмотреть сообщение
Если не создаются переменные и массивы, то оперативка не используется
для выделения битов используются битовые маски
Опять непонятно...
Допустим есть unsigned char x = 0x15; как проверить что первая часть равно единице и получить '5' для передачи в DDRD |=(_BV('5')); ?

Я могу завести вторую переменную, например так:
unsigned char x[2] ={0x01;0x05}
и обрабатывать :

if (x[0]==1){
DDRD |=(_BV(x[1]));
}
if (x[0]==0){
DDRD &= ~(_BV(x[1]));
}


Второй вариант легче в написании, как мне кажется.. а первый я себе пока не представляю.
Tohin вне форума   Ответить с цитированием
Старый 27.09.2016, 23:45   #42
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AVR (mega328p)

Цитата:
Допустим есть unsigned char x = 0x15; как проверить что первая часть равно единице
Не понятно, первая часть чего?
Admin вне форума   Ответить с цитированием
Старый 28.09.2016, 07:14   #43
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 770
Вес репутации: 803
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: AVR (mega328p)

Первая часть байта в шестнадцатеричном виде 00 - FF.
В десятеричной системе аналогом будут десятки. То есть я хочу сравнивать только первый знак двузначной записи. А что будет если я напишу:
char x = 0xF5; //данная переменная содержит байт, получаемый по сети clunet, поэтому значение нужно проверить.
if ((x/10)==0xF){
DDRD |=(_BV(x-0xF0));
}

на калькуляторе получается то что надо.
Tohin вне форума   Ответить с цитированием
Старый 28.09.2016, 12:30   #44
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AVR (mega328p)

Цитата:
Первая часть байта в шестнадцатеричном виде 00 - FF.
Это вторая, она же старшая тетрада
Сравнивать через маску &

if (x/10==(DDRD &=B11110000))
или
if (x/10==(DDRD &=0xF0))
или
if (x/10==(DDRD &=240))
Admin вне форума   Ответить с цитированием
Старый 30.09.2016, 20:44   #45
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 770
Вес репутации: 803
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию Re: AVR (mega328p)

Никак не могу понять что происходит в части: DDRD &=B11110000

Можно на примере?
char x = 0xF5;
x&=B11110000;

Что будет содержать х? Есть ли на примете книги/статьи где данный аспект рассматривается в подаче "для детей с проблемами развития"?
У меня никак не возникает понимание битовых операций типа |=; ~&=; >>; <<. Вроде и читал, вроде и в примерах все понятно, но применять или понять что происходит в коде никак не могу...

И сразу еще вопрос:
есть у меня массив char data [128]. Предположительно (!) ему присваивается значение либо {0x15,0x72}, либо "1572" (не могу пока чужой код разобрать)
пытаюсь вернуть в UART data[0] - приходит 0004. А если возвращаю просто data, то приходит как и требуется 1572
Может моя ошибка очевидна, и найти проблему легко - буду благодарен за помощь. Если нет - то я продолжу эксперименты...
UPD: Кажется что-то нашел DEC 1572 = Hex 624. Метод "тыка" конечно, но цифра совпала... Как при присвоении значений убедить компилятор работать исключительно в hex?

Последний раз редактировалось Tohin; 25.02.2017 в 18:12.
Tohin вне форума   Ответить с цитированием
Старый 30.09.2016, 22:27   #46
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию Re: AVR (mega328p)

Цитата:
Можно на примере?
char x = 0xF5;
x&=B11110000;
Что будет содержать х?
х будет равен 0xF0

Побитовое И — это бинарная операция, действие которой эквивалентно применению логического И к каждой паре битов, которые стоят на одинаковых позициях в двоичных представлениях операндов. Другими словами, если оба соответствующих бита операндов равны 1, результирующий двоичный разряд равен 1; если же хотя бы один бит из пары равен 0, результирующий двоичный разряд равен 0.
Admin вне форума   Ответить с цитированием
Старый 08.05.2017, 19:17   #47
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 770
Вес репутации: 803
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Развел мне добрый человек с форума плату для выключателя, за что ему ОГРОМНЫЙ респект и спасибо.
А теперь вопрос: Есть 4 кнопки подключенные к PB2-PB5, как бы мне прочитав весь регистр PINB определить номера (1-4) нажатых кнопок?
Tohin вне форума   Ответить с цитированием
Старый 10.05.2017, 09:27   #48
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

Конфигурируем порт на вход:
#define portb_In DDRB = 0


Или каждый по отдельности:
#define D8_In DDRB &= B11111110
#define D9_In DDRB &= B11111101
#define D10_In DDRB &=B11111011
#define D11_In DDRB &=B11110111
#define D12_In DDRB &=B11101111
#define D13_In DDRB &=B11011111

Читаем весь порт:
uint8_t ReadPortB=PINB;

Читаем каждый вход по отдельности:
#define D8_Read (PINB & B00000001)
#define D9_Read ((PINB & B00000010)>>1)
#define D10_Read ((PINB & B00000100)>>2)
#define D11_Read ((PINB & B00001000)>>3)
#define D12_Read ((PINB & B00010000)>>4)
#define D13_Read ((PINB & B00100000)>>5)
Admin вне форума   Ответить с цитированием
Старый 10.05.2017, 21:10   #49
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 770
Вес репутации: 803
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Цитата:
Сообщение от Admin Посмотреть сообщение
Читаем весь порт:
uint8_t ReadPortB=PINB;
Т.к планирую повесить прерывание PCINT.
ставлю бит PCIE0 в регистре PCICR
Ставлю в PCMSK0 = 00111100 // для PB2-5

Дальше в обработчике прерывания записываю состояние регистра в глобальную переменную:
volatile uint8_t ReadPortB=PINB;

Как дальше определить кнопку? Кучей if'ов или циклом со сдвигом по биту?
Tohin вне форума   Ответить с цитированием
Старый 10.05.2017, 23:11   #50
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,007
Вес репутации: 9205
Admin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant futureAdmin has a brilliant future
По умолчанию

можно Switch case
Admin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход


Текущее время: 06:20. Часовой пояс GMT +3.


Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd. Перевод: zCarot
Яндекс.Метрика