Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ТС1 в 8535
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
golovin
Добрый день!

МК 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


Голову уже сломал, но понять не могу.
Спасибо
Dima_Ag
Цитата(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
add
Цитата
Длительность отслеживаю по светодиоду.

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

;-----------------------------------------------------------------
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


Будет включать или выключать светодиод при каждом входе в прерывание.
golovin
Всем спасибо, особенно Dima_Ag. Проблема действительно в этом бите.
Видимо глаз уже замылился, поэтому не заметил сам.
=AVR=
"Будь проще, и люди за тобой потянутся!"(с)


Код
.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
=GM=
Цитата(=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               ;

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

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

Код
        sbi     PIND,LED


Интересно, в Xmega сохранят эту фичу - Port pin toggle on write "1" to pin register ?
=GM=
Цитата(=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 ?
Это относительно новая фича, значит, почти наверняка запатентована, значит, почти наверняка будет в новых разработках.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.