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

Вопросы от начинающих по МК


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

А зачем нужен массив с 161 значением?  если 80 достаточно, дважды заносите одни и те же значения. Ваш цикл for пролетает за доли секунды

В этой строчке тоже не вижу необходимости  if (A==161) A=0;

Сергей.

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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

я не знаю как это сделать, знаю только что шим работает от CLKpll, и какой это таймер? какой то внутренний генератор на 64мгц! там еще делители настраиваются

PCNF2|=PSC2_FOUR_RAMP//Four Ramp Mode
	     |(1<<PCLKSEL2)//выбираем CLK PLL стр 162 таб.16-9

энкодер от первого таймера, 

и как синхронизировать эти таймеры? вот тактирует он от своего PLL импульсы а мы тут влазим...

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

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

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

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

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

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

28 минут назад, Дмитрий Вас сказал:

и как синхронизировать эти таймеры?

Они сихронизируются аппаратно: вы заносите в OCR0RA новое значение, оно пишется в промежуточный регистр, и ждет, пока аппаратная часть доделает начатый период ШИМ, а затем перегрузит это значение в рабочий регистр. Как-то так.

То есть вам не надо думать о синхронизации, но вы должны понимать, что если вы не даете МК времени на доделывание ШИМа, а постоянно обновляете регистр, момент синхронизации не наступает (или наступает очень редко), в итоге вы видите не то, что ожидаете.

31 минуту назад, Дмитрий Вас сказал:

я не знаю как это сделать

Очень просто: я же вам написал! Допустим, таймер0 настраиваете на прерывания 100 раз в секунду, в обработчике пишите своё 

OCR0RA = tab_sin[A];
if(++A >= 160) A = 0;

И все. А остальную писанину в регистры делаете один раз на этапе инициализации периферии в вашей программе. Ну, разве что еще переменная A у вас должна быть внутри обработчика объявлена static uint8_t A;

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

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

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

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

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

ISR(TIMER0_COMPA_vect)
{
	static uint8_t A;
	//static uint8_t B;
	//static uint8_t C;
	OCR0RA = tab_sin[A];
	OCR0SA = 50;
	OCR0RB = 0;
	OCR0SB = 0;
	if(++A >= 160) 
	    { 
		  OCR0RB = tab_sin [A];
		  OCR0SB = 50;
		  OCR0RA = 0;
		  OCR0SA = 0;
		  A = 0;
		};

Ошибка двух или более типов данных в спецификаторах объявлений, вот что пишет

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

  • 2 недели спустя...

Доброго дня! Подскажите пожалуйста , если  впомните вдруг. Нужно контроллер подобрать по корпусу СО-8. И ногам питания (не очень стандартным) 8-Vcc. 4-Vss.  (по олдовой геометрии ТТЛ в общем, если так можно выразится. Последняя нога" +" , и по диагонали" -")

По функционалу понадобятся I2C  и EEPROM.

Буду благодарен , если вспомнит кто-нибудь в распостраненном семействе. Либо вариант посоветует (не космического масштаба ) заказать небольшую партию известного образца с моей распиновкой 

 

РS: "аттини 13" нашел пока. Но слабенькая она совсем 

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

2 часа назад, Пришел в кедах сказал:

Но слабенькая она совсем

Да ладно, слабенькая! Нормальная для своих "лет" :) Есть её старшие сестрички attiny25 и attiny85. Сейчас есть и другие, но я не помню их по имени...

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Вся задача как раз в готовые платы упихать. Там 1-й пин уже незамысловатый логический вход .. А так.. На ПИКе идеально было бы для меня

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

  • 3 недели спустя...

Добрый вечер.

В очередной раз пытаюсь постигнуть эту "магию " программирования.

Прошу совета.

Сейчас читаю  книги по автоматному программированию, автор Шалыто, понравилась логика и сама концепция .

Ну и возник вопрос,совета просить не у кого,

Возможно ли (почему нельзя) использовать конструкцию типа :

if(PINB0 & !PINB1)     //  если PINBO=1 а PINB1=0, то делаем что-то

{

do_something();

}

я понимаю что что-то тут не так, и если бы все было так просто то не использовались стандартные конструкции типа:

if((0 != (PINB & (1<<PINBO)) & (0 == (PINB & (1<<PINB1)))

{

do_something();

}

 

 

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

есть регистр запуска шим PCTL2 = (1<<PRUN2);. хочу кнопкой включать и выключать его.

ISR (TIMER1_COMPA_vect)
{
	//обработка кнопки
	if(!(PIND&(1<<5)))//если нажата кнопка
	{
	    PCTL2 ^= (1<<PRUN2);
	}

правильно ли я написал?

@pndbr через & нельзя только через запятую возможно. посмотрите как у меня в вопросе написанно

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

13 минут назад, Дмитрий Вас сказал:

правильно ли я написал?

Нет: таймер у вас сгенерирует прерывание явно много раз в секунду, и каждый раз, когда при этом кнопка все еще будет нажата, бит PRUN2 будет менять свое значение на противоположное, т.е. будет включаться и выключаться многократно, пока нажата кнопка.

 

14 минут назад, pndbr сказал:

Возможно ли (почему нельзя) использовать конструкцию типа

Возможно все, если все сделать правильно. В частности, применять оператор && (ЛОГИЧЕСКОЕ И) вместо & (БИТОВОЕ И). А остальное - дело техники: никто не запретит вам создать макросы и получить "конструкцию типа"

#define PIN_1	(!!(PINB & (1<<PB0)))
#define PIN_2	(!!(PINB & (1<<PB1)))
  
// "конструкция"
if(PIN_1 && !PIN_2) {
  // что-то там
}

 

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

Только что, ARV сказал:

 


#define PIN_1	(!!(PINB & (1<<PB0)))
#define PIN_2	(!!(PINB & (1<<PB1)))
  
// "конструкция"
if(PIN_1 && !PIN_2) {
  // что-то там
}

 

спасибо добрый человек

но возник новый вопрос:

(!!(PINB & (1<<PB0)))

С оператором "!" (НЕ) знаком,а оператор "!!" первый раз встречаю, что он значит?

 

 

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

Это 2 оператора !

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

2 минуты назад, ARV сказал:

 

логично,не спорю)

но попрошу Вас,если не сложно,немного подробнее написать, для недостаточно просветленных..ну или направить где я смогу найти описание действий оператора сдвоенного "НЕ"

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

Да что тут понимать...

Оператор НЕ превращает любое НЕНУЛЕВОЕ число в 0, а НОЛЬ превращает в 1. То есть после первого ! мы получим 0, если было не ноль, и 1, если был ноль. А после второго ! мы получим снова инверсию, то есть получим 1, если изначально было не ноль, и 0, если был и так ноль.

Иными словами двойное НЕ превращает любое ненулевое число в 1, а любой ноль не меняет.

Таким образом, можно сравнивать любые числа, как логические значения, что без двойного НЕ невозможно.

Например:

char A = 12;
char B = 30;

// простое сравнение
if(A == B) {
  // не сработает, т.к. числа разные
}

// "логическое" сравнение
if(!!A == !!B){
  // сработает, т.к. логически оба числа эквивалентны TRUE
}

Многие ошибочно пытаются сравнивать "значение бита в порту" с 1 или 0, а это не сработает, т.к., например, ТРЕТИЙ бит в порту это 0x04, что, естественно, единице не будет равно никогда. Если сделать НЕ-НЕ, то любой бит в порту превратится в 1 или 0, что уже можно сравнивать безошибочно

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 hour ago, ARV said:

Оператор НЕ превращает

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

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

7 часов назад, Yurkin2015 сказал:

Поэтому тут двойное отрицание не нужно.

А если применять оператор == или !=, а тем более ^, он превратит операнды в логические или нет?

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

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

3 часа назад, ARV сказал:

А если применять оператор == или !=, а тем более ^, он превратит операнды в логические или нет?

Конечно нет. Bool появляется ПОСЛЕ логической операции. Исходные операнды не имеют права изменяться.

Кстати, если подключить stdbool.h, то можно просто привести типы  (bool)A == (bool)B.

Изменено пользователем my504

戦う前に相手のベルトの色に注目

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

22 минуты назад, my504 сказал:

Конечно нет.

Вопрос был риторическим.

22 минуты назад, my504 сказал:

то можно просто привести типы  (bool)A

Но писать больше букв :) 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

11 минут назад, ARV сказал:

Но писать больше букв :) 

Больше - не значит хуже. 

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

Никому в голову не придет сокращать имена переменных/функций до нечитабельного состояния с целью "меньше писать"... 

Ну и не факт, что компилятор оптимизирует двойное отрицание до приведения типа. 

戦う前に相手のベルトの色に注目

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

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

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

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

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

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

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

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

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

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

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

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