fnd 다이나믹 구동하려고 그러는데, 잘 안되네요.
소스입니다.
<init.c>
//timer1 interrupt setting
TCCR1A = 0x00; // CTC mode(4), don't output OC1A
TCCR1B = 0x0b; // 8MHz/64 = 5ms(625)
TCCR1C = 0x00;
OCR1AH = (624>>8);
OCR1AL = 624 & 0xff;
TCNT1H = 0x00; // clear Timer/Counter1
TCNT1L = 0x00;
TIMSK = 0x10; // enable OC1A interrupt
ETIMSK = 0x00;
TIFR = 0x3c; // clear all interrupt flags
ETIFR = 0x01;
<display.c>
#pragma vector = TIMER1_COMPA_vect //5ms interrupt isr
__interrupt void timer1_COMPA_isr(void)
{
if(++icounter==8) icounter=0;
SEGM = 0x00;
DIGM =(1<<icounter);
if(icounter == 4)SEGM = Led_one;
else if(icounter == 8)SEGM = Led_two;
else SEGM =fnd_data[icounter];
kyein = KEYM;
}
5ms 인터럽트 주기를 걸어, fnd를 다이나믹 방식으로 업데이트 시킬려고 하는데, 먹통입니다.
1. 인터럽트 타임을 1초 정도로 크게 잡고 루틴이 실행되는지 확인
__interrupt void timer1_COMPA_isr(void)
{
if(++icounter>=2) icounter=0;
if(0 == icounter){
PORTA =0xFF;
}else if(1 == icounter){
PORTA = 0x00;
}
}
// 여기부터 인터럽트 루틴에 소스를 하나씩 늘려가면서 해보세요.
2. 매핑이 제대로 되었는지 확인해보세요.
SEGM, DIGM, KEYM 를 다른 어드레스로 설정하였다면, 당연히 시스템이 죽을수 있습니다.
최근에 정상적으로 동작하였던 소스와 수정후 최초로 오동작하던 소스를 비교해 보면 금방 알수 있을겁니다.
천천히 다시 살펴 보세요.^^