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

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

Добавлено: Пн май 28, 2012 12:08:53
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

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

Добавлено: Пн май 28, 2012 12:59:23
Gudd-Head
astrgan писал(а): START:
LDI R16,10
Иииииии? Всё???

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

Добавлено: Пн май 28, 2012 13:11:42
astrgan
да.
Ну конечно недоделана, и вообще учебная программа.

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

Добавлено: Пн май 28, 2012 13:14:13
astrgan
Почему-то на метку START когда нужно не переходит.

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

Добавлено: Пн май 28, 2012 13:29:26
Gudd-Head
ППЦ.
При наступлении прерывания МК прыгает на метку START, делает там LDI R16,10 и... продолжает идти дальше. А дальше у чистого МК находятся одни NOP'ы до конца флэша.

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

Добавлено: Пн май 28, 2012 13:31:45
astrgan
Что тут такого?
Когда эта часть заработает( прыгнит когда надо), буду дописывать.

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

Добавлено: Пн май 28, 2012 13:33:45
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

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

Добавлено: Пн май 28, 2012 13:39:22
Engineer_Keen

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

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

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

START:
 LDI R16,10
RETI
А если не надо опять включать прерывание, то вместо RETI писать RET. Выход в главный цикл по RJMP рано или поздно поломает стек.

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

Добавлено: Пн май 28, 2012 13:39:59
pyzhman
А в чем отлаживаете? Как это пролазит?:

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

sei ;разрешение глобальных прерываний

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

Добавлено: Пн май 28, 2012 13:40:48
Gudd-Head
astrgan писал(а):START:
LDI R16,10
RJMP LOOP
ППЦ :facepalm: ППЦ

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

START:
 LDI R16,10
 RETI
Проблему я вашу понял, ошибку нашёл. Это же надо — сначала запускать таймер, а уже только ПОТОМ запихивать в него число для сравнения :facepalm: :facepalm: :facepalm:

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

Добавлено: Пн май 28, 2012 13:46:52
astrgan
Всем БОЛЬШОЕ спасибо!)

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

Добавлено: Пн май 28, 2012 15:26:31
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

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

Добавлено: Пн май 28, 2012 15:28:08
Gudd-Head
astrgan писал(а):Извиняюсь что вопросы глупые но всеже, как потом изменить ocr?
Видимо, остановив таймер? :idea:

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

Добавлено: Вт май 29, 2012 07:59:13
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

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

Добавлено: Вт май 29, 2012 08:14:53
ILYAUL
Вы установили режим Fast PWM, 8-bit

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

Добавлено: Вт май 29, 2012 08:17:54
astrgan
А какой нужен?

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

Добавлено: Вт май 29, 2012 08:18:55
Engineer_Keen
На каком основании сделан вывод, что прерывание не срабатывает? Все работает.

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

Добавлено: Вт май 29, 2012 08:20:37
ILYAUL
astrgan писал(а):А какой нужен?
Смотря что Вы хотите сброс при совпадении или PWM

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

Добавлено: Вт май 29, 2012 08:30:09
astrgan
ILYAUL
Нужен PWM.

Engineer_Keen

На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит(кажется иногда он даже перепрыгивает это число).

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

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