前回TimerCalculator2.5がおかしいのがわかってver2.0を使ってタイマー割り込みを確認しました。
Timer 割り込みルーチン内でのコードはいずれも

PORTC.B1 = ~PORTC.B1;

です。PORTCのbit1にLEDが接続されているので上のコードを実行するたびにPORTC.B1が反転します。

Timer0 100msでの割り込み確認のコードは以下の通りです。1秒間に5回点滅することになります。

//Timer0
//Prescaler 1:16; TMR0 Preload = 15535; Actual Interrupt Time : 100.00025 ms

//Place/Copy this part in declaration section
void InitTimer0(){
T0CON     = 0x83;
TMR0H     = 0x3C;
TMR0L     = 0xAF;
GIE_bit     = 1;
TMR0IE_bit     = 1;
}

void Interrupt(){
if (TMR0IF_bit){
TMR0IF_bit = 0;
TMR0H     = 0x3C;
TMR0L     = 0xAF;
//Enter your code here
PORTC.B1 = ~PORTC.B1;
}
}

void InitDevice(void)
{
// 発振 8MHz  x4 = 32MHz
OSCCON.IRCF2 = 1;
OSCCON.IRCF1 = 1;
OSCCON.IRCF2 = 1;
OSCTUNE.PLLEN = 1; // PLL enable x4 ->32MHz 動作になる

// COMPARATOR    OFF
CMCON.CM0 = 1;
CMCON.CM1 = 1;
CMCON.CM2 = 1;

// AD
ADCON1 = 0b001011;//AN0-AN3 AD  AN4-AN12 DIO

// DIO
TRISA = 0b00101111;
TRISB = 0b00000001;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b1111;

// Timer0 init
InitTimer0();

}

Timer1  50ms の割り込みルーチンの確認。コードは以下のようになります。1秒間に10回点滅するコードになります。

//Timer1
//Prescaler 1:8; TMR1 Preload = 15533; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer1(){
T1CON     = 0x31;
TMR1IF_bit     = 0;
TMR1H     = 0x3C;
TMR1L     = 0xAD;
TMR1IE_bit     = 1;
INTCON     = 0xC0;
}

void Interrupt(){
if (TMR1IF_bit){
TMR1IF_bit = 0;
TMR1H     = 0x3C;
TMR1L     = 0xAD;
//Enter your code here
PORTC.B1 = ~PORTC.B1;
}
}

void InitDevice(void)
{
// 発振 8MHz  x4 = 32MHz
OSCCON.IRCF2 = 1;
OSCCON.IRCF1 = 1;
OSCCON.IRCF2 = 1;
OSCTUNE.PLLEN = 1; // PLL enable x4 ->32MHz 動作になる

// COMPARATOR    OFF
CMCON.CM0 = 1;
CMCON.CM1 = 1;
CMCON.CM2 = 1;

// AD
ADCON1 = 0b001011;//AN0-AN3 AD  AN4-AN12 DIO

// DIO
TRISA = 0b00101111;
TRISB = 0b00000001;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b1111;

// Timer0 init
//InitTimer0();
InitTimer1();
}

Timer2 5msの割り込みルーチンは以下の通りです。

//Timer2
//Prescaler 1:16; Postscaler 1:10; TMR2 Preload = 250; Actual Interrupt Time : 5.00125 ms

//Place/Copy this part in declaration section
void InitTimer2(){
T2CON     = 0x4E;
TMR2IE_bit     = 1;
PR2         = 250;
INTCON     = 0xC0;
}

void Interrupt(){
if (TMR2IF_bit){
TMR2IF_bit = 0;
//Enter your code here
PORTC.B1 = ~PORTC.B1;
}
}

void InitDevice(void)
{
// 発振 8MHz  x4 = 32MHz
OSCCON.IRCF2 = 1;
OSCCON.IRCF1 = 1;
OSCCON.IRCF2 = 1;
OSCTUNE.PLLEN = 1; // PLL enable x4 ->32MHz 動作になる

// COMPARATOR    OFF
CMCON.CM0 = 1;
CMCON.CM1 = 1;
CMCON.CM2 = 1;

// AD
ADCON1 = 0b001011;//AN0-AN3 AD  AN4-AN12 DIO

// DIO
TRISA = 0b00101111;
TRISB = 0b00000001;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b1111;

// Timer0 init
//InitTimer0();
//InitTimer1();
InitTimer2();
}

Timer3 50msの割り込みルーチンは以下の通りです。

//Timer3
//Prescaler 1:8; TMR3 Preload = 15533; Actual Interrupt Time : 50 ms

//Place/Copy this part in declaration section
void InitTimer3(){
T3CON     = 0x31;
TMR3IF_bit     = 0;
TMR3H     = 0x3C;
TMR3L     = 0xAD;
TMR3IE_bit     = 1;
INTCON     = 0xC0;
}

void Interrupt(){
if (TMR3IF_bit){
TMR3IF_bit = 0;
TMR3H     = 0x3C;
TMR3L     = 0xAD;
//Enter your code here
PORTC.B1=~PORTC.B1;
}
}

void InitDevice(void)
{
// 発振 8MHz  x4 = 32MHz
OSCCON.IRCF2 = 1;
OSCCON.IRCF1 = 1;
OSCCON.IRCF2 = 1;
OSCTUNE.PLLEN = 1; // PLL enable x4 ->32MHz 動作になる

// COMPARATOR    OFF
CMCON.CM0 = 1;
CMCON.CM1 = 1;
CMCON.CM2 = 1;

// AD
ADCON1 = 0b001011;//AN0-AN3 AD  AN4-AN12 DIO

// DIO
TRISA = 0b00101111;
TRISB = 0b00000001;
TRISC = 0b00000000;
TRISD = 0b00000000;
TRISE = 0b1111;

// Timer0 init
//InitTimer0();
//InitTimer1();
//InitTimer2();
InitTimer3();
}

 

いずれの場合もメインルーチンは

While(1){

}

としています。
40ピンのICとなるとプログラミングのたびの抜き差しが簡単ではないので次回からはICSPの活用を考えたいとおもいます。

 

Tags:

Leave a Reply

This blog is kept spam free by WP-SpamFree.

4 visitors online now
0 guests, 4 bots, 0 members
Max visitors today: 10 at 02:56 pm UTC
This month: 17 at 06-21-2018 05:18 pm UTC
This year: 22 at 01-21-2018 10:47 pm UTC
All time: 133 at 05-04-2015 11:06 pm UTC