реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> ТС1 в 8535, Частота переполнения в 2 раза ниже, чем была определена
golovin
сообщение Apr 20 2007, 09:48
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 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


Голову уже сломал, но понять не могу.
Спасибо
Go to the top of the page
 
+Quote Post
Dima_Ag
сообщение Apr 20 2007, 09:58
Сообщение #2


Частый гость
**

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
add
сообщение Apr 20 2007, 10:10
Сообщение #3


Местный
***

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



Цитата
Длительность отслеживаю по светодиоду.

Возможно переод у Вас получается изза того что одно прерывание включает диод, другое выключает.. т.е. Переод за два прерывания.. отсюда мигает в два раза медленнее.
Или как сказал Dima_Ag вы проверяете не 0 а 1бит, отсюда счет идет до 2 а не до 1 (sbrc R20,0).
Удачи.


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
Wild007
сообщение Apr 20 2007, 10:28
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 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


Будет включать или выключать светодиод при каждом входе в прерывание.


--------------------
Ничто так не ограничивает полет мысли программиста, как компилятор
Go to the top of the page
 
+Quote Post
golovin
сообщение Apr 20 2007, 10:36
Сообщение #5


Участник
*

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



Всем спасибо, особенно Dima_Ag. Проблема действительно в этом бите.
Видимо глаз уже замылился, поэтому не заметил сам.
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Apr 20 2007, 10:44
Сообщение #6





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
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 20 2007, 16:58
Сообщение #7


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               ;

Люди ещё больше потянутся(:-).


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
Guest_=AVR=_*
сообщение Apr 20 2007, 21:42
Сообщение #8





Guests






Цитата
Люди ещё больше потянутся(:-).
Ну да, так гораздо изящнее, только это надо вставлять после восстановаления SR - r20, очевидно, для расширения таймера использован, а не только для PortBitToggle. Значит, его надо инкрементировать, а это значит - портить (и поэтому сохранять/восстанавливать) статус.

Но если бы это была одна из новых Мег (Core 3), то было бы еще круче - 1 команда:

Код
        sbi     PIND,LED


Интересно, в Xmega сохранят эту фичу - Port pin toggle on write "1" to pin register ?
Go to the top of the page
 
+Quote Post
=GM=
сообщение Apr 21 2007, 20:22
Сообщение #9


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 ?
Это относительно новая фича, значит, почти наверняка запатентована, значит, почти наверняка будет в новых разработках.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 22:09
Рейтинг@Mail.ru


Страница сгенерированна за 0.01417 секунд с 7
ELECTRONIX ©2004-2016