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. Проблема не в прерывании. По крайней мере, пока

, 👍0

Обсуждение

Вы упомянули SPI и ADC — причем здесь последовательный порт?, @Nick Gammon

DFPlayer использует Serial. Я не уверен, при чем здесь SPI. Возможно, автор не понимает, что такое SPI., @Delta_G

Вы получаете данные **от** dfplayer или отправляете данные **на** его? Если вы отправляете его игроку, я не вижу, где нужны прерывания., @Nick Gammon

@NickGammon Я обновил свой пост, чтобы ответить на твой вопрос. Спасибо, @boop

@Delta_G Я обновил свой пост, чтобы прояснить ситуацию. Спасибо, @boop

SoftwareSerial берет на себя все векторы прерываний PCINT. Вот и все прерывания по смене контактов. Ваш код сна также хочет использовать один из этих векторов прерываний, вероятно, в качестве сигнала пробуждения. Ответом будет либо модификация SoftwareSerial, чтобы использовать только один вектор, необходимый в вашем конкретном случае, либо поиск другой библиотеки мягких последовательных интерфейсов, которая не будет использовать их все. Я не знаю, какая библиотека подойдет под этот счет, поэтому я просто оставлю комментарий, а не ответ. Возможно, если кто-то знает подходящую библиотеку, он сможет ответить., @Delta_G


2 ответа


Лучший ответ:

0

Благодаря @Delta_G мне удалось найти решение.

Я взял исходные файлы библиотеки SoftwareSerial с github и скопировал это в мой проект. Я переименовал его, чтобы не было конфликтов. Затем я продолжил комментировать прерывания в файле cpp и позаботился о вызове handle_interrupt из моей программы. Мне также пришлось удалить ключевое слово inline из функции handle_interrupt

.

Я разместил свои измененные файлы на github.

,

0

boot/wakeup // <-- здесь мне нужно прерывание, не так ли?

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

Если вы соедините свои кнопки с резисторами таким образом, чтобы любая кнопка вообще посылала напряжение не менее 0,6 В постоянного тока (т. е. 3 В вверх для системы 5 В), тогда это можно настроить для генерации прерывания (нарастающего прерывания). Таким образом, вы можете настроить резисторы так, чтобы кнопки посылали напряжение 3,2 В, 3,5 В, 3,8 В, 4,1 В, 4,4 В и 4,7 В. Это дает вам шесть различных напряжений, и все они достаточно высоки, чтобы считаться «высокими». на цифровом выводе. Затем заставьте этот вывод генерировать прерывание, а также считывать его с АЦП, как только вы проснетесь.

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

,