TIMER1_OVF INTERRUPTの練習ProgramをCでCodeingした。
TIMER1_OVFでは、TIMER1(16bit) 2^16=65536 に 必要なCount値を引いた値をSetする。
65536-12500=53036 をsetする。(後12500countするとOverflowする。)
/**********************************
TIMER1_OVF INTERRUPT Program
-----------------------------------
AVR: ATTINY2313
clock: Internal RC OSC 8MHz
INPUT:
SW:
EVENT: TIMER1_OVF_INTERRUPT 100ms
OUTPUT:
LED:
PORT:
PB0: PB0(12)R-LED TIMER1_OVF TIME
PD0: PD0(2) G-LED main WAIT LOOP check
PA0: PA0(5) R-LED TIMER1_OVF INTERRUPT
Register set value
---------------------------------------------------------------------
//TIMSK 1 0 0 0 0 0 0 0
//TIMSK TOIE1 OCIE1A OCIE1B ----- ICIE1 OCIE0B TOIE0 OCIE0A
//TCCR1A 0 0 0 0 0 0 0 0
//TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 ----- ----- WGM11 WGM10
//TCCR1B 0 0 0 0 0 0 1 1
//TCCR1B ICNC1 ICES1 ----- WGM13 WGM12 CS12 CS11 CS10
-----------------------------------------------------------------------
GND |10 11| PD6
PD5 | 9 12| PB0
PD4 | 8 13| PB1
PD3 | 7 14| PB2
PD2 | 6 15| PB3
PA0 | 5 16| PB4
PA1 | 4 17| PB5
PD1 | 3 18| PB6
PD0 | 2 19| PB7
*RESET/PA2 | 1 20| VCC
---------------------------------*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//----------------------------------
ISR(TIMER1_OVF_vect) // timer1 Overflow interrupt
//----------------------------------
{
TCNT1 = 53036; // 8000000/64/10=12500(1/10sec)
// 65536-12500=53036 each 100ms ↓
PORTA = 0x01;
_delay_ms(5);
PORTA = 0; // LED-R PA0 = 1 Interrupt check
PORTB ^= 0x01; // PB0(12) 8_LED board
}
//--------------------------------
void timer1_init()
//----------------------------
{
TCNT1 = 53036; // 1/10 sec (100ms)
TIMSK =_BV(TOIE1); // Timer1_ovf interrupt enable 1
TCCR1A = 0;
TCCR1B = 3; // 1/64 clock
sei(); // Interrupt Enable
}
//*****************************
int main (void)
//*****************************
{
DDRA = 0x03; // xxxx x011 PA2:(0)RESET PA1: output PA0: LED
DDRB = 0xFF; // 1111 1111 PB0: LED
DDRD = 0x7F; // x111 1110 PD0: LED
PORTA = 0; //
PORTB = 0; //
PORTD = 0; //
PORTB = 0x01; // TIMER1_OVF LED-R
timer1_init(53036); // 65536-12500=53036 each 100ms ↓
while(1)
{
PORTD = 0x01; // LED-G main wait loop
_delay_ms(10); // PD0(2)
PORTD = 0;
_delay_ms(10);
}
}
TIMER1_OVFでは、TIMER1(16bit) 2^16=65536 に 必要なCount値を引いた値をSetする。
65536-12500=53036 をsetする。(後12500countするとOverflowする。)
/**********************************
TIMER1_OVF INTERRUPT Program
-----------------------------------
AVR: ATTINY2313
clock: Internal RC OSC 8MHz
INPUT:
SW:
EVENT: TIMER1_OVF_INTERRUPT 100ms
OUTPUT:
LED:
PORT:
PB0: PB0(12)R-LED TIMER1_OVF TIME
PD0: PD0(2) G-LED main WAIT LOOP check
PA0: PA0(5) R-LED TIMER1_OVF INTERRUPT
Register set value
---------------------------------------------------------------------
//TIMSK 1 0 0 0 0 0 0 0
//TIMSK TOIE1 OCIE1A OCIE1B ----- ICIE1 OCIE0B TOIE0 OCIE0A
//TCCR1A 0 0 0 0 0 0 0 0
//TCCR1A COM1A1 COM1A0 COM1B1 COM1B0 ----- ----- WGM11 WGM10
//TCCR1B 0 0 0 0 0 0 1 1
//TCCR1B ICNC1 ICES1 ----- WGM13 WGM12 CS12 CS11 CS10
-----------------------------------------------------------------------
GND |10 11| PD6
PD5 | 9 12| PB0
PD4 | 8 13| PB1
PD3 | 7 14| PB2
PD2 | 6 15| PB3
PA0 | 5 16| PB4
PA1 | 4 17| PB5
PD1 | 3 18| PB6
PD0 | 2 19| PB7
*RESET/PA2 | 1 20| VCC
---------------------------------*/
#define F_CPU 8000000UL
#include <util/delay.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//----------------------------------
ISR(TIMER1_OVF_vect) // timer1 Overflow interrupt
//----------------------------------
{
TCNT1 = 53036; // 8000000/64/10=12500(1/10sec)
// 65536-12500=53036 each 100ms ↓
PORTA = 0x01;
_delay_ms(5);
PORTA = 0; // LED-R PA0 = 1 Interrupt check
PORTB ^= 0x01; // PB0(12) 8_LED board
}
//--------------------------------
void timer1_init()
//----------------------------
{
TCNT1 = 53036; // 1/10 sec (100ms)
TIMSK =_BV(TOIE1); // Timer1_ovf interrupt enable 1
TCCR1A = 0;
TCCR1B = 3; // 1/64 clock
sei(); // Interrupt Enable
}
//*****************************
int main (void)
//*****************************
{
DDRA = 0x03; // xxxx x011 PA2:(0)RESET PA1: output PA0: LED
DDRB = 0xFF; // 1111 1111 PB0: LED
DDRD = 0x7F; // x111 1110 PD0: LED
PORTA = 0; //
PORTB = 0; //
PORTD = 0; //
PORTB = 0x01; // TIMER1_OVF LED-R
timer1_init(53036); // 65536-12500=53036 each 100ms ↓
while(1)
{
PORTD = 0x01; // LED-G main wait loop
_delay_ms(10); // PD0(2)
PORTD = 0;
_delay_ms(10);
}
}