Клеммы, реле, разъемы Degson со склада в России

Счетчик событий Attiny2313

Страница 1 из 2
Знаток
 
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
105 143
4 0
 
03.05.2012 20:58 #1
чето я запутался,
Что-то я забыл указать, или где-то накосячил. В протеусе модель не работает. После трех нажатий на портах долно установиться лог. 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
Я пока только начинаю изучать программирование так что
Оценка
Новичок
 
Аватар для BOB51
 
Регистрация: 25.11.2008
Адрес: ДОНЕЦК
Сообщений: 313
Репутация: 58
48 13
0 0
 
05.05.2012 00:10 #2
кнопки обычно "зудят" , а на входе таймера ... фильтра точно нет
можно попробовать программный фильтр с передачей значения опять же программно на счетный вход или через
аппаратный r-s (d)триггер (триггер шмитта не всегда выручает)да и протеус... можно и в симуляторе студии поглядеть
Оценка
Новичок
 
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
10 1
0 0
 
05.05.2012 14:39 #3
Да тут далеко до антидребезга. Во-первых нет основного цикла программы собствеено, где отслеживается нажатие, поэтому после того, как счётчик прогонит все адреса контроллер повиснет. Во-вторых задержка организована не совсем правильно, сравнение есть, а вот команды пропуска перехода на метку Р нет. В результате программа все время крутится в метке Р не реагируя на всё. Под рукой отладчика пока нет. И зачем вам там таймер?
Последний раз редактировалось С.М.С; 05.05.2012 в 15:43.
Оценка
Знаток
 
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
105 143
4 0
 
05.05.2012 19:44 #4
Тут об дребезге пока не ведется разговор. Для обработок кнопок я смотрел надо использовать таймер-счетчик типа А, используют в клавиатуре. Эта модель чисто для учения программирования. Я незаморачивался над обработками кнопок.
С.М.С по вашему совету, я понял что при использовании такого вида задержки, таймер не будет работать? Надо наверно использовать в качестве задержки что-то вроде счетчика?
BOB51 извини, но я чесно говорю, что пока незнаю о програмных фильтрах. Буду искать. Спасибо за ответы!
Оценка
Новичок
 
Регистрация: 29.06.2009
Сообщений: 101
Репутация: 20
10 1
0 0
 
05.05.2012 22:17 #5
Если я правильно понял, то вам надо отследить три нажатия кнопки на линии PD5 и после третьего нажатия установить высокий уровень. Если так, то тут совсем не надо использовать таймер. И ассемблер не язык высокого уровня, здесь нет автоматического опроса кнопок и выводов.

Кстати в соседней теме "обсуждается" книга Юрия Ревича "Практическое программирование микроконтроллеров Atmel AVR на языке ассемблера", как раз то, что вам надо.
Последний раз редактировалось С.М.С; 05.05.2012 в 22:35. Причина: косяк
Оценка
Знаток
 
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
105 143
4 0
 
05.05.2012 22:34 #6
Цитата:
Сообщение от С.М.С
Если я правильно понял, то вам надо отследить три нажатия кнопки и после третьего нажатия установить высокий уровень на линии PD5? Если так, то тут совсем не надо использовать таймер. И ассемблер не язык высокого уровня, здесь нет автоматического опроса кнопок и выводов.
Вот я нашол похожий пример в книге. Только здесь по другому настраиваются порта, и есть режим sleep. Я думаю этот режим не обязательно включать. Аглоритм практически одинаков. В моделе все работает, в этом примере приведен контроллер 8515.
Код:
.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
10 1
0 0
 
05.05.2012 22:45 #7
В вашем примере, после настройки портов и таймера, контроллер переходит в режим "сна", а пробуждение происходит по переполнению таймер счётчика. В верхнем же листинге вы хотите считать количества нажатия кнопки, можете в качестве тренировки использования таймера, применить задержку на 1 секунду горения светодиода, после нажатия кнопки.
Оценка
Знаток
 
Регистрация: 06.12.2009
Сообщений: 824
Репутация: 114
105 143
4 0
 
06.05.2012 10:03 #8
Цитата:
Сообщение от С.М.С
В вашем примере, после настройки портов и таймера, контроллер переходит в режим "сна", а пробуждение происходит по переполнению таймер счётчика. В верхнем же листинге вы хотите считать количества нажатия кнопки, можете в качестве тренировки использования таймера, применить задержку на 1 секунду горения светодиода, после нажатия кнопки.
Последовал вашему совету и все заработало. Регистровую задержку пришлось убрать. Вместо нее поставил nop. Но это не очень хороший выход. Все-таки задержку надо делать хотяб на том же таймере.
Результат работы: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
10 1
0 0
 
06.05.2012 11:15 #9
Цитата:
Сообщение от схемопай
Все-таки задержку надо делать хотяб на том же таймере.
Это смотря что вы делаете. Если надо отсчитать точные промежутки времени во время, когда контроллер занят другими операциями или если используется режим энергосбережения то да. А если алгоритм линейный, и питания достаточно, то смысла с таймерами нет. В коде выше, у вас тактирование таймера внешнее. Таким путём можно было использовать прерывание на линии PD3, код был бы намного короче. В общем это не совсем типичное использование таймера
Оценка
Новичок
 
Аватар для BOB51
 
Регистрация: 25.11.2008
Адрес: ДОНЕЦК
Сообщений: 313
Репутация: 58
48 13
0 0
 
07.05.2012 13:34 #10
можно и таймер использовать ...
но тогда таймер считает "условные единицы" то внутреннего предделителя, а включение/выключение счета производит входной сигнал (или в аврках еще приятне - режим защелки данных)
затем сравниваем полученное "уе" с эталонными значениями - имеем не только количество воздействий, но и их "качество" выражаемое в значениях "уе" ;-)
Оценка
Ответ
Страница 1 из 2
Похожие темы
Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход
Электронные компоненты. Скидки 15%, кэшбэк 15% и бесплатная доставка от ТМ Электроникс
Часовой пояс GMT +3, время: 01:51.
Обратная связь РадиоЛоцман Вверх