ATtiny85 со сном и последовательным портом
Я хочу подключиться по последовательному порту к другому устройству (dfplayer), а также перевести микроконтроллер в спящий режим.
У ATtiny85 нет аппаратного последовательного порта, поэтому мне нужно использовать виртуальный последовательный порт (например, SoftwareSerial.h
)
Я много гуглил и пробовал много чего, но, по сути, всегда сталкиваюсь с одной и той же проблемой. SoftwareSerial
(или NeoSWSerial
) не работает с avr/sleep
. Что-то связанное с прерываниями,
NeoSWSerial.cpp.o (символ из плагина): В функции
NeoSWSerial::read()': (.text+0x0): множественное определение
__vector_2' .pio\build\attiny85\src\main.cpp.o (символ из плагина):(.text+0x0): впервые определено здесь
AltSoftSerial не будет работать, поскольку для него требуется 16-битный таймер, которого нет у ATtiny__
Могу ли я что-нибудь с этим поделать?
Чем я на самом деле хочу заниматься
Подключите 6 кнопок с 6 разными резисторами к одному выводу АЦП контроллера. При нажатии кнопки выводит устройство из режима сна (при необходимости), считывает значение ADC, выбирает трек на основе этого значения и затем воспроизводит его в dfplayer.
Через некоторое время, если ни одна кнопка не будет нажата, переведите dfplayer и mcu в спящий режим. И именно поэтому мне вообще нужен mcu. Вы не можете перевести dfplayer в спящий режим или разбудить его без последовательного порта
Обновление:
Я действительно перепутал SPI и Serial. Мне нужно использовать последовательную связь
Я хочу отправлять и получать посылки. Отправить: InitCommand
, получить: PlayerInitialized
/ InitializationFailed
. И так далее. Ну, это, конечно, шестнадцатеричные коды, но я думаю, вы поняли
Моя последовательность действий должна выглядеть примерно так:
boot/wakeup // <-- здесь мне нужно прерывание, не так ли?
прочитать значение adc
выбрать номер трека на основе значения adc
отправить команду PlayTrack в DFPlayer
задержка x мс
отправить команду сна в DFPlayer
иди спать
Но проблема в сочетании библиотеки Sleep и SoftwareSerial. Проблема не в прерывании. По крайней мере, пока
@boop, 👍0
Обсуждение2 ответа
Лучший ответ:
Благодаря @Delta_G мне удалось найти решение.
Я взял исходные файлы библиотеки SoftwareSerial с github и скопировал это в мой проект. Я переименовал его, чтобы не было конфликтов. Затем я продолжил комментировать прерывания в файле cpp и позаботился о вызове handle_interrupt
из моей программы. Мне также пришлось удалить ключевое слово inline из функции handle_interrupt
Я разместил свои измененные файлы на github.
boot/wakeup // <-- здесь мне нужно прерывание, не так ли?
Прерывание определяет, что вы нажали одну из кнопок? Если он у вас есть, вам не нужно использовать таймер для пробуждения.
Если вы соедините свои кнопки с резисторами таким образом, чтобы любая кнопка вообще посылала напряжение не менее 0,6 В постоянного тока (т. е. 3 В вверх для системы 5 В), тогда это можно настроить для генерации прерывания (нарастающего прерывания). Таким образом, вы можете настроить резисторы так, чтобы кнопки посылали напряжение 3,2 В, 3,5 В, 3,8 В, 4,1 В, 4,4 В и 4,7 В. Это дает вам шесть различных напряжений, и все они достаточно высоки, чтобы считаться «высокими». на цифровом выводе. Затем заставьте этот вывод генерировать прерывание, а также считывать его с АЦП, как только вы проснетесь.
Затем можно перевести процессор в глубокий сон до нажатия кнопки. Во время воспроизведения трека вы также можете настроить прерывание сторожевого таймера, чтобы вы могли проснуться и проверить, не пора ли усыпить плеер.
- attiny85 сбрасывает себя вместо процедуры пробуждения
- Связь AtTiny44 и AtTiny 85
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Как перевести ATtiny/ATmega в режим глубокого сна (чтобы годами работать от батарей), но при этом обнаруживать нажатие кнопки?
- PCINT0, PCINT1, PCINT2 и т. д. на ATtiny45/85
- Как назначить прерывание на нажатие кнопки с помощью ATtiny? (прерывание не срабатывает с моим кодом)
- Программирование сервопривода на ATtiny85
- Digispark ATtiny 85 - не распознается как HID устройство
Вы упомянули SPI и ADC — причем здесь последовательный порт?, @Nick Gammon
DFPlayer использует Serial. Я не уверен, при чем здесь SPI. Возможно, автор не понимает, что такое SPI., @Delta_G
Вы получаете данные **от** dfplayer или отправляете данные **на** его? Если вы отправляете его игроку, я не вижу, где нужны прерывания., @Nick Gammon
@NickGammon Я обновил свой пост, чтобы ответить на твой вопрос. Спасибо, @boop
@Delta_G Я обновил свой пост, чтобы прояснить ситуацию. Спасибо, @boop
SoftwareSerial берет на себя все векторы прерываний PCINT. Вот и все прерывания по смене контактов. Ваш код сна также хочет использовать один из этих векторов прерываний, вероятно, в качестве сигнала пробуждения. Ответом будет либо модификация SoftwareSerial, чтобы использовать только один вектор, необходимый в вашем конкретном случае, либо поиск другой библиотеки мягких последовательных интерфейсов, которая не будет использовать их все. Я не знаю, какая библиотека подойдет под этот счет, поэтому я просто оставлю комментарий, а не ответ. Возможно, если кто-то знает подходящую библиотеку, он сможет ответить., @Delta_G