Помогите разобраться с ATtiny84

Тема в разделе "Микроконтроллеры AVR", создана пользователем Mozg00FF, 5 окт 2014.

  1. Mozg00FF

    Mozg00FF Нерд

    Добрый день,

    купил микроконтроллер ATtiny84, стал пробовать прошить его через arduino uno - проблем не было (делал всё по инструкции), прошивка нормально заливается, а вот в плане функциональности что-то у меня не клеится.

    1) Как бы не пытался обращаться к пинам - всегда попадаю видимо на digital пины, т.е. PA1 или просто 1 приводит на 3ю ногу, PA2 (2) приводит на 5ую ногу и т.д. Варианты A1-A7 вообще не работают. По названиям PB1 и PB2 можно попасть всё на те же 1 и 2 цифровые пины.
    2) На 2ой и 11ой ногах вообще никакой реакции нет.
    3) Не получается сделать чтение с пина:

    Код (Text):
    // Номер пина для светодиода
    #define ledPin 3

    // Номер аналогового пина
    #define analogPin 7

    // В эту переменную считываем значение с аналогового входа
    int val = 0;      

    void setup()
    {
      // Настраиваем пин светодиода на выход
      pinMode(ledPin, OUTPUT);
      // set pin as input
      pinMode(analogPin, INPUT);
    }

    void loop()
    {
      // Считываем значение
      val = analogRead(analogPin);
      // val содержит значение из диапазона 0..1023, а диапазон значений для analogWrite
      // 0..255. Для этого делим val на 4
      analogWrite(ledPin, val / 4);
    }
     
    Собственно помогите, пожалуйста, разобраться что же тут не так и как всё таки читать с аналоговых пинов?
     
  2. geher

    geher Гуру

    Насколько я понимаю, PBх и PАх относятся к регистрам B и A соответственно.
    А константы предназначены для маскирования соответствующих битов в соответствующем регистре.
    PORTA |= _BV(PA1); //PA1=HIGH
    PORTA &= ~_BV(PA2); //PA2=LOW

    Насчет нумерации пинов для digitalWrite.
    Если рассматривать реализацию digital_pin_to_bit_mask_PGM и digital_pin_to_port_PGM для Tiny84, то, скорее всего, она идет так:
    0 - B0
    1 - B1
    2 - B2
    3 - A7
    4 - A6
    5 - A5
    6 - A4
    7 - A3
    8 - A2
    9 - A1
    10 - A0
    Еще есть набор констант вида
    PIN_Ax
    PIN_Bx
    из которых следует, что еще есть B3, который есть пин 11, но он RESET, потому трогать его не надо.
    Распиновка же Tiny84 по пинам PBx и PAx вроде такая:
    Код (Text):
    //                
    //                    1|    |14
    //              PB0  2|    |13
    //              PB1  3|    |12  PA1
    //              PB3  4|    |11  PA2
    //              PB2  5|    |10  PA3
    //              PA7  6|    |9  PA4
    //              PA6  7|    |8  PA5  
    Нумерация аналоговых пинов для analogRead вроде должна быть такой
    Начиная с номера, следующего за последним цифровым (PB3), т.е. 11+1
    Т.е A0 - 12, A1 - 13, A2 - 14, и т.д. до A7 - 19
     
    Последнее редактирование: 5 окт 2014
    Mozg00FF нравится это.
  3. Mozg00FF

    Mozg00FF Нерд

    Спасибо, разобрался.

    В итоге, если соотносить с:
    Код (Text):
    // ATMEL ATTINY84 / ARDUINO
    //
    //                           +-\/-+
    //                     VCC  1|    |14  GND
    //             (D  0)  PB0  2|    |13  AREF (D 10)
    //             (D  1)  PB1  3|    |12  PA1  (D  9)
    //                     PB3  4|    |11  PA2  (D  8)
    //  PWM  INT0  (D  2)  PB2  5|    |10  PA3  (D  7)
    //  PWM        (D  3)  PA7  6|    |9  PA4  (D  6)
    //  PWM        (D  4)  PA6  7|    |8  PA5  (D  5)        PWM
    //                          +----+
    то получается что:
    цифры 0 - 10 соответствуют D0 - D10
    константы PIN_A1-PIN_A7 соответствуют PA1-PA7, для порта B - аналогично
    для analogRead - как вы и написали соответствие PA0 (AREF) - 12, PA1 - 13, PA2 - 14, и т.д. до PA7 - 19

    Единственное - это нормально, что если к пину вообще ничего не подключено, то analogRead читает это значение как 1024 видимо (диод ярко светится), но как только подключаю потенциометр, который даёт по идее тот же ноль - диод гаснет и работает уже нормально?

    Так же, можно как-то вылечить шим на PA6 и PA5? На них шим достаточно низкий, из-за чего моргание диода хорошо различимо глазом и сильно раздражает.