Menu
Attiny13 - мелочь и приятно

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