PINx не читает порт на леонардо
- Войдите на сайт для отправки комментариев
Втр, 21/05/2019 - 23:46
#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 прекрасно читает.
пробовал так
if не срабатывает
есть идеи?
Читает. Судя по скетчу на пине 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); }Да, не, Дим, там задержки не хватает между строками 14 и 15, я дал ТС ссылку на даташит, пусть читает.
Читает. Судя по скетчу на пине 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);это весь код и выводит
то что ноль не обнуляет я разобрался там леды для сериала, сами ноги сериала , другие датчики и т.п. НО вот почему PIN и PORT дают разные результаты ?
плюс я настраивал датчик, МК ни как не хотел видить его уровни (это все было в этот же день) я вспомнил про эту особеность порт/пин. поменял в коде PORT на PIN и МК увидел единицу от датчика. я всегда считал что у них должен быть один результат.
Посмотрите схему включения портов в мануале на процессор. PIN и PORT это совершенно разные регистры. Частный случай когда порт настроен на вывод, то PIN соединён с PORT и читает его состояние, соответственно они равны. Во остальных случаях как получится.
nik182, получается никакими програмными фишечками мы не можем сделать (в реальном проекте где вход/выходы всё в разных состояниях), не можем сделать и не можем гарантировать что порт и пин выдадут одинаковый результат ? мы должны принять за данность чо они на 99% будут иметь разный результат?
Одинаковые данные в разных (!) регистрах ситуация случайная. В рамках рассматриваемых процессоров это входной и выходной регистры, внутренние подключение которых определяется текущей конфигурацией выходного порта. Читая PORT вы получаете информацию о том какой будет уровень выходного сигнала, когда нога МК будет сконфигурирована как выход. Ничего более. Никакой информации о состоянии ноги МК получить невозможно читая PORT.
Весело тут у вас!
PINx - регистр для чтения. PORTx - для записи. Если ты читаешь PORTx и придаешь прочитанному какой-то смысл - это твои личные половые проблеммы... ну может не проблемы, а радости, кто ж тебя знает?
ДШ ничего не утверждает и никак не определяет смысл содержимого PORT, кроме того, что сам автор туда запихнул. Так доходчиво?
Это слишком утрировано. Для записи, для чтения... В PIN можно записать, но вот результат записи может очень удивить. В мануале показано, что чтение PORT читает регистр-защёлку выходного буфера, за буфером стоит шинный усилитель. Так что точка из которой читают сигнал PORT никак не связяна с выходной ногой МК. Но чтение PORT всегда дает байт, который в PORT записан. Видел программы, в которых это использовалось как дополнительная ячейка памяти.
Это слишком утрировано. Для записи, для чтения...
Это не тебе было;)))) А ТСу не нужно говорить сложнее.... мееедленно и по сло-гам. ;))
Там даже пример есть
вот блин графики, таблицу видел а сам код не посмотрел . ну всеравно пришёл к тому же и без ДШ. ну правда в ноп-ом в 4мс.
nik182, другими словами вы хотите сказать что PORT не прочтёт уровни с ног настроенных на вход? только с ног на выход
wdrakula ,ДШ утверждает что можно и пином записывать и портом читать, да.
дракула , я тебе что дорогу перешел? нафига эти коментариями не относящиеся к теме
Вот проведи пальчиком по схеме и попробуй найти путь от ноги MK до регистра PORT. Я думаю если прочитать мануал на МК то таких глупых вопросов не будет.
wdrakula ,ДШ утверждает что можно и пином записывать и портом читать, да.
Опять "дискутируешь" :-)))))
Смешной ты парень!
nik182, другими словами вы хотите сказать что PORT не прочтёт уровни с ног настроенных на вход? только с ног на выход
Ненадо мне припысывать больше чем я сказал. Прочитай внимательно, что я писал и осознай, что картина мира отличается от сложившейся в твоей голове. На приведенной выше схеме ясно видно, что нога процессора не соединина ни с PORT ни с PIN. Между PORT и ногой стоит шинный формирователь с возможностью трерьего Z состояния выхода. Через него в обратном направлении от ноги МК до PORT никакие сигналы пройти не могут.
Между ногой и PIN стоит аж 3 устройства - тоже сигнал попадает не сразу в PIN а после обработки и теоретически значение PIN может не соответствовать значению уровня сигнала на ноге процессора, правда только короткое время обработки и синхронизации.
#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); } }впринципе выводит нам одинаковый результат
ногой и PIN стоит аж 3 устройства - тоже сигнал попадает не сразу в PIN а после обработки и теоретически значение PIN может не соответствовать значению уровня сигнала на ноге процессора, правда только короткое время обработки и синхронизации.
а ну теперь понятно. вы как раз про эту задержку синхронизации. а то я понял ваш первый пост в разнесенные во времени промежутке мы можем иметь разные значения на PORTB и PINB. получается они должны быть равны после устаканивания сигналов.
но тогда возращаемся к моему вопросу. почему на ноге настроенной как INPUT LOW.
PIN читал входящую единицу
а PORT не видел ?
ворта непойму ты чего хочешь то?
Не может быть настройки INPUT LOW. Нет такой опции. Входной сигнал можно изменить только соединяя ногу (!!!) МК с землёй (LOW) или c питанием(HIGH). Программно ногу процессора настроенную на вход и соединённую с другим источником сигнала невозможно запрограмировать в LOW или HIGH.
ворта непойму ты чего хочешь то?
Уже ничего :( Поначалу хотел что-то тебе объяснить, даже ссылку на даташит дал и страницу указал, но понял, что медицина бессильна и теперь просто хрущу попкорном и наблюдаю мучения бедняги nik182
теперь просто хрущу попкорном и наблюдаю мучения бедняги nik182
-- Подвинься! У меня пиво и орешки, - Будешь?
PINx не читает порт на леонардо
Ворота за линк спасибо. Дш подтвердил правильность моей мысли о задержке. ответа почему порт не видит единицу не нашел. Ну а далее что за выпады в мою сторону? И дракула тудаже. Вы не по тролив новичка не можете жить на белом свете?
Nik182, input LOW я имею ввиду начальное состояние. Pull down. Ждем единицу. Приходит единица PINx видит. Portx не видит. Почему?
Хотя мы пришли к тому что результат должен быть одинаковый
третий год одно и то же. Ты не новичок, ты дебил, которому бесполезно учиться. Дебил читает по 20 раз и все равно не понимает. И вот доказательство:
nik182 написал: в обратном направлении от ноги МК до PORT никакие сигналы пройти не могут.
alexbnd опять нифига не понял: Portx не видит. Почему? Хотя мы пришли к тому что результат должен быть одинаковый
Ответь мне пожалуйста на вопрос. Развёрнуто. По блокам на схеме ноги процессора. Почему и как PORTx должен видеть единицу? Какой путь на схеме единицы от ноги процессора до PORTx? Почему у тебя в голове живёт уверенность что есть состояние PULL DOWN? Для AVR это состояние можно создать только ВНЕШНИМ(!) резистором. Внешние воздействия на PORTx никак не влияют. Мы не приходили к выводу что результат должен быть одинаковый. Тебе уже несколько раз сказали что этого быть может только случайно. Никаких связей при настроенной на вход ноге МК нет, кроме управления pull up резистором.
Ответь мне пожалуйста на вопрос. Развёрнуто. По блокам на схеме ноги процессора. Почему и как PORTx должен видеть единицу?
Это тебя просят ответить, почем не видит, а ты вопросом на вопрос - нехорошо :)
Nik182, причем тут моя голова, да есть пулап пуллдаун. Может прежде чем плеваться спокойно подумаете. Яж не говорил что я это программно сделал. Да поставил резистор. А что так нельзя было? Плюс программно мы же можем послать единицу на вход и тем самым инициализировать программно прерывание например. И по диаграмме я не специалист но линия ине одна от датабас идет к портх. Можете не отвечать если это вас заставляет нервничать
B707, по себе судишь? Иди оскорбляй своих родных и близких. Я уже говорил тебе и остальным выпендрежникам - не умеете спокойно выразить свою мысль - проходите мимо. Вот когда задам свой вопрос в разделе флуд - тогда можете блеснуть своим воспитанием. А тут раздел программирование и не относящиеся к теме сообщения держите при себе.
Bwn, кмк нужно ваше внимание к некоторыми персонажам
Прерывание можно вызвать только запрограмировать ногу как ВЫХОД. После записи в регистр DDR. Если нога запрограмирована на ВХОД никакими программными ухищрениями прерывание сгенерить невозможно. В том числе записью единицы в регистр PORTx. Если нога сконфигурирована на ВЫХОД то никакие pull down - pull up не работают и регистр PINx содержит точно такое же значение как и PORTx. Т.е. в режиме ВЫХОД снаружи , от ноги МК, влиять на регистр PINx невозможно.
Ник спасибо.
протестировал сейчас все варианты.
если делать программно , то что установили то и читается причем одинаково хорошо и через PINx и через PORTx и результаты совпадают. выставил на инпут единицу так и прочиталось. ну и любые другие варианты.
а вот если железно влиять на инпут то PORTx берет значение с утановки этого пина. например инпут лоу. то PORTx будет 0 а вот PINx читает реально что на инпуте из вне.
да интересная петрушка.