Хочу реализовать такую простую задачу на AVR:
1.При замыкании кнопкой PIND.0 на землю - на PINB.0 появляется минус (соответственно при размыкании кнопки исчезает)
2.При нажатой кнопке более 30секунд и дальнейшем удержании на PINB.0 должен появляется плюс.
Я совсем начинающий. Первый пункт сделать получается (PORTB.0=PIND.0) С временными интервалами вроде разобрался,но как реализовать второй пункт не доходит.
if(кнопка нажата) {
Порт Б = низний уровень;
пауза(30сек);
if(кнопка нажата) Порт Б = высокий уровень;
}
Проверил такой вариант не работает.Устройство так и должно работать:Кнопку должны отпустить в течении этих 30 секунд,если не отпустили или кнопка запала на PINB.0 должен быть восстановлен высокий уровень.
что то я забыл, алгоритмические схемы (где бы их найти) ?
Есть у когонить ссылко.
Я бвы так начал:
Имеем.
- ВХОД = PIND.0 (порт D, линия(бит) 0 (первая) настроен на вход данных, изначально присутствует (есть "пождтяжка") лог.1)
- ВЫХОД = PORTB.0 (порт В, линия 0, изначально лог 0)
Алгоритм. схема. (примерная, для начала...)
1.1 вкыл-сброс.
1.2. инициализация(кто я и что из себя представляю)
(на ВХОДе 1, на ВЫХОДе 0.)
2. Начало (постоянный(бесконечный) цикл)
2.1 опрос ВХОДа
присвоение ВХОДа за переменной и проверка условия
да (1)/(0) нет
да- вернутся на 2.1.
нет - " включить" счётчик.
проверить переменную счетчика,
условие более 30сек
да - выдать на ВЫХОД 1, вернуться на 2.1.
нет - выдать(установить) на ВЫХОД 0, вернутся на 2.1.
Реaлизация.
unsigned long int a; // какая тактовая частота ?
while(1){
if (!PIND.0){
a++;
if(a>30 000 000){ // допустим кварц на 1 МГц
PORTB.0=1;
a--; }
esle{PORTB.0=0; };
}
else{a=0;PORTB.0=1;};
};
Може гдето и ошибся, т.к. дел не в проворот. Но, ничего исправлюсь.
А где он 1 будет? (это вся программа, если я правильно ТЗ понял. Где + где лог 1 написана... Ну в общем, главное алгоритм... )
Я бы смотрел на время установки регистров МК и их опросов.
MetEl писал(а):А где он 1 будет? (это вся программа, если я правильно ТЗ понял. Где + где лог 1 написана... Ну в общем, главное алгоритм... )
Я бы смотрел на время установки регистров МК и их опросов.
if (!PIND.0){
a++;
if(a>30 000 000){ // если а зашкалило
PORTB.0=1; // то порт Б = 1
a--; }
esle{PORTB.0=0; }; // иначе 0
}
else{a=0;PORTB.0=1;}; // Если кнопка не была нажата, то а=0 И Порт Б = 1 << !!!
помоему это лишнее
Всем спасибо.Сделал так как предложил MetEl - всё работает так как нужно.Строчка "else{a=0;PORTB.0=1;}; " нужна,без неё при отпускании кнопки на PINB.0 остаётся логический 0.Вообщем сделал так:
while (1)
{if(!PIND.0){a++;if(a>4100000){PORTB.0=1;a--;}
else{PORTB.0=0;};}
else{a=0;PORTB.0=1;};
Теперь буду во всё это вникать и пытаться писать программу дальше.
Там всёвремя просили 1-цу держать.
Иначе зачем её в ноль переводить, при нажатии клавиши?
kasper, рад что ты/вы сразу всё понял (???).
Возникла идея, а нет ли в колуарах Кота, некоего хранилища програмных решений. Ну типа, интересных подходов, скажем перевод в десятичную систему или ещё чтонибуть, антидребезг какойнить... каждый год ведь, одно и тоже спрашивают.