Mega 2560 + Atmel Studio 7 = странное

Тема в разделе "Arduino & Shields", создана пользователем Anika, 11 мар 2017.

  1. Anika

    Anika Нуб

    Приобрел Mega 2560 r3, при подключении к Arduino IDE выяснилось, что 16u2 не работает. Перешивал 16u2 - не помогло.
    Решил - "пофиг - пляшем" подцепил по JTAG к Atmel Studio 7.

    Программка элементарнейшая:
    Код (C++):
    void setup() {              
      // Инициализируем цифровой вход/выход в режиме выхода.
      pinMode(1, OUTPUT);
      pinMode(2, OUTPUT);
      pinMode(3, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(7, OUTPUT);
      pinMode(8, OUTPUT);
      pinMode(9, OUTPUT);
      pinMode(10, OUTPUT);
      pinMode(11, OUTPUT);
      pinMode(12, OUTPUT);
      pinMode(13, OUTPUT);
      pinMode(14, OUTPUT);
      pinMode(15, OUTPUT);
      pinMode(16, OUTPUT);  
      pinMode(17, OUTPUT);
      pinMode(18, OUTPUT);
      pinMode(19, OUTPUT);
      pinMode(20, OUTPUT);
      pinMode(21, OUTPUT);
      pinMode(22, OUTPUT);
      pinMode(23, OUTPUT);
      pinMode(24, OUTPUT);
      pinMode(25, OUTPUT);
      pinMode(26, OUTPUT);
      pinMode(27, OUTPUT);
      pinMode(28, OUTPUT);
      pinMode(29, OUTPUT);
      pinMode(30, OUTPUT);
      pinMode(31, OUTPUT);
      pinMode(32, OUTPUT);
      pinMode(33, OUTPUT);
      pinMode(34, OUTPUT);
      pinMode(35, OUTPUT);
      pinMode(36, OUTPUT);
      pinMode(37, OUTPUT);
      pinMode(38, OUTPUT);
      pinMode(39, OUTPUT);
      pinMode(40, OUTPUT);
      pinMode(41, OUTPUT);
      pinMode(42, OUTPUT);
      pinMode(43, OUTPUT);
      pinMode(44, OUTPUT);
      pinMode(45, OUTPUT);
      pinMode(46, OUTPUT);
      pinMode(47, OUTPUT);
      pinMode(48, OUTPUT);  
      pinMode(49, OUTPUT);
      pinMode(50, OUTPUT);
      pinMode(51, OUTPUT);
      pinMode(52, OUTPUT);
      pinMode(53, OUTPUT);

    }
    void loop() {
      digitalWrite(1, HIGH);   // зажигаем светодиод
      digitalWrite(2, HIGH);   // зажигаем светодиод
      digitalWrite(3, HIGH);   // зажигаем светодиод
      digitalWrite(4, HIGH);   // зажигаем светодиод
      digitalWrite(5, HIGH);   // зажигаем светодиод
      digitalWrite(6, HIGH);   // зажигаем светодиод
      digitalWrite(7, HIGH);   // зажигаем светодиод
      digitalWrite(8, HIGH);   // зажигаем светодиод
      digitalWrite(9, HIGH);   // зажигаем светодиод
      digitalWrite(10, HIGH);   // зажигаем светодиод
      digitalWrite(11, HIGH);   // зажигаем светодиод
      digitalWrite(12, HIGH);   // зажигаем светодиод
      digitalWrite(13, HIGH);   // зажигаем светодиод
      digitalWrite(14, HIGH);   // зажигаем светодиод
      digitalWrite(15, HIGH);   // зажигаем светодиод
      digitalWrite(16, HIGH);   // зажигаем светодиод
      digitalWrite(17, HIGH);   // зажигаем светодиод
      digitalWrite(18, HIGH);   // зажигаем светодиод
      digitalWrite(19, HIGH);   // зажигаем светодиод
      digitalWrite(20, HIGH);   // зажигаем светодиод
      digitalWrite(21, HIGH);   // зажигаем светодиод
      digitalWrite(22, HIGH);   // зажигаем светодиод
      digitalWrite(23, HIGH);   // зажигаем светодиод
      digitalWrite(24, HIGH);   // зажигаем светодиод
      digitalWrite(25, HIGH);   // зажигаем светодиод
      digitalWrite(26, HIGH);   // зажигаем светодиод
      digitalWrite(27, HIGH);   // зажигаем светодиод
      digitalWrite(28, HIGH);   // зажигаем светодиод
      digitalWrite(29, HIGH);   // зажигаем светодиод
      digitalWrite(30, HIGH);   // зажигаем светодиод
      digitalWrite(31, HIGH);   // зажигаем светодиод
      digitalWrite(32, HIGH);   // зажигаем светодиод
      digitalWrite(33, HIGH);   // зажигаем светодиод
      digitalWrite(34, HIGH);   // зажигаем светодиод
      digitalWrite(35, HIGH);   // зажигаем светодиод
      digitalWrite(36, HIGH);   // зажигаем светодиод
      digitalWrite(37, HIGH);   // зажигаем светодиод
      digitalWrite(38, HIGH);   // зажигаем светодиод
      digitalWrite(39, HIGH);   // зажигаем светодиод
      digitalWrite(40, HIGH);   // зажигаем светодиод
      digitalWrite(41, HIGH);   // зажигаем светодиод
      digitalWrite(42, HIGH);   // зажигаем светодиод
      digitalWrite(43, HIGH);   // зажигаем светодиод
      digitalWrite(44, HIGH);   // зажигаем светодиод
      digitalWrite(45, HIGH);   // зажигаем светодиод
      digitalWrite(46, HIGH);   // зажигаем светодиод
      digitalWrite(47, HIGH);   // зажигаем светодиод
      digitalWrite(48, HIGH);   // зажигаем светодиод
      digitalWrite(49, HIGH);   // зажигаем светодиод
      digitalWrite(50, HIGH);   // зажигаем светодиод
      digitalWrite(51, HIGH);   // зажигаем светодиод
      digitalWrite(52, HIGH);   // зажигаем светодиод
      digitalWrite(53, HIGH);   // зажигаем светодиод

      delay(1000);              // ждем секунду
      digitalWrite(1, LOW);    // выключаем светодиод
      digitalWrite(2, LOW);    // выключаем светодиод
      digitalWrite(3, LOW);    // выключаем светодиод
      digitalWrite(4, LOW);    // выключаем светодиод
      digitalWrite(5, LOW);    // выключаем светодиод
      digitalWrite(6, LOW);    // выключаем светодиод
      digitalWrite(7, LOW);    // выключаем светодиод
      digitalWrite(8, LOW);    // выключаем светодиод
      digitalWrite(9, LOW);    // выключаем светодиод
      digitalWrite(10, LOW);    // выключаем светодиод
      digitalWrite(11, LOW);    // выключаем светодиод
      digitalWrite(12, LOW);    // выключаем светодиод
      digitalWrite(13, LOW);    // выключаем светодиод
      digitalWrite(14, LOW);    // выключаем светодиод
      digitalWrite(15, LOW);    // выключаем светодиод
      digitalWrite(16, LOW);    // выключаем светодиод
      digitalWrite(17, LOW);    // выключаем светодиод
      digitalWrite(18, LOW);    // выключаем светодиод
      digitalWrite(19, LOW);    // выключаем светодиод
      digitalWrite(20, LOW);    // выключаем светодиод
      digitalWrite(21, LOW);    // выключаем светодиод
      digitalWrite(22, LOW);    // выключаем светодиод
      digitalWrite(23, LOW);    // выключаем светодиод
      digitalWrite(24, LOW);    // выключаем светодиод
      digitalWrite(25, LOW);    // выключаем светодиод
      digitalWrite(26, LOW);    // выключаем светодиод
      digitalWrite(27, LOW);    // выключаем светодиод
      digitalWrite(28, LOW);    // выключаем светодиод
      digitalWrite(29, LOW);    // выключаем светодиод
      digitalWrite(30, LOW);    // выключаем светодиод
      digitalWrite(31, LOW);    // выключаем светодиод
      digitalWrite(32, LOW);    // выключаем светодиод
      digitalWrite(33, LOW);    // выключаем светодиод
      digitalWrite(34, LOW);    // выключаем светодиод
      digitalWrite(35, LOW);    // выключаем светодиод
      digitalWrite(36, LOW);    // выключаем светодиод
      digitalWrite(37, LOW);    // выключаем светодиод
      digitalWrite(38, LOW);    // выключаем светодиод
      digitalWrite(39, LOW);    // выключаем светодиод
      digitalWrite(40, LOW);    // выключаем светодиод
      digitalWrite(41, LOW);    // выключаем светодиод
      digitalWrite(42, LOW);    // выключаем светодиод
      digitalWrite(43, LOW);    // выключаем светодиод
      digitalWrite(44, LOW);    // выключаем светодиод
      digitalWrite(45, LOW);    // выключаем светодиод
      digitalWrite(46, LOW);    // выключаем светодиод
      digitalWrite(47, LOW);    // выключаем светодиод
      digitalWrite(48, LOW);    // выключаем светодиод
      digitalWrite(49, LOW);    // выключаем светодиод
      digitalWrite(50, LOW);    // выключаем светодиод
      digitalWrite(51, LOW);    // выключаем светодиод
      digitalWrite(52, LOW);    // выключаем светодиод
      digitalWrite(53, LOW);    // выключаем светодиод
      delay(1000);              // ждем секунду
    }
    Как легко можно догадаться, эта штука сначала зажигает все пины, потом гасит....
    А вот НЕ ВСЕГДА!
    В зависимости от того что шью - поведение разное:

    Atmel Studio делает либо Debug либо Release версию.
    В соответствующем каталоге создаются файлы:

    Sketch3.elf
    Sketch3.hex
    Sketch3.ino.elf
    Sketch3.ino.hex
    Sketch3.ino.with_bootloader.hex
    Sketch3.with_bootloader.hex

    Все их можно прошить JTAGом.

    А теперь - ПРИКОЛ.

    если шью из DEBUG

    Sketch3.elf - НИЧЕГО не моргает
    Sketch3.hex - все моргает
    Sketch3.ino.elf - все моргает
    Sketch3.ino.hex - все моргает
    Sketch3.ino.with_bootloader.hex - моргает ТОЛЬКО 13-й пин!
    Sketch3.with_bootloader.hex - моргает ТОЛЬКО 13-й пин!

    если шью Release

    Sketch3.elf - ВСЕ моргает
    Sketch3.hex - ВСЕ моргает
    Sketch3.ino.elf - ВСЕ моргает
    Sketch3.ino.hex - ВСЕ моргает
    Sketch3.ino.with_bootloader.hex - моргает ТОЛЬКО 13-й пин!
    Sketch3.with_bootloader.hex - моргает ТОЛЬКО 13-й пин!

    Как такое может быть?????
     
  2. Unixon

    Unixon Оракул Модератор

    Таблица векторов прерываний всегда на месте и корректна?
     
  3. Anika

    Anika Нуб

    Как это проверить?
     
  4. Unixon

    Unixon Оракул Модератор

    Например, воспользоваться objdump и посмотреть результат дизассемблирования.
    Таблица в самом начале, там куча jmp инструкций. Вектор сброса должен показывать или на загрузчик или на блок статической инициализации вызовом main в конце, если загрузчика нет.
     
  5. ostrov

    ostrov Гуру

    Приведенную выше программу можно записать в несколько строк, например в 5. А в таком виде вызывает кровотечение из глаз. Ознакомьтесь с оператором цикла.