Attiny13 - мелочь и приятно
Attiny13 - производительный и энергоэффективный микроконтроллер Atmel,
Ранее уже была статья, с использование ШИМ в Atnega8.
Мне он достался в корпусе DIP. Цель использования для конкретной задачи - реализовать программный UART, так как аппаратный отсутствует.
Требуется создать дешевое расширение портов для маршрутизатора на OpenWRT через UART порт.
Исходные данные:
Среда программирования - Arduino IDE
Достойная библиотека MicroCore
https://github.com/MCUdude/MicroCore
Ссылка для менеджера плат - https://mcudude.github.io/MicroCore/package_MCUdude_MicroCore_index.json
Программатор - USBasp ( ID 16c0:05dc Van Ooijen Technische Informatica shared ID for use with libusb )
Подключение Attiny13 к USBasp:
Простой скетч для дрыга PB3,PB4:
void setup() {
// put your setup code here, to run once:
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
digitalWrite(3, HIGH); // turn the LED on (HIGH is the voltage level)
digitalWrite(4, HIGH); // turn the LED on (HIGH is the voltage level)
delay(500); // wait for a second
digitalWrite(3, LOW); // turn the LED off by making the voltage LOW
digitalWrite(4, LOW); // turn the LED off by making the voltage LOW
delay(500);
}
Arduino IDE в Debian 11 с библиотекой MicroCore пишет в камень отлично. Но с другими вариантами, можно получить ошибку записи в порт, так как он не появляется, даже при создании файла /etc/udev/rules.d/10-usbasp.rules с содержимым:
SUBSYSTEM=="usb", ATTR{idVendor}=="16c0", ATTR{idProduct}=="05dc", GROUP="dialout", MODE="0666"
Поэтому Arduino IDE не может записать прошивку. Длч записи использован костыль в виде установленного avrdude.
Скетч > Экспорт бинарного файла.
Далее, после установки
apt install avrdude
Проверяем плату:
avrdude -c usbasp -p t13
Если плата отвечает, что-то типа
avrdude: AVR device initialized and ready to accept instructions
Reading | ################################################## | 100% 0.02s
Можно залить выгруженный из АрдуАйда HEX:
avrdude -p t13 -c usbasp -U flash:w:sketch_ino_attiny13a_1200000L.hex:i -P usb
Для общения с роутером отлично подойдет пример "Serial Exmamples / MenuDemo".
Выводы Attiny13:
PB0 - TX, PB1- RX (По умолчанию MicroCore, но можно поменять в файле core_settings.h)
PB3,PB4 - INPUT, PB5- OUTPUT.
На OpenWRT роутере надо отключить использование UART для отладки:
1.Добавить в /etc/sysctl.conf
kernel.printk = 0 4 1 7
2. Заремировать в /etc/inittab
#::askconsole:/bin/ash --login
Со стороны attiny13 незамысловатый код взаимодействия с програмным UART:
#include <EEPROM.h>
int input2state=0;
void setup()
{
// Check if there exist any OSCCAL value in EEPROM addr. 0
// If not, run the oscillator tuner sketch first
uint8_t cal = EEPROM.read(0);
if(cal < 0x7F)
OSCCAL = cal;
// Note that any baud rate specified is ignored on the ATtiny13. See header above.
// PB0 - TX, PB1- RX
Serial.begin();
pinMode(2, OUTPUT);
pinMode(3, INPUT_PULLUP);
pinMode(4, INPUT);
Serial.println("");
Serial.println("Started");
}
void loop()
{
// чтение UART
switch(Serial.read_blocking())
{
case '#':
switch(Serial.read_blocking())
{
case 'a':
switch(Serial.read_blocking())
{
case '1':
digitalWrite(2, HIGH);
break;
case '0':
digitalWrite(2, LOW);
break;
}
break;
}
break;
default:
Serial.print(F("#a"));
Serial.print(digitalRead(2));
Serial.print(F("#b"));
Serial.print(digitalRead(3));
Serial.print(F("#c"));
Serial.print(digitalRead(4));
Serial.println(F("#"));
break;
}
}
Отправив, например, #a1 на контроллер, получаем вывод #a1#b0#c1# в зависимости от состояния ног.
На стороне OpenWRT можно запустить скрипт опроса и анализа
killall cat
#stty -F /dev/ttyS0 sane
stty -F /dev/ttyS0 ispeed 115200 ospeed 115200 -ignpar cs8 -cstopb -echo
exec 3</dev/ttyS0
cat <&3 > /tmp/serial.dat &
PID=$!
echo "PID:$PID"
state_a="0"
while [ 2 -lt 3 ] ; do
if [ $state_a == 0 ]; then
state_a="1"
else
state_a="0"
fi
echo "#a$state_a" > /dev/ttyS0
sleep 1
resp=$(grep -h '[a-z0-9]' /tmp/serial.dat )
#cat /tmp/serial.dat)
if [[ "$resp" == *"#b0"* ]]; then
echo "b=0;"
fi
if [[ "$resp" == *"#b1"* ]]; then
echo "b=1;"
fi
echo "Status: $resp State_a: $state_a"
echo "" > /tmp/serial.dat
done
kill $PID
wait $PID 2>/dev/null
exec 3<&-
Таким образом можно расширить количество GPIO маршрутизатора, если они не выведены.
Lisolog @ 2022