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

Обсуждаем контроллеры компании Atmel.
Ответить
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

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


ну я не вижу тут альтернативных вариантов , код приведен выше. это весь код.
делаем паузу меньше 3 мс. ПИН не читает. делаем больше - читает.
ПОРТ читает сразу о чем я сразу говорил с первого сообщения. но при этом порт не всё читает . ПИН более всеядный но тормознутый
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

Если бы только зрения... Проблемы элементарной логики.(
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

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

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

я не оспариваю вашего опыта и умения работать с авр. но вот вы например можете привести код (на чистом С или асм) для леонардо чтоб PIN прочитал единицу пусть даже через один nop ?
потому что я не думаю что аврдуде компилирует так криво код в котором нет ни одной ардуиновской вставки. хотя всё может быть конечно. но если это не компилятор то других причин нет. почему PIN нужно 4мс на расскачку при том что PORT сразу могёт. может это специфика камня 32u4 ?
приедет нано проверю и на ней
Реклама
Эиком - электронные компоненты и радиодетали
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

ДОСТАЛ таки!
:twisted:
sketch_may24a.rar
(1.06 КБ) 136 скачиваний
приеду домой гляну как на практике работает (для нанки/про-мини или 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 раза.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

может дело в том, что регистр порт — это то что на ногу послали, а регистр пин — то что на ноге намеряли? т.е. если послал в порт "1", то пока откроются выходные ключи, пока поднимется напряжение на ноге, пока это напряжение измерится... (знаю, что каждая операция быстра) может и успеет пара команд выполниться... они ведь тоже быстрые...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Исправлено с комментарием относительно допущенных ошибок первого варианта -
при обработке функций вывода в ПК необходимо нормировать маской ОБА значения
а не только считываемое из порта Р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 раз.
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

инфа про ноп от форумчан - он не желательен а 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мс надо мне было.
о тут продолжение темы от маститых котов :) попробую ваши скетчи на досуге
OKF
Это не хвост, это антенна
Сообщения: 1407
Зарегистрирован: Вт июн 07, 2011 08:03:18

Сообщение OKF »

[uquote="alex68md",url="/forum/viewtopic.php?p=3638835#p3638835"]например ?про логику. или просто зашли оскорбить новичка?[/uquote]
Неужели сложно чётко и лаконично описать проблему, без всякой посторонней шелухи?
Такое впечатление что вы в бреду разговариваете с самим собой.(

3-4 мс - это если у вас к выходу подключен электролитический конденсатор. Либо сам выход неисправен.
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

проверил и ваш код и свой

Код: Выделить всё

#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 читает предварительно установленный сигнал
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Вы 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);

  }
}
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

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

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

Сообщение dgrett »

Потому что Портх не видит что вы подали на ногу. А вот если подаёте на ногу изнутри мк, те на Порт, информация сначала выскакивает но Порт, а через такт и на Пин.
Пин для чтения и предназначен.
Я всё-всё узнAю и стану профессором.
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

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 мксек.
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

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

Сообщение alex68md »

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

Dimon456, про МГц я все понимаю, но на моей леонардо если использовать ардуино delay то 3мс нужно. Меньше Ника к. Либо 2 ноп.
Друг Кота
Аватара пользователя
Сообщения: 15599
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

.....
КОГДА ЖЕ КОТЯТКИ НАУЧАТСЯ НАЧИНАТЬ РАБОТУ С ПРЕДВАРИТЕЛЬНОГО ИЗУЧЕНИЯ ВСЕЙ НЕОБХОДИМОЙ ДОКУМЕНТАЦИИ??...
:cry:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18678
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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 никак не может быть достаточно!!!

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

Мой уютный бложик... заходите!
Контактная информация:
Грызет канифоль
Сообщения: 275
Зарегистрирован: Сб янв 03, 2015 21:03:24

Сообщение alex68md »

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

Вернуться в «AVR»