Страница 1 из 1

Atmega16

Добавлено: Ср май 19, 2010 18:54:13
Riels
Добрый день!
Сегодня собрал схему простейшего ком программатора, подключил ATmega16. Наспех написал программу мигания светодиодами(их 2). Прошил.Включил. первый светодиод постоянно горит, второй вообще не загорается. Оба светодиода исправны.В протеусе схему моделировал-все работает. Программу писал так,чтобы сначало горел один светодиод, потом второй,а получается так,что сначала и до конца горит первый и потушен второй.
В чем может быть проблема?

P.S. Сейчас плату покрутил, подергал, начали мигать. После переподключения питания снова один горит,второй нет.

Re: Atmega16

Добавлено: Ср май 19, 2010 19:12:45
Meteor
Куда прикошачили светодиоды? Есть у меги 16 выводы JTAG, которые не позволят сразу пользователю управлять ими.

Re: Atmega16

Добавлено: Ср май 19, 2010 19:14:37
Riels
Выводы PD7 и PC0.

Re: Atmega16

Добавлено: Ср май 19, 2010 20:56:32
AndyWorld
PC - это как раз и есть оно.. Измени фуз JTAGEN

Re: Atmega16

Добавлено: Ср май 19, 2010 21:11:19
Riels
Сейчас переписал программу, подпрограмму задержки убрал, а саму задержку вставил в главный цикл. Светодиоды мигают.
Писал на ассме.
Фьюзы еще не менял.
P.S. видимо когда контроллер доходит до подпрограммы, он ее не выполняет и идет сразу на сброс.

Re: Atmega16

Добавлено: Чт май 20, 2010 09:08:01
Meteor
Наверное у вас стек не инициирован, потому и подпрограмма не возвращается.
Код в студию

Re: Atmega16

Добавлено: Чт май 20, 2010 10:25:31
Riels
Тоже об этом думал, потом добавил инициализацию стека. Все равно та же картина.

Код: Выделить всё

.def	Temp1=R16
	.def	Temp2=R17
	.def	Temp3=R18
	.def	Temp=R19
.cseg
.org 0

rjmp Reset
rjmp INT_0
rjmp INT_1
rjmp Timer1_capt1
rjmp Timer1_comp1
rjmp Timer1_OVF1
rjmp Timer0_OVF0
rjmp UART_RX
rjmp UART_UDRE
rjmp UART_TX
rjmp ANA_COMP

INT_0:
INT_1:
Timer1_capt1:
Timer1_comp1:
Timer1_OVF1:
Timer0_OVF0:
UART_RX:
UART_UDRE:
UART_TX:
ANA_COMP:
          reti

reset:    ldi Temp1,0x5f	;инициализация стека
          out $3d,Temp1      

	  ldi Temp,0b11111111  ;настройка порта с
          out $11,Temp
	
	  ldi temp,0b11111111	;настройка порта а
	out $1A,temp
	  ldi temp,0b00000001	;зажигаем 1-й светодиод
	  out $1b,temp

Begin:    ldi Temp,0b00000000  ;тушим 2-й светодиод
          out $12,Temp

rcall delay

	  ldi temp,0b00000000	;тушим 1-й светодиод
	  out $1b,temp
	  ldi Temp,0b10000000  ;зажигаем 2-й светодиод
          out $12,Temp

RCALL DELAY

	  ldi temp,0b00000001	;зажигаем 1-й светодиод	
	  out $1b,temp
;	  rcall delay
rjmp begin
delay:

   	ldi Temp1,250          ;задержка
          ldi Temp2,250
	  ldi temp3,6
Loop2:    dec Temp1
          brne Loop2

          dec Temp2
          brne Loop2

	  dec temp3
	  brne loop2
ret
sleep

Re: Atmega16

Добавлено: Чт май 20, 2010 10:45:14
Meteor
Здрасьте приехали.
Почему стек 1 байтом инициируете?
Вот на мегу16 инициализация, прям из датиашита

Re: Atmega16

Добавлено: Чт май 20, 2010 12:26:23
GP1
Мяу, Meteor!
Всем остальным тоже здрасте! :)))
Вот смотрю я на код и думаю: "толи лыжи не едут...", использовать адреса вместо названия регистров :shock: :shock: :shock:
так и накосячить можно в раз, зачем только ATMELовцы def* файлы писали :dont_know: :dont_know: :dont_know:

Re: Atmega16

Добавлено: Чт май 20, 2010 12:49:09
Meteor
Мяу, GP1!
У каждого свое представление об извращениях :)))
У автора вообще косяков до чертиков. Один выход из прерываний на все чего стоит.
Автору.
Обычно помещаю обработчики прерываний в "хвост" программы, назначая каждому свой выход командой reti.

Re: Atmega16

Добавлено: Чт май 20, 2010 13:32:31
GP1
Мне вот стало любопытно когда у него мк в режим sleep уйдет :dont_know:
или для чего он там нужен.

Re: Atmega16

Добавлено: Чт май 20, 2010 13:44:51
Riels
Спасибо за помощь. Все работает после включения .inс файла и указания более понятных регистров. Я в своей программе указал только SPL, а SPH почему-то решил не указывать %).
Программу писал буквально одной рукой,потому думал обойдусь без inc, так что всё в адресах.