Геннадий Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 Мне кажется точнее будет так "запись логической единицы в PINx приведет к изменению значения PORTx на противоположное". 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Огонёк Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 Из даташита: Цитата 10.2.2 Toggling the Pin Writing a logic one to PINxn toggles the value of PORTxn, independent on the value of DDRxn 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Геннадий Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 И...? До запятой "Запись логической единицы в PINx переключает значение PORTx,...". Что не так? Записали единичку в PINx - PORTx из нуля переключился в единичку, записали еще раз единичку в PINx - PORTx переключился обратно, из единички в ноль. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Огонёк Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 (изменено) Всё верно, цитата только для подтверждения. Ну и обратить внимание на то, что это всё independent on the value of DDRxn Изменено 8 июня, 2023 пользователем Огонёк 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 2 минуты назад, Огонёк сказал: ...independent on the value of DDRxn "Независимо от значения DDRxn", т.е. от направления порта. Значит такой же операцией можно включать/отключать резисторы подтяжки, если DDRx = 0. Мне так думается. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 23 минуты назад, Геннадий сказал: Мне так думается Логично. Я тоже так подумал. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
Просто зашёл Опубликовано 8 июня, 2023 Поделиться Опубликовано 8 июня, 2023 (изменено) 11 часов назад, dubrovkin сказал: Мне как раз говорили, что устанавливать уровень сигнала на выходе можно через PINB, вместо PORTB. Да, можно, только не у всех МК это можно реализовать. Регистр PINx это регистр состояния порта и как правило доступен только для чтения. Но в некоторых МК (в частности у tiny13) имеется в даташите такая оговорка: Цитата However, writing a logic one to a bit in the PINx Register, will result in a toggle in the corresponding bit in the Data Register. Однако запись логической единицы в бит регистра PINx приведёт к переключению соответствующего бита в регистре данных. То есть произойдёт переключение логического состояния на противоположный если вывод настроен на выход. Если настроен на вход, то будет управлять подтяжкой резистора. Вот потому данная процедура работает не на всех МК. К примеру у atmega8 такой оговорки нет, а значит и переключение состояния не произойдёт. Изменено 8 июня, 2023 пользователем Просто зашёл 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dodik Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 6 часов назад, Просто зашёл сказал: Вот потому данная процедура работает не на всех МК. Вот потому данную процедуру не нужно применять . 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 короче абсолютно бесполезена для целей ТС. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 39 минут назад, dodik сказал: данную процедуру не нужно применять Для переносимости кода, лучше не применять. Если конкретно для ATtiny13, то почему бы и нет. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
IMXO Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 3 часа назад, ДядяВован сказал: то почему бы и нет. Ну нет, так нет. вот такой трэш на Си Спойлер /******************************************************* Chip type : ATtiny13A AVR Core Clock frequency: 9,600000 MHz Memory model : Tiny External RAM size : 0 Data Stack size : 16 *******************************************************/ #include <tiny13a.h> void write_WS2812B(unsigned char _Green,unsigned char _Red,unsigned char _Blue); void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 1 #pragma optsize- CLKPR=(1<<CLKPCE); CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0); // State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0 PORTB=(0<<PORTB5) | (1<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); while (1) { write_WS2812B(0xAA,0x55,0xFF); } } void write_WS2812B(unsigned char _Green,unsigned char _Red,unsigned char _Blue) { unsigned char Green = _Green; unsigned char Red = _Red; unsigned char Blue = _Blue; unsigned char caunt_bit=8; #pragma optsize- do{ Green<<=1; #asm brcc send_zero_G send_one_G: sbi 0x18,0 nop send_zero_G: sbi 0x18,0 nop cbi 0x18,0 #endasm } while (--caunt_bit); caunt_bit=8; do{ Red<<=1; #asm brcc send_zero_R send_one_R: sbi 0x18,0 nop send_zero_R: sbi 0x18,0 nop cbi 0x18,0 #endasm } while (--caunt_bit); caunt_bit=8; do{ Blue<<=1; #asm brcc send_zero_B send_one_B: sbi 0x18,0 nop send_zero_B: sbi 0x18,0 nop cbi 0x18,0 #endasm } while (--caunt_bit); #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif } 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 9 июня, 2023 Автор Поделиться Опубликовано 9 июня, 2023 (изменено) Ребят, а поясните по поводу некоторых команд и их времени выполнения. Например, команда SBRC (Set Bits in Register). В официальном Datasheet по ATtiny13A написано в поле #Clocks значение 1/2/3. Я видел команды, которые выполняются либо 1 либо 2 такта, в зависимости от условий (например команда BRCC), как раз для них пишут 1/2. Но, в Datasheet по ATtiny13A нет описания команд. Поэтому я пошёл в другой официальный документ от Microchip - AVR Instruction Set Manual. Нашёл там команду SBRC. И там для данной команды, для всех архитектур (AVRe, AVRxm, AVRxt и AVRrc) стоит время выполнения в 1 такт. Тогда что за 1/2/3? Вот Вы говорите, смотрите Datasheet... Изменено 9 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Starichok Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 6 минут назад, dubrovkin сказал: команда SBRC (Set Bits in Register) а тогда что делает команда SBR? 0 Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду. Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 9 июня, 2023 Автор Поделиться Опубликовано 9 июня, 2023 (изменено) Отставить. В PDF не хорошо переходит по ссылкам. Я нажимал на одну команду, а он мне переходил на другую. Изменено 9 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 9 июня, 2023 Поделиться Опубликовано 9 июня, 2023 21 минуту назад, dubrovkin сказал: Ребят, а поясните по поводу некоторых команд и их времени выполнения. Например, команда SBRC... Пропустить следующую команду, если бит РОН сброшен. Вам бы скачать книгу Евстифеева А.В. "Микроконтроллеры AVR семейства Tiny" или/и "Микроконтроллеры AVR семейства Mega". Там все найдете... и на русском. 28 минут назад, dubrovkin сказал: ...Тогда что за 1/2/3? Вот Вы говорите, смотрите Datasheet... Кол-во тактов выполнения зависит от условий: 1т. - нет пропуска. 2т. - размер пропускаемой команды 1 слово. 3т. - размер пропускаемой команды 2 слова. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dolmatovva Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 10 часов назад, Геннадий сказал: Кол-во тактов выполнения зависит от условий: 1т. - нет пропуска. 2т. - размер пропускаемой команды 1 слово. 3т. - размер пропускаемой команды 2 слова. и в зависимости от кейса вставить нужное количество nop . это софтовая генерация, и плавающие её камни уже шестую страницу обсуждаем. и варианты перенести на хард предложили. и кажется у ТС спросили в каком устройстве это будет реализовано, но вот я не до конца понял что это за устройство. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dodik Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 (изменено) Длина одного бита 9 тактов . На 9.6 МГц это менее 1 мкс . Изменено 10 июня, 2023 пользователем dodik 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 Блин, ребят, да не, Вы не так всё поняли. Смысл какой. Я открыл Datasheet по ATtiny13A. Перешёл там к главе Instruction Set Summary. Там долистал до команд BRANCH INSTRUCTIONS. И начал разглядывать колонки. Увидел 1/2/3 и ряда инструкций и увидел 1/2. Так как тут описаний нет, пошёл в AVR Instruction Set Manual. Решил прочитать про команду BRCC, у которой стоит 1/2 и в документе AVR Instruction Set Manual, в содержании тыкнул на неё мышкой. Открылась страничка с этой командой, где я пролистал вниз (хотя там и так на экране уже видно было) до раздела Cycles. И там увидел как расписано когда будет 1 такт, а когда 2. Далее я вернулся в Datasheet от ATtiny13A и обратил внимание на команду SBRC, где указано 1/2/3. Пошёл в AVR Instruction Set Manual. Нашёл её в содержании и тыкнул (там когда на команды тыкаешь, идёт переход на главу с описанием этой команды). И вот переход сработал. А ищу раздел Cycles и вижу там только то, что там всё выполняется за 1 такт. Вот и у меня сразу паника. А как оказалось, там ошибка в переходе была, притыке на команду SBRC, меня кинуло на команду SBR. А я это не увидел. И когда начал сюда писать, я название конмады взял (точнее её мнемонику) из Datasheet'а по ATtiny13A, а расшифровку скопировал уже из того места, куда меня перенесли в AVR Instruction Set Manual. Копировал прям из этой строки "SBR – Set Bits in Register". Но меня интересовала только правая часть от -. В общем, я и не заметил что речь идёт про другую команду. В общем вот так получилось. Переходы у них сделаны с ошибкой. Ну, или так офигенно переходит Microsoft Edge (я в их браузере эти pdf открываю). Ребят, а на счёт входов. Вот настрою я в DDRB какой-нибудь пин на вход. Через PORTB могу настроить этот же пин на то, будет ли подтягивающий резистор или нет. Для подключения кнопки, какой из вариантов (с подтягивающим резистором или без) предпочтительно использовать? Я так понимаю, предпочтительно именно с подтягивающим резистором? Тогда вопрос, обязательно ли тогда ставить резистор от минуса и через кнопку до входа в микроконтроллер (чтобы при замыкании, ножка микроконтроллера не напрямую была подключена к минусу, а через резистор) и если да, то какого номинала? Ещё по поводу дребезка контактов при нажатии. Как с этим обстоя дела. Сам микроконтроллер с этим умеет работать или нужно на ассемблере что-то выдумывать? И ещё вопрос по поводу прерываний. Так как для меня важно точно срок в срок отправлять сигналы, я буду отключать прерывания. Но, мне нужно будет всё равно получать уведомление что на кнопку нажали и отправлять другой цвет. Я так понимаю, я мог бы это сделать и без прерываний, а просто после отправки опрашивать какое там состояние на входе. Но что-то мне кажется это не очень хорошей идеей. Вот что на счёт прерываний. Вопросы такие: Если я отключил прерывания, нажал кнопку, затем отжал и затем включил прерывания. Придёт ли мне прерывание (то есть может он запоминает, но пока не обрабатывает)? Думаю что не придёт. Если я отключил прерывания, нажал кнопку, включил прерывания и затем отжал кнопку. Придёт прерывание? Ещё я так и не понял, почему прерывания называются внешние (там, вроде для пина INT0) и внутренние для всех остальных (включая и PCINT1, что является той же ножкой, что и пин INT0). В чём различие такое внутренние и внешние? Они же все один фиг приходят от того, если извне сигнал поменяется. Да, я знаю что у внутреннего условий больше для срабатываний, но всё же, названия внутренние и внешние - это громко звучит. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 (изменено) А на счёт вопросов про прерывания, где 1 и 2. Там я имел в виду про сигнал в момент нажатия. То есть, если подтягивающий резистор, то там же всё инвентируется. То есть, всегда +, а в момент нажатия -. А если без него, то всегда -, а в момент нажатия +. В общем, там вопрос относится к тому, что первое нажатие должно бы выдать прерывание. Изменено 10 июня, 2023 пользователем dubrovkin 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 15 минут назад, dubrovkin сказал: ставить резистор от минуса и через кнопку Не надо. 16 минут назад, dubrovkin сказал: предпочтительно именно с подтягивающим резистором? Да. 16 минут назад, dubrovkin сказал: нужно на ассемблере что-то выдумывать? Да 17 минут назад, dubrovkin сказал: кажется это не очень хорошей идеей Кнопка штука медленная, поэтому можно из без прерываний. Достаточно опрашивать с периодом 20-30 мс. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 И кстати да, я видимо перепутал терминологии. Не внутренние и внешние, а аппаратное и программное. Но вопрос остался) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 "Огласите, пожалуйста, весь список..." (к/ф "Операция Ы и другие приключения Шурика"). Опишите весь проект, тогда будет возможность правильнее выбрать направление решения задачи. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 Не не не) Я как хочу, Вы меня только правилам игры в шахматы научите, а играть я сам буду) Так же и тут. Я видел что Выше там шлют сообщения как биты отправляют. Я даже не читаю их. Я уже составил как я буду отправлять. То есть, мне нужны только ядровые вещи, правила работы. Далее я сам всё придумаю. В том и интерес. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
ДядяВован Опубликовано 10 июня, 2023 Поделиться Опубликовано 10 июня, 2023 Прерывание от кнопки не очень хорошая идея, из-за дребезга. Я обычно делаю опрос кнопок в прерывании по таймеру, либо как-то ещё с определенным интервалом. Таким образом и с дребезгом проще бороться. Если у Вас в программе уже будут определены тайминги для иных процессов, то привяжите к ним опрос кнопки. Допустим закончили передачу, опросили кнопку, запомнили её состояние в переменной. 0 С уважением, Владимир Ссылка на комментарий Поделиться на другие сайты Поделиться
dubrovkin Опубликовано 10 июня, 2023 Автор Поделиться Опубликовано 10 июня, 2023 У меня, конечно была идея, написать программу, чтобы определить как обрабатываются прерывания. Скажем, смысл программы такой. Каждые N времени (скажем 1-2 секунды) включаются и выключаются прерывания. Чтобы я понимал когда какое состояние, выдавать сигнал - будет гореть светодиод. Подключаю кнопку. И, когда светодиод не горит (прерывания отключены), нажать на кнопку и отпустить её тогда, когда светодиод загорится (прерывания разрешены). Ну и, в обработчике прерываний инвентировать сигнал на другую ножку, где тоже будет светодиод, по которому можно будет понять отработало ли прерывание. Просто быстрее спросить тут, чем это всё составлять. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.