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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2011, 03:24   #1
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию AVR ATmega 128: почему не происходит переход?

Господа, здраствуйте!
У меня проблема с контроллером и таймером: стек создается, порт конфигурируется, лампочка загорается, таймер запускается, потом, как таймер оттикал, лампочка гаснет и вновь запускается таймер. И потом по идее снова должна загореться лампочка, а у меня программа просто не выходит из таймера - он все тикает и тикает, оттикал до переполнения и вновь перезапустился... А лампочка не зажигается заново - я бъюсь как рыба об лед.... вроде все правильно....

Помогите блондинке, объясните, в чем ошибка и почему такая реакция, и как правильно... мне еще 2 света крутить((((( И все с циклами - горит, не горит(((

Код:
.include "c:\Program Files\Atmel\AVR Tools\AvrAssembler2\Appnotes\m128def.inc"
.def tmp=r16
.cseg
.org 0
	rjmp	RESET
	
	rjmp	OVF0 

OVF0:
	cbi	PORTB,2	
	reti

/////////////////////Создаем стек
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		
	clt
	
	
;===========================
main:	wdr				


ldi  r17,$7 
out DDRB,r17 

ldi r16, $1 
out PORTB,r16 

clr r16 
clr r17




	sbis	PIND,3		

///// потом, чтобы запустить дальнейшую
//  программу, я  искуственно сбрасываю с 	PIND,3 черный ////кубик				
	
rcall Red_Stop 





	clt				
	rjmp	main			






Red_Stop:


clr r16
clr r17



red_light:


;{Мигание

ldi r18, $3 // Это потом пригодится для цикла, чтобы 4 раза
//зажигался и гас свет 

 
rcall	Timer

//гасим свет
ldi r17, $80 //
out PORTB,r17 // лампочка не горит
clr r17

rcall	Timer

/////С этого места не видит - не выходит из таймера!!!!!!!!!!!!!!

//зажигаем свет - порт конфигурируется нормально
ldi r17,$81 
out PORTB,r17//лампочка горит
clr r17

rcall	Timer 

/*
dec r18      ; Потом пригодится для цикла лампочка горит- не горит 4 раза
ldi r17, $0
cp r18, r17

/*


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

Timer:	
	ldi	tmp, 10
	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 вне форума Ответить с цитированием
Старый 05.05.2011, 05:09   #2
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Это какие-то куски программы? Или почему такой бардак?

Что за дикий цикл?
Код:
wait:	wdr
	tst	tmp
	brne	wait
Вообще идеология неправильная. Судя по тому как настраивается TCCR0 должно использоваться прерывание по переполнению таймера ноль. А обработчик этого прерывания фактически пустой.

Процедура Timer настраивает таймер счётчик 0. Ну и зачем его три раза подряд настраивать, в промежутке между настройками переключая порт?

И чем вообще всё закончилось, где хотя бы один возврат из процедуры?

В итоге - ничего не понятно. Настроили таймер, а использовать не используете, почему, зачем, печальный смайлик
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 05.05.2011, 20:55   #3
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Ну конечно, был выход из таймера - поэтому я и удивляюсь, почему при следующем вхождении он из него не выходит. Ведь все точно также прописано.

Мне надо чтобы у меня был цикл - 3 раза лампочка загорается, три раза гаснет - по очереди. Я не знаю, как по другому прописать, не перенастраивая порт. Мне еще надо тоже самое проделать с 2 другими цветами.

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

Цитата:
почему при следующем вхождении он из него не выходит.
А он и после первого вхождения из него не выходит. И вообще выйти никогда не сможет. Как (куда) ему выходить, если ret в процедуре отсутствует. И цикл у вас там бесконечный и бессмысленный.

Цитата:
Я не знаю, как по другому прописать, не перенастраивая порт
А при чём тут порт? Не, ну понятно что битами на порту надо рулить, вопрос то другой был - где ими рулить.

Значит теперь по существу.
1. Так как разрешены прерывания, то значит вектора должны быть заполнены ,в идеале все, а как минимум те, которые используются. У вас это RESET и OVF0. В вашей программе jmp на обработчик находится не там, где ему положено находиться, а точнее просто брошен где попало. Поэтому когда возникнет прерывание, контроллер пойдёт не на выполнение вашего обработчика, а чёрт знает куда. Для прерывания OVF0 - это 17-ый вектор, адрес $0020. Именно по этому адресу должен стоять jmp, либо заглушка reti.

2. Теперь про таймер. Я попытался наводящими вопросами намекнуть, что не надо его три раза подряд настраивать. Зачем? Настроили один раз по сбросу - и всё, пусть он себе молотит спокойно. А всю обработку портов, сигналов, битов выносите в обработчик прерывания.

Соберём в кучу вышесказанное. Эта программка будет поидее моргать пином 0 порта B в соответствии с битовой последовательностью, расположенной в озу по адресу VAL_1DIOD. т.е. 10101010.
Код:
.include "m128def.inc"
.def tmp=r16
.equ CNT_1DIOD=$0100
.equ VAL_1DIOD=$0101

.cseg
.org $0000
	rjmp	RESET
.org $0020
	rjmp	OVF0 

OVF0:
	lds tmp, CNT_1DIOD
	tst tmp
	breq OVF0_end
	dec	tmp
	sts CNT_1DIOD, tmp

	lds tmp, VAL_1DIOD
	lsr tmp
	sts VAL_1DIOD, tmp

	in	r17, PORTB
	andi tmp, $01
	andi r17, 0b11111110
	or r17, tmp
	out PORTB, r17
OVF0_end:
	reti
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		
	clt

	ldi	tmp, 3
	sts	CNT_1DIOD, tmp
	ldi	tmp, 0b10101010
	sts	VAL_1DIOD, tmp

	ldi	tmp, 10
	out	TCNT0,tmp
	clr	tmp
	out	TIFR,tmp
	ldi	tmp,1
	out	TCCR0,tmp
	in	tmp,TIMSK
	sbr	tmp,1<<TOIE0
	out	TIMSK,tmp	
	
;===========================
main:
	wdr				
	rjmp	main
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 06.05.2011, 01:28   #5
Blondy
Участник клуба
 
Аватар для Blondy
 
Регистрация: 07.07.2009
Сообщений: 1,385
По умолчанию

Спасибо большое, буду потихоньку разбираться... К сожалению нам Assembler преподают не очень хорошо... Не только блондинки, но и пацаны в нем ой как плавают.. Мне надо кровь из носу, чтобы получить зачет сдать этот чертов "парк-троник" и сигнализацию. Ну прямо "Планета Шелезяка - воды нет, полезных ископаемых нет, населена роботами...."
Нажимаю на весы))) Спасибо, что откликнулись)) Премного Вас благодарю!
"Все мы жаждем чудес. Чисто человеческое свойство." Carl Sagan
Blondy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл Cardinal - почему так происходит? Nester Общие вопросы Delphi 2 28.07.2010 15:04
Удаление информации из файлов .mb: почему не происходит? Ruschel БД в Delphi 4 25.02.2010 09:22
Почему происходит сброс переменной password? NSvirus PHP 2 10.11.2009 16:07
Form Region-почему так происходит Nester Общие вопросы Delphi 3 14.09.2009 21:16
Почему так происходит? Zeraim Общие вопросы Delphi 1 05.05.2008 14:10