Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Тема закрыта

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

Пн май 28, 2012 12:08:53

По идеи на $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

astrgan писал(а):START:
LDI R16,10

Иииииии? Всё???

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

Пн май 28, 2012 13:11:42

да.
Ну конечно недоделана, и вообще учебная программа.

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

Пн май 28, 2012 13:14:13

Почему-то на метку START когда нужно не переходит.

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

Пн май 28, 2012 13:29:26

ППЦ.
При наступлении прерывания МК прыгает на метку START, делает там LDI R16,10 и... продолжает идти дальше. А дальше у чистого МК находятся одни NOP'ы до конца флэша.

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

Пн май 28, 2012 13:31:45

Что тут такого?
Когда эта часть заработает( прыгнит когда надо), буду дописывать.

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

Пн май 28, 2012 13:33:45

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

.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

Код:
START:
 LDI R16,10
 RJMP LOOP

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

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

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

Пн май 28, 2012 13:39:59

А в чем отлаживаете? Как это пролазит?:
Код:
sei ;разрешение глобальных прерываний

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

Пн май 28, 2012 13:40:48

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

ППЦ :facepalm: ППЦ
Код:
START:
 LDI R16,10
 RETI


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

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

Пн май 28, 2012 13:46:52

Всем БОЛЬШОЕ спасибо!)

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

Пн май 28, 2012 15:26:31

Извиняюсь что вопросы глупые но всеже, как потом изменить 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

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

Видимо, остановив таймер? :idea:

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

Вт май 29, 2012 07:59:13

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

Код:
.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

Вы установили режим Fast PWM, 8-bit

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

Вт май 29, 2012 08:17:54

А какой нужен?

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

Вт май 29, 2012 08:18:55

На каком основании сделан вывод, что прерывание не срабатывает? Все работает.

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

Вт май 29, 2012 08:20:37

astrgan писал(а):А какой нужен?

Смотря что Вы хотите сброс при совпадении или PWM

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

Вт май 29, 2012 08:30:09

ILYAUL
Нужен PWM.

Engineer_Keen

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

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

Вт май 29, 2012 08:39:40

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

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

А в этом нет ничего удивительного, TCNT1 и должен в этом режиме считать по кругу 0-65535 и прерывание по совпадению будет всегда раз в 256мкс, независимо от значения OCR.
Тема закрыта