В чем отличие встроенного монитора и внешней программы?
- Войдите на сайт для отправки комментариев
Здравствуйте.
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 конвертера может зависеть такое поведение?