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

 
 
> 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



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

 


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


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