 |
|
|
|
| Автор |
Сообщение |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 23 Ноя 2006, 9:51 Заголовок сообщения: |
|
|
Вот словесный алгоритм, который я разработал
Инициализируем 2 порта
PB0 - выход (для светодиода)
PB1 - вход (для кнопки)
Моргаем светодиодом с частотой 1 раз в 5 секунд (все данные из задания №2).
При возникновении напряжения (кнопка нажата) на входе PB1 начинаем моргать
с частотой 1 раз в секунду. Если отпускаем кнопку, снова моргаем 1 раз в 5 секунд.
Кнопка подключается к выходу VCC и входу PB1.
Вопросы:
1. Как смоделировать нажатие кнопки? (для демонстрации работы в VMLab).
|
|
| Вернуться к началу |
|
 |
Alexx Знатный посетитель (>20)


Зарегистрирован: 25.09.2006 Сообщения: 49 Откуда: Украина, Киев
|
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 23 Ноя 2006, 15:35 Заголовок сообщения: |
|
|
Работа с кнопкой.
| Код: | #include <90s2313.h> //подключаем библиотеку работы с микроконтроллером
interrupt [TIM1_OVF] void timer1_ovf_isr(void) //описываем прерывание
{
TCNT1H = 0xb3; // задаем время для
TCNT1L = 0xb5; // таймера/счетчика 1
// выполняемый код
PORTB = PORTB ^ 1;// инвертируем последний бит порта
}
void main(void) {
DDRB = 0x01; // определяем направление (выход)
PORTB = 0x02; // загорается светодиод
TCCR1A = 0x00; TCCR1B = 0x02; // устанавливаем параметры счетчика
TCNT1H = 0xb3; TCNT1L = 0xb5; // устанавливаем временной интервал
OCR1H = 0x00; OCR1L = 0x00; // устанавливаем регистр совпадения
TIMSK = 0xB0; // разрешаем прерывание от таймера/счетчика 1
PORTB = 0x01; // светодиод гаснет
#asm ("SEI"); // разрешаем прерывания
while (1) {
if (PINB&0x02) TCCR1B =0x02; //проверяем второй бит порта B,если 1, то оставляем тот же период мерцания
else { // если второй бит равен 0,
TCCR1B =0x01; // изменяем частоту мерцания
PORTB=PORTB^0x02;
PORTB=PORTB^0x02;
} //else
} // запускаем бесконечный цыкл
} //main |
Для демонстрации нажатия кнопки в файле проекта необходимо прописать строчку
Эта строка подключает кнопку "1" на панели "Control Panel".
| Описание: |
|
 Файлообменник |
| Название файла: |
Third.rar |
| Размер файла: |
17.99 KB |
| Скачено: |
241 раз(а) |
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 23 Ноя 2006, 16:18 Заголовок сообщения: |
|
|
хитрО! Я разные варианты реализации ждал увидеть ... но управлять делителем честоты вх. импульсов не додумался.
И еще ... расскажи для чего в главном цикле строки
| Код: |
PORTB=PORTB^0x02;
PORTB=PORTB^0x02;
|
небольшие замечания
0
| Код: |
PORTB = 0x02; // загорается светодиод
|
Здесь не светодиод загорается, а подтянгивающий резистор включается, ибо вывод у тебя сконфигурирован как вход.
1 А еще подскажи как модернизировать алгоритм, дабы при отпущеной кнопке моргалка моргала 1Гц, а при нажатой - 0,75 Гц.
| Код: |
TCCR1A = 0x00; TCCR1B = 0x02; // устанавливаем параметры счетчика
PORTB = PORTB ^ 1;// инвертируем последний бит порта
|
Намного информативней было бы
| Код: |
TCCR1A = 0x00; TCCR1B = 0x02; // TC1 PWM-off, CK/8
PORTB = PORTB ^ 1; // переключение светодиода
|
То что в строке устанавливаются параметры счетчика и так ясно ... а вот какие параметры!? Намного легче читать, однако.
2 Приучитесь сразу к определенному форматированию текста - намного меньше глупых ошибок будет. Работать то будет и в одной строке всё, а вот читать и вникать намного легче, когда блоки выровнены
_________________ AndryG
Последний раз редактировалось: AndryG (23 Ноя 2006, 17:16), всего редактировалось 3 раз(а) |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 23 Ноя 2006, 16:24 Заголовок сообщения: |
|
|
| AndryG писал(а): |
И еще ... расскажи для чего в главном цикле строки
| Код: |
PORTB=PORTB^0x02;
PORTB=PORTB^0x02;
|
|
Это для того чтобы при отпускании клавиши установить 2-ой бит PINB
Не додумался до лутшего варианта
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 23 Ноя 2006, 16:34 Заголовок сообщения: |
|
|
Эти две строки просто "передергивают" внутренний подтягивающий резистор.
Какой с этого толк? Нужно в самом начале устновить этот бит, тем самым подключив подтягивающий резистор, и больше его не нужно трогать.
Как только кнопка будет отпущена, вход B.2 будет подтянут к питанию внутренним резистором и на нем установится единица... так я считал и читал ... попробовал в симуляторе - нет! - вывод сидит в нуле и с подключенным внутренним подтягивающим. Может кто объяснит где глюк: в симуляторе или в голове.
А пока, дабы заработало твое творение без извратов ... давай подключим внешний подтягивающий резистор в VMLABе ...
| Код: |
K1 VSS PB1 ;Кнопка
R2 VDD PB1 4700 ;Подтягивающий резистор
|
... и в окне Scope всё здорово начнет плясать.
На счет подтягивающих резисторов... Если в схеме возможны большие помехи, то надеятся на внутренние резисторы не стоит - их сопротивление доволно большое и слабо "тянет" к плюсу .. лучше поставить внешние на несколько кОм, что усилит помехозащищенность конструкции.
_________________ AndryG
Последний раз редактировалось: AndryG (23 Ноя 2006, 17:22), всего редактировалось 2 раз(а) |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 23 Ноя 2006, 16:43 Заголовок сообщения: |
|
|
После отпускания кнопки, второй бит PINB не устанавливается. Поэтому пришлось прибегать к такой вот фишке.
Попробуйте закоментаровать эти две строчки и увидите результат
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 23 Ноя 2006, 17:19 Заголовок сообщения: |
|
|
Попробуйте убрать эти две строки, подключить подтягивающий резистор
| Код: |
R2 VDD PB1 4700 ;Подтягивающий резистор
|
У увидите результатъ
_________________ AndryG |
|
| Вернуться к началу |
|
 |
tellurian Частый гость (>5)

Зарегистрирован: 15.11.2006 Сообщения: 15
|
Добавлено: 24 Ноя 2006, 10:17 Заголовок сообщения: |
|
|
Подскажите пожалуйста. Существует ли документация (окромя хэлпа) по VMLab?
|
|
| Вернуться к началу |
|
 |
AndryG Модератор
Зарегистрирован: 24.07.2006 Сообщения: 411 Откуда: Helios-3
|
Добавлено: 24 Ноя 2006, 11:05 Заголовок сообщения: |
|
|
Я, лично, не видел ...
А что тебя интересует? Программа простая, я ее немного знаю, Alexx ее хорошо знает, может другие подключатся ... спрашивай - ответим ... так и сделаем "документацию".
С включением подтягивающего резистора в VMLABe получилось без тех двух строк нормальной работы добится?
И еще... на счет 1 и 0,75 Гц
У меня идея такова... настраиваем таймер на 0,25 сек.
Если кнопка отжата, то переключаем светожиод каждый четвертый тик, если нажата - каждый пятый.
Чем, на мой взгляд, такой вариант хорош... в дальней можно уменьшить время "тикания" таймера и в его обработчике сканировать клавиатуру, обрабатывать дребезг, управлять индикацией и т.д. ... если некоторые действия нужно выполнять реже, то просто выполняем их не каждый тик, а каждый N-ый.
Я, например, ставлю один таймер на определенной время. В отдельной переменной (байт) каждый бит у меня указывает на определенный режим работы .. своеобразный флаг. Пототом по этим флагам включаем индикацию ... если бит поднят, то переключаем светодиод каждый сотый раз... иначе каждый 50-ый. Так получаем различные варианты индикации и т.д.
_________________ AndryG |
|
| Вернуться к началу |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах Вы не можете добавлять вложения в этом форуме Вы можете просматривать вложения в этом форуме
|
|