DrobyshevAlex Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 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 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 А нет ли библиотеки как в ардуино. Button state= digitalRead(pinc5)If (button state==1){...} 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
DrobyshevAlex Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 25 минут назад, Дмитрий Мамедиев сказал: они как библиотеки? ну вот у вас написано например include <avr/io.h> э там определена куча макросов, PINС, PINC7, DDRB, INT0, и еще куча всего 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Дмитрий Мамедиев Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 Вот читаю книгу... ничего не понимаю. А вы обьясняете, все ясно и просто как то. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 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 } Вообщем особо по ардуино не подскажу) Не работал) 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 Почитайте вообще отдельно с++, и ООП. Вы можете использовать перечисления 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? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 Начитался я тут. В общем мне нужно работать не просто с кнопкой, а с входящим сигналом и считать его приплюсовывая. Это делают входы int0 и int1, но вот мне нужен если еще и int2 но на атмеге 8 его нет. Это можно програмно обмануть или лучше (тем более в моем случае) взять другой контроллер? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 (изменено) Можно взять прерывание с порта(PCINTxx), разрешить его для одного пина. Но там нет настройки срабатывания на фронт или спад, прерывание будет реагировать на оба перепада и их как-то надо отличать или поделить на двое подсчет. Изменено 23 декабря, 2018 пользователем Alexeyslav 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Berg Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 40 минут назад, Alexeyslav сказал: Можно взять прерывание с порта(PCINTxx) в mega8 PCINTхх нету, зато есть еще компаратор 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 23 декабря, 2018 Поделиться Опубликовано 23 декабря, 2018 Как это нет группового прерывания по изменению состояния пинов порта? Ох ты ж... и правда нету, тогда точно стоит поменять её на MEGA48 или 88. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 Или Atmega328p, чтобы схему не переделывать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 (изменено) Я как раз задался тем же вопросом в соседней теме, как мне атмегой8 отловить прерывания от двух сенсоров и от одного nrf24. Думал сделать просто, два сенсора завести на два любых пина, а потом оба через диоды завести на INT0. Как только будет прерывания на инт 0, я буду смотреть на двух пинах состояние, что бы понять от какого сработало или от двух сразу. Но мне не нужна точность подсчета. 12 часа назад, Дмитрий Мамедиев сказал: и считать его приплюсовывая Разве это не делают счетчики, которые можно тактировать от внешнего сигнала на ножках Т0 и Т1 у атмеги8? Изменено 24 декабря, 2018 пользователем DrobyshevAlex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 Разве это не делают счетчики, которые можно тактировать от внешнего сигнала на ножках Т0 и Т1 у атмеги8?Да но мне их нужно три. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 10 минут назад, Дмитрий Мамедиев сказал: Да но мне их нужно три. ТО есть, если я правильно понимаю, T0, T1, INT0, INT1 - как минимум 4 входа, которые позволят посчитать 4 числа, просто в случае с T0 макс число будет 255, да и настроек там вроде бы нет у таймера 0, только по 255 считать. А вот Т1 можно настроить прерывания на совпадение с единицей, и считать каждый такт в отдельную переменную, так же считать еще по INT0 и INT1. И того 3 счетчика. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 Тааааак. Ну я то начинающий. Пошел учить. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 (изменено) 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, если нужно подсчитывать каждый такт, и в прерывании сброса при совпадении считать в свою переменную. Изменено 24 декабря, 2018 пользователем DrobyshevAlex 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 24 декабря, 2018 Поделиться Опубликовано 24 декабря, 2018 Это я уже прочитал. Спасибо. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 25 декабря, 2018 Поделиться Опубликовано 25 декабря, 2018 Чето не могу я с этими таймерами разобраться. Для т0 чтоб считал внешние импульсы, какие регистры нужно настраивать? TCCR0= ((1 какие еще? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 25 декабря, 2018 Поделиться Опубликовано 25 декабря, 2018 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(); // разрешить прерывания 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 25 декабря, 2018 Поделиться Опубликовано 25 декабря, 2018 Я не понимаю. Короче на него будут подаваться импульсы непрерывно, но на выходе мк нужно получить управление шд00001000010000100001Т.е. счет как бы до четырехЯ так понимаю в функции isr{step++}while{portd= 0b00000001На каждый импульс step нужно плюсавать но только до четырех и начинать сначала. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
КЭС Опубликовано 25 декабря, 2018 Поделиться Опубликовано 25 декабря, 2018 Есть же операции по-битового сдвига. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 25 декабря, 2018 Поделиться Опубликовано 25 декабря, 2018 Вот если б Вы написали задачу просто было бы проще) Счет нужен? Или просто пришел импульс на ножку мк - нужно выдать на другую ножку? То есть каждый входящий импульс сдвигать 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; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DrobyshevAlex Опубликовано 27 декабря, 2018 Поделиться Опубликовано 27 декабря, 2018 В 24.12.2018 в 09:54, DrobyshevAlex сказал: Думал сделать просто, два сенсора завести на два любых пина, а потом оба через диоды завести на INT0. Как только будет прерывания на инт 0, я буду смотреть на двух пинах состояние, что бы понять от какого сработало или от двух сразу. Да, так сработало, таким образом можно больше внешних прерываний повесить на мк. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 29 декабря, 2018 Поделиться Опубликовано 29 декабря, 2018 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 на порту В единица должна смещаться. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 30 декабря, 2018 Поделиться Опубликовано 30 декабря, 2018 21 час назад, Дмитрий Мамедиев сказал: я пошел другим путем Что это у Вас за стремные попытки (хоть бы они и закомментированы) дергать разрешения прерываний в обработчике? 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.