как выйти из вечного loop?

Тема в разделе "Arduino & Shields", создана пользователем alxndrlsn, 21 ноя 2016.

  1. alxndrlsn

    alxndrlsn Нерд

    Доброго всем! "Понедельник день тяжелый"(с)
    Решил залить в Iskra_Neo (читай Leonardo) такой вот код:
    Код (C++):
      // U_MOTOR - мотор верхнего винта
        // D_MOTOR - мотор нижнего винта
        #define U_MOTOR_PIN      A0
        #define D_MOTOR_PIN      A1
     
        void setup()
        {
          //оба входа настраиваем на считывание
          pinMode(U_MOTOR_PIN, INPUT);
          pinMode(D_MOTOR_PIN, INPUT);
        }
     
        void loop()
        {
            long cU, cD;
            // открываем последовательный порт
            Serial.begin(115200);
            // 0 = 0 Вольт, 255 = 5 Вольт (максимальные обороты)
            cU = analogRead(U_MOTOR_PIN)/51;
            cD = analogRead(D_MOTOR_PIN)/51;
            Serial.print(cU);
            Serial.print(" U_umotor\t");
            Serial.print(cD);
            Serial.print(" D_dmotor\t");
        }
    ..да вот выход из этого всего не предусмотрел... (чуть не забыл! при прошивке программатор был установлен в Arduino as ISP!!! ) теперь Искра не дает загрузить в себя даже Blink.
    Sketch uses 4 788 bytes (16%) of program storage space. Maximum is 28 672 bytes.
    Global variables use 151 bytes (5%) of dynamic memory, leaving 2 409 bytes for local variables. Maximum is 2 560 bytes.
    Перезагрузка платы открытием/закрытием порта COM5 на 1200bps
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM5, } => {}
    PORTS {COM5, } / {COM3, } => {COM3, }
    Found upload port: COM3
    C:\Program Files\Arduino/hardware/tools/avr/bin/avrdude -CC:\Program Files\Arduino/hardware/tools/avr/etc/avrdude.conf -v -patmega32u4 -cavr109 -PCOM3 -b57600 -D -Uflash:w:C:\Temp\build5066821649304159881.tmp/Blink.cpp.hex:i

    avrdude: Version 6.0.1, compiled on Jan 15 2015 at 16:58:43
    Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
    Copyright (c) 2007-2009 Joerg Wunsch

    System wide configuration file is "C:\Program Files\Arduino/hardware/tools/avr/etc/avrdude.conf"

    Using Port : COM3
    Using Programmer : avr109
    Overriding Baud Rate : 57600
    AVR Part : ATmega32U4
    Chip Erase delay : 9000 us
    PAGEL : PD7
    BS2 : PA0
    RESET disposition : dedicated
    RETRY pulse : SCK
    serial program mode : yes
    parallel program mode : yes
    Timeout : 200
    StabDelay : 100
    CmdexeDelay : 25
    SyncLoops : 32
    ByteDelay : 0
    PollIndex : 3
    PollValue : 0x53
    Memory Detail :

    Block Poll Page Polled
    Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
    ----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
    eeprom 65 20 4 0 no 1024 4 0 9000 9000 0x00 0x00
    flash 65 6 128 0 yes 32768 128 256 4500 4500 0x00 0x00
    lfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
    hfuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
    efuse 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
    lock 0 0 0 0 no 1 0 0 9000 9000 0x00 0x00
    calibration 0 0 0 0 no 1 0 0 0 0 0x00 0x00
    signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00

    Programmer Type : butterfly
    Description : Atmel AppNote AVR109 Boot Loader

    Connecting to programmer: .
    Found programmer: Id = "CATERIN"; type = S
    Software Version = 1.0; No Hardware Version given.
    Programmer supports auto addr increment.
    Programmer supports buffered memory access with buffersize=128 bytes.

    Programmer supports the following devices:
    Device code: 0x44

    avrdude: devcode selected: 0x44
    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.00s

    avrdude: Device signature = 0x1e9587
    avrdude: reading input file "C:\Temp\build5066821649304159881.tmp/Blink.cpp.hex"
    avrdude: writing flash (4788 bytes):

    Writing | ################################################## | 100% 0.06s

    avrdude: 4788 bytes of flash written
    avrdude: verifying flash memory against C:\Temp\build5066821649304159881.tmp/Blink.cpp.hex:
    avrdude: load data flash data from input file C:\Temp\build5066821649304159881.tmp/Blink.cpp.hex:
    avrdude: input file C:\Temp\build5066821649304159881.tmp/Blink.cpp.hex contains 4788 bytes
    avrdude: reading on-chip flash data:

    Reading | ################################################## | 100% 0.05s

    avrdude: verifying ...
    avrdude: verification error, first mismatch at byte 0x0000
    0x00 != 0x0c
    avrdude: verification error; content mismatch


    avrdude done. Thank you.
    Есть методы какие-нибудь как все это безобразие остановить/исправить?
    "Признаю себя ослом и жду ваших распоряжений"(с)Треллони

    вдогонку: можно ли прошить загрузчик в Neo через usb-serial или еще хитрее через iskra mini, подключенную через usb-serial адаптер?
     
    Последнее редактирование: 21 ноя 2016
  2. Tomasina

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

    из loop выходить никогда не нужно (это идеология Arduino).
    Прошить загрузчик можно по ICSP любым программатором или через другую Arduino.

    На всякий случай: загрузчик в Leonardo активируется однократным или двукратным нажатием Reset.
     
  3. Igor68

    Igor68 Гуру

    Простите за вмешательство... но в рабочем цикле:
    Код (C++):
    // открываем последовательный порт
            Serial.begin(115200);
     
    по моему каждый раз отрывать порт.....
    Если это не ставить в setup а оставить в loop похоже будет повторяться сие недоразумение.
    Ещё раз простите!
     
  4. ostrov

    ostrov Гуру

    Serial.begin() вынести в setup и добавить небольшую задержку между итерациями если нет необходимости получать десяток тысяч символов в секунду.
     
  5. alxndrlsn

    alxndrlsn Нерд

    а как теперь перепрошить-то? не дает даже блинк залить...может это загрузчик повредился/слетел из-за того, что при заливке скетча был выбран программатором (поспешил-недосмотрел) Arduino as ISP?
    два раза подряд надо нажать или как? (однократно нажимал - все вариации = безрезультатно)

    можно ли сделать из Искра мини программатор? оказывается можно: http://justforduino.blogspot.ru/2015/08/avr-arduino-pro-mini.html
     
    Последнее редактирование: 22 ноя 2016
  6. alxndrlsn

    alxndrlsn Нерд

    загрузчик на Neo восстановлен через Искру мини, все как в статье вышеуказанной, только на Neo спользован разъем ISP
    Код (C++):
    Iskra Mini --- Iskra Neo
    GND  -------- GND
    VCC +5В --- VIN

    D10 --- Reset
    D11 --- MOSI
    D12 --- MISO
    D13 --- SCLK
    схема наглядно - в приложенном файле.

    Код переделал, теперь вот так:
    Код (C++):
        // U_MOTOR - мотор верхнего винта
        // D_MOTOR - мотор нижнего винта
        #define U_MOTOR_PIN      A0
        #define D_MOTOR_PIN      A1
        void setup()
        {
          //оба входа настраиваем на считывание
          pinMode(U_MOTOR_PIN, INPUT);
          pinMode(D_MOTOR_PIN, INPUT);
          // открываем последовательный порт
          Serial.begin(115200);
        }
        void loop()
        {
            long cU, cD;
            if (Serial.available()) {
            // 0 = 0 Вольт, 255 = 5 Вольт (максимальные обороты)
            cU = analogRead(U_MOTOR_PIN)/51;
            cD = analogRead(D_MOTOR_PIN)/51;
            Serial.print(cU);
            Serial.print(" U_umotor     ");
            Serial.print(cD);
            Serial.println(" D_dmotor ");
            delay(100);
            }
        }
     

    Вложения:

    Последнее редактирование: 22 ноя 2016
  7. Igor68

    Igor68 Гуру

    Теперь у вас должен спокойно загружаться новый проект.
     
  8. alxndrlsn

    alxndrlsn Нерд

    Так и было: проект был загружен, испытан, после чего Iskra Neo перестала отображаться в диспетчере устройств... (не сообразил, что не зря разность потенциалов на контактах коллекторного движка -3.7В, хотя по обозначениям должно было быть +3.7В, в итоге на Gnd Ардуинки подано было примерно -3.7 Вольт) :confused:
    Выход был найден нетривиальным способом: дело в том, что по двойному нажатию резета (клац-клац) Iskra Neo ненадолго появлялась в диспетчере устройств на каком-то порте в виде Leonardo bootloader (COM X), где Х - номер порта.
    Решено было попытаться прошить Ардуинку пустым скетчем пока она видна (1-2 секунды), для чего было установлено на каком порту появляется устройство, затем в Arduino IDE было выставлены параметры платы и порт (благо IDE запоминает порт, если на нем хоть что-то засветилось). Затем был скомпилирован пустой стандартный скетч (который отображается на старте) и сразу по двойному нажатию резета (клац-клац) скетч был отправлен в Ардуинку, однако она успела погаснуть в диспетчере и пришлось тут же еще два раза клацнуть по резету.. и "О, Чудо!" прошилась! Ардуинка переселилась на другой порт и теперь уже не исчезает, значит жива...(тут же был прошит Blink, как символ победы жизни над смертью в плоскости компьютерных систем, разумеется).:cool:
    и слава Богу!
     
    Последнее редактирование: 22 ноя 2016
  9. Unixon

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

    Это не идеология Arduino. Из loop выходить некуда. Разве что в sleep/halt или reset...