›ã‚‹ã€‚
本文ã¸ã‚¹ã‚­ãƒƒãƒ—

アトメル社ã®AVRマイコンをã¤ã‹ã£ãŸé›»å­å·¥ä½œãŠã‚ˆã³ç„¡ç·šã‚’使ã£ãŸé›»å­å·¥ä½œã‚’紹介ã—ã¾ã™ã€‚





ホーム > ソフト室 >AVRマイコンã§å§‹ã‚ã‚‹C言語ã®ä½¿ã„方 >LEDを点ç¯ã•ã›ã‚‹ã€‚

AVRマイコンã§å§‹ã‚ã‚‹C言語ã®ä½¿ã„æ–¹

LEDを点ç¯ã•ã›ã‚‹ã€‚

AVRマイコンã®ãƒãƒ¼ãƒˆã«æŽ¥ç¶šã•ã‚Œã¦ã„ã‚‹LEDã®ç‚¹ç¯ã•ã›ã¾ã™ã€‚
LEDã®ç‚¹ç¯ã«ã¤ã„ã¦ã¯å·¥ä½œå®¤ã®ã€Œã¯ã˜ã‚ã®ä¸€æ­©LEDã®ç‚¹ç¯ã€é ã‚‚å‚ç…§ã—ã¦ãã ã•ã„。

1.マイコンã®åˆæœŸè¨­å®š

マイコンã®åˆæœŸï¼ˆé›»æ°—を入れãŸå¾Œï¼‰ã®ãƒãƒ¼ãƒˆã®çŠ¶æ…‹ã¯å…¥åŠ›ã«è¨­å®šã•ã‚Œã¦ã„ã¾ã™ã€‚
LEDを点ç¯ã•ã›ã‚‹ã«ã¯ã€æŽ¥ç¶šã•ã‚Œã¦ã„るマイコンã®ãƒãƒ¼ãƒˆã‚’出力ã«è¨­å®šã—ã¾ã™ã€‚
次ã«â€™ï¼¨â€™ï¼ˆä»Šå›žã®å­¦ç¿’用ãƒãƒ¼ãƒ‰ã®å ´åˆï¼‰ã‚’ãƒãƒ¼ãƒˆã«å‡ºåŠ›ã—ã¾ã™ã€‚ãƒãƒ¼ãƒˆã«â€™ï¼¨â€™ã¤ã¾ã‚Šï¼•ï¼¶ã‚’出力ã™ã‚‹ã¨ãƒãƒ¼ãƒˆâ†’抵抗680Ω→LED→グランドã¨é›»æ°—ãŒæµã‚Œã¦LEDãŒç‚¹ç¯ã—ã¾ã™ã€‚
ãã®ä»–ã®ãƒãƒ¼ãƒˆã¯ã©ã†ã™ã‚‹ã‹ã¨ã„ã†ã¨å‡ºåŠ›ã«è¨­å®šã—ã¦ãŠãã¾ã™ã€‚ã“ã®ãƒžã‚¤ã‚³ãƒ³ã¯CMOSã§ã§ã§ãã¦ã„ã‚‹ãŸã‚ã«ãƒŽã‚¤ã‚ºç­‰ã§è²«é€šé›»æµãŒæµã‚Œã‚‹å¯èƒ½æ€§ãŒã‚ã‚‹ãŸã‚ã§ã™ã€‚最近ã®ãƒžã‚¤ã‚³ãƒ³ã¯å†…部的ã«ã“ã®ã‚ˆã†ãªã“ã¨ãŒèµ·ã“らãªã„よã†ã«ãªã£ã¦ã„るらã—ã„ã®ã§ã™ãŒã€ATmega328Pã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã«æœªä½¿ç”¨ãƒ”ンã®å–り扱ã„ã«ã¤ã„ã¦æ˜Žç¢ºã«è¨˜è¼‰ã•ã‚Œã„ã¾ã›ã‚“。ãã®ãŸã‚ã“ã“ã§ã¯æœªä½¿ç”¨ã®ç«¯å­ã¯å‡ºåŠ›ã«è¨­å®šã—ã¦ãŠãã¾ã™ã€‚
ATmega328Pã§ã¯ãƒãƒ¼ãƒˆã¯PB0~PB7ã€PC0~PC5(PC6ã¯ãƒªã‚»ãƒƒãƒˆç«¯å­ã¨ã—ã¦ä½¿ç”¨ã—ã¾ã™ã€‚)ã€PD0~PD7ã§ã™ã€‚
ãƒãƒ¼ãƒˆã®å…¥åŠ›ã¾ãŸã¯å‡ºåŠ›ã®è¨­å®šã¯ãƒ¬ã‚¸ã‚¹ã‚¿DDRxã§è¡Œã„ã¾ã™ã€‚(xã¯Bã€Cã€DãŒå…¥ãƒãƒ¼ãƒˆPBã€ãƒãƒ¼ãƒˆPCã€ãƒãƒ¼ãƒˆPDã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚)入力ã¾ãŸã¯å‡ºåŠ›ã®è¨­å®šã¯1ビット毎ã«è¨­å®šã§ãã¾ã™ã€‚
DDRxレジスタ
DDx7 DDx6 DDx5 DDx4 DDx3 DDx2 DDx1 DDx0
åˆæœŸå€¤ 0 0 0 0 0 0 0 0
出力ã®çŠ¶æ…‹'H'ã¾ãŸã¯'L'ã®è¨­å®šã¯ãƒ¬ã‚¸ã‚¹ã‚¿PORTxã§ãŠã“ãªã„ã€'0'を設定ã™ã‚‹ã¨'L'を出力ã—ã€'1'を設定ã™ã‚‹ã¨'H'を出力ã—ã¾ã™ã€‚
PORTxレジスタ
PORTx7 PORTx6 PORTx5 PORTx4 PORTx3 PORTx2 PORTx1 PORTx0
åˆæœŸå€¤ 0 0 0 0 0 0 0 0

学習ãƒãƒ¼ãƒ‰ã§ã¯ã€PD4ã‹ã‚‰P7ãŒLED(出力)ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã™ã€‚PD0~PD3ãŒã‚¹ã‚¤ãƒƒãƒ(入力)ã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã™ã€‚ã€PB0~PB7ãŒLCDã«æŽ¥ç¶šã•ã‚Œã¦ã„ã¾ã™ã€‚
ã§ã¯ã€ãƒãƒ¼ãƒˆã®è¨­å®šã¯ãƒ—ログラムã§ã¯ã©ã®ã‚ˆã†ã«ã™ã‚‹ã‹ã¨ã„ã†ã¨
[入出力ã®è¨­å®šï¼½
DDRD = 0b11110000;  //PD7~PD4ãŒå‡ºåŠ›ã€PD0~PD3ãŒå…¥åŠ›ã«è¨­å®šã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
DDRB = 0b11111111; //PB7~PB0を出力ã«è¨­å®šã™ã‚‹ã“ã¨ã‚’示ã—ã¾ã™ã€‚2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
DDRC = 0b00111111; //PC7ã¨PC6ã¯ãƒãƒ¼ãƒˆã¨ã—ã¦ã¯ä½¿ç”¨ã—ãªã„ã®ã§'0'(åˆæœŸçŠ¶æ…‹ã®ã¾ã¾)ã¨ã—ã¦ãŠãã¾ã™ã€‚
            他ã¯å‡ºåŠ›ã«è¨­å®šã—ã¾ã™ã€‚2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
[出力ãƒãƒ¼ãƒˆã¯'L'ã«è¨­å®šï¼½
PORTD = 0b00000000; //PD7~PD4ã¯'L'出力ã€PD3~PD0ã¯å…¥åŠ›ãƒãƒ¼ãƒˆãªã®ã§åˆæœŸå€¤â€™ï¼â€™ã®ã¾ã¾ã¨ã—ã¾ã™ã€‚
                                     // 2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
PORTB = 0b00000000; //PB7~PB0ã¯'L'出力。2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
PORTC = 0b00000000; //PC7~PC0ã¯'L'出力。2進数ã§è¡¨ç¤ºã—ã¦ã„ã¾ã™ã€‚
以上ã§åˆæœŸè¨­å®šã¯çµ‚了ã§ã™ã€‚

設定方法ã¯ä¸Šè¨˜ã®ã»ã‹ã«ä»¥ä¸‹ã®æ›¸ãæ–¹ãŒã‚ã‚Šã¾ã™ã€‚
(1)DDRB = 0b1111111;   // 2進数ã§è¡¨ç¾ã—ã¾ã™ã€‚上記ã®æ–¹æ³•ã§ã™ã€‚
(2)DDRB = 0xff;               // 16進ã§è¡¨ç¾ã—ã¾ã™ã€‚
(3)DDRB = (1 << DDB7) | (1 << DDB6) | (1 << DDB5) | (1 << DDB4) | (1 << DDB3) | ( 1 << DDB2) |
               (1 << DDB1) | (DDB0);
                        DDBxã¯ãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«ã«ä»¥ä¸‹ã®ã‚ˆã†ã«å®šç¾©ã•ã‚Œã¦ã„ã¾ã™ã€‚
                           #define DDB0 0
                           #define DDB1 1
                           #define DDB2 2
                           #define DDB3 3
                           #define DDB4 4
                           #define DDB5 5
                           #define DDB6 6
                           #define DDB7 7
          "<<"ã¯ã‚·ãƒ•ãƒˆæ¼”ç®—å­ã¨ã„ã„ã¾ã™ã€‚使ã„æ–¹ã¯ã€Œãƒ„ール->Tips->シフト演算å­ã€å‚ç…§ã—ã¦ãã ã•ã„。
(4)PD7ã¨PD6ã‚’'H'ã‹ã‚‰'L'ã«ã‹ãˆãŸã„ã¨ãã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚
          PORTD &= 0x3f;
          PORTD &= ~(( 1 << PORTD7) | (1 << PORTD6))
(5)PD7ã¨PD6ã‚’'L'ã‹ã‚‰'H'ã«å¤‰ãˆãŸã„ã¨ãã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚
          PORTD |= 0xc0;
          PORTD |= (1 << PORTD7) | (1 << PORTD6);

2.プログラムã®ä½œæˆ

AVR Studio 6ã‚’èµ·å‹•ã—ã€ãƒžã‚¤ã‚³ãƒ³ã®å½¢åã‚’ATmega328Pã‚’é¸æŠžã—ã¾ã™ã€‚プロジェクトåã¯é©å½“ã«æ±ºã‚ã¾ã™ã€‚
AVR Studio 6ã®ä½¿ã„æ–¹ã«ã¤ã„ã¦ã¯ã€Œãƒ„ールã®AVR Studio 6インストールåŠã³ä½¿ç”¨æ–¹æ³•ã€ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
åˆæœŸã®ãƒ—ログラムを以下ã«ç¤ºã—ã¾ã™ã€‚

/*
 *avr001t.c
 *
 * Created: 
 *  Author:
 */ 


#include <avr/io.h>

int main(void)
{
    while(1)
    {
        //TODO:: Please write your application code 
    }
}
whileç¹°ã‚Šè¿”ã—ループã«ã¤ã„ã¦
while(æ¡ä»¶å¼){.....}ã§è¡¨ã•ã‚Œæ¡ä»¶å¼ãŒæˆç«‹ï¼ˆçœŸã¾ãŸã¯0ã§ãªã„ã¨ã„ã„ã¾ã™ï¼‰ã—ã¦ã„ã‚‹é–“ã¯{.....}内を繰り返ã—実行ã—ã¾ã™ã€‚whileç¹°ã‚Šè¿”ã—ループã‹ã‚‰æŠœã‘ã‚‹ã®ã¯æ¡ä»¶å¼ãŒæˆç«‹ã—ãªã‹ã£ãŸã¨ã(å½ã¾ãŸã¯0ã®æ™‚ã¨è¨€ã„ã¾ã™ã€‚)ã§ã™ã€‚
while(1)ã¯æ¡ä»¶å¼ãŒï¼‘ã§ã™ã®ã§æ¡ä»¶å¼ã¯å¸¸ã«æˆç«‹ã—ã¾ã™ã®ã§{....}内を無é™ã«ç¹°ã‚Šè¿”ã—ã¾ã™ã€‚

プログラムã¯while(1)ã®å‰ã«æ›¸ãã¾ã™ã€‚åˆæœŸè¨­å®šã‚’è¡Œã£ãŸå¾Œã«LEDを点ç¯ã•ã›ã‚‹ãŸã‚ã«ãƒãƒ¼ãƒˆã«'H'を出力ã—ã¾ã™ã€‚
以下ã«ãƒ—ログラムを示ã—ã¾ã™ã€‚
プログラムã®ãƒžã‚¤ã‚³ãƒ³ã¸ã®æ›¸ãè¾¼ã¿ã¯ã€Œãƒ„ールã®ãƒ—ログラマAVRISP mkâ…¡ã€ã‚’å‚ç…§ã—ã¦ãã ã•ã„。
/*
 * avr001.c
 *
 * Created:
 *  Author:
 */ 


#include <avr/io.h>

int main(void)
{
    // ãƒãƒ¼ãƒˆBåˆæœŸè¨­å®š
    DDRB = 0xff;    // 0b11111111ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚PB7~PB0を出力ã«è¨­å®šã—ã¾ã™ã€‚
    PORTB = 0;      // 0b00000000ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚PB7~PB0ã«'L'を出力ã—ã¾ã™ã€‚ãƒãƒ¼ãƒˆCåˆæœŸè¨­å®š
    DDRC = 0x3f;    // 0b00111111ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚PC7,PC6ã¯åˆæœŸ(入力)ã€PC5~PC0を出力ã«è¨­å®šã—ã¾ã™ã€‚
    PORTC = 0;      // 0b00000000ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚PC7~PC0ã«'L'を出力ã—ã¾ã™ã€‚
    // ãƒãƒ¼ãƒˆDåˆæœŸè¨­å®š
    DDRD = 0xf0;    // 0b11110000ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚
                    // PD7~PD4ã¯å‡ºåŠ›ã€PD3~PD0ã¯å…¥åŠ›ã«è¨­å®šã—ã¾ã™ã€‚
    PORTD = 0;      // 0b00000000ã¨åŒã˜æ„味ã§16進表示ã—ã¦ã„ã¾ã™ã€‚
    
    // LED4ã¤ã¨ã‚‚点ç¯ã•ã›ã¾ã™ã€‚
    PORTD = 0xf0; // PD7~PD4ã«'H'を出力ã—ã¦LEDを点ç¯ã•ã›ã¾ã™ã€‚
    
  while(1)
    {
        //TODO:: Please write your application code 
    }
}
åˆæœŸè¨­å®šã‚’ã—ãŸå¾Œã«LEDãŒç‚¹ç¯ã™ã‚‹ã‚ˆã†ã«ãƒãƒ¼ãƒˆã«'H'を出力ã—ã¾ã™ã€‚点ç¯ã—ãŸå¾Œã¯ãã®çŠ¶æ…‹ã‚’ãšã£ã¨ä¿æŒã—ã¦ãŠãã¾ã™ã®ã§ã€while(1){}ã§ç„¡é™ãƒ«ãƒ¼ãƒ•ã¨ã—ã¾ã™ã€‚一般ã«ãƒžã‚¤ã‚³ãƒ³ã®ãƒ—ログラムã¯ãƒ—ログラムを終了ã•ã›ã‚‹ã“ã¨ãªãç„¡é™ãƒ«ãƒ¼ãƒ—ã§å‹•ä½œçŠ¶æ…‹ã‚’ä¿ã¤ã‚ˆã†ã«ã—ã¾ã™ã€‚
ã†ã¾ã点ç¯ã—ãŸã§ã—ょã†ã‹ï¼Ÿã€€æ¬¡å›žã¯LEDã®ç‚¹æ»…ã‚’ã—ã¾ã™ã€‚
å‰ãƒšãƒ¼ã‚¸æ¬¡ãƒšãƒ¼ã‚¸