Аналоговый порт в цифровой, PORTF сопротивляется, помогите победить!
- Войдите на сайт для отправки комментариев
Чт, 16/11/2017 - 08:48
Здравствуйте, уважаемые ардуинщики и АВР-щики!
В работе с Leonardo (ATmega32U4) возникла необходимость использовать порт F цифровым выходом. Как только ни пытался его настроить:
DDRF = B11111111;
DDRF = DDRF | B11110011; (на всякий случай, в нём нет PF2, PF3)
pinMode(PORTF, OUTPUT);
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);
pinMode(A5, OUTPUT);
делаю тренировочный оператор:
PORTF = B10101010;
получаю: 11111110
В ходе анализа пришёл к выводу, что PF0 и PF1 рабоают правильно, а вот, что старше, - тупо пишет "1".
Что за хрень, ёрш его медь?..
Спасибо.
На этом же порту JTAG висит если память не изменяет. Возможно он мешает своей подтяжкой, отключите для проверки.
UPD: хотя в файле боардс фьюзы такие что JTAG отключен вроде. Но я бы проверил. На меге2561 у меня аналоговые входы/выходы как цифровые работают нормально.
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);.....?
PF7-14-PF4-17, PF1-18, PF0-19
делаю тренировочный оператор:
PORTF = B10101010;
получаю: 11111110
В ходе анализа пришёл к выводу, что PF0 и PF1 рабоают правильно, а вот, что старше, - тупо пишет "1".
Чем "получаю" ?? Залейте это для проверки:
void setup() {DDRF=0xFF;} void loop() { PORTF^=0xFF; delay(1000); }И тестером/светодиодом на каждом А0-А5 проверьте что напряжение появляется раз в секунду. Если нет -то порты ваши палёные.
Во, а можно я тоже присоединюсь? Всем привет. Есть такой вопрос, собираю делитель импульсов с делением от 1 до 100, скетч простенький получился и даже как ни странно работает... Но захотелось его (делитель) сделать так чтоб коэфицент деления можно было менять без участия компьютера-нубука-планшета и прочего, поскольку делал на нано, портов свободных хватает, решил на аналоговые порты влупить переключатель 0-1 на 10 каналов, на как раньше на материнских платах стояли, смысл примерно такой по входам А0-А7 устанавливать переключателем коэфицент деления в двоичке, типа 4 это 00000100, при старте ардуины считывать это значение (во время работы не изменяется) и использовать его для подставки в деление. Не скажу что перерыл весь интернет, но найти не смог как считать полученные на порту нули и еденицы одним байтом? И как его потом в деление запихнуть, там же выражение должно быть В00000100? или надо пересчитывать в десятичку и считывать побитно?
Заранее бланрдарен.
Ух как букав много сегодня.
SergC4, A0-A5 - это PORTC, а A6 и A7 - входы число аналоговые, как цифровые не конфигурируются. Так что 1 бит (для коэффициента до 100 достаточно 7 битов) нужно будет взять с какого-то другого порта. Например 6 пин PORTD. В десятичке, естественно, ничего считать не нужно: взять И по маске и объединить по ИЛИ.
взять И по маске и объединить по ИЛИ.
Блин.... не понял, можно носом в ссыль?
Навскидку:
byte dividor = (PORTC & 0x3F) | (PORTD & 0x40);
Нули кажет в мониторе.
Разобрался
byte divider = (PINC & 0x3F) | (PIND & 0x40);
andriano, спасибо.