Обсуждаем контроллеры компании Atmel.
Ответить

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 11:38:01

а, так что дело явно не в том, что уровни не успевают устаканиться.


ну я не вижу тут альтернативных вариантов , код приведен выше. это весь код.
делаем паузу меньше 3 мс. ПИН не читает. делаем больше - читает.
ПОРТ читает сразу о чем я сразу говорил с первого сообщения. но при этом порт не всё читает . ПИН более всеядный но тормознутый

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 11:43:55

alex68md писал(а):ну я не вижу тут альтернативных вариантов
я просто напоминаю, что проблемы вашего зрения не являются основанием огульно винить микроконтроллер. а в остальном - каждый сам выбирает, как выстрелить себе в ногу :)

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 11:59:32

Если бы только зрения... Проблемы элементарной логики.(

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 12:06:36

например ?про логику. или просто зашли оскорбить новичка?

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

я не оспариваю вашего опыта и умения работать с авр. но вот вы например можете привести код (на чистом С или асм) для леонардо чтоб PIN прочитал единицу пусть даже через один nop ?
потому что я не думаю что аврдуде компилирует так криво код в котором нет ни одной ардуиновской вставки. хотя всё может быть конечно. но если это не компилятор то других причин нет. почему PIN нужно 4мс на расскачку при том что PORT сразу могёт. может это специфика камня 32u4 ?
приедет нано проверю и на ней

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 12:10:51

alex68md писал(а):аврдуде компилирует так криво код
avrdude - это программатор, а не компилятор, он ничего не компилирует. а компилятор в ардуине тот же самый, что и в AVR Studio или Atmel Studio - avr-gcc, коим и я пользуюсь много лет

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 17:28:24

ДОСТАЛ таки!
:twisted:
sketch_may24a.rar
(1.06 KiB) Скачиваний: 121

приеду домой гляну как на практике работает (для нанки/про-мини или uno).
:sleep:

Добавлено after 3 hours 37 minutes 18 seconds:
Ну и какого ПСА мы воду мутим?
:tea:
Вот с максимальным быстродействием (с точки зрения особо докусучих)
Код:
#define mask B00111111 //ограничение на "вольные лапки"
byte data;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
 DDRB |= mask;
 PORTB |= mask;
}

void loop() {
  // put your main code here, to run repeatedly:
 for (byte n=0; n<255; n++)
 {
  PORTB = n & mask;
  data = PINB; data = PINB;
   Serial.println("output of PORTB");
   Serial.println(n, BIN);  // print as an ASCII-encoded binary здесь ошибка - необходимо (n & mask), BIN
   Serial.println("input of PINB");
   Serial.println((data & mask), BIN);  // print as an ASCII-encoded binary
   delay(2000);
 }
}

включаем монитор порта или "terminal" и смотрим результат!
:twisted:
Кстати...
Ежли после запуска именно "terminal" не появилось ничего жмем или кнопу "сброс" на платке адуриньи или тыць на кнопе DTR в панели терминала.
8)
Последний раз редактировалось BOB51 Пт май 24, 2019 20:29:01, всего редактировалось 3 раз(а).

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 18:05:05

может дело в том, что регистр порт — это то что на ногу послали, а регистр пин — то что на ноге намеряли? т.е. если послал в порт "1", то пока откроются выходные ключи, пока поднимется напряжение на ноге, пока это напряжение измерится... (знаю, что каждая операция быстра) может и успеет пара команд выполниться... они ведь тоже быстрые...

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 18:22:54

Исправлено с комментарием относительно допущенных ошибок первого варианта -
при обработке функций вывода в ПК необходимо нормировать маской ОБА значения
а не только считываемое из порта РIN - в противном случае (см. СКОТч выше) будет разнобой при последующих повторах цикла
при том, что первый проход будет отображаться верно.
Нижеприведенное от ошибок индикации свободно
Код:
#define mask B00111111 //ограничение на "вольные лапки"
byte data;

void setup() {
  // put your setup code here, to run once:
 Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
 DDRB |= mask;
 PORTB |= mask;
}

void loop() {
  // put your main code here, to run repeatedly:
 for (byte n=0; n<255; n++)
 {
  PORTB = n & mask;
  data = PINB; data = PINB; // первое чтение является задержкой (фиктивное чтение) второе даст верные данные
                                       // сделано чтобы не вставлять NOP под ассемблером
   Serial.println("output of PORTB");
   Serial.println((n & mask), BIN);  // print as an ASCII-encoded binary
   Serial.println("input of PINB");
   Serial.println((data & mask), BIN);  // print as an ASCII-encoded binary
   delay(2000); // выставляем для удобства восприятия
 }

}


:wink:
Пардонс... я в СИ новичекс...
:?
Последний раз редактировалось BOB51 Пт май 24, 2019 20:25:57, всего редактировалось 1 раз.

Re: PINx не читает порт на леонардо :(

Пт май 24, 2019 19:54:22

инфа про ноп от форумчан - он не желательен а 100% необходим спасибо форумчане
оказывается я прогладел это в ДШ

PORTB = (1<<PB7)|(1<<PB6)|(1<<PB1)|(1<<PB0);
DDRB = (1<<DDB3)|(1<<DDB2)|(1<<DDB1)|(1<<DDB0);
/* Insert nop for synchronization*/
__no_operation();
/* Read port pins */
i = PINB;

Добавлено after 2 minutes 22 seconds:
вот только одного нопа мне не хватало. как говорил 3-4мс надо мне было.
о тут продолжение темы от маститых котов :) попробую ваши скетчи на досуге

Re: PINx не читает порт на леонардо :(

Сб май 25, 2019 06:21:22

например ?про логику. или просто зашли оскорбить новичка?

Неужели сложно чётко и лаконично описать проблему, без всякой посторонней шелухи?
Такое впечатление что вы в бреду разговариваете с самим собой.(

3-4 мс - это если у вас к выходу подключен электролитический конденсатор. Либо сам выход неисправен.

Re: PINx не читает порт на леонардо :(

Сб май 25, 2019 17:16:49

проверил и ваш код и свой
Код:
#define mask B00111111 //ограничение на "вольные лапки"
#define CLED (1 << PC7)
#define DLED (1 << PD6)
#define ELED (1 << PE6)
#define FLED (1 << PF0)

void setup() {
  Serial.begin(115200);
  while (!Serial);
  delay(2000);
  DDRF = 0xFF; PORTF = 0;
  DDRE = 0xFF; PORTE = 0;
  DDRD = 0xFF; PORTD = 0;
  DDRC = 0xFF; PORTC = 0;
  DDRB = 0xFF; PORTB = 0;


  DDRB |= mask;
  PORTB |= mask;

}

void loop() {
 
  for (byte n = 0; n < 255; n++)
  {
    PORTB = n & mask;
    //двойное чтение нам даёт необходимую задержку и гарантированно правильный вывод, поэтому
    //не стал его делать т.к. если мы перестраховываемся для гарантированного чтения то просто можем прочитать его позже. т.к. завязки именно на скоростное использование PINB в коде нету
    Serial.print(" send to PORTB = ");
    Serial.println(n & mask, BIN);  // print as an ASCII-encoded binary
    Serial.print("output of PORTB = ");
    Serial.println((PORTB & mask), BIN);  // print as an ASCII-encoded binary
    Serial.print(" input of PINB = ");
    Serial.println((PINB & mask), BIN);  // print as an ASCII-encoded binary
    Serial.println("----------");
    delay(600);

  }
}

результат на всех регистрах одинаковый

Добавлено after 1 minute 9 seconds:
по поводу скорости проверил еще раз
достаточно или двойное присвоение как у вас или двойной ноп и тогда PINx читает предварительно установленный сигнал

Re: PINx не читает порт на леонардо :(

Сб май 25, 2019 18:27:37

Вы asm хоть смотрели?
Спойлер
Код:
void loop() {
 uint8_t  a;
  for (byte n = 0; n < B01000000; n++)
  {
 
   PORTB = n;
   // вот сюда и вставляй свою задержку!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   a= PINB;

    Serial.print(" send to PORTB = ");
    Serial.println(n & mask, BIN);  // print as an ASCII-encoded binary
    Serial.print("output of PORTB = ");
    Serial.println((PORTB & mask), BIN);  // print as an ASCII-encoded binary
    Serial.print(" input of PINB = ");
    Serial.println((a & mask), BIN);  // print as an ASCII-encoded binary
    Serial.println("----------");
    delay(600);

  }
}

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 07:00:59

Смотрел. Димон , так я ее туда и вставил. Выше же я писал 2 дня назад. Что нужна задержка 3-4мс. Delay (3) стоит в коде у меня там. Ровно в то место в которое вы указали.
Вообщем с этой задержкой вопрос понятен. Спасибо.

Непонятно другое:
Настравиваю ногу на input LOW, я имею ввиду начальное состояние. Input Pull down. Ждем единицу от датчика. Приходит единица и PINx видит ее. А если меняю PINx на Portx то не видит. Почему?
Хотя мы пришли к тому в наших примерах выше что результат должен быть одинаковый на порт и пин

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 07:35:52

Потому что Портх не видит что вы подали на ногу. А вот если подаёте на ногу изнутри мк, те на Порт, информация сначала выскакивает но Порт, а через такт и на Пин.
Пин для чтения и предназначен.

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 07:54:19

alex68md писал(а):Настравиваю ногу на input LOW, я имею ввиду начальное состояние. Input Pull down. Ждем единицу от датчика. Приходит единица и PINx видит ее. А если меняю PINx на Portx то не видит. Почему?
Ас чего вы взяли что при input Portx должен что то видеть? Вы структурную схему порта контроллера открывали?
alex68md писал(а):Хотя мы пришли к тому в наших примерах выше что результат должен быть одинаковый на порт и пин
Все верно, при режиме порта OUTPUT.

Добавлено after 15 minutes 11 seconds:
alex68md писал(а):Что нужна задержка 3-4мс. Delay (3)
Вы что смеетесь?
Это высокопроизводительные контроллеры, время выполнения одной команды
При F = 16 МГц
Tclk = 1/16000000 = 0,0000000625 сек = 0,0625 мксек (микросекунды).

Команда nop выполняется за 0,0625 мксек.

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 08:39:12

На платках-прототипах возможны незначительные отклонения задержки установления уровня из-за топологии разводки дорожек и "дополнительных обыязок" - запараллеливания на разные внешние разъёмы и/или подключения индикаторов/микросхем расширения (в пределах платки).
Теоретически вероятно...
Однако на практике - пока не замечалось (у тех, с которыми пришлось дело иметь)
:roll:

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 08:43:01

dgrett, Dimon456, понял спасибо. Это если сам МК посылает то порт прочтёт. А если из вне чтото приходит на инпут только PIN поможет. Спасибо

Dimon456, про МГц я все понимаю, но на моей леонардо если использовать ардуино delay то 3мс нужно. Меньше Ника к. Либо 2 ноп.

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 09:55:08

.....
КОГДА ЖЕ КОТЯТКИ НАУЧАТСЯ НАЧИНАТЬ РАБОТУ С ПРЕДВАРИТЕЛЬНОГО ИЗУЧЕНИЯ ВСЕЙ НЕОБХОДИМОЙ ДОКУМЕНТАЦИИ??...
:cry:

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 12:13:25

alex68md писал(а):если использовать ардуино delay то 3мс нужно. Меньше Ника к. Либо 2 ноп
вы хотя бы понимаете, что разница между 3 мс и 2 NOP составляет 3-4 порядка?! как у вас это может быть эквивалентом?!

NOP выполняется за 1 такт, т.е. при тактовой частоте 8000000 Гц (я не знаю, сколько у ардуины, беру значение "по умолчанию) за 125 наносекунд. НАНО!!! два NOP - это 250 наносекунд.

3 миллисекунды (МИЛЛИ!!!) задержки это ровно 3000000 наносекунд! то есть ровно в 12 тысяч (ТЫСЯЧ!!!) раз медленнее двух NOP.

никак не может быть в вашей ардине ИЛИ 3 мс ИЛИ 2 NOP. если для считывания НЕОБХОДИМО 3 мс, то 2 NOP никак не может быть достаточно!!!

неужели у вас калькулятора нет, и арифметики вы в школе не изучали?!

Re: PINx не читает порт на леонардо :(

Вс май 26, 2019 15:16:54

Вы уж не серчайте
Я все понимаю :) но я же цифры не из головы беру
Ставлю два ноп работает.
Ставлю delay (2) не работает
Так оно на практике
Ради интереса попробую _delay_ms (1);
Ответить