| 変数型 | サイズ | 値の範囲 | |
|---|---|---|---|
| char | 1バイト | 8ビット | -128 ~ +127 |
| unsigned char | 1バイト | 8ビット | 0 ~ 255 |
| int | 2バイト | 16ビット | -32768 ~ +32767 |
| unsigned int | 2バイト | 16ビット | 0 ~ 65535 |
/*
* avr002.c
* LED点滅させる。
* (1)forループを使う
* Created:
* Author:
*/
#include <avr/io.h>
int main(void)
{
unsigned int i, j;
// ポートの初期化を行います。
// ポートB初期設定
DDRB = 0xff; // PB7~PB0を出力に設定します。
PORTB = 0; // PB7~PB0に'L'を出力します。
// ポートC初期設定
DDRC = 0x3f; // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
PORTC = 0; // PC7~PC0に'L'を出力します。
// ポートD初期設定
DDRD = 0xf0; // PD7~PD4は出力、PD3~PD0は入力に設定します。
PORTD = 0; // PD7~PD0に'L'を出力します。
while(1)
{
PORTD |= 0xf0; // PD7~PD4に'H'を出力してLEDを点灯させます。
for ( i = 0; i < 13; i++)
{
for ( j = 0; j < 10000; j++);
}
PORTD &= 0x0f; // PD7~PD4に'L'を出力してLEDを消灯させます。
for ( i = 0; i < 13; i++)
{
for ( j = 0; j < 10000; j++);
}
}
}
/*
* avr003.c
* _delay_msを使う
* Created:
* Author:
*/
#define F_CPU 1000000UL // 1MHz
#include <util/delay.h>
#include <avr/io.h>
void InitHard( void); // ポートの初期化
int main(void)
{
InitHard();
while(1)
{
PORTD |= 0xf0; // PD7~PD4に'H'を出力してLEDを点灯させます。
_delay_ms( 500);
PORTD &= 0x0f; // PD7~PD4に'L'を出力してLEDを消灯させます。
_delay_ms(500);
}
}
void InitHard( void) // ポートの初期化
{
// ポートB初期設定
DDRB = 0xff; // PB7~PB0を出力に設定します。
PORTB = 0; // PB7~PB0に'L'を出力します。
// ポートC初期設定
DDRC = 0x3f; // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
PORTC = 0; // PC7~PC0に'L'を出力します。
// ポートD初期設定
DDRD = 0xf0; // PD7~PD4は出力、PD3~PD0は入力に設定します。
PORTD = 0; // PD7~PD0に'L'を出力します。
}
whileループ内のみ書いています。
unsigned char d;
while(1)
{
d = PORTD; // PORTDの値を変数dに記憶しておきます。
PORTD = ~(d & 0xf0) | (d & 0x0f); // PD7~PD4を反転した値をPORTDに出力します。
_delay_ms( 500);
}
| 分周比 | 8ビットタイマ[ms] | 16ビットタイマ[ms] |
|---|---|---|
| 1 | 0.255 | 65.535 |
| 8 | 2.040 | 524.280 |
| 64 | 16.320 | 4194.240 |
| 256 | 65.280 | 16776.960 |
| 1024 | 261.120 | 67107.840 |
| WGM13 | WGM12 | WGM11 | WGM10 |
| 0 | 1 | 0 | 0 |
| 分周比 | CS12 | CS11 | CS10 |
|---|---|---|---|
| 停止 | 0 | 0 | 0 |
| 1(分周比無し) fclk / 1 | 0 | 0 | 1 |
| 8分周 fclk / 8 | 0 | 1 | 0 |
| 64分周 fclk / 64 | 0 | 1 | 1 |
| 256分周 fclk / 256 | 1 | 0 | 0 |
| 1024分周 fclk / 1024 | 1 | 0 | 1 |
| ビット名 | ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
|---|---|---|---|---|---|---|---|---|
| 設定値 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 |
| ビット | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 設定値 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 1 |
| ビット名 | - | - | ICIE1 | - | - | OCIE1B | OCI1A | TOIE1 |
|---|---|---|---|---|---|---|---|---|
| 設定値 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 |
| ビット名 | 内容 | 1 | 0 |
|---|---|---|---|
| ICIE1 | インプットキャプチャ割込 | 許可 | 禁止 |
| OCIE1B | コンペアマッチB割込 | 許可 | 禁止 |
| OCIE1A | コンペアマッチA割込 | 許可 | 禁止 |
| TOIE1 | オーバーフロー割込 | 許可 | 禁止 |
/*
* avr005.c
* タイマ割込を使う
* Created:
* Author:
*/
#include <avr/io.h>
#include <avr/interrupt.h>
void InitHard( void); // ポート及びタイマ設定の初期化
int main(void)
{
InitHard(); // ポート及びタイマ設定の初期化
sei(); // 全体の割込を許可
while(1)
{
//TODO:: Please write your application code
}
}
void InitHard( void) // ポート及びタイマ設定の初期化
{
// ポートB初期設定
DDRB = 0xff; // PB7~PB0を出力に設定します。
PORTB = 0; // PB7~PB0に'L'を出力します。
// ポートC初期設定
DDRC = 0x3f; // PC7,PC6は初期(入力)、PC5~PC0を出力に設定します。
PORTC = 0; // PC7~PC0に'L'を出力します。
// ポートD初期設定
DDRD = 0xf0; // PD7~PD4は出力、PD3~PD0は入力に設定します。
PORTD = 0; // PD7~PD0に'L'を出力します。
TCCR1B |= (1 << WGM12); // タイマ1をCTCモードに設定
OCR1A = 62499; // コンペアマッチAレジスタに62499(0xf423)を設定
TIMSK1 |= (1 << OCIE1A); // コンペアマッチA一致で割込を許可します。
TCCR1B |= (1 << CS11); // 8分周でタイマをスタートさせます。
}
SIGNAL( TIMER1_COMPA_vect) // コンペアマッチA割込が発生したときの処理を行います。
{
unsigned char d;
d = PORTD; // PORTDの値を変数dに記憶しておきます。
PORTD = ~(d & 0xf0) | (d & 0x0f); // PD7~PD4を反転した値をPORTDに出力します。
}