В чем отличие встроенного монитора и внешней программы?
- Войдите на сайт для отправки комментариев
Здравствуйте.
Arduino Pro Mini (5 В)
Написал небольшую программку, которая получает символ через компорт (это цифры и единственный буквенный символ - f) и зажигает светодиоды 7-сегментного индикатора. Она замечательно работает, когда отправляю данные через встроенный монитор. Как только пытаюсь сделать bat-файл или вывести что-то из 1С, ардуинка ведет себя, как будто ее ресетят. Причем, если в 1С я в отладчике прогоняю свою программу, то опять работет, как надо. Стоит только запустить обычный режим, снова не работает.
Нагуглил конденсатор на ножку RST и GND. Но с ним у меня только не заливается скетч (как и должно быть по описанию), а вот нужного результата не добился. Что делаю не так? Подскажите, плиз.
На всякий случай привожу свой скетч. Может с ним накосячил?
#define FIRST_SEGMENT_PIN 2 #define SEGMENT_COUNT 8 // Всего цифр 10, поэтому в массиве 10 чисел + символ 'F'. byte numberSegments[11] = { 0b00111111, 0b00001100, 0b01011011, 0b01011110, 0b01101100, 0b01110110, 0b01110111, 0b00011100, 0b01111111, 0b01111110, 0b01110001 }; int j = 0; int val = 0; // the setup function runs once when you press reset or power the board void setup() { // initialize digital pin LED_BUILTIN as an output. Serial.begin(9600); //Serial.println("write"); for (int i = 0; i < SEGMENT_COUNT; ++i) pinMode(i + FIRST_SEGMENT_PIN, OUTPUT); while (Serial.available() == 0) { int mask = numberSegments[0]; for (int i = 0; i < 7; ++i) { boolean enableSegment = bitRead(mask, i); digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); if (i == 0) { digitalWrite(7, LOW); } else { digitalWrite(i + FIRST_SEGMENT_PIN - 1, LOW); } if (i == 5) { digitalWrite(2, enableSegment); } else { digitalWrite(i + FIRST_SEGMENT_PIN + 1, enableSegment); } digitalWrite( 8, LOW); delay(100); } } } // the loop function runs over and over again forever void loop() { while (Serial.available() > 0) { delay(2); int val = Serial.read(); if (val == 'f' || val == 'F') { // если принят симовол 'f',... j = 10; } else { j = (char)val-48; } } int mask = numberSegments[j]; // для каждого из 7 сегментов индикатора if (j < 10) { for (int i = 0; i < SEGMENT_COUNT; ++i) { // определяем: должен ли он быть включён. boolean enableSegment = bitRead(mask, i); // включаем/выключаем сегмент на основе полученного значения digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); } } else { while (Serial.available() == 0) { for (int i = 0; i < SEGMENT_COUNT; ++i) { digitalWrite(i + FIRST_SEGMENT_PIN, LOW); //гасим все пины } delay(500); for (int i = 0; i < SEGMENT_COUNT; ++i) { boolean enableSegment = bitRead(mask, i); digitalWrite(i + FIRST_SEGMENT_PIN, enableSegment); //выводим мигающий символ 'F' } delay(500); } } }
Упс! Код не работает. Это я экспериментировал по мотивам поиска по теме. Если надо, приведу тот, который у меня 100% рабочий.
В батнике надо com настроить перед тем как отправлять данные. Типа так:
Думаю тоже нужно делать и в Вашей проге...
Это сделано. Не помогает.
И сейчас я не пойму, что поменял. Раньше, если я монитор закрывал, то цифра на индикаторе у меня оставалась, а сейчас при закрытии идет сброс порта.
От USB-COM конвертера может зависеть такое поведение?