имеется партия опытных девайсов (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();
//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
/********************************************************/
.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 раза чаще чем положено.
включал/выключал подтяжки на ногах кварца.
Кто сталкивался? Что делать? Что попробовать предпринять?