Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2011, 17:57   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию AVR Atmega 128: Traffic light - как установить счетчик на таймер?

Добрый день!
Нужен добрый совет - в программе есть таймер, нужно чтобы он запускался подряд в одном случае 8 раз, в другом 4 раза. Граммотнее всего было бы свинтить 2 счетчика - один на 4 раза, другой на 8 раз. Я не знаю как это правильно написать. Или его возможно просто прописать несколькими rcall подряд?
И вообще посмотрите, насколько программа написана - идея очень простая - это обычный светофор с таймером. Изначально горит зеленый, нажали кнопку - загорелся желтый (таймер на 4 раза), потом красный (таймер на 8 раз), потом опять желтый (таймер на 4 раза), и опять все вернулось к зеленому.
Тестю пока на эмуляторе. Завтра сдавать в железе.... Поэтому конфигурация уже вся под железо - если был бы только эмулятор, я бы по-другому регистры порта настроила, так как я лучше понимаю)))

Код:
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler\Appnotes\m128def.inc"
.def tmp=r25

.cseg
.org 0
rjmp RESET
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop




RESET:

;**********************************************

ldi	tmp, (1<<TOIE0)
	out	TIMSK,tmp		
	sei				
	
; Создаем стек
	ldi	tmp,low(RAMEND)
	out	SPL,tmp
	ldi	tmp,high(RAMEND)	
	out	SPH,tmp
	clr	tmp	

	ldi	tmp,(1<<WDCE)|(1<<WDE)
	out	WDTCR,tmp		;Инифиализация сторожевого таймера

	ldi	tmp,(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
	out	WDTCR,tmp		; без команд wdr сброс каждые 2 секунды

	clt

;peremennqe dlja cvetov
ldi r17, 0b00111000; PORT setup
ldi r18, 0b00110000; Green
ldi r19, 0b00101000; Yellow
ldi r20, 0b00011000; ReD
ldi r21, 0b11111110; Maska 1


out DDRB, r17; конфигурируем порт
out PORTB, r17; изначально гасим лампочки
main:	wdr


out PORTB, r18
rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer

out PORTB, r19
rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer

out PORTB, r20
rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer

out PORTB, r19
rcall Timer
;rcall Timer
;rcall Timer
;rcall Timer

rjmp main


//Таймер 4 раза
d05ms: ;zaderzka na o,5 ms
;if 1st buttom pressed - turn on green light
in tmp, PINB;
or tmp, r21;

cp tmp, r21;
breq main;
nop












///Таймер 8 раз

//////////////////////////////Timer///////////////////////////////////////////

Timer:	
	ldi	tmp, 5; Начинаем с  5,  так как нам надо  250*8=2000 
	out	TCNT0,tmp
	clr	tmp
	out	TIFR,tmp
	ldi	tmp,1
	out	TCCR0,tmp
	in	tmp,TIMSK
	sbr	tmp,1<<TOIE0		;разрешение прерывания таймера
	out	TIMSK,tmp		

wait:	wdr
	tst	tmp
	brne	wait
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 22.05.2011, 20:08   #2
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

1раз - это сколько в секундах? 0,5мс? И какая частота тактирования?
С.М.С вне форума Ответить с цитированием
Старый 22.05.2011, 21:06   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Частота тактирования 4 MHz
Тогда получается таймер на 0,125 сек. Ну а нам надо на 0.5 сек и на 1 сек . Если я не ошибаюсь в расчетах.
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan

Последний раз редактировалось Blondy; 22.05.2011 в 21:13.
Blondy вне форума Ответить с цитированием
Старый 22.05.2011, 21:09   #4
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

А обязательно делать 4 раза и 8 раз или всё таке можно сделать 0,5 и 1 секунд к примеру?

Последний раз редактировалось С.М.С; 22.05.2011 в 21:18.
С.М.С вне форума Ответить с цитированием
Старый 22.05.2011, 22:06   #5
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Можно насколько угодно - конечно мне в секундах проще)) Но почему-то я стала думать, что в одном таймере не получится сделать полсекунды и 1 секунду. У нас же максимально 255 единиц можно задействовать. Хотя я думаю, для такого профи как Вы возможно все)))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 22.05.2011, 23:42   #6
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Скажите куда у Вас кнопка включена?
С.М.С вне форума Ответить с цитированием
Старый 22.05.2011, 23:56   #7
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

по идее это должен быть первый (по счету) регистр порта В. то есть PB0
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 22.05.2011, 23:57   #8
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Мой вариант. Работает по циклу 4с(жёлтый)-8с(красный)-4с(жёлтый).
Точность на самом деле не 1 сек, а 998 мс, т.е. есть погрешность.

Код:
.include "m128def.inc"
.def tmp=r16
.equ FLAG_PROC=$0100
.equ CNT_SEC=$0101
.equ DIV_SEC=$0102

.equ start=PD0 ; ñòàðò
.equ GreenPort=0b00110000; Green
.equ YellowPort=0b00101000; Yellow
.equ RedPort=0b00011000; ReD

.cseg
.org $0000
	rjmp	RESET
.org $001E
	rjmp	CMPT0

CMPT0:
	push	tmp
	in	tmp,SREG
	push	tmp

	lds	tmp, DIV_SEC
	dec	tmp
	breq	CMPT0_nextS
	sts	DIV_SEC, tmp
	rjmp	CMPT0_end
CMPT0_nextS:
	ldi	tmp, 20
	sts	DIV_SEC, tmp
	lds	tmp, CNT_SEC
	dec	tmp
	breq	CMPT0_nextE
	sts	CNT_SEC, tmp
	rjmp	CMPT0_end
CMPT0_nextE:
	lds	tmp, FLAG_PROC
	cpi	tmp, 0
	breq	CMPT0_end
	cpi	tmp, 1
	breq	CMPT0_setG
	cpi	tmp, 2
	breq	CMPT0_setY
	cpi	tmp, 3
	breq	CMPT0_setR
	rjmp	CMPT0_end

CMPT0_setY:
	dec	tmp
	sts	FLAG_PROC, tmp
	ldi	tmp, YellowPort
	out	PORTB, tmp
	ldi	tmp, 4
	sts	CNT_SEC, tmp
	rjmp	CMPT0_end

CMPT0_setG:
	dec	tmp
	sts	FLAG_PROC, tmp
	ldi	tmp, GreenPort
	out	PORTB, tmp
	rjmp	CMPT0_end

CMPT0_setR:
	dec	tmp
	sts	FLAG_PROC, tmp
	ldi	tmp, RedPort
	out	PORTB, tmp
	ldi	tmp, 8
	sts	CNT_SEC, tmp
	
CMPT0_end:
	pop	r16
	out	SREG,tmp
	pop	tmp	
	reti

;/////////////////////Ñîçäàåì ñòåê
RESET:
	ldi	tmp,low(RAMEND)
	out	SPL,tmp
	ldi	tmp,high(RAMEND)
	out	SPH,tmp
	clr	tmp	
	ldi	tmp,(1<<WDCE)|(1<<WDE)
	out	WDTCR,tmp		
	ldi	tmp,(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
	out	WDTCR,tmp		
	clt

	LDI	tmp,0
	OUT	TCNT0,tmp
	LDI	tmp,194
	OUT	OCR0,tmp
	LDI	tmp,$0F
	OUT	TCCR0,tmp
	LDI	tmp,2
	OUT	TIMSK,tmp

	ldi	tmp, 20
	sts	DIV_SEC, tmp

	LDI	tmp,0
	sts	FLAG_PROC, tmp

	ldi r17, 0b00111000; PORT setup
	out DDRB, r17

	ldi r17, GreenPort
	out PORTB, r17

	clr tmp
	out DDRD, tmp
	ser tmp
	out PORTD, tmp
	out PIND, tmp

	sei
;===========================
main:
	wdr
	lds	tmp, FLAG_PROC
	tst	tmp
	brne	main_notEks

	sbic	PIND, start
	rjmp	main_notEks
	LDI	tmp,0
	OUT	TCNT0,tmp
	ldi	tmp, 3
	sts	FLAG_PROC, tmp
	ldi	tmp, YellowPort
	out	PORTB, tmp
	ldi	tmp, 4
	sts	CNT_SEC, tmp
	ldi	tmp, 20
	sts	DIV_SEC, tmp
main_notEks:
	rjmp	main
Вообще не проверял. Ну так вроде должно работать.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru

Последний раз редактировалось Ulex; 23.05.2011 в 00:05.
Ulex вне форума Ответить с цитированием
Старый 23.05.2011, 00:10   #9
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Ага, спасибо. Через часик буду тестить.... И еще надо будет посмотреть в справочнике операторов то, что я не знаю. А то ведь мне ни за что не поверят, что это я))) Придется отбиваться чуть ли не ногами.

Если что-то будет не понятно, я спрошу.
Премного Вас благодарю - Вы мой спаситель))
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Старый 23.05.2011, 01:47   #10
С.М.С
Участник клуба
 
Аватар для С.М.С
 
Регистрация: 29.12.2008
Сообщений: 1,598
По умолчанию

Опередили меня, ну да ладно вот ещё вариант. Изначально горит зелёный. После нажатия кнопки загорается оранжевый и горит 0,5 секунды. Затем загорается красный и горит 1секунду. Затем опять оранжевый горит 0,5 секунды. И зелённый. Дальше ожидается нажатие кнопки (низкий уровень PB0). Закорючки это русские буквы, а АВР студио будут нормальными.


Код:
.include "C:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m128def.inc"


;=============== Ïðåðûâàíèÿ ====================================================================
	.org 0								;Íà÷àëî ïðîãðàììû ïîñëå ñáðîñà
	jmp RESET 							; Reset Handler

	.org OVF0addr 
	jmp OVF0
;-----------------------------------------------------------------------------------
.def Flag = r16			
.def temp2 = r21
.def tmp=r25
.def Count_time = r22



;====================
RESET:
	
; Ñîçäàåì ñòåê
ldi	tmp,low(RAMEND)
out	SPL,tmp
ldi	tmp,high(RAMEND)	
out	SPH,tmp
clr	tmp	

ldi	tmp,(1<<WDCE)|(1<<WDE)
out	WDTCR,tmp		;Èíèôèàëèçàöèÿ ñòîðîæåâîãî òàéìåðà

ldi	tmp,(1<<WDE)|(1<<WDP2)|(1<<WDP1)|(1<<WDP0)
out	WDTCR,tmp		; áåç êîìàíä wdr ñáðîñ êàæäûå 2 ñåêóíäû

clt

;peremennqe dlja cvetov
ldi r17, 0b00111000; PORT setup
ldi r18, 0b00110000; Green
ldi r19, 0b00101000; Yellow
ldi r20, 0b00011000; ReD

ldi Flag,1


out DDRB, r17; êîíôèãóðèðóåì ïîðò
out PORTB, r17; èçíà÷àëüíî ãàñèì ëàìïî÷êè
out PORTB, r18

ldi	tmp, (1<<TOIE0)
out	TIMSK,tmp
ldi tmp,0b00000101 ;âêëþ÷àåì òàéìåð 1\1024
out TCCR0,tmp		
sei				

;--------------------------------------Êîíåö ïîäïðîãðàììû-----------------------------------------



;=========================
Main:	wdr

sbis PINB,PB0		;Ïðîïóñê ñëåäóþùåé êîìàíäû,  
;åñëè íà ëèíèè  (PD0) ÂÛÑÎÊÈÉ óðîâåíü - ðó÷íîå óïðàâëåíèå
call Indication1

sbrc Flag,0
call Indication1
sbrc Flag,1
call Indication2
sbrc Flag,2
call Indication3
sbrc Flag,3
call Indication4

jmp Main
;--------------------------------------Êîíåö ïîäïðîãðàììû-----------------------------------------



Indication1:
out PORTB, r19
ldi temp2,0b00000010
ldi	tmp, (1<<TOIE0)
out	TIMSK,tmp
ldi tmp,0b00000101 ;âêëþ÷àåì òàéìåð 1\1024
out TCCR0,tmp		
sei				
call Timer1
ret

Indication2:
out PORTB, r20
ldi temp2,0b00000100
call Timer2
ret

Indication3:
out PORTB, r19
ldi temp2,0b00001000
call Timer1
ret

Indication4:
out PORTB, r18
clr temp2
clr Flag 
ldi	tmp,0
out	TCCR0,tmp
ret




;======================Timer1 0,5 sec=============================================
Timer1:	wdr
	ldi	Count_time, 7; 
	clr	Flag
	sei
ret			
;--------------------------------------Êîíåö ïîäïðîãðàììû-----------------------------------------

;=======================Timer2 1 sec==============================================

Timer2:	
	ldi	Count_time, 14; 
	clr	Flag		
	sei					
ret
;--------------------------------------Êîíåö ïîäïðîãðàììû-----------------------------------------


;Ïîäïðîãðàììà îáðàáîòêè ïðåðûâàíèÿ ïî ïåðåïîëíåíèþ òàéìåðà 0
;================================================================================================
OVF0:
	dec Count_time
	breq end_count
sei
ret

end_count:
mov Flag,temp2

ret
;--------------------------------------Êîíåö ïîäïðîãðàììû-----------------------------------------

Последний раз редактировалось С.М.С; 23.05.2011 в 01:50.
С.М.С вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AVR Atmega 128: сигнализация не срабатывает на ключи Blondy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 16 20.05.2011 12:29
AVR ATmega 128: почему не происходит переход? Blondy Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 4 06.05.2011 01:28
Двоичный счетчик в AVR studio 4 UKG Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 22.10.2010 17:48
MCS-51 таймер/счетчик Steff-z Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 05.06.2009 23:15
Добавить инди в delphi 10 light, но как это зделать и где её взять не знаю 100GRamm Компоненты Delphi 1 09.02.2009 13:38