Перейти к содержанию

Таймер ATtiny13A каждый такт на частоте 9.6 МГц


dubrovkin

Рекомендуемые сообщения

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

И...? До запятой "Запись логической единицы в PINx переключает значение PORTx,...". Что не так?

Записали единичку в PINx - PORTx из нуля переключился в единичку, записали еще раз единичку в PINx - PORTx переключился обратно, из единички в ноль.

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Всё верно, цитата только для подтверждения. Ну и обратить внимание на то, что это всё independent on the value of DDRxn

Изменено пользователем Огонёк
Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, Огонёк сказал:

...independent on the value of DDRxn

"Независимо от значения DDRxn", т.е. от направления порта. Значит такой же операцией можно включать/отключать резисторы подтяжки, если DDRx = 0. Мне так думается.

Ссылка на комментарий
Поделиться на другие сайты

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 такой оговорки нет, а значит и переключение состояния не произойдёт. :)

Изменено пользователем Просто зашёл
Ссылка на комментарий
Поделиться на другие сайты

39 минут назад, dodik сказал:

данную процедуру не нужно применять 

Для переносимости кода, лучше не применять. Если конкретно для ATtiny13, то почему бы и нет.

С уважением, Владимир

Ссылка на комментарий
Поделиться на другие сайты

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    
}

 

 

Ссылка на комментарий
Поделиться на другие сайты

Ребят, а поясните по поводу некоторых команд и их времени выполнения. Например, команда 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...

Изменено пользователем dubrovkin
Ссылка на комментарий
Поделиться на другие сайты

6 минут назад, dubrovkin сказал:

команда SBRC (Set Bits in Register)

а тогда что делает команда SBR?

Мудрость приходит вместе с импотенцией...

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

Ссылка на комментарий
Поделиться на другие сайты

Отставить. В PDF не хорошо переходит по ссылкам. Я нажимал на одну команду, а он мне переходил на другую.

Изменено пользователем dubrovkin
Ссылка на комментарий
Поделиться на другие сайты

21 минуту назад, dubrovkin сказал:

Ребят, а поясните по поводу некоторых команд и их времени выполнения. Например, команда SBRC...

Пропустить следующую команду, если бит РОН сброшен.

Вам бы скачать книгу Евстифеева А.В. "Микроконтроллеры AVR семейства Tiny" или/и "Микроконтроллеры AVR семейства Mega". Там все найдете... и на русском. 

28 минут назад, dubrovkin сказал:

...Тогда что за 1/2/3? Вот Вы говорите, смотрите Datasheet...

Кол-во тактов выполнения зависит от условий:

1т. - нет пропуска.

2т. - размер пропускаемой команды 1 слово.

3т. - размер пропускаемой команды 2 слова.

Ссылка на комментарий
Поделиться на другие сайты

10 часов назад, Геннадий сказал:

Кол-во тактов выполнения зависит от условий:

1т. - нет пропуска.

2т. - размер пропускаемой команды 1 слово.

3т. - размер пропускаемой команды 2 слова.

и в зависимости от кейса вставить нужное количество nop .

это софтовая генерация, и плавающие её камни уже шестую страницу обсуждаем. и варианты перенести на хард предложили. и кажется у ТС спросили в каком устройстве это будет реализовано, но вот я не до конца понял что это за устройство.

Ссылка на комментарий
Поделиться на другие сайты

Блин, ребят, да не, Вы не так всё поняли. Смысл какой. Я открыл 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 могу настроить этот же пин на то, будет ли подтягивающий резистор или нет. Для подключения кнопки, какой из вариантов (с подтягивающим резистором или без) предпочтительно использовать? Я так понимаю, предпочтительно именно с подтягивающим резистором? Тогда вопрос, обязательно ли тогда ставить резистор от минуса и через кнопку до входа в микроконтроллер (чтобы при замыкании, ножка микроконтроллера не напрямую была подключена к минусу, а через резистор) и если да, то какого номинала?

Ещё по поводу дребезка контактов при нажатии. Как с этим обстоя дела. Сам микроконтроллер с этим умеет работать или нужно на ассемблере что-то выдумывать?

И ещё вопрос по поводу прерываний. Так как для меня важно точно срок в срок отправлять сигналы, я буду отключать прерывания. Но, мне нужно будет всё равно получать уведомление что на кнопку нажали и отправлять другой цвет. Я так понимаю, я мог бы это сделать и без прерываний, а просто после отправки опрашивать какое там состояние на входе. Но что-то мне кажется это не очень хорошей идеей. Вот что на счёт прерываний. Вопросы такие:

  1. Если я отключил прерывания, нажал кнопку, затем отжал и затем включил прерывания. Придёт ли мне прерывание (то есть может он запоминает, но пока не обрабатывает)? Думаю что не придёт.
  2. Если я отключил прерывания, нажал кнопку, включил прерывания и затем отжал кнопку. Придёт прерывание?

Ещё я так и не понял, почему прерывания называются внешние (там, вроде для пина INT0) и внутренние для всех остальных (включая и PCINT1, что является той же ножкой, что и пин INT0). В чём различие такое внутренние и внешние? Они же все один фиг приходят от того, если извне сигнал поменяется. Да, я знаю что у внутреннего условий больше для срабатываний, но всё же, названия внутренние и внешние - это громко звучит.

Ссылка на комментарий
Поделиться на другие сайты

А на счёт вопросов про прерывания, где 1 и 2. Там я имел в виду про сигнал в момент нажатия. То есть, если подтягивающий резистор, то там же всё инвентируется. То есть, всегда +, а в момент нажатия -. А если без него, то всегда -, а в момент нажатия +. В общем, там вопрос относится к тому, что первое нажатие должно бы выдать прерывание.

Изменено пользователем dubrovkin
Ссылка на комментарий
Поделиться на другие сайты

15 минут назад, dubrovkin сказал:

ставить резистор от минуса и через кнопку

Не надо.

16 минут назад, dubrovkin сказал:

предпочтительно именно с подтягивающим резистором?

Да.

16 минут назад, dubrovkin сказал:

нужно на ассемблере что-то выдумывать?

Да

17 минут назад, dubrovkin сказал:

кажется это не очень хорошей идеей

Кнопка штука медленная, поэтому можно из без прерываний. Достаточно опрашивать с периодом 20-30 мс. 

 

С уважением, Владимир

Ссылка на комментарий
Поделиться на другие сайты

"Огласите, пожалуйста, весь список..." (к/ф "Операция Ы и другие приключения Шурика").:)

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

Ссылка на комментарий
Поделиться на другие сайты

Не не не) Я как хочу, Вы меня только правилам игры в шахматы научите, а играть я сам буду) Так же и тут. Я видел что Выше там шлют сообщения как биты отправляют. Я даже не читаю их. Я уже составил как я буду отправлять. То есть, мне нужны только ядровые вещи, правила работы. Далее я сам всё придумаю. В том и интерес.

Ссылка на комментарий
Поделиться на другие сайты

Прерывание от кнопки не очень хорошая идея, из-за дребезга. Я обычно делаю опрос кнопок в прерывании по таймеру, либо как-то ещё с определенным интервалом. Таким образом и с дребезгом проще бороться. Если у Вас в программе уже будут определены тайминги для иных процессов, то привяжите к ним опрос кнопки. Допустим закончили передачу, опросили кнопку, запомнили её состояние в переменной.

С уважением, Владимир

Ссылка на комментарий
Поделиться на другие сайты

У меня, конечно была идея, написать программу, чтобы определить как обрабатываются прерывания. Скажем, смысл программы такой. Каждые N времени (скажем 1-2 секунды) включаются и выключаются прерывания. Чтобы я понимал когда какое состояние, выдавать сигнал - будет гореть светодиод. Подключаю кнопку. И, когда светодиод не горит (прерывания отключены), нажать на кнопку и отпустить её тогда, когда светодиод загорится (прерывания разрешены). Ну и, в обработчике прерываний инвентировать сигнал на другую ножку, где тоже будет светодиод, по которому можно будет понять отработало ли прерывание. Просто быстрее спросить тут, чем это всё составлять.

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

×
×
  • Создать...