atmega16 в ардуино
atmega16 в ардуино
здравствуйте, я переделал ардуино уно на атмега 16 написал угломер по энкодеру и в коде генерируется импульс после полного оборота, может есть у кого код преобразования импульса из переменной в количество оборотов? типа тахометра и вывод на дисплей 16х2
}
else // Вращение шпинделя влево
{
Spindle_Direction = Spindle_Direction_CCW;
Enc_Pos--;
if (Enc_Pos < 0) // полный оборот
{
Enc_Pos = Enc_Line - 1;
TahoSetPulse(); // при проходе 0 генерим сигнал Taho
if (Mode_On_flag == true) // проверка режима на ON/OFF, только! после прохода 0 разрешаем счет до к.деления
{
Step_On_flag = true;
}
}
}
}
else // Вращение шпинделя влево
{
Spindle_Direction = Spindle_Direction_CCW;
Enc_Pos--;
if (Enc_Pos < 0) // полный оборот
{
Enc_Pos = Enc_Line - 1;
TahoSetPulse(); // при проходе 0 генерим сигнал Taho
if (Mode_On_flag == true) // проверка режима на ON/OFF, только! после прохода 0 разрешаем счет до к.деления
{
Step_On_flag = true;
}
}
}
- Реклама
Re: atmega16 в ардуино
А сосчитать число импульсов за 1 секунду уже ну никак?
Re: atmega16 в ардуино
Частотомер / периодомер...
Только вот мега 16 это уже не нанка в принципе - надо ставить платформу MightyCore и соответственно раскладку выводов делать.

Только вот мега 16 это уже не нанка в принципе - надо ставить платформу MightyCore и соответственно раскладку выводов делать.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: atmega16 в ардуино
Странный вопрос: коль энкодер, так, значит квадратурный - так? Коль квадратурный, то подключен к таймеру - так? Коль к таймеру подключен, то что мешает связать с ним другой таймер по достижению нужного количества отсчетов и считать обороты чисто аппаратно? Ну, а ежели аврка так не умеет, можно в прерывании того самого таймера счетчик инкрементировать/декрементировать (только нужно иметь флаг, в какую сторону переполнение произошло).
Re: atmega16 в ардуино
я переделал на атмегу 8535 , скетч переписал на нее и привел код в рабочее состояние, дальше будет развитие на управление шаговым мотором в зависимости от числа оборотов, угол по энкодеру уже считает данный скетч, у энкодера три канала выхода ABZ , Z канал это один импульс на оборот , на меге 8535 есть INT2 я когда прописываю третье прерывание по внешнему признаку, только когда я подключаю к нему импульсы то все остальные прерывания не работают, attachInterrupt(2, fan_interrupt, FALLING); эта команда с атмегой 8535 не работает, может у кого есть код как включить все три прерывания?
- Реклама
Re: atmega16 в ардуино
Вообще-то D2 это INT0...
Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
attachInterrupt(interrupt, ISR, mode); (not recommended)
attachInterrupt(pin, ISR, mode) ; (not recommended Arduino Due, Zero only)
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...

Syntax
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode); (recommended)
attachInterrupt(interrupt, ISR, mode); (not recommended)
attachInterrupt(pin, ISR, mode) ; (not recommended Arduino Due, Zero only)
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega16 в ардуино
3 прерывания ATmega8535 работают. Попробовал с 3-мя действиями со светодиодами.
Код: Выделить всё
attachInterrupt(0, fan_interrupt_0, FALLING);
attachInterrupt(1, fan_interrupt_1, FALLING);
attachInterrupt(2, fan_interrupt_2, FALLING);- Вложения
-
- 3_int.jpg
- (180.62 КБ) 82 скачивания
Re: atmega16 в ардуино
а как в скетче прописывал? можешь скинуть ?
Добавлено after 58 seconds:
у меня при включении третьего прерывания все гаснет и виснет,
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...
а как прописать чтобы третье прерывание заработало?
Добавлено after 58 seconds:
у меня при включении третьего прерывания все гаснет и виснет,
для "стандартного" референса INT2 недоступно, там надо таки много покопаться и в дебрях IDE и в описании платформы MightyCore (с учетом вариантов раскладки выводов - их там аж три имеется - стандартный, sanguino и bobuino)...
а как прописать чтобы третье прерывание заработало?
Re: atmega16 в ардуино
На схеме со светиками раскладка кристалла...НО...
имена прерываний "по ардуиновски" будут отличаться
для bobuino int0 - D2
int1 - D3
int2 - D6
или для "стандарт" int0 - D10
int1 - D11
int2 - D2
то же и для "sanguino" (там другие выводы меняются) int0 - D10
int1 - D11
int2 - D2
конкретика какая платформа выбрана (и соответственно загрузчик и фузы) надо выставить в соответствующих вкладках IDE - компилятор будет вести обработку имен выводов согласно выбранной платформы (строка pinout)

Последние данные лучше посмотреть на сайте:
https://github.com/MCUdude
https://github.com/MCUdude/MightyCore

имена прерываний "по ардуиновски" будут отличаться
для bobuino int0 - D2
int1 - D3
int2 - D6
или для "стандарт" int0 - D10
int1 - D11
int2 - D2
то же и для "sanguino" (там другие выводы меняются) int0 - D10
int1 - D11
int2 - D2
конкретика какая платформа выбрана (и соответственно загрузчик и фузы) надо выставить в соответствующих вкладках IDE - компилятор будет вести обработку имен выводов согласно выбранной платформы (строка pinout)
Последние данные лучше посмотреть на сайте:
https://github.com/MCUdude
https://github.com/MCUdude/MightyCore
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega16 в ардуино
MightyCore -> ATmega8535, Internal Clock 8 MHz
Соотв. прерывание поднимает соотв. флаг.
Файл Proteus (v8.13) внутри.
Соотв. прерывание поднимает соотв. флаг.
Файл Proteus (v8.13) внутри.
Спойлер
Код: Выделить всё
bool ch_0 = false;
bool st_0 = false;
bool ch_1 = false;
bool st_1 = false;
bool ch_2 = false;
bool st_2 = false;
void setup() {
pinMode(PIN_A0, OUTPUT);
pinMode(PIN_A1, OUTPUT);
pinMode(PIN_A2, OUTPUT);
attachInterrupt(0, fan_interrupt_0, FALLING);
attachInterrupt(1, fan_interrupt_1, FALLING);
attachInterrupt(2, fan_interrupt_2, FALLING);
}
void loop() {
if (ch_0) {
digitalWrite(PIN_A0, st_0);
ch_0 = false;
}
if (ch_1) {
digitalWrite(PIN_A1, st_1);
ch_1 = false;
}
if (ch_2) {
digitalWrite(PIN_A2, st_2);
ch_2 = false;
}
}
void fan_interrupt_0() {
ch_0 = true;
st_0 ^= 1;
}
void fan_interrupt_1() {
ch_1 = true;
st_1 ^= 1;
}
void fan_interrupt_2() {
ch_2 = true;
st_2 ^= 1;
}- Вложения
-
- sketch_nov12b.zip
- (32.75 КБ) 85 скачиваний
Последний раз редактировалось veso74 Сб ноя 12, 2022 13:47:26, всего редактировалось 1 раз.
Re: atmega16 в ардуино
вторую ссылку пробовал пишет что эта библиотека атмегой не поддерживается
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega16 в ардуино
Arduino IDE какая версия установлено?
Устанавливается нормально. Win7 64 bit, Arduino IDE v1.8.19
Устанавливается нормально. Win7 64 bit, Arduino IDE v1.8.19
- Вложения
-
- ard.jpg
- (122.74 КБ) 77 скачиваний
Re: atmega16 в ардуино
1.8.19 32 бит
Re: atmega16 в ардуино
Это прожка под использование PCINT, а не набора INT0-INT2, что также требует некоторой "алхимии" с установкой библиотек.
Исходно у vik vik взяты за основу "стандартные" прерывания платформ для IDE.

Исходно у vik vik взяты за основу "стандартные" прерывания платформ для IDE.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega16 в ардуино
Просто скачайте архива библиотеки и распаковайте архив в MyDoc/Arduino/hardware
(убрать ...-master с имя папки)
(убрать ...-master с имя папки)
- Вложения
-
- Untitled-2.jpg
- (73.75 КБ) 125 скачиваний
Re: atmega16 в ардуино
Ошибка компиляции для платы ATmega8535.
вот такую хрень выдал
вот такую хрень выдал
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega1Сфотографируйте настройки выбранного микро6 в ард
Сделайте скрийншот настройки выбранного микроконтроллера в Arduino IDE.
Re: atmega16 в ардуино
выбран стандарт , а под какой вариант эта библиотека?
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1916
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: atmega16 в ардуино
Не понял вопрос о вариантах?
---
[uquote="BOB51",url="/forum/viewtopic.php?p=4318856#p4318856"]Это прожка под использование PCINT, а не набора INT0-INT2...[/uquote]
Нет. Посм. файл WInterrupts.c.
---
[uquote="BOB51",url="/forum/viewtopic.php?p=4318856#p4318856"]Это прожка под использование PCINT, а не набора INT0-INT2...[/uquote]
Нет. Посм. файл WInterrupts.c.
Спойлер
Код: Выделить всё
// ATmega8, ATmega8515, ATmega8535, ATmega16, ATmega32, ATmega162
#elif defined(__AVR_ATmega8__) || defined(__AVR_ATmega8515__) || defined(__AVR_ATmega8535__) \
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__) || defined(__AVR_ATmega162__)
case 0:
MCUCR = (MCUCR & ~((1 << ISC00) | (1 << ISC01))) | (mode << ISC00);
GICR |= (1 << INT0);
break;
case 1:
MCUCR = (MCUCR & ~((1 << ISC10) | (1 << ISC11))) | (mode << ISC10);
GICR |= (1 << INT1);
break;
case 2:
#if defined(INT2)
#if defined(EMCUCR)
EMCUCR = (EMCUCR & ~((1 << ISC2))) | ((mode & 0x01) << ISC2); // ATmega8515/162
#else
MCUCSR = (MCUCSR & ~((1 << ISC2))) | ((mode & 0x01) << ISC2); // ATmega8535/16/32
#endif
GICR |= (1 << INT2);
#endif
break;

