【解決済み】Arduino dueのuartの割り込みがうまくいってない

下記のサンプルコードを見ると、

data == 49/50でLEDをon/offしている。

49/50は

ASCIIコード表

より、

49: 0x31, 1

50: 0x32, 2

となる。1/2をシリアルで送ると、割り込みが入ってON/OFFする?

書き込めたが、LEDはON/OFFしなかった。

 

UART interrupt Arduino Due ?

#define LED_BUILTIN 13
volatile uint8_t data;
char TXBUFFER[64]; // UART PDC Transmit buffer
void UART_Handler (void) __attribute__ *1;
void UART0_Handler(void) {
 
  if (UART->UART_SR & UART_SR_RXRDY) {
    data = UART->UART_RHR;
   if(data == 49) digitalWrite(LED_BUILTIN, LOW); 
   else if(data == 50) digitalWrite(LED_BUILTIN, HIGH); 
  }
  

}

void setup() {
   
    
   PMC->PMC_PCER0 = PMC_PCER0_PID8;  // UART power ON

  // Reset and disable receiver & transmitter
  UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS;

  // Set the baudrate to 250000
  UART->UART_BRGR = 21; // 84 000 000 / 16 * x = BaudRate (write x into UART_BRGR)

  // No Parity
  UART->UART_MR = UART_MR_PAR_NO;

  // Disable PDC channel requests
  UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS;

  // Disable / Enable interrupts on end of receive
  UART->UART_IDR = 0xFFFFFFFF;
  UART->UART_IER = UART_IER_RXRDY;
  NVIC_EnableIRQ*2;
void UART_Handler(void)
{
 Serial.IrqHandler();
} 

UART_Handler

 

void UART_Handler (void) __attribute__ *3;

UART interrupt Arduino Due ?

serial - How to setup SAM3x8e IRQ handler for USART? - Electrical Engineering Stack Exchange

 

ただ割り込み中に、シリアルポートを使用したりするといともたやすくフリーズする。用途的にloop()関数のあとに実行されるSeralEvent()で十分であれば、そっちの方が簡単である。

Arduinoリファレンス(Serial.serialEvent)

Serial.available()

Arduino 日本語リファレンス

 

variant.cppは

C:UserschinoAppDataLocalArduino15packagesarduinohardwaresam.6.11ariantsarduino_due_xariant.cpp

thermometer/variant.cpp at master · takurx/thermometer · GitHub

にあった。

 

weakシンボルを使うと多重定義が避けられるらしい。

リンクされているライブラリによってプログラムの動作を変える - bkブログ

karky7のブログ: weakシンボルに時間をとられた

weakシンボル - syohex’s diary

weakシンボルなしで再定義すると、エラーになるのは確認した。

visual studio上で動くVisual MicroのArduinoプラグインを使った環境で確認した。なかなか便利。 Arduino IDE for Visual Studio and Atmel Studio

 

Arduinoプラグインでシリアルの使いすぎ?でエラーになると

VMDPV_1|1_V

をシリアル出力して、フリーズしたりした。

Visual Studio Ide for Arduino - False errors

 

わりと簡単そうに書いてて、できるんじゃないかなーと思ってたところ、解決できたので良かった。

 

その他:

Arduino の attachInterrupt() での割り込み処理

Atmel Studio入門:割り込み処理 | easy labo

*1:weak

*2:IRQn_Type) ID_UART);

  // Enable receiver and transmitter
  UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN;


   pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, HIGH); 
  
}

void loop() {

}

 

ArduinoCore-sam/variant.cpp at master · arduino/ArduinoCore-sam · GitHub

// 0/1 - UART (Serial)
void UART_Handler(void)

// 18/19 - USART0 (Serial1)
void USART0_Handler(void)

// 16/17 - USART1 (Serial2)
void USART1_Handler(void)

// 14/15 - USART3 (Serial3)
void USART3_Handler(void)

 

 

 

追記:2018/08/15

 

variant.cppの方のUART_Handlerにweakシンボルを追加して、

自分のスケッチの方でUART_Handlerを再定義すると、割り込み時の処理を変更することができる。

 

void UART_Handler(void) __attribute__((weak

*3:weak

Macのscreenコマンドでシリアル通信

参考のリンクのそのまま。

Mac の screen コマンドでシリアル通信

 

RS232C-USBケーブルをさす前

[chino@kafu ~]$ls -l /dev/tty.*
crw-rw-rw- 1 root 35, 4 Jul 20 20:17 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw- 1 root 35, 0 Jul 20 20:17 /dev/tty.kokoahoto-SPPDev-1
crw-rw-rw- 1 root 35, 2 Jul 20 20:17 /dev/tty.kokoahoto-SPPDev-6
crw-rw-rw- 1 root 35, 6 Jul 20 20:17 /dev/tty.rizetedezasiPhone-Wirele

RS232C-USBケーブルをさした後。認識した。

[chino@kafu ~]$ls -l /dev/tty.*
crw-rw-rw- 1 root 35, 4 Jul 20 20:17 /dev/tty.Bluetooth-Incoming-Port
crw-rw-rw- 1 root 35, 0 Jul 20 20:17 /dev/tty.kokoahoto-SPPDev-1
crw-rw-rw- 1 root 35, 2 Jul 20 20:17 /dev/tty.kokoahoto-SPPDev-6
crw-rw-rw- 1 root 35, 10 Jul 21 17:39 /dev/tty.usbserial
crw-rw-rw- 1 root 35, 6 Jul 20 20:17 /dev/tty.rizetedezasiPhone-Wirele

RS232C-USBケーブルの/dev/tty.usbserialを指定して、screenコマンドを38400bpsで実行。

[chino@kafu ~]$sudo screen /dev/tty.usbserial 38400
Password:

 screenコマンドを終わるときは、ctrl+aとk。

ArduinoでC++風の"<<"での文字列の連結

下記を参考に、

ライブラリを追加して、動作させてみた。便利だ。

#include <Streaming.h>
#include <PString.h>


char serialBuffer[4800];
PString serialStr(serialBuffer, sizeof(serialBuffer));

 

serialStr << "ADC 10bit: " << analogRead(A0) << ", ";
Serial.print(serialStr);

serialStr = ""; //初期化しないと文字が追加されていく

 

ライブラリの追加は、下記のzipファイルをダウンロードして、

- Streaming5.zip

- PString3.zip

 をメニューバーの

スケッチ>ライブラリをインクルード>.zip形式のライブラリのをインストール...

を選択して、zipファイルを選択するとライブラリが追加される。

追記

serialStr = ""; //初期化しないと文字が追加されていく

のに気づいた。

 

スケッチの備忘録−文字列の連結 - MuFuFuの日記

 

スケッチで文字列の連結+αを行う方法

導入ライブラリ

1.「Streaming」・・・文字列を << を使用して連結可能にする。

2.「PString」・・・・上記連結の字列を代入可能な変数を設定可能にする。

 

http://arduiniana.org/libraries/streaming/

Download

The latest version of Streaming is available at Streaming5.zip.

 

http://arduiniana.org/libraries/PString/

Download

The latest version of PString is PString3.zip.

 

analogReadResolution(bits):arduinoのAD変換のbit数変更

http://www.musashinodenpa.com/arduino/ref/index.php?f=0&pos=2244

void loop() {
// read the input on A0 at default resolution (10 bits)
// and send it out the serial connection
analogReadResolution(10);
Serial.print("ADC 10-bit (default) : ");
Serial.print(analogRead(A0));

// change the resolution to 12 bits and read A0
analogReadResolution(12);
Serial.print(", 12-bit : ");
Serial.print(analogRead(A0));

 

デフォルトのAD変換が10bitなので、

analogReadResolution(12)を入れて、12bitにする。(Arduino dueの場合)

Travis CI を走らせた

 

参考:

secret-garden.hatenablog.com

 

参考通り進めて、git pushしようとしたら

[chino@kafu cpp-test-travis-ci]$git push -u origin master

git@github.com: Permission denied (publickey).

fatal: Could not read from remote repository.

 

Please make sure you have the correct access rights

and the repository exists.

 permissionがおかしいとでるので、ssh keyを登録し直した。

(前にgithubsshの設定して消したんだよなー。)

参考:

employment.en-japan.com

 

それでsshの接続テストは成功したけど、あいかわらずgit pushが通らない。。。

[chino@kafu cpp-test-travis-ci]$ssh -i ~/.ssh/id_rsa_github git@github.com

Enter passphrase for key '/Users/chino/.ssh/id_rsa_github':

PTY allocation request failed on channel 0

Hi takurx! You've successfully authenticated, but GitHub does not provide shell access.

Connection to github.com closed.

 

[chino@kafu cpp-test-travis-ci]$git push -u origin master

git@github.com: Permission denied (publickey).

fatal: Could not read from remote repository.

 

Please make sure you have the correct access rights

and the repository exists.

 は成功したけど、あいかわらずgit pushが通らない。。。

 

エラーでぐぐったら、ssh-addコマンドを使えば良いとのことでやったところできるようになった。

参考:

qiita.com

[chino@kafu cpp-test-travis-ci]$ssh-add /Users/chino/.ssh/id_rsa_github

Enter passphrase for /Users/chino/.ssh/id_rsa_github:

Identity added: /Users/chino/.ssh/id_rsa_github (/Users/chino/.ssh/id_rsa_github)

 

[chino@kafu cpp-test-travis-ci]$git push -u origin master

Counting objects: 8, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (6/6), done.

Writing objects: 100% (8/8), 799 bytes | 399.00 KiB/s, done.

Total 8 (delta 0), reused 0 (delta 0)

To github.com:takurx/cpp-test-travis-ci.git

* [new branch]      master -> master

Branch 'master' set up to track remote branch 'master' from 'origin'.

 

ssh key指定のsshも試したけど、これはだめだったわ。

github に SSH key を登録しても Permission denied (publickey) | Home Made Garbage

[chino@kafu cpp-test-travis-ci]$ssh -i ~/.ssh/id_rsa_github git@github.com

Enter passphrase for key '/Users/chino/.ssh/id_rsa_github':

PTY allocation request failed on channel 0

Hi takurx! You've successfully authenticated, but GitHub does not provide shell access.

Connection to github.com closed.

 

[chino@kafu cpp-test-travis-ci]$git push -u origin master

git@github.com: Permission denied (publickey).

fatal: Could not read from remote repository.

 

Please make sure you have the correct access rights

and the repository exists.

 

そして、Travis CIをwebから設定した。再度pushをかける。

Readme.mdを編集して、commitしてpushしたら、Travis CIが走った。

[chino@kafu cpp-test-travis-ci]$git commit -a

[master 1657762] trigger to push

1 file changed, 1 insertion(+)

 

 

[chino@kafu cpp-test-travis-ci]$git push origin master

Counting objects: 3, done.

Delta compression using up to 4 threads.

Compressing objects: 100% (2/2), done.

Writing objects: 100% (3/3), 330 bytes | 330.00 KiB/s, done.

Total 3 (delta 0), reused 0 (delta 0)

To github.com:takurx/cpp-test-travis-ci.git

   82de7d1..1657762  master -> master

 

以下だとpushできなかった。なんでだろ。後で調べる。

コマンドラインのgitは覚えないと。コマンドラインからの方が楽ではあるので。

[chino@kafu cpp-test-travis-ci]$git commit -m "trigger to push"

On branch master

Your branch is up to date with 'origin/master'.

 

Changes not staged for commit:

modified:   README.md

 

no changes added to commit

 

[chino@kafu cpp-test-travis-ci]$git push -u origin master

Branch 'master' set up to track remote branch 'master' from 'origin'.

Everything up-to-date

 

追記:バッチのリンク入れるのを忘れてた。

rcmdnk.com

バッジを貼る

設定が出来てテストなどを行えたら結果の表示をしたいわけですが、 バッジはTravis CIにある各レポジトリの右上のバッジ部分をクリックすると バッジのURLなどが出てきます 9

travisgetbadge

いくつか表示形式が選べるので、 GitHubのREADMEなんかに貼るにはMarkdownを選んで貼るります。