Страница 1 из 1
Простейшая программа на Си
Добавлено: Пн мар 03, 2008 15:40:03
kasper
Хочу реализовать такую простую задачу на AVR:
1.При замыкании кнопкой PIND.0 на землю - на PINB.0 появляется минус (соответственно при размыкании кнопки исчезает)
2.При нажатой кнопке более 30секунд и дальнейшем удержании на PINB.0 должен появляется плюс.
Я совсем начинающий. Первый пункт сделать получается (PORTB.0=PIND.0) С временными интервалами вроде разобрался,но как реализовать второй пункт не доходит.
Добавлено: Пн мар 03, 2008 16:09:53
Томатный
if(кнопка нажата) {
Порт Б = низний уровень;
пауза(30сек);
if(кнопка нажата) Порт Б = высокий уровень;
}
наверно так.
Добавлено: Пн мар 03, 2008 16:48:20
tych
ИМХО не верно. Во время паузы кнопку могут и отпустить-с.
Добавлено: Пн мар 03, 2008 17:01:14
kasper
if(кнопка нажата) {
Порт Б = низний уровень;
пауза(30сек);
if(кнопка нажата) Порт Б = высокий уровень;
}
Проверил такой вариант не работает.Устройство так и должно работать:Кнопку должны отпустить в течении этих 30 секунд,если не отпустили или кнопка запала на PINB.0 должен быть восстановлен высокий уровень.
что то я забыл, алгоритмические схемы (где бы их найти) ?
Добавлено: Пн мар 03, 2008 17:50:03
MetEl
что то я забыл, алгоритмические схемы (где бы их найти) ?
Есть у когонить ссылко.
Я бвы так начал:
Имеем.
- ВХОД = 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;};
};
Може гдето и ошибся, т.к. дел не в проворот. Но, ничего исправлюсь.
Добавлено: Пн мар 03, 2008 18:15:07
Томатный
опередили меня, тоже думал такой алгоритм придложить

а зачем тут
else{a=0;PORTB.0=1;};
устанавливать PORTB.0=1; ? тогда Всегда порт Б будит 1 или как?
а если кнопку отключат на период, меньший чем период такта проца? шутка

Добавлено: Пн мар 03, 2008 18:17:53
MetEl
А где он 1 будет? (это вся программа, если я правильно ТЗ понял. Где + где лог 1 написана... Ну в общем, главное алгоритм... )
Я бы смотрел на время установки регистров МК и их опросов.
Добавлено: Пн мар 03, 2008 18:26:41
Томатный
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 << !!!
помоему это лишнее
или я что-то не догнал?
Добавлено: Пн мар 03, 2008 19:25:54
kasper
Всем спасибо.Сделал так как предложил 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;};
Теперь буду во всё это вникать и пытаться писать программу дальше.
Добавлено: Пн мар 03, 2008 21:04:10
MetEl
Томатный писал(а):***
или я что-то не догнал?
Там всёвремя просили 1-цу держать.
Иначе зачем её в ноль переводить, при нажатии клавиши?
kasper, рад что ты/вы сразу всё понял (???).
Возникла идея, а нет ли в колуарах Кота, некоего хранилища програмных решений. Ну типа, интересных подходов, скажем перевод в десятичную систему или ещё чтонибуть, антидребезг какойнить... каждый год ведь, одно и тоже спрашивают.
Добавлено: Пн мар 03, 2008 21:43:16
Томатный
MetEl писал(а):Томатный писал(а):***
или я что-то не догнал?
Там всёвремя просили 1-цу держать.
Иначе зачем её в ноль переводить, при нажатии клавиши?
сорри то я затупил, потом дошло, что так и просили

Добавлено: Пн мар 03, 2008 22:00:41
MetEl
я лишь хочу, всего лишь заметить... что:
Строчка "else{a=0;PORTB.0=1;}; - это не строчка а пункт, точнее шаг. Тут как в фахматах, предложил решение решение в два хода...
f(a>30 000 000){ // если а зашкалило - не зашкалило, а набрало. Ибо зашкалило это когда уже больше 4 294 967 295, для переменной unsigned long int.
И Порт Б = 1 << !!! сперва подумал, что это сдвиг... потом подумал на "как"?!
Ну это я просто, высказатся хочу... соррииии...