pp.563ff.
テキストは、SPI接続のLEDドライバーMAX7221で7セグLEDを駆動しているが、ここでは雷センサーAS3935を試す。SparkFun社製ブレークアウトボードを使う。
SparkFun社製ブレークアウトボード (接続図)の注意点:
- SPI専用。
- 内蔵レギュレーターは未使用。したがって電源電圧は3.3 V専用。
- IOは3.3 V。
- ボード上にINTとあるが実際はHi有意。
そうそう都合よく雷は鳴ってくれないので、とりあえずチャッカマンで動作確認をする。火花を飛ばしたいだけである。一往何かを検出してはいる。
https://github.com/ti-nspire/AVR/tree/master/AS3935%231/test_C
#define F_CPU 8000000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "USARTClass.h" #include "SPIClass.h" const uint8_t CS_port = 'B'; const uint8_t CS_pin = 2; SPIClass spi(128, 1, 'M', CS_port, CS_pin); // (分周比, モード, ?SBファースト, CSポート, CSピン) volatile uint8_t detected = 0; ISR(INT0_vect){ detected = 1; } int main(){ usart.init(); spi.init(); EIMSK |= (1 << INT0); // INT0 (外部割り込み要求0)を有効化する。 EICRA |= (1 << ISC01) | (1 << ISC00); // rising edgeで割り込む。 sei(); // グローバル割り込みを有効化する。 uint8_t occurences = 0; while(1){ if(detected){ // 雷が検知されたら spi.selectSlave(CS_port, CS_pin); spi.tradeByte(0b01 << 6 | 0x07); spi.tradeByte(0); spi.deselectSlave(CS_port, CS_pin); usart.printString("#"); usart.printByte(occurences++); // 何発目であるかを表示して、 usart.printString("\n"); usart.printString("distance (km): "); // 距離を表示して、 usart.printByte(SPDR); usart.printString("\n"); _delay_ms(3); spi.selectSlave(CS_port, CS_pin); spi.tradeByte(0b01 << 6 | 0x03); spi.tradeByte(0); spi.deselectSlave(CS_port, CS_pin); usart.printString("int source: "); usart.printByte(SPDR & 0b1111); // 割り込み要因を表示する。 usart.printString("\n\n"); detected = 0; } } return 0; }