Задействовать неразведенные пины ATmega2560

Тема в разделе "Микроконтроллеры AVR", создана пользователем Tomasina, 27 июн 2016.

  1. Tomasina

    Tomasina Сушитель лампочек Модератор

    На родной Arduino от чипа ATmega2560 разведены не все выводы (в частности, интересуют ноги 29, 47-48 - мне удобны в плане трассировки для своей платы).
    Можно ли (и каким образом) их задействовать в Arduino IDE?

    Upd: Вот схема чипа и таблица текущей распиновки для родной Arduino: https://www.arduino.cc/en/Hacking/PinMapping2560
    [​IMG]

    Файл конфигурации пинов найден в /usr/share/arduino/hardware/arduino/variants/mega/pins_arduino.h

    А дальше - темный лес битовых операций :(

    Как мне объявить ногу 29 --> пином 70, ноги 47-49 --> пинами 71-73?
     
    Последнее редактирование: 27 июн 2016
  2. Alex19

    Alex19 Гуру

    Тут более интересна сама схема - https://www.arduino.cc/en/uploads/Main/arduino-mega2560_R3-sch.pdf. Сами выходы не выведены 29 (PG4), 47-48 (PD4, PD5).

    Все, что Вы можете сделать без пайки, это сохранить значения в регистры порта, которые будут работать как переменная.
    Код (C++):
    PORTD |= (1 << PD5);
    Так же не доступны ICP1, XCK1, TOSC1, так как требуют входа/выхода.

    Не очень понимаю, что Вы хотите, можете объяснить на пальцах?
     
  3. Tomasina

    Tomasina Сушитель лампочек Модератор

    я их выведу на своей самодельной плате (не шилде и не на родной плате 2560). Вопрос в том, как их задействовать так, чтобы они были видны в IDE как цифровые пины 70-73, т.е. чтобы их можно было использовать в коде также как и остальные: digitalWrite(70, HIGH).
    Мне достаточно только режима digitalWrite, но если получится и digitalRead - пусть будет, авось пригодится.
     
  4. Alex19

    Alex19 Гуру

    Теперь понятно.

    Открываем файл - https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/cores/arduino/wiring_digital.c. Смотрим реализацию digitalWrite, ищем:
    Код (C++):
    uint8_t timer = digitalPinToTimer(pin);
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    out = portOutputRegister(port);
    Они тут - https://github.com/arduino/Arduino/.../hardware/arduino/avr/cores/arduino/Arduino.h.

    Описание самих портов, тут - https://github.com/arduino/Arduino/blob/master/hardware/arduino/avr/variants/mega/pins_arduino.h. Добавляем в соответствующие массивы port_to_mode_PGM, port_to_output_PGM и т.д. Да не забываем про NUM_DIGITAL_PINS.

    Сейчас нет времени, если не разберетесь, вечером помогу более конкретнее.
     
  5. Alex19

    Alex19 Гуру

    И так, код, сделал только для 29 пина, для остальных аналогично.

    Меняем в файле E:\Arduino\Software\Arduino\Arduino 1.6.5-r5\hardware\arduino\avr\variants\mega\pins_arduino.h, блоки.

    Код.
    Код (C++):
    #define NUM_DIGITAL_PINS            70
    На или на 73, для 3 пинов.
    Код (C++):
    #define NUM_DIGITAL_PINS            71
    В массиве.
    Код (C++):
    const uint8_t PROGMEM digital_pin_to_port_PGM[]
    Добавляем пункты.
    Код (C++):
    PK    , // PK 7 ** 69 ** A15
    PG    , // PG 4 ** 29 on AVR    
    Вам соответственно, еще 2 пункта PD и PD.

    В массиве.
    Код (C++):
    const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]
    Добавляем пункты.
    Код (C++):
        _BV( 7 )    , // PK 7 ** 69 ** A15
        _BV( 4 )    , // 29 on AVR    
    Вам соответственно, еще 2 пункта _BV( 4 ) и _BV( 5 ).

    В массиве.
    Код (C++):
    const uint8_t PROGMEM digital_pin_to_timer_PGM[]
    Добавляем пункты.
    Код (C++):
        NOT_ON_TIMER    , // PK 7 ** 69 ** A15  
        NOT_ON_TIMER    , // 29 on AVR
    Вам соответственно, еще 2 пункта NOT_ON_TIMER и NOT_ON_TIMER.

    Что будет работать, pinMode, digitalWrite, digitalRead и что основано на них. Что не будет - PCINT, надо разбираться в pdf на контролер и вносить дополнения в digitalPinToPCICR, digitalPinToPCICRbit и т.д.

    Код для проверки.
    Код (C++):
    void setup() {
      // put your setup code here, to run once:
      pinMode(70, OUTPUT);
      Serial.begin(115200);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      digitalWrite(70, 1);
      Serial.print("PING - ");
      Serial.println(PING, BIN);
      Serial.print("70 pin - ");
      Serial.println(digitalRead(70));
      delay(1000);
      digitalWrite(70, 0);
      Serial.print("PING - ");
      Serial.println(PING, BIN);
      Serial.print("70 pin - ");
      Serial.println(digitalRead(70));
      delay(1000);
    }
     
    DIYMan, ZAZ-965 и Tomasina нравится это.
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    спасибо за отклик. Проверить пока не могу - плата еще не готова.
     
  7. Alex19

    Alex19 Гуру

    Не за что, Вы мне помогли куда больше, порой прямо, иногда косвенно отвечая на вопросы других, так еще должен;).

    Код проверял, в регистры все записывается корректно, проблем не должно быть, но если буду пишите.
     
    Последнее редактирование: 28 июн 2016
    Jevega и Tomasina нравится это.
  8. fusic

    fusic Нуб

    ...а если так digitalWrite(PD4, LOW) и не исправлять библиотеки ?