Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: mega1280 ошибка асинхронного(часового) таймера2
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
yod
Вопрос к уважаемым форумчанам, может кто знает эти грабли.
имеется партия опытных девайсов (4штуки) на mega1280. питание 3.3В, основной кварц 7.3728МГц.
+ часовой кварц 32768, подключеный c TOSC1 TOSC2.
Девайсы функционируют, в целом, исправно, контроллеры запаяны из одной партии.

имеется код инициализации (Си), настроенный на срабатывание по переполнению 1 раз в секунду:
Код
    /***** MILLSECONDS and SECONDS ASYNC TIMER *******/
        //for external Quarz 32768
//        PORTB&= ~((1<<PG3)||(1<<PG4));
        PORTB|= ((1<<PG3)||(1<<PG4));
        ASSR =(1<<AS2);
        TCCR2B= 0x05;            //1 секунда по переполнению
        TIMSK2=(1<<TOIE2);
    /*************************************************/
    sei();

и ассемблерный обработчик прерывания:
Код
/*------------------ ASYNC TIMER 2 -------------------------*/
.global TIMER2_OVF_vect    
TIMER2_OVF_vect:
        push    r31
        push    r24
        in        r24,_SFR_IO_ADDR(SREG)
        
        lds        r31,SYSTEM_RTC+0
        subi    r31,0xFF
        sts        SYSTEM_RTC+0,r31
        brcs    ast_ms_correct            //корректируем тут
        lds        r31,SYSTEM_RTC+1
        subi    r31,0xFF
        sts        SYSTEM_RTC+1,r31
        brcs    ast_exit
        lds        r31,SYSTEM_RTC+2
        subi    r31,0xFF
        sts        SYSTEM_RTC+2,r31
        brcs    ast_exit
        lds        r31,SYSTEM_RTC+3
        inc        r31
        sts        SYSTEM_RTC+3,r31
        rjmp    ast_exit
//----------------------------------------
        ast_ms_correct:
        push    r30    
        lds        r30,SYSTEM_MS+0
        lds        r31,SYSTEM_MS+1
        subi    r30,lo8(1000)
        breq    ms_end_correct         //корректировки не требуется
        sbci    r31,hi8(1000)
        push    r25    
        lds        r25,ICR5L
        add        r25,r30
        mov        r30,r25
        lds        r25,ICR5H
        adc        r25,r31
        sts        ICR5H,r25
        sts        ICR5L,r30
        pop        r25
ms_end_correct:
        pop        r30        
      ast_exit:
        out        _SFR_IO_ADDR(SREG),r24
        pop        r24
        ldi        r31,0x00
        sts        SYSTEM_MS+0,r31
        sts        SYSTEM_MS+1,r31
        pop        r31
        RETI
/********************************************************/

SYSTEM_RTC - 32-битный ИНТ

ПРОБЛЕМА:
В случае mega1280 прерывания возникают в 5,5 раз чаще 1 секунды
В параллельном проекте на мега48 ЭТО ЖЕ код срабатывает как и положено 1 раз в секунду(кварцы используются теже).

Пробывал искать в нете описание подобного косяка - не нашел.
Изменял делитель - меняется нормально, но срабатывает в 5,5 раза чаще чем положено.
включал/выключал подтяжки на ногах кварца.

Кто сталкивался? Что делать? Что попробовать предпринять?
ILYAUL
А кварц , правильно ли "скварчит" то бишь , частота соответсвует номинальной 32.768
К тому же при включении асинхронного режима выходы порта отключаются от TOScов и подключается внутренная схема генератора.
И тот варц, что нормально работаеь с 48 , запросто может не работать с 1280 - посмотрите , что Atmel рекомендует использовать.
yod
Цитата(ILYAUL @ Apr 29 2008, 21:43) *

Спасибо, частоту погляжу если смогу - АКТАКОМовский осциллограф "забивает" генерацию кварца, при прикосновении щупа.
в сязи с этим родилась идея подать внешнюю частоту 32768. завтра опробую.
а по даташиту - да граблями и не раз...
Сергей Борщ
Цитата(yod @ Apr 29 2008, 17:18) *
Код
        PORTB|= ((1<<PG3)||(1<<PG4));
Извините, что встреваю, но в вышеотцитированной строчке у вас явная ошибка - вы используете логическое ИЛИ ("||") вместо побитового ("|"). В результате эта строчка будет компилиться в PORTB |= 1;
ILYAUL
"в сязи с этим родилась идея подать внешнюю частоту 32768. завтра опробую"

Необходимо будет по другому инициализировать ассинхронный режим т.е включить бит внешнего входа
mdmitry
Необходимо подключить кварц
Для 1281 у меня так:
Код
    ASSR |= _BV(AS2);        /* Подключение кварца 32кГц */
    TCCR2B = _BV(CS22) | _BV(CS21)| _BV(CS20);  /* Timer2 clk/1024 normal mode int every ?? ms */
    TCNT2 = 255;
SasaVitebsk
А у меня так. Хотя и в режиме СТС тоже работало

TCCR2B=5; // Делить на 128 (32768/128 = 256)
TIMSK2=1; // Прерывание по OVF
ASSR=0x20; // Тактирование от внешнего часового генератора
yod
Всем спасибо, проблема была решена самым убогим способом - подключением дополнительных нагрузочных емкостей по 18пФ на каждую ногу часового кварца. Теперь платы придется переделывать sad.gif
demiurg_spb
Цитата(yod @ Apr 30 2008, 13:14) *
Всем спасибо, проблема была решена самым убогим способом - подключением дополнительных нагрузочных емкостей по 18пФ на каждую ногу часового кварца. Теперь платы придется переделывать sad.gif


У меня была схожая проблема на Mega8.
Она решилась включением фуза CKOPT.
Я почти уверен, что у Вас тоже самоеsmile.gif

The CKOPT Fuse selects between two different
Oscillator amplifier modes. When CKOPT is programmed, the Oscillator output
will oscillate a full rail-to-rail swing on the output. This mode is suitable when operating
in a very noisy environment or when the output from XTAL2 drives a second clock
buffer. This mode has a wide frequency range. When CKOPT is unprogrammed, the
Oscillator has a smaller output swing.

By programming the CKOPT Fuse,
the user can enable internal capacitors on XTAL1 and XTAL2, thereby removing the
need for external capacitors. The internal capacitors have a nominal value of 36 pF.

Хотя всё это рассматривается применительно к основному генератору контроллера,
но оно также справедливо и в отношении генератора для асинхронного таймера.
Я сейчас никак не могу найти это место в datasheet, но я читал про это лично.

И по поводу внешнего генератора (datasheet не рекомендует):

The Oscillator is optimized for use with a 32.768 kHz watch crystal. Applying an
external clock to the TOSC1 pin may result in incorrect Timer/Counter2 operation.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.