Аналоговый порт в цифровой, PORTF сопротивляется, помогите победить!

Peotr
Peotr аватар
Offline
Зарегистрирован: 17.02.2014

Здравствуйте, уважаемые ардуинщики и АВР-щики!

В работе с 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".

Что за хрень, ёрш его медь?..

Спасибо.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

На этом же порту JTAG висит если память не изменяет. Возможно он мешает своей подтяжкой, отключите для проверки.

UPD: хотя в файле боардс фьюзы такие что JTAG отключен вроде. Но я бы проверил. На меге2561 у меня аналоговые входы/выходы как цифровые работают нормально.

andrikll
Offline
Зарегистрирован: 04.08.2013

pinMode(14, OUTPUT);

pinMode(15, OUTPUT);.....?

PF7-14-PF4-17, PF1-18, PF0-19

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

Peotr пишет:

делаю тренировочный оператор:

PORTF = B10101010;

получаю: 11111110

В ходе анализа пришёл к выводу, что PF0  и PF1 рабоают правильно, а вот, что старше, - тупо пишет "1".

Чем "получаю" ?? Залейте это для проверки:

void setup() {DDRF=0xFF;}
void loop() {
PORTF^=0xFF;
delay(1000);
}

И тестером/светодиодом на каждом А0-А5 проверьте что напряжение появляется раз в секунду. Если нет -то порты ваши палёные.

SergC4
Offline
Зарегистрирован: 18.10.2017

Во, а можно я тоже присоединюсь? Всем привет. Есть такой вопрос, собираю делитель импульсов с делением от 1 до 100, скетч простенький получился и даже как ни странно работает... Но захотелось его (делитель) сделать так чтоб коэфицент деления можно было менять без участия компьютера-нубука-планшета и прочего, поскольку делал на нано, портов свободных хватает, решил на аналоговые порты влупить переключатель 0-1 на 10 каналов, на как раньше на материнских платах стояли, смысл примерно такой по входам А0-А7 устанавливать переключателем коэфицент деления в двоичке, типа 4 это 00000100, при старте ардуины считывать это значение (во время работы не изменяется) и использовать его для подставки в деление. Не скажу что перерыл весь интернет, но найти не смог как считать полученные на порту нули и еденицы одним байтом? И как его потом в деление запихнуть, там же выражение должно быть В00000100? или надо пересчитывать в десятичку и считывать побитно?

Заранее бланрдарен.

Ух как букав много сегодня.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

SergC4, A0-A5 - это PORTC, а A6 и A7 - входы число аналоговые, как цифровые не конфигурируются. Так что 1 бит (для коэффициента до 100 достаточно 7 битов)  нужно будет взять с какого-то другого порта. Например 6 пин PORTD. В десятичке, естественно, ничего считать не нужно: взять И по маске и объединить по ИЛИ.

SergC4
Offline
Зарегистрирован: 18.10.2017

andriano пишет:

взять И по маске и объединить по ИЛИ.

Блин.... не понял, можно носом в ссыль?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Навскидку:

byte dividor = (PORTC & 0x3F) | (PORTD & 0x40);

SergC4
Offline
Зарегистрирован: 18.10.2017

Нули кажет в мониторе.

SergC4
Offline
Зарегистрирован: 18.10.2017

Разобрался 

byte divider = (PINC & 0x3F) | (PIND & 0x40);

andriano, спасибо.