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

 
 
 
Reply to this topicStart new topic
> mega1280 ошибка асинхронного(часового) таймера2, некорректно функционирует часовой кварц с асинхронным таймером
yod
сообщение Apr 29 2008, 14:18
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



Вопрос к уважаемым форумчанам, может кто знает эти грабли.
имеется партия опытных девайсов (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 раза чаще чем положено.
включал/выключал подтяжки на ногах кварца.

Кто сталкивался? Что делать? Что попробовать предпринять?
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 29 2008, 14:43
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



А кварц , правильно ли "скварчит" то бишь , частота соответсвует номинальной 32.768
К тому же при включении асинхронного режима выходы порта отключаются от TOScов и подключается внутренная схема генератора.
И тот варц, что нормально работаеь с 48 , запросто может не работать с 1280 - посмотрите , что Atmel рекомендует использовать.


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
yod
сообщение Apr 29 2008, 15:47
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



Цитата(ILYAUL @ Apr 29 2008, 21:43) *

Спасибо, частоту погляжу если смогу - АКТАКОМовский осциллограф "забивает" генерацию кварца, при прикосновении щупа.
в сязи с этим родилась идея подать внешнюю частоту 32768. завтра опробую.
а по даташиту - да граблями и не раз...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 29 2008, 16:07
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ILYAUL
сообщение Apr 29 2008, 17:15
Сообщение #5


Профессионал
*****

Группа: Свой
Сообщений: 1 940
Регистрация: 16-12-07
Из: Москва
Пользователь №: 33 339



"в сязи с этим родилась идея подать внешнюю частоту 32768. завтра опробую"

Необходимо будет по другому инициализировать ассинхронный режим т.е включить бит внешнего входа

Сообщение отредактировал ILYAUL - Apr 29 2008, 17:19


--------------------
Закон Мерфи:

Чем тщательнее составлен проект, тем больше неразбериха, если что-то пошло не так
Go to the top of the page
 
+Quote Post
mdmitry
сообщение Apr 29 2008, 17:43
Сообщение #6


Начинающий профессионал
*****

Группа: Свой
Сообщений: 1 215
Регистрация: 25-10-06
Из: СПб
Пользователь №: 21 648



Необходимо подключить кварц
Для 1281 у меня так:
Код
    ASSR |= _BV(AS2);        /* Подключение кварца 32кГц */
    TCCR2B = _BV(CS22) | _BV(CS21)| _BV(CS20);  /* Timer2 clk/1024 normal mode int every ?? ms */
    TCNT2 = 255;


--------------------
Наука изощряет ум; ученье вострит память. Козьма Прутков
Go to the top of the page
 
+Quote Post
SasaVitebsk
сообщение Apr 29 2008, 18:05
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521



А у меня так. Хотя и в режиме СТС тоже работало

TCCR2B=5; // Делить на 128 (32768/128 = 256)
TIMSK2=1; // Прерывание по OVF
ASSR=0x20; // Тактирование от внешнего часового генератора
Go to the top of the page
 
+Quote Post
yod
сообщение Apr 30 2008, 09:14
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



Всем спасибо, проблема была решена самым убогим способом - подключением дополнительных нагрузочных емкостей по 18пФ на каждую ногу часового кварца. Теперь платы придется переделывать sad.gif
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 5 2008, 20:55
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(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.

Сообщение отредактировал demiurg_spb - May 5 2008, 20:57


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

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

 


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


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