電子工作日記、その他

趣味の電子工作製作の記録、その他思った事

Program(5) TIMER1_OVF INTERRUPT

2013-02-01 19:15:07 | 日記
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);
}
}