Знаток
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
|
чето я запутался,
Что-то я забыл указать, или где-то накосячил. В протеусе модель не работает. После трех нажатий на портах долно установиться лог. 1. Код:
.include "2313def.inc" .def temp = r16 .org $0000 rjmp reset .org $0006 rjmp timer0_ovf reset: ldi temp, RAMEND out SPL, temp ldi temp ,0b11111111 ;порт В - на выход out DDRB,temp ldi temp,0b0010000 ; PD4(T0) - на вход out portd,temp ;***************************************************** ;настройка таймера Т0 на режим счетчика событий ldi temp,0b00000010 ;разрешение прерывания out TIMSK,temp ;по переполнению Т0 ldi temp,0b00000111 ;инкримент счетчика происх. out TCCR0,temp ;по нарастанию фронта sei ldi temp,0xFD ; отсчет 3-х нажатий out TCNT0,temp ;************************************************* ;после 3- нажатий на линии подать 1 timer0_ovf: clr temp out portb,temp rcall delay ser temp out portb,temp ldi temp,0xFD out TCNT0,temp reti delay: ldi r20, 100 p: dec r20 cpi r20,0 rjmp p ret |
||
Оценка
|
Новичок
Регистрация: 25.11.2008
Адрес: ДОНЕЦК
Сообщений: 313
Репутация: 58
|
кнопки обычно "зудят" , а на входе таймера ... фильтра точно нет
можно попробовать программный фильтр с передачей значения опять же программно на счетный вход или через аппаратный r-s (d)триггер (триггер шмитта не всегда выручает)да и протеус... можно и в симуляторе студии поглядеть |
||
Оценка
|
Новичок
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
|
Да тут далеко до антидребезга. Во-первых нет основного цикла программы собствеено, где отслеживается нажатие, поэтому после того, как счётчик прогонит все адреса контроллер повиснет. Во-вторых задержка организована не совсем правильно, сравнение есть, а вот команды пропуска перехода на метку Р нет. В результате программа все время крутится в метке Р не реагируя на всё. Под рукой отладчика пока нет. И зачем вам там таймер?
Последний раз редактировалось С.М.С; 05.05.2012 в 15:43.
|
||
Оценка
|
Знаток
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
|
Тут об дребезге пока не ведется разговор. Для обработок кнопок я смотрел надо использовать таймер-счетчик типа А, используют в клавиатуре. Эта модель чисто для учения программирования. Я незаморачивался над обработками кнопок.
С.М.С по вашему совету, я понял что при использовании такого вида задержки, таймер не будет работать? Надо наверно использовать в качестве задержки что-то вроде счетчика? BOB51 извини, но я чесно говорю, что пока незнаю о програмных фильтрах. Буду искать. Спасибо за ответы! |
||
Оценка
|
Новичок
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
|
Если я правильно понял, то вам надо отследить три нажатия кнопки на линии PD5 и после третьего нажатия установить высокий уровень. Если так, то тут совсем не надо использовать таймер. И ассемблер не язык высокого уровня, здесь нет автоматического опроса кнопок и выводов.
Кстати в соседней теме "обсуждается" книга Юрия Ревича "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера", как раз то, что вам надо.
Последний раз редактировалось С.М.С; 05.05.2012 в 22:35.
Причина: косяк
|
||
Оценка
|
Знаток
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
|
Цитата:
Код:
.include "8515def.inc" .def temp = r16 .org $000 rjmp reset .org $007 rjmp T0_OVF reset: ldi temp,low(RAMEND) out SPL,temp ldi temp,high(RAMEND) out SPH,temp clr temp out DDRB,temp ldi temp,0x01 out PORTB,temp ser temp out DDRD,temp out PORTD,temp ldi temp,0x20 out MCUCR,temp ldi temp,0x02 out TIMSK,temp ldi temp,0x07 out TCCR0,temp sei ldi temp,0xFE ;количество нажатий 256-254=2 out TCNT0,temp LOOP: sleep nop rjmp LOOP T0_OVF: clr temp out PORTD,temp rcall delay ser temp out PORTD,temp ldi temp,0xFE out TCNT0,temp reti delay: ldi r20, 100 lsl r20 p: dec r20 cpi r20,0 rjmp p ret |
||
Оценка
|
Новичок
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
|
В вашем примере, после настройки портов и таймера, контроллер переходит в режим "сна", а пробуждение происходит по переполнению таймер счётчика. В верхнем же листинге вы хотите считать количества нажатия кнопки, можете в качестве тренировки использования таймера, применить задержку на 1 секунду горения светодиода, после нажатия кнопки.
|
||
Оценка
|
Знаток
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
|
Цитата:
В вашем примере, после настройки портов и таймера, контроллер переходит в режим "сна", а пробуждение происходит по переполнению таймер счётчика. В верхнем же листинге вы хотите считать количества нажатия кнопки, можете в качестве тренировки использования таймера, применить задержку на 1 секунду горения светодиода, после нажатия кнопки.
Результат работы:http://www.youtube.com/watch?v=_Z0Lc...ature=youtu.be исходный код: Код:
.include "2313def.inc" .def temp = r16 .org $0000 rjmp reset .org $0006 rjmp timer0_ovf reset: ldi temp, RAMEND out SPL, temp ldi temp ,0b11111111 ;порт В - на выход out DDRB,temp ldi temp,0b0010000 ; PD4(T0) - на вход out portd,temp ;***************************************************** ;настройка таймера Т0 на режим счетчика событий ldi temp,0b00000010 ;разрешение прерывания out TIMSK,temp ;по переполнению Т0 ldi temp,0b00000111 ;инкримент счетчика происх. out TCCR0,temp ;по нарастанию фронта sei ldi temp,0xFD ; отсчет 3-х нажатий out TCNT0,temp ;************************************************* ;после 3- нажатий на линии подать 1 loop: nop sleep rjmp loop timer0_ovf: clr temp out portb,temp nop ser temp out portb,temp ldi temp,0xFD out TCNT0,temp reti |
||
Оценка
|
Новичок
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
|
Это смотря что вы делаете. Если надо отсчитать точные промежутки времени во время, когда контроллер занят другими операциями или если используется режим энергосбережения то да. А если алгоритм линейный, и питания достаточно, то смысла с таймерами нет. В коде выше, у вас тактирование таймера внешнее. Таким путём можно было использовать прерывание на линии PD3, код был бы намного короче. В общем это не совсем типичное использование таймера
|
||
Оценка
|
Новичок
Регистрация: 25.11.2008
Адрес: ДОНЕЦК
Сообщений: 313
Репутация: 58
|
можно и таймер использовать ...
но тогда таймер считает "условные единицы" то внутреннего предделителя, а включение/выключение счета производит входной сигнал (или в аврках еще приятне - режим защелки данных) затем сравниваем полученное "уе" с эталонными значениями - имеем не только количество воздействий, но и их "качество" выражаемое в значениях "уе" ;-) |
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |