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

alexbmd
Offline
Зарегистрирован: 15.01.2016
#define PIN_LED (1 << PC7)
void setup() {
  // put your setup code here, to run once:
DDRF = 0xFF; PORTF = 0;
DDRE = 0xFF; PORTE = 0;
DDRD = 0xFF; PORTD = 0;
DDRC = 0xFF; PORTC = 0;
DDRB = 0xFF; PORTB = 0;
}

void loop() {
  // put your main code here, to run repeatedly:
  //PF0 a5
  PORTE |= 1<<PE6;
  digitalWrite(13,  PINE & 1<<PE6 ); //issue here. if I change to PORTE will work
  delay(3000);
  PORTC &= ~PIN_LED;        
  PORTE &= ~(1<<PE6);
}

друзья , ктото сталкивался с таким ?

PORTx прекрасно читает.

alexbmd
Offline
Зарегистрирован: 15.01.2016

пробовал так

  PORTE |= 1<<PE6; //пишем один. светик горит

if (PINE) PORTC |= led13;

if не срабатывает

есть идеи?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

Читает. Судя по скетчу на пине 13 всегда будет 1. Банально не хватает строк, которые меняли бы состояние пина, когда будет "0" на PE6.

void loop() {
PORTE |= 1<<PE6;
digitalWrite (13, PINE&(1<<6));
delay(1000);
PORTE &= ~(1<<PE6);
digitalWrite (13, PINE&(1<<6));
delay(1000);
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:
есть идеи?
Конечно, есть, например, почитать даташит и вставить ... впрочем, сам читай. Там даже пример есть как это правильно делать (прямо на Си записывают и читают). Раздел 10.2.4 на стр. 65 и далее.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Да, не, Дим, там задержки не хватает между строками 14 и 15,  я дал ТС ссылку на даташит, пусть читает.

alexbmd
Offline
Зарегистрирован: 15.01.2016

dimax пишет:

Читает. Судя по скетчу на пине 13 всегда будет 1. 

былобы всегда 1 не было бы вопроса :)

[ссылку Ворота еще не смотрел обезательно посмотрю позже, потому что как раз ковырял ДШ на этот вопрос, но видно не достаточно хорошо, потому интересно чтоже я пропустил] , но еще до ответа от Ворота , решил этот вопрос там таки да нужна задержка 4мс , одного nop не хватило.

при том что PORT читает сразу же а PIn нужна задержка.  даже если убрать все ардуиновские записи оставить только прямое обращение к регистрам и чистый си  всеравно нужна задержка 4мс.у меня во всяком случае так.

 

Дима к вам другой вопрос, пока я ковырял этот вопрос, всплыл другой, уже чтоб не плодить темы спрошу тут

DDRB = 0xFF; PORTB = 0;
DDRC = 0xFF; PORTC = 0;
DDRD = 0xFF; PORTD = 0;

Serial.println("DDR B C D =");
Serial.println(PINB);
Serial.println(PINC);
Serial.println(PIND);
Serial.println(PORTB);
Serial.println(PORTC);
Serial.println(PORTD);
PORTD = 0x00;
Serial.println(PIND);
Serial.println(PORTD);

это весь код и выводит 

DDR B C D =
0
0
45
0
0
32
45
32

то что ноль не обнуляет я разобрался там леды для сериала, сами ноги сериала , другие датчики и т.п.  НО вот почему PIN и PORT дают разные результаты ?

плюс я настраивал датчик, МК ни как не хотел видить его уровни (это все было в этот же день) я вспомнил про эту особеность порт/пин. поменял в коде PORT на PIN и МК увидел единицу от датчика.  я всегда считал что у них должен быть один результат.

nik182
Offline
Зарегистрирован: 04.05.2015

Посмотрите схему включения портов в мануале на процессор. PIN и PORT это совершенно разные регистры. Частный случай когда порт настроен на вывод, то PIN соединён с PORT и читает его состояние, соответственно они равны. Во остальных случаях как получится.

alexbmd
Offline
Зарегистрирован: 15.01.2016

nik182, получается никакими програмными фишечками мы не можем сделать (в реальном проекте где вход/выходы всё в разных состояниях), не можем сделать и не можем гарантировать что порт и пин выдадут одинаковый результат ? мы должны принять за данность чо они на 99% будут иметь разный результат?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Одинаковые данные в разных (!) регистрах ситуация случайная. В рамках рассматриваемых процессоров это входной и выходной регистры, внутренние подключение которых определяется текущей конфигурацией выходного порта. Читая PORT вы получаете информацию о том какой будет уровень выходного сигнала, когда нога МК будет сконфигурирована как выход. Ничего более. Никакой информации о состоянии ноги МК получить невозможно читая PORT. 

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Весело тут у вас!

PINx - регистр для чтения. PORTx - для записи. Если ты читаешь PORTx и придаешь прочитанному какой-то смысл - это твои личные половые проблеммы... ну может не проблемы, а радости, кто ж тебя знает?

ДШ ничего не утверждает и никак не определяет смысл содержимого PORT, кроме того, что сам автор туда запихнул. Так доходчиво?

 

nik182
Offline
Зарегистрирован: 04.05.2015

Это слишком утрировано. Для записи, для чтения... В PIN можно записать, но вот результат записи может очень удивить. В мануале показано, что чтение PORT читает регистр-защёлку выходного буфера, за буфером стоит шинный усилитель. Так что точка из которой читают сигнал PORT никак не связяна с выходной ногой МК. Но чтение PORT всегда дает байт, который в PORT записан. Видел программы, в которых это использовалось как дополнительная ячейка памяти.  

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

nik182 пишет:

Это слишком утрировано. Для записи, для чтения...

Это не тебе было;)))) А ТСу не нужно говорить сложнее.... мееедленно и по сло-гам. ;))

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

wdrakula пишет:
Если ты читаешь PORTx и придаешь прочитанному какой-то смысл ...
Давно собирался посоветовать ТС обсудить эту проблему с его психиатром, но он такой обидчивый.

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ворота пишет:

Там даже пример есть 

вот блин графики, таблицу видел а сам код не посмотрел . ну всеравно пришёл к тому же и без ДШ.  ну правда в ноп-ом в 4мс.

alexbmd
Offline
Зарегистрирован: 15.01.2016

nik182, другими словами вы хотите сказать что PORT не прочтёт уровни с ног настроенных на вход? только с ног на выход

 

 

alexbmd
Offline
Зарегистрирован: 15.01.2016

wdrakula ,ДШ утверждает что можно и пином записывать и портом читать, да. 

дракула , я тебе что дорогу перешел? нафига эти коментариями не относящиеся к теме

nik182
Offline
Зарегистрирован: 04.05.2015

Вот проведи пальчиком по схеме и попробуй найти путь от ноги MK до регистра PORT. Я думаю если прочитать мануал на МК то таких глупых вопросов не будет.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:

wdrakula ,ДШ утверждает что можно и пином записывать и портом читать, да. 

Опять "дискутируешь" :-)))))

Смешной ты парень!

nik182
Offline
Зарегистрирован: 04.05.2015

alexbmd пишет:

nik182, другими словами вы хотите сказать что PORT не прочтёт уровни с ног настроенных на вход? только с ног на выход

Ненадо мне припысывать больше чем я сказал. Прочитай внимательно, что я писал и осознай, что картина мира отличается от сложившейся в твоей голове. На приведенной выше схеме ясно видно, что нога процессора не соединина ни с PORT ни с PIN. Между PORT и ногой стоит шинный формирователь с возможностью трерьего Z состояния выхода. Через него в обратном направлении от ноги МК до PORT никакие сигналы пройти не могут. 

Между ногой и PIN стоит аж 3 устройства - тоже сигнал попадает не сразу в PIN а после обработки и теоретически значение PIN может не соответствовать значению уровня сигнала на ноге процессора, правда только короткое время обработки и синхронизации.

alexbmd
Offline
Зарегистрирован: 15.01.2016
#define mask B00111111 //ограничение на "вольные лапки"

void setup() {
  Serial.begin(115200);
  while (!Serial);
  delay(2000);

  DDRB |= mask;
  PORTB |= mask;

}

void loop() {
  
  for (byte n = 0; n < 255; n++)
  {
    PORTB = n & mask;
    Serial.print(" send to PORTB = ");
    Serial.println(n & mask, BIN);  
    Serial.print("output of PORTB = ");
    Serial.println((PORTB & mask), BIN);  
    Serial.print(" input of PINB = ");
    Serial.println((PINB & mask), BIN); 
    Serial.println("-------------------");
    delay(600);

  }
}

впринципе выводит нам одинаковый результат

alexbmd
Offline
Зарегистрирован: 15.01.2016

nik182 пишет:

 ногой и PIN стоит аж 3 устройства - тоже сигнал попадает не сразу в PIN а после обработки и теоретически значение PIN может не соответствовать значению уровня сигнала на ноге процессора, правда только короткое время обработки и синхронизации.

а ну теперь понятно. вы как раз про эту задержку синхронизации. а то я понял ваш первый пост  в разнесенные во времени промежутке мы можем иметь разные значения на PORTB и PINB.  получается они должны быть равны после устаканивания сигналов.

но тогда возращаемся к моему вопросу. почему на ноге настроенной как INPUT LOW. 

PIN читал входящую единицу

а PORT не видел ?

alexbmd
Offline
Зарегистрирован: 15.01.2016

ворта непойму ты чего хочешь то?

nik182
Offline
Зарегистрирован: 04.05.2015

Не может быть настройки INPUT LOW. Нет такой опции. Входной сигнал можно изменить только соединяя ногу (!!!) МК с землёй (LOW) или c питанием(HIGH). Программно ногу процессора настроенную на вход и соединённую с другим источником сигнала невозможно запрограмировать в LOW или HIGH.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

alexbmd пишет:

ворта непойму ты чего хочешь то?

Уже ничего :( Поначалу хотел что-то тебе объяснить, даже ссылку на даташит дал и страницу указал, но понял, что медицина бессильна и теперь просто хрущу попкорном и наблюдаю мучения бедняги nik182

wdrakula
wdrakula аватар
Онлайн
Зарегистрирован: 15.03.2016

Ворота пишет:

теперь просто хрущу попкорном и наблюдаю мучения бедняги nik182

 -- Подвинься! У меня пиво и орешки, - Будешь?

nik182
Offline
Зарегистрирован: 04.05.2015
Кто на лавочке сидел,
Кто на улицу глядел,
Толя пел,
Борис молчал,
Николай ногой качал.
 
Дело было вечером,
Делать было нечего.
 
Галка села на заборе,
Кот забрался на чердак.
Тут сказал ребятам Боря
Просто так:
А у меня 

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

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ворота за линк спасибо. Дш подтвердил правильность моей мысли о задержке. ответа почему порт не видит единицу не нашел. Ну а далее что за выпады в мою сторону? И дракула тудаже. Вы не по тролив новичка не можете жить на белом свете?

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

b707
Offline
Зарегистрирован: 26.05.2017

alexbmd пишет:
что за выпады в мою сторону? И дракула тудаже. Вы не по тролив новичка не можете жить на белом свете?

третий год одно и то же. Ты не новичок, ты дебил, которому бесполезно учиться. Дебил читает по 20 раз и все равно не понимает. И вот доказательство:

nik182 написал: в обратном направлении от ноги МК до PORT никакие сигналы пройти не могут.

alexbnd опять нифига не понял: Portx не видит. Почему? Хотя мы пришли к тому что результат должен быть одинаковый

nik182
Offline
Зарегистрирован: 04.05.2015

Ответь мне пожалуйста на вопрос. Развёрнуто. По блокам на схеме ноги процессора. Почему и как PORTx должен видеть единицу? Какой путь на схеме единицы от ноги процессора до PORTx? Почему у тебя в голове живёт уверенность что есть состояние PULL DOWN? Для AVR это состояние можно создать только ВНЕШНИМ(!) резистором. Внешние воздействия на PORTx никак не влияют. Мы не приходили к выводу что результат должен быть одинаковый. Тебе уже несколько раз сказали что этого быть может только случайно. Никаких связей при настроенной на вход ноге МК нет, кроме управления pull up резистором. 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

nik182 пишет:

Ответь мне пожалуйста на вопрос. Развёрнуто. По блокам на схеме ноги процессора. Почему и как PORTx должен видеть единицу? 

Это тебя просят ответить, почем не видит, а ты вопросом на вопрос - нехорошо :)

alexbmd
Offline
Зарегистрирован: 15.01.2016

Nik182, причем тут моя голова, да есть пулап пуллдаун. Может прежде чем плеваться спокойно подумаете. Яж не говорил что я это программно сделал. Да поставил резистор. А что так нельзя было? Плюс программно мы же можем послать единицу на вход и тем самым инициализировать программно прерывание например. И по диаграмме я не специалист но линия ине одна от датабас идет к портх. Можете не отвечать если это вас заставляет нервничать

B707, по себе судишь? Иди оскорбляй своих родных и близких. Я уже говорил тебе и остальным выпендрежникам - не умеете спокойно выразить свою мысль - проходите мимо. Вот когда задам свой вопрос в разделе флуд - тогда можете блеснуть своим воспитанием. А тут раздел программирование и не относящиеся к теме сообщения держите при себе.

Bwn, кмк нужно ваше внимание к некоторыми персонажам

nik182
Offline
Зарегистрирован: 04.05.2015

Прерывание можно вызвать только запрограмировать ногу как ВЫХОД. После записи в регистр DDR. Если нога запрограмирована на ВХОД никакими программными ухищрениями прерывание сгенерить невозможно. В том числе записью единицы в регистр PORTx. Если нога сконфигурирована на ВЫХОД то никакие pull down - pull up не работают и регистр PINx содержит точно такое же значение как и PORTx. Т.е. в режиме ВЫХОД снаружи , от ноги МК, влиять на регистр PINx невозможно. 

 

alexbmd
Offline
Зарегистрирован: 15.01.2016

Ник спасибо.

протестировал сейчас все варианты.

если делать программно , то что установили то и читается причем одинаково хорошо и через PINx и через PORTx и результаты совпадают.  выставил на инпут единицу так и прочиталось. ну и любые другие варианты.

а вот если железно влиять на инпут то PORTx берет значение с утановки этого пина. например инпут лоу. то PORTx будет 0 а вот PINx читает реально что на инпуте из вне.

да интересная петрушка.