Пожалуйста помогите найти ошибку в программе для avr.

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

По идеи на $0006 программа должна перейти только один раз (по прерыванию), а на деле получается постоянно.

.include "m16def.inc"

.CSEG
rjmp VECT_END
.ORG $0006 ;адрес вектор прерывания по совпадению Т2
rjmp START ;прерывание по совпадению (TIMER2)
VECT_END:

;***** инициализация стека

ldi r19,0x04 ;инициализация указателя стека
out SPH,r19
ldi r19,0x5F
out SPL,r19

;***** инициализация таймера

LDI R19,0b01000001
OUT TCCR2,R19 ; Т2, режим ШИМ, предделитель 1
LDI R20,50
out OCR2, r20 ;Число для сравнения
LDI R21,0b10000000
OUT TIMSK, R21 ;разрешение прерывания по совпадению таймера Т2
sei ;разрешение глобальных прерываний

LOOP:
RJMP LOOP

START:
LDI R16,10
Реклама
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Gudd-Head »

astrgan писал(а): START:
LDI R16,10
Иииииии? Всё???
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

да.
Ну конечно недоделана, и вообще учебная программа.
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Почему-то на метку START когда нужно не переходит.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Gudd-Head »

ППЦ.
При наступлении прерывания МК прыгает на метку START, делает там LDI R16,10 и... продолжает идти дальше. А дальше у чистого МК находятся одни NOP'ы до конца флэша.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Что тут такого?
Когда эта часть заработает( прыгнит когда надо), буду дописывать.
Реклама
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Ну пусть будет так:

.include "m16def.inc"

.CSEG
rjmp VECT_END
.ORG $0006 ;адрес вектор прерывания по совпадению Т2
rjmp START ;прерывание по совпадению (TIMER2)
VECT_END:

;***** инициализация стека

ldi r19,0x04 ;инициализация указателя стека
out SPH,r19
ldi r19,0x5F
out SPL,r19

;***** инициализация таймера

LDI R19,0b01000001
OUT TCCR2,R19 ; Т2, режим ШИМ, предделитель 1
LDI R20,50
out OCR2, r20 ;Число для сравнения
LDI R21,0b10000000
OUT TIMSK, R21 ;разрешение прерывания по совпадению таймера Т2
sei ;разрешение глобальных прерываний

LOOP:
RJMP LOOP

START:
LDI R16,10
RJMP LOOP
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Engineer_Keen »

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

START:
 LDI R16,10
 RJMP LOOP
Из прерываний так не выходят (обычно). Нужно так

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

START:
 LDI R16,10
RETI
А если не надо опять включать прерывание, то вместо RETI писать RET. Выход в главный цикл по RJMP рано или поздно поломает стек.
Аватара пользователя
pyzhman
Друг Кота
Сообщения: 7016
Зарегистрирован: Вс июл 12, 2009 19:15:29
Откуда: Ижевск
Контактная информация:

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение pyzhman »

А в чем отлаживаете? Как это пролазит?:

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

sei ;разрешение глобальных прерываний
Docendo discimus
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Gudd-Head »

astrgan писал(а):START:
LDI R16,10
RJMP LOOP
ППЦ :facepalm: ППЦ

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

START:
 LDI R16,10
 RETI
Проблему я вашу понял, ошибку нашёл. Это же надо — сначала запускать таймер, а уже только ПОТОМ запихивать в него число для сравнения :facepalm: :facepalm: :facepalm:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Всем БОЛЬШОЕ спасибо!)
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Извиняюсь что вопросы глупые но всеже, как потом изменить ocr?

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

.include "m16def.inc"

.CSEG
	rjmp VECT_END
.ORG $0006      ;адрес вектор прерывания по совпадению Т2
	rjmp START ;прерывание по совпадению (TIMER2)
VECT_END:

;***** инициализация стека

	ldi r19,0x04	;инициализация указателя стека
	out	SPH,r19    
	ldi r19,0x5F
	out	SPL,r19
	
	ldi r17, 0b11111111 ;инициализация порта на вывод
	out DDRA, r17
	
MAS:   .DB 0x1A,0x2A,0x3A,0x4A


	LDI ZL, low(MAS*2)
	LDI ZH, High(MAS*2)
	LDI R22,0b000000001

;***** инициализация таймера
       ; Т2, режим ШИМ, предделитель 1
	LDI R16,10
	out OCR2, r16      ;Число для сравнения
	LDI R21,0b10000000  
	
	LDI R19,0b01000001 
	OUT TCCR2,R19  
	OUT TIMSK, R21      ;разрешение прерывания по совпадению таймера Т2
	sei                 ;разрешение глобальных прерываний

LOOP:            
	RJMP LOOP

START:
	CLI
	LPM R16,Z+
	out OCR2, r16
	com R22
	ANDI R22,0b00000001
	OUT PORTA,R22
	sei
	RETI
Аватара пользователя
Gudd-Head
Друг Кота
Сообщения: 20092
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Gudd-Head »

astrgan писал(а):Извиняюсь что вопросы глупые но всеже, как потом изменить ocr?
Видимо, остановив таймер? :idea:
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

Пожалуйсто подскажите еще раз.
Почемуто не срабатывает прерывание?

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

.include "m128def.inc"

	
.CSEG
	RJMP VECT_END
.ORG $0018	       ;Вектор прерывания таймера T1 при совпадении
	RJMP SINOUT    ;Адрес подпрограммы обработки прерывания

VECT_END:
	
;***** инициализация стека

	ldi r19,0x04	
	out	SPH,r19    
	ldi r19,0x5F
	out	SPL,r19
;***** инициализация таймера


	LDI r19,0		
	OUT OCR1AH, r19		;в регистр совпадений таймера T1
	LDI r19, 50		
	OUT OCR1AL, r19		;в регистр совпадений таймера T1


	LDI R16,0b00000001
	OUT TCCR1A,R16

	LDI R17,0b00001001
	OUT TCCR1B,R17

	LDI R18, 0b00010000
	OUT TIMSK,R18

	SEI


LOOP:
	RJMP loop
	
SINOUT:
	LDI R22,10
	RETI
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение ILYAUL »

Вы установили режим Fast PWM, 8-bit
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

А какой нужен?
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Engineer_Keen »

На каком основании сделан вывод, что прерывание не срабатывает? Все работает.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение ILYAUL »

astrgan писал(а):А какой нужен?
Смотря что Вы хотите сброс при совпадении или PWM
astrgan
Встал на лапы
Сообщения: 103
Зарегистрирован: Чт мар 08, 2012 01:13:30

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение astrgan »

ILYAUL
Нужен PWM.

Engineer_Keen

На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит(кажется иногда он даже перепрыгивает это число).
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Пожалуйста помогите найти ошибку в программе для avr.

Сообщение Engineer_Keen »

astrgan писал(а):На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит.
Если код написан в соответствии с даташитом, но в симуляторе почему-то не работает очевидный кусок, значит кривой симулятор. Нужен либо другой симулятор, либо реальный контроллер. Связка 2х симуляторов позволяет отлавливать баги друг друга. Проверял в протеусе. Переход на RJMP SINOUT происходит раз в 256us (Fclk=1МГц).
astrgan писал(а):(кажется иногда он даже перепрыгивает это число)
А в этом нет ничего удивительного, TCNT1 и должен в этом режиме считать по кругу 0-65535 и прерывание по совпадению будет всегда раз в 256мкс, независимо от значения OCR.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»