Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Пн май 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
Пн май 28, 2012 12:59:23
astrgan писал(а):START:
LDI R16,10
Иииииии? Всё???
Пн май 28, 2012 13:11:42
да.
Ну конечно недоделана, и вообще учебная программа.
Пн май 28, 2012 13:14:13
Почему-то на метку START когда нужно не переходит.
Пн май 28, 2012 13:29:26
ППЦ.
При наступлении прерывания МК прыгает на метку START, делает там LDI R16,10 и... продолжает идти дальше. А дальше у чистого МК находятся одни NOP'ы до конца флэша.
Пн май 28, 2012 13:31:45
Что тут такого?
Когда эта часть заработает( прыгнит когда надо), буду дописывать.
Пн май 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
Пн май 28, 2012 13:39:22
- Код:
START:
LDI R16,10
RJMP LOOP
Из прерываний так не выходят (обычно). Нужно так
- Код:
START:
LDI R16,10
RETI
А если не надо опять включать прерывание, то вместо RETI писать RET. Выход в главный цикл по RJMP рано или поздно поломает стек.
Пн май 28, 2012 13:39:59
А в чем отлаживаете? Как это пролазит?:
- Код:
sei ;разрешение глобальных прерываний
Пн май 28, 2012 13:40:48
astrgan писал(а):START:
LDI R16,10
RJMP LOOP
ППЦ
ППЦ
- Код:
START:
LDI R16,10
RETI
Проблему я вашу понял, ошибку нашёл. Это же надо — сначала запускать таймер, а уже только ПОТОМ запихивать в него число для сравнения
Пн май 28, 2012 13:46:52
Всем БОЛЬШОЕ спасибо!)
Пн май 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
Пн май 28, 2012 15:28:08
astrgan писал(а):Извиняюсь что вопросы глупые но всеже, как потом изменить ocr?
Видимо, остановив таймер?
Вт май 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
Вт май 29, 2012 08:14:53
Вы установили режим Fast PWM, 8-bit
Вт май 29, 2012 08:17:54
А какой нужен?
Вт май 29, 2012 08:18:55
На каком основании сделан вывод, что прерывание не срабатывает? Все работает.
Вт май 29, 2012 08:20:37
astrgan писал(а):А какой нужен?
Смотря что Вы хотите сброс при совпадении или PWM
Вт май 29, 2012 08:30:09
ILYAUL
Нужен PWM.
Engineer_Keen
На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит(кажется иногда он даже перепрыгивает это число).
Вт май 29, 2012 08:39:40
astrgan писал(а):На AVR Studio 4 симулирую (DEBUG), TCNT1 доходит до значения в OCR и нечего не происходит.
Если код написан в соответствии с даташитом, но в симуляторе почему-то не работает очевидный кусок, значит кривой симулятор. Нужен либо другой симулятор, либо реальный контроллер. Связка 2х симуляторов позволяет отлавливать баги друг друга. Проверял в протеусе. Переход на RJMP SINOUT происходит раз в 256us (Fclk=1МГц).
astrgan писал(а):(кажется иногда он даже перепрыгивает это число)
А в этом нет ничего удивительного, TCNT1 и должен в этом режиме считать по кругу 0-65535 и прерывание по совпадению будет всегда раз в 256мкс, независимо от значения OCR.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.