ilya73 писал(а):Модифицировал "часики" - ежесекундное обновление.
Вроде работает, но насколько корректно/правильно?
- Код: Выделить всё
: timer-int-isr
-timer \ NEW!
time@
2 2 oled96.settextxy
#stamp count oled96.putstring
0 TCNT1H c! \ NEW!
0 TCNT1L c! \ NEW!
+timer \ NEW!
;
1. В данном случае удобнее использовать
Timer1 в режиме
15.9.2 Clear Timer on Compare Match (CTC) Mode. В этом режиме счетчик
TCNT1 инкрементируется до совпадения с содержимым либо
OCR1A (
WGM13:10=4) либо
ICR1 (
WGM13:10=12), затем сбрасывается в $0000. Соответственно устанавливается флаг прерывания: либо
OCF1A либо
ICF1. Для этих целей так же возможно использовать
Watchdog Timer в режиме интервального таймера. Или, как вариант, можно использовать внешнее прерывание от
ds1307 - пин
SQW/OUT.
2. Обновление и индикация времени в процедуре обработки прерывания...нуу низнаю, как бы некомильфо такой объемный код выполнять при обработке прерываний. Можно завести какую-нибудь флаг-переменную (семафор), как-то так:
- Код: Выделить всё
: time-update
time@ 2 2 oled96.settextxy
#stamp count oled96.putstring
;
variable пора false пора !
: уже? пора @ ;
: все! false пора ! ;
: уже! true пора ! ;
: timer-int-isr
...
уже!
...
;
\ бесконечный цикл
: какоето-имя
begin pause уже? while time-update все! again
;
Применение
multitasker'а позволяет по-другому решить ту же задачу. Прерывание по таймеру будет "пробуждать" задачу, например:
time-update-task task-awake. Задача, отработав, будет "засыпать" (
stop). Аналогичным образом
multitasker позволит решить проблему с приемом информации от RFID reader'а. Вкратце: при поступленни прерывания по внешнему входу (от ридера) - все активные (обновление времени, опрос датчиков, еще что-то) задачи (task'и) переводятся в неактивный режим (sleep), запрещаются все прерывания, кроме одного - от ридера, индицируется готовность системы к считыванию карты (необязятельно), меняется вектор прерывания от ридера на другой (soft-rx RFID reader), запускается сторожевой таймер в интервальном режиме ( 4-8 секунд достаточно) - не забыть разрешить прерывания от сторожевого таймера. Далее, по тому же прерыванию ( от ридера) происходит прием информационного пакета программным способом (в процессе можно сбрасывать сторожевой таймер - на всякий случай). Если пакет принят - останов сторожевого таймера, запрет прерываний от него, обработка принятого пакета, затем - все восстанавливаем, как было: выключаем индикацию, восстанавливаем прежний вектор прерывания от ридера, разрешаем потребные прерывания. Если в отведенное время пакет не принят ( произошло прерывание от сторожевого таймера) - делаем все тоже самое, кроме обработки пакета
И все возвращается на круги своя...
Ну да, для того чтобы RFID reader сработал, необходимо дважды подносить карточку - но другое решение: взять дополнительно какую-нибудь тиньку и озадачить ее исключительно на работу с RFID ридером...нуу тоже можно, конечно...
Собственно говоря - это ты должен подробно описать функционирование системы, которую строишь...( ТЗ называется - очень помогает наличие такого документа)
Хотелось бы добавить - без изучения технической литературы - никуда!
Одна из многих книг по AVR ATmega
http://padabum.com/d.php?id=2819go forth