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

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


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

15 минут назад, Дмитрий Мамедиев сказал:

А эти макросы нужно составлять самому или они как библиотеки?

Ну вот вы пишите

#define STEP PINCx

Это можно сказать вы и создали макрос.

Писать вы можете сами, а есть и готовые. Например _BV - он готовый в Атмел Студия, в других не знаю.

Так же можно находить готовые) Например вот тут.

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

создаете заголовочный файл, напрмиер define.h и пишите в нем

// ветодиод висит на ноге PB2
#define LED_DDR DDRB
#define LED_PORT PORDB
#define LED_PIN PORTB2

А потом где то в коде например в main.cpp

#include "define.h" //подключаем наш файл

... 

// где то в коде
LED_DDR |= _BV(LED_PIN); // настроим ножку на выход
LED_PORT |= _BV(LED_PIN); // включим светодиод

Все, теперь перенося светодиод на другую ногу, просто меняем настройки в файле define.h

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

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

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

25 минут назад, Дмитрий Мамедиев сказал:

они как библиотеки?

ну вот у вас написано например include <avr/io.h> э там определена куча макросов, PINС, PINC7, DDRB, INT0, и еще куча всего

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

5 минут назад, Дмитрий Мамедиев сказал:

А нет ли библиотеки как в ардуино.

Не работал с ардуино. Но предположу, что исходя из того что в digitalRead только 1 параметр, эта функция ил макрос, не знаю что это, заточена на плату ардуино, где извесно какой порт под каким номером)

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

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

#define BitIsSet(reg, bit) ((reg & (1<<(bit))) != 0)

#define BitIsSet(reg, bit)       ((reg & (1<<(bit))) != 0)

Что вам мешает сделать так

#define digitalRead(reg, bit)       ((reg & (1<<(bit))) != 0)

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

#define digitalRead(r, b) SitIsSet(r, b)

а потом написать так

bool state = digitalRead(STATE_PORT, STATE_PIN);
if (state) {
  // тут 1 на ноге
} else {
  // тут 0
}

Вообщем особо по ардуино не подскажу) Не работал)

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

Почитайте вообще отдельно с++, и ООП. Вы можете использовать перечисления enum например

enum ButtonState {
	LOW,
	HI
};

Можете классы

class Button {
  	Button (volatile uint8_t* port, int8_t pin, ButtonState pressType) {
     	...
    }
	protected:
		ButtonState _state;
		...
	public
		ButtonState getState() {
            return _state;
        }
  		
  		bool isPressed() {
          return _state == _pressState;
        }
...
}

и использовать в коде что то типа

Button btn(STATE_PORT, STATE_PIN, ButtonState.LOW);
if (btn.getState() == ButtonState.HI) {
  
}
// или 
if (btn.isPressed()) {
  
}
// и т.д. как ваша душа пожелает описатьповидение кнопки)

 

33 минуты назад, Дмитрий Мамедиев сказал:

button state==1

быть может тут должно быть что то типа

button_state==1 или button.state==1 или button->state==1 или state==1? 

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

Начитался я тут. В общем мне нужно работать не просто с кнопкой, а с входящим сигналом и считать его приплюсовывая. Это делают входы int0 и int1, но вот мне нужен если еще и int2 но на атмеге 8 его нет. Это можно програмно обмануть или лучше (тем более в моем случае) взять другой контроллер?

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

Можно взять прерывание с порта(PCINTxx), разрешить его для одного пина. Но там нет настройки срабатывания на фронт или спад, прерывание будет реагировать на оба перепада и их как-то надо отличать или поделить на двое подсчет.

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

Учение - изучение правил. Опыт - изучение исключений.

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

Как это нет группового прерывания по изменению состояния пинов порта? Ох ты ж... и правда нету, тогда точно стоит поменять её на MEGA48 или 88.

Учение - изучение правил. Опыт - изучение исключений.

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

Я как раз задался тем же вопросом в соседней теме, как мне атмегой8 отловить прерывания от двух сенсоров и от одного nrf24. Думал сделать просто, два сенсора завести на два любых пина, а потом оба через диоды завести на INT0. Как только будет прерывания на инт 0, я буду смотреть на двух пинах состояние, что бы понять от какого сработало или от двух сразу. Но мне не нужна точность подсчета.

12 часа назад, Дмитрий Мамедиев сказал:

и считать его приплюсовывая

Разве это не делают счетчики, которые можно тактировать от внешнего сигнала на ножках Т0 и Т1 у атмеги8?

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




Разве это не делают счетчики, которые можно тактировать от внешнего сигнала на ножках Т0 и Т1 у атмеги8?

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

10 минут назад, Дмитрий Мамедиев сказал:

Да но мне их нужно три.

ТО есть, если я правильно понимаю, T0, T1, INT0, INT1 - как минимум 4 входа, которые позволят посчитать 4 числа, просто в случае с T0 макс число будет 255, да и настроек там вроде бы нет у таймера 0, только по 255 считать. А вот Т1 можно настроить прерывания на совпадение с единицей, и считать каждый такт в отдельную переменную, так же считать еще по INT0 и INT1. И того 3 счетчика.

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

34 минуты назад, Дмитрий Мамедиев сказал:

Ну я то начинающий

Ну я то тоже :) С INTx я работал, с таймерами тоже работал, но при тактировании от МК. А от внешнего не работал, но написано что выводы Tx - это выводы с которых можно подсчитывать импульсы.

из даташит установленные биты регистра TCCR1B

CS11 и CS12 - External clock source on T1 pin. Clock on falling edge
CS10, CS11 и CS12 - External clock source on T1 pin. Clock on rising edge

Выбираете по переходу в 0 или в 1 соотвественно вам надо считать.

Дальше по идеи можно настроить таймер на сброс при совпадении и указать как совпадение 1, если нужно подсчитывать каждый такт, и в прерывании сброса при совпадении считать в свою переменную.

 

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

Чето не могу я с этими таймерами разобраться. Для т0 чтоб считал внешние импульсы, какие регистры нужно настраивать?

 TCCR0= ((1

какие еще?

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

2 минуты назад, Дмитрий Мамедиев сказал:

Для т0

Я уже пиал раньше, что на соклько я помню, Т0 не имеет настроек для совпадения. То есть, если вы на него будите подавать импульсы, прерывания по переполнению сработает достигнув 255 импульсов.

То есть, вы сможете в основном цикле программы, ну или с другого прерывания получить число сколько там импульсов, но если вам нужно прям по каждому импульсу срабатывание прерывания - то с данным таймером это не получится.

 

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

попробуйте так

uint8_t cnt = 0; // куда считать

ISR(TIMER0_OVF_vect) { // Прерывание по переполнению таймера 0
	TCNT0 = 254; // Накрутим значение для срабатывания прерывания на следующим импульсе
	cnt ++; // Плюсуем наш импульс
}

А где то в основном цикле настройка таймера

TCCR0 |= (1 << CS02) | (1 << CS01) | (1 << CS00); // если нужно сичтать переход с 0 в 1
TCCR0 |= (1 << CS02) | (1 << CS01) | (0 << CS00); // если нужно сичтать переход с 1 в 0

TCNT0 = 254; // запишем сразу дефолтное значение в 254, что бы на следующем импульсе было прерывание
TIMSK |= 1 << TOIE0; // включить прерывания по переполнению
sei(); // разрешить прерывания

 

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

Я не понимаю. Короче на него будут подаваться импульсы непрерывно, но на выходе мк нужно получить управление шд
0000
1000
0100
0010
0001
Т.е. счет как бы до четырех
Я так понимаю в функции isr{step++}
while{portd= 0b00000001На каждый импульс step нужно плюсавать но только до четырех и начинать сначала.

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

Вот если б Вы написали задачу просто было бы проще)

Счет нужен? Или просто пришел импульс на ножку мк - нужно выдать на другую ножку? То есть каждый входящий импульс сдвигать 1 бит но до 4х?

можно тогда не считать по идеи

ISR() {
  // если прошлый шаг был 4 то сдвигаем обратно на 0 бит
  if (PORTD & 0b00001000) {
      PORTD = (PORTD & 0x0f) >> 3;
  } else { // если не 4 шаг то двигаем влево
      PORTD = (PORTD << 1) & 0x0F;
  }
}

ну если нужно сохранить старшие 4 бита то как то так

if (PORTD & 0b00001000) {
	PORTD = (PORTD & 0xF0) | ((PORTD & 0x0f) >> 3);
} else {
	PORTD = (PORTD & 0xF0) | ((PORTD << 1) & 0x0F);
}

Если же нужно включать и выключать ногу и помнить шаг то да со счетчиком

PORTD |= 1 << step; // при первом срабатывании в step будет 0, 1 << 0 будет 0b00000001, на втором 1 << 1 = 0b00000010 и тд
if (++step == 4) { // если step == 4 то это будет 0b00010000 уже лишнее. сбросим в 0
	step = 0;
}

 

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

В 24.12.2018 в 09:54, DrobyshevAlex сказал:

Думал сделать просто, два сенсора завести на два любых пина, а потом оба через диоды завести на INT0. Как только будет прерывания на инт 0, я буду смотреть на двух пинах состояние, что бы понять от какого сработало или от двух сразу.

Да, так сработало, таким образом можно больше внешних прерываний повесить на мк.

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

unsigned char stepX=0,stepY=0,stepZ=0;//stepX-PD2(INT0) stepY-PD3(INT1) stepZ-PD4(T0)
ISR(INT0_vect)
{
	//cli();//запрещение прерываний на время обработки прерывания
	stepX++;
	//sei();//разрешение прерываний
}
ISR(INT1_vect)
{
	stepY++;
}
void INTinit()
{
	GICR=((1<<INT0)|(1<<INT1)); //разрешаем прерывание int0 и int1
	MCUCR=((1<<ISC00)|(1<<ISC01)|(1<<ISC10)|(1<<ISC11));// прерывание по переднему фронту импульса int0 и int1
}

int main(void)
{
	    INTinit();//вызываем функцию инициализации прерывания
	    sei();//устанавливаем бит глобального разрешения прерываний
        DDRC=0b0111111;//PINC6 на вход остальные на выход
        //DDRB=0xff;
        DDRD=0b11100000;//step/dir на вход
        PORTC=0x00;//порт подтянули к нулю
        //PORTB=0x00;
        PORTD=0x00;

	  while (1) 
    {
		if(stepX>1&&stepX<3)
		{
			PORTB=0b00001000>>stepX;
			
		}
    }
}
          

я пошел другим путем. много чего прочел, немного разобрался. но... СМЕЩЕНИЯ НЕТ. на каждый импульс на INT0 на порту В единица должна смещаться.

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

21 час назад, Дмитрий Мамедиев сказал:

я пошел другим путем

Что это у Вас за стремные попытки (хоть бы они и закомментированы) дергать разрешения прерываний в обработчике? :crazy:

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

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

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

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

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

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

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

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

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

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

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

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

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