|
|
  |
ТС1 в 8535, Частота переполнения в 2 раза ниже, чем была определена |
|
|
|
Apr 20 2007, 09:48
|
Участник

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012

|
Добрый день! МК 8535, кварц 11.0592МГц. Использую ТС1 с предделителем 256. считает от 0 до максимума. По идее должен считать за ~1.5 сек, а считает за ~3сек. Длительность отслеживаю по светодиоду. Код ;Начало программы PROG: ;PROG ldi R16,high(RAMEND) out SPH,R16 ldi R16,low(RAMEND) out SPL,R16 ldi R16,(1<<TOIE1) out TIMSK,R16 ldi R16,$00 out TCCR1A,R16 ldi R16,(1<<CS12) out TCCR1B,R16 sbi DDRB,1 clr R20 sei
END_PROG: rjmp END_PROG
;----------------------------------------------------------------- SUBI_TIMER1_OVERFLOW: push R16 in R16,SREG push R16 inc R20 sbrc R20,1 rjmp Label1 sbi PORTB,1 LABEL1: sbrs R20,1 rjmp Label2 cbi PORTB,1 LABEL2: pop R16 out SREG,R16 pop R16 reti Голову уже сломал, но понять не могу. Спасибо
|
|
|
|
|
Apr 20 2007, 09:58
|
Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 12-09-06
Пользователь №: 20 304

|
Цитата(golovin @ Apr 20 2007, 10:48)  SUBI_TIMER1_OVERFLOW: push R16 in R16,SREG push R16 inc R20 sbrc R20,1 rjmp Label1 sbi PORTB,1 LABEL1: sbrs R20,1 rjmp Label2 cbi PORTB,1 LABEL2: pop R16 out SREG,R16 pop R16 reti [/code]
Голову уже сломал, но понять не могу. Спасибо Обратите внимание на команду sbrc R20,1 Этой командой Вы проверяете ПЕРВЫЙ бит, а не НУЛЕВОЙ. Естественно, что при инкременте первый бит меняется в два раза реже нулевого. Попробуйте написать sbrc R20,0
|
|
|
|
|
Apr 20 2007, 10:10
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата Длительность отслеживаю по светодиоду. Возможно переод у Вас получается изза того что одно прерывание включает диод, другое выключает.. т.е. Переод за два прерывания.. отсюда мигает в два раза медленнее. Или как сказал Dima_Ag вы проверяете не 0 а 1бит, отсюда счет идет до 2 а не до 1 (sbrc R20,0). Удачи.
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Apr 20 2007, 10:28
|

Местный
  
Группа: Свой
Сообщений: 226
Регистрация: 25-03-05
Из: Беларусь
Пользователь №: 3 672

|
Попробуйте такой код: Код ;----------------------------------------------------------------- SUBI_TIMER1_OVERFLOW: push R16 in R16,SREG push R16 ;**************** ЗАЖИГАЕМ ИЛИ ГАСИМ СВЕТОДИОД ******************************** CLT SBIS PORTB,1 SET IN R16,PORTB BLD R16,1 OUT PORTB,R16 pop R16 out SREG,R16 pop R16 reti Будет включать или выключать светодиод при каждом входе в прерывание.
--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
|
|
|
|
|
Apr 20 2007, 10:36
|
Участник

Группа: Участник
Сообщений: 37
Регистрация: 13-04-07
Пользователь №: 27 012

|
Всем спасибо, особенно Dima_Ag. Проблема действительно в этом бите. Видимо глаз уже замылился, поэтому не заметил сам.
|
|
|
|
Guest_=AVR=_*
|
Apr 20 2007, 10:44
|
Guests

|
"Будь проще, и люди за тобой потянутся!"(с) Код .def stat = r2 ; Сюда сохраняй SR в любых прерываниях - будет 1 такт вместо 5 .equ LED = PB1 ; Обращайся к LED по-человечески
SUBI_TIMER1_OVERFLOW: in stat,SREG push r16
inc r20
bst r20,0 ; SR.T = r20.0 in r16,PORTB ; r16 = PORTB bld r16,LED ; LEDbit in r16 = r20.0 out PORTB,r16 ; LEDbit in PORTB = r20.0
pop r16 out SR,stat reti
|
|
|
|
|
Apr 20 2007, 16:58
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(=AVR= @ Apr 20 2007, 06:44)  "Будь проще, и люди за тобой потянутся!"(с) Код .def stat = r2 ; Сюда сохраняй SR в любых прерываниях - будет 1 такт вместо 5 .equ LED = PB1 ; Обращайся к LED по-человечески
SUBI_TIMER1_OVERFLOW: in stat,SREG push r16
inc r20
bst r20,0 ; SR.T = r20.0 in r16,PORTB ; r16 = PORTB bld r16,LED ; LEDbit in r16 = r20.0 out PORTB,r16 ; LEDbit in PORTB = r20.0
pop r16 out SR,stat reti Тогда уж так Код ovr1: sbic portb,1 ;skip if <1>pb=0 rjmp ovr2 ;<1>pb=0 sbi portb,1 ;1--><1>pb reti ; ovr2: cbi portb,1 ;0--><1>pb reti ;
Люди ещё больше потянутся(:-).
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
Guest_=AVR=_*
|
Apr 20 2007, 21:42
|
Guests

|
Цитата Люди ещё больше потянутся(:-). Ну да, так гораздо изящнее, только это надо вставлять после восстановаления SR - r20, очевидно, для расширения таймера использован, а не только для PortBitToggle. Значит, его надо инкрементировать, а это значит - портить (и поэтому сохранять/восстанавливать) статус. Но если бы это была одна из новых Мег (Core 3), то было бы еще круче - 1 команда: Код sbi PIND,LED Интересно, в Xmega сохранят эту фичу - Port pin toggle on write "1" to pin register ?
|
|
|
|
|
Apr 21 2007, 20:22
|

Ambidexter
    
Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282

|
Цитата(=AVR= @ Apr 20 2007, 18:42)  Ну да, так гораздо изящнее, только это надо вставлять после восстановаления SR - r20, очевидно, для расширения таймера использован, а не только для PortBitToggle. Значит, его надо инкрементировать, а это значит - портить (и поэтому сохранять/восстанавливать) статус. Ну так, я специально написал такой "хвост" прерывания, который не использует регистры и не портит статус-регистр. А уж что до него будет, "хвосту" без разницы. Цитата(=AVR= @ Apr 20 2007, 18:42)  Интересно, в Xmega сохранят эту фичу - Port pin toggle on write "1" to pin register ? Это относительно новая фича, значит, почти наверняка запатентована, значит, почти наверняка будет в новых разработках.
--------------------
Делай сразу хорошо, плохо само получится
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|