На родной Arduino от чипа ATmega2560 разведены не все выводы (в частности, интересуют ноги 29, 47-48 - мне удобны в плане трассировки для своей платы). Можно ли (и каким образом) их задействовать в Arduino IDE? Upd: Вот схема чипа и таблица текущей распиновки для родной Arduino: https://www.arduino.cc/en/Hacking/PinMapping2560 Файл конфигурации пинов найден в /usr/share/arduino/hardware/arduino/variants/mega/pins_arduino.h А дальше - темный лес битовых операций Как мне объявить ногу 29 --> пином 70, ноги 47-49 --> пинами 71-73?
Тут более интересна сама схема - 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, так как требуют входа/выхода. Не очень понимаю, что Вы хотите, можете объяснить на пальцах?
я их выведу на своей самодельной плате (не шилде и не на родной плате 2560). Вопрос в том, как их задействовать так, чтобы они были видны в IDE как цифровые пины 70-73, т.е. чтобы их можно было использовать в коде также как и остальные: digitalWrite(70, HIGH). Мне достаточно только режима digitalWrite, но если получится и digitalRead - пусть будет, авось пригодится.
Теперь понятно. Открываем файл - 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. Сейчас нет времени, если не разберетесь, вечером помогу более конкретнее.
И так, код, сделал только для 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); }
Не за что, Вы мне помогли куда больше, порой прямо, иногда косвенно отвечая на вопросы других, так еще должен. Код проверял, в регистры все записывается корректно, проблем не должно быть, но если буду пишите.