GR-SAKURA
GR-KURUMI
GR-COTTON
GR-CITRUS
GR-PEACH
GR-KAEDE
GR-ADZUKI
GR-LYCHEE
GR-ROSE
GR-MANGO(*)
SNShield
Web Compiler
IDE for GR
TOPPERS関連
女子美コラボ
その他
※プロデューサミーティング中
作り方使い方資料
イベント関連
作品記事
体験記事
ライブラリ
ツール
その他・過去ファイル
IDE for GR1.11で下のようなプログラム書いています。dataの値を得るのに早くしたいのですが、よい方法はございますか?
サクラはカメラモジュールからデータをもらいます。ご指導お願いします。
unsigned int data=0; long *porta; long ad=0x8C00A; porta=&ad; data=digitalRead(7)*128+ digitalRead(6)*64+ digitalRead(5)*32+ digitalRead(4)*16+ digitalRead(17)*8+ digitalRead(16)*4+ digitalRead(15)*2+ digitalRead(14)*1; Serial.print("PORTA "); Serial.println(PORTA.PIDR.BYTE, HEX); Serial.print("0x8C00A "); Serial.println((unsigned int)porta, HEX); Serial.print("data "); Serial.println(data, HEX);
とりあえず、ポートのアドレスを配列に格納してから読む方法を行った場合、約2分の1になりました。digitalRead内でピンからレジスタを読むのを省略しているだけです。
以下は試したプログラムです。1000回繰り返したときの時間として、つくたろうさんのは3130us、配列に格納した場合は1474usでした。
const uint8_t pins[8] = { 7, 6, 5, 4, 17, 16, 15, 14 };void setup() { // put your setup code here, to run once: Serial.begin(9600); pinMode(PIN_LED3, OUTPUT); digitalWrite(PIN_LED3, LOW); // 終了通知用 delay(1000); unsigned int data = 0; volatile uint8_t *port_adr[8]; uint8_t port_bit[8]; for(int i = 0; i < 8; i++){ pinMode(pins[i], INPUT_PULLUP); uint8_t port = digitalPinToPort(pins[i]); port_adr[i] = portInputRegister(port); port_bit[i] = digitalPinToBitMask(pins[i]); } unsigned long start = micros(); for(int i = 0; i < 1000; i++){#if 0 data=digitalRead(7)*128+ digitalRead(6)*64+ digitalRead(5)*32+ digitalRead(4)*16+ digitalRead(17)*8+ digitalRead(16)*4+ digitalRead(15)*2+ digitalRead(14)*1;#else data =( ((*port_adr[0] & port_bit[0]) != 0) << 7 | ((*port_adr[1] & port_bit[1]) != 0) << 6 | ((*port_adr[2] & port_bit[2]) != 0) << 5 | ((*port_adr[3] & port_bit[3]) != 0) << 4 | ((*port_adr[4] & port_bit[4]) != 0) << 3 | ((*port_adr[5] & port_bit[5]) != 0) << 2 | ((*port_adr[6] & port_bit[6]) != 0) << 1 | ((*port_adr[7] & port_bit[7]) != 0) );#endif } Serial.println(micros() - start); Serial.print("data "); Serial.println(data, HEX); digitalWrite(PIN_LED3, HIGH);}void loop() { // put your main code here, to run repeatedly: }