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

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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 12.05.2017, 22:38   #51
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Долго думал, но так и не понял как побитово через switch/case.
Перебирать все 265 значений?

И второй вопрос: А чисто гипотетически, может atmega проработать пару секунд на питании от конденсатора? Как можно рассчитать необходимую емкость конденсатора?

Последний раз редактировалось Tohin; 12.05.2017 в 23:33.
Tohin вне форума   Ответить с цитированием
Старый 13.05.2017, 10:13   #52
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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
По умолчанию

Извиняюсь, написал глубоко не вникая в суть вопроса
Тогда через If
Admin вне форума   Ответить с цитированием
Старый 13.05.2017, 10:54   #53
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Да я тоже тормоз. Кнопок-то всего 4. и нажимаются они по одной. То есть всего 4 комбинации.

На профильном форуме подсказали еще вариант, для 4 кнопок:
Цитата:
Сделай таблицу соответствий, она будет всего 16 байт.


unsigned char led_status[16] = { 0b0000000, 0b00001000, 0b00000010....};
...
key_byte &= 0x0F; // выделим младшую тетраду из пришедшего байта
tmp =key_status[led_byte]; // находим значение по таблице
PORTD &= 0xF0; // временно очищаем младшую тетраду
PORTD |= tmp; // накладываем по маске
Из плюсов, можно на одну кнопку повесить комбинации выхода.
Минус - Неочевидность задания соответствия.

У меня родился вот такой бред (еще не прошивал):
Код:
void led_update(char led_status){
	const int ledPin[] = {4,5,6,3};
	int i;
	for (i = 0; i < 4; i++) {
		if (led_status&(1<<i)){
			PORTB |= (1<<ledPin[i]);
		}
		else{
			PORTB &= ~(1<<ledPin[i]);
		}
	}
}
Tohin вне форума   Ответить с цитированием
Старый 16.05.2017, 18:07   #54
sakatgg
Senior Member
 
Регистрация: 15.07.2014
Сообщений: 939
Вес репутации: 990
sakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nicesakatgg is just really nice
По умолчанию

Tohin, Модернизировал УЗ ванну, там в коде работа с кнопками есть, может что подойдет

Последний раз редактировалось sakatgg; 16.05.2017 в 18:16.
sakatgg вне форума   Ответить с цитированием
Старый 16.05.2017, 20:26   #55
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Как обычно, не хватает времени изучить ВСЁ
На easyelectronics (кстати видел там ALS'a) подсказали интересный код для переставки бит в байте:

Код:
void led_update(uint8_t led_status){

uint8_t bo = 0x00;

  __asm__ __volatile__(
"bst %[b_in], 0\n\t"
"bld %[b_out], 3\n\t"
"bst %[b_in], 1\n\t"
"bld %[b_out], 6\n\t"
"bst %[b_in], 2\n\t"
"bld %[b_out], 5\n\t"
"bst %[b_in], 3\n\t"
"bld %[b_out], 4\n\t"
: [b_out] "=&r" (bo)
: [b_in] "r" (led_status)
);

PORTD = bo;
// или как вариант: PORTD |= bo; PORTD &= bo | 0b10000111; - это чтобы не менять другие биты в PORTD
}
Tohin вне форума   Ответить с цитированием
Старый 20.05.2018, 22:52   #56
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Снова продолжаю мучать несчастную атмегу...
Задача передать несколько числовых значений в рандомном порядке. Чтобы их различать решил слать буковку перед циферкой. Типа: a45y18b10x12
Написал так:
Код:
int y,x,a,b,d;
void loop() {
   if (Serial.available()) {
    // wait a bit for the entire message to arrive
    delay(100);
    char c = Serial.read();
    if (c == 'y') { 
      y=Serial.parseInt();
    }
    if (c == 'x') { 
      x=Serial.parseInt();
    }
        if (c == 'a') { 
      a=Serial.parseInt();
    }
    if (c == 'b') { 
      b=Serial.parseInt();
    }   
    if (c == 'd') { 
     d=Serial.parseInt();
    }

    
    if (c == '\n') { 
//обработка полученных значений
}
}
}
Единственный свой косяк который вижу, надо было через switch-case писать наверное.

Есть ли иные варианты?
Tohin вне форума   Ответить с цитированием
Старый 21.05.2018, 00:40   #57
Admin
Administrator
 
Аватар для Admin
 
Регистрация: 12.04.2010
Адрес: Москва
Сообщений: 9,618
Вес репутации: 9823
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 вне форума   Ответить с цитированием
Старый 11.08.2018, 16:28   #58
Tohin
Moderator
 
Регистрация: 20.07.2014
Адрес: МСК
Сообщений: 991
Вес репутации: 1031
Tohin is a jewel in the roughTohin is a jewel in the roughTohin is a jewel in the rough
По умолчанию

Так, опять я не могу алгритм подобрать.
Есть 2 условия и 2 участка кода которые выполняются по этим условиям.
И есть третий кусок кода, который должен выполнится только при наличии одного из условий. Пока написал так:
Код:
if (условие1) {
       код1
}
if (условие2){
      код2
}
if (условие1 || условие2){
     код3
}
Так правильно писать или есть конструкции позволяющие сделать это без повторной проверки условий? Обычный else не прокатит - если оба условия ложные код3 не должен выполняться
Tohin вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 2 (пользователей: 0 , гостей: 2)
 

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

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

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


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


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