アトメルマイコンのSPI通信ISRルーチン書き方

このQ&Aのポイント
  • アトメルマイコンのSPI通信ISRルーチンの書き方をご教示ください
  • SPI通信における受信データの割り込み処理をスッキリさせたいです
  • ISR(SPIFの受信ベクタ名)のベクタ名を教えてください
回答を見る
  • ベストアンサー

アトメルマイコンのSPI通信ISRルーチン書き方

現在、ATxmega128A1Uのマイコンのプログラムを作成しています。プログラム内でSPI通信のSPIFポートでデータの送受信を行わせている箇所があります。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c 現在、SPIFポートでのデータ受信は無限ループ内で、 if(SPIF.STATUS & 0x80) このコードでデータ受信の有無を確認して、受信バッファの配列変数に確保するようなやり方を在しています。 しかし、このコードだと受信とデータの送信のタイミングなどを考慮した書き方をしないとけなくて、プログラムが複雑になってしまうような気がしていて、もう少しスッキリさせたいと思い、ATMELのC言語で受信時の割り込み時にSPIFの割り込み時にその割り込みの割り込みルーチンのISR関数に飛ぶようにして、そこで受信データを配列変数に入れていくようにすれば、コードがスッキリするんじゃないかと思っています。 そこで、ISRを描きたいのですが、ISR(SPIFの受信ベクタ名)このSPIFの受信ベクタ名をご教示いただきますよう、宜しくお願い致します。 以前、ATmega88PマイコンでUARTの受信をISRのルーチンで同様のことをやった際のコードを見返してみたら、 ISR(USART_RX_vect) このようなベクタ名を書いていたのですが、この”USART_RX_vect”この文字列がどこのプログラムとリンクしているのか、プロジェクト全体で検索をかけてみても見つかりませんでした。 このベクタ名はどこで確認すれば良いかも教えて頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • kaba__san
  • ベストアンサー率46% (27/58)
回答No.1

iox128a1u.hでベクター名が定義されています。 ビルド済みのプロジェクトであれば、Solution Explorer内のDependenciesを展開すれば関連しているファイルの一覧が出てきますので、その中にiox128a1u.hがあります。 それをダブルクリックすればプロジェクト内で開いて閲覧できます。 _vectで文書内検索すれば定義の羅列が見つかるはずです。 USART_RX_vectのように有効な定義名であればその文字を選択して出てくるプルダウンリストからFind refeferencesを選べばそれが書かれているファイルすべてが結果ウインドウに表示されます。ただしこれも、ビルドが成功している状態でなければなりません。

techhouse
質問者

お礼

回答頂きありがとうございます。 iox128a1.hがDependenciesの中にありました。 このファイル内をSPIFで検索してみたら、 6990行目付近に /* SPIF interrupt vectors */ #define SPIF_INT_vect_num 118 #define SPIF_INT_vect _VECTOR(118) /* SPI Interrupt */ このような文字列が用意されていることがわかりました。 助かります。

関連するQ&A

  • アトメルマイコンでISRを追加すると出てくるエラー

    現在、アトメル社製のマイコンATxmega128A1Uでプログラミングを行なっています。 SPI通信でSPIFポートでの通信を行なっているコードで、受信のコードを割り込みルーチンのようなISRでのコードで受信データを配列に入れるようなコードにしたいと思っています。 そこで、 ISR(SPIF_INT_vect) { } https://github.com/KenjiMaehara/raspberryPiTCPClient/commit/89b4c85451febee0cd841acd531c34cac8112c60#diff-974068d932dfafd8f83f2ef729cab1a3 このような割り込みルーチンのSPIFベクタのコードを追加しましたが、次のようなエラーが発生します。 Error 2 Disabling relaxation: it will not work with multiple definitions 1 1 MainUnit Error 3 ld returned 1 exit status collect2.exe 0 0 MainUnit Error 1 multiple definition of `__vector_118' C:\Users\kmaeh_000\Documents\GitHub\raspberryPiTCPClient\testSpi161101\M1601A_20161205\MainUnit\Debug/.././event.c 87 1 MainUnit このエラーの回避方法をご教示いただきますよう、宜しくお願い致します。

  • c18でのusart受信割り込み

    いつもお世話になっております。 pic18f14k50を使用して設計を行っています。 コンパイラはc18です。 usartで受信したときに割り込みを発生させ、規定の処理を実行したいのですが、割り込みが発生せずに困っております。 timer0を使用した割り込みの記述を行った場合は、割り込みは問題なく発生しました。 usart受信割り込みを以下のようなコードで行いたいのですが、間違いがわかる方がいらっしゃいましたら、ご指摘をお願い致します。 void main(){ TRISB=0x20; TRISC=0; OpenUSART(USART_TX_INT_OFF & USART_RX_INT_ON & USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_CONT_RX & USART_BRGH_HIGH,10);     IPENbits.IPEN=0; IPR1bits.RCIP=1; PIE1bits.RCIE=1; INTCONbits.GIE=1; while(1){ } } #pragma interrupt isr #pragma code isrcode = 0x08 void jump_isr(void){ _asm goto isr _endasm } #pragma code void isr(void){ //割り込み関数 if (PIR1bits.RCIF == 1){ PIR1bits.RCIF =0;         処理; } }

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みルーチンの途中で、条件1により割り込み発生元(メインルーチン)に復帰させてたいのですが、下記のソースに何か問題はございますか? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止          条件1         return;     処理1          条件2         return;     処理2 } よろしくお願い致します。

  • 割り込み処理について

    割り込み処理について 初心者です。 AVRマイコンの割り込み処理について質問させて頂きます。 INT0割り込みの割り込みが入ったら、割り込みルーチン中の他の割り込みを許可し、かつINT0の割り込みを禁止したいのですが、下記ソースで問題はありませんか? INT0割り込みが終了して、メインルーチンに復帰した直後にINT0割り込みを許可したいのですが、下記ソース(1)で問題はありませんか(メインルーチンに復帰した直後に許可したいのですが、方法がわかりません)? ISR(INT0_vect,ISR_NOBLOCK) {     int0割り込み禁止      ・      ・      ・      ・    (int0割り込み要求フラグクリア) ・・・・(1)        (int0割り込み許可)         ・・・・(1)   } よろしくお願い致します。

  • FT232RLを用いた通信について

    FT232RLを使用してPC-マイコン間の通信を行いたいのですが、PC側のプログラムを書いているときにいくつか疑問に思う部分があります。 ・開きたいポート名が"\\\\.\\COM1"となっていますが、COM1の部分は開きたいポート名(コントロールパネルから参照できるもの)ということでわかるのですが、\\\\.\\の部分は必要なのでしょうか? ・BYTE型の配列を使用していますが、こちらの配列の大きさはマイコン側のUARTの送信あるいは受信バイト数にあわせて設定してやればいいのでしょうか? ・CSerialPortクラスのメンバーのReceiveData関数とThreadFunc関数はどうしてWINAPI(__stdcall)で呼び出されているのですか?自分の認識では__thiscallよりもthisポインタがスタックにpushされないので高速であるとは思いますが、そのような速度が必要なのでしょうか?それともマルチスレッドでの場合それが必須なのでしょうか? また、この部分はboostのthreadで代用は聞くのでしょうか? 使用言語およびIDEはリンク先と同じです。 よろしくお願いします。 参考: http://code.msdn.microsoft.com/windowsdesktop/COM-howto-4b79a479

  • DMAを使ったUARTの受信が一度しかできない

    STM32F3 シリーズにて DMA を利用した UART 通信の受信を行ってます。 通信するデータは 7Byte 1Set の固定データで、連続して送信されます。 デバッグを開始して最初の 7Byte は受信できるのですが、それきり受信が止まってしまいます。 何か考えられる原因はありますか? 該当すると思われる箇所のコードを以下にピックアップします。 UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_rx; #define USART1_RX_LEN 7 uint8_t USART1_RXD_Buffer[USART1_RX_LEN]; int main(void) { HAL_Init(); SystemClock_Config(); HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_1); HAL_NVIC_SetPriority(SysTick_IRQn, 0, 1); MX_GPIO_Init(); MX_DMA_Init(); MX_USART1_UART_Init(); HAL_UART_Receive_DMA(&huart1, &USART1_RXD_Buffer[0], USART1_RX_LEN); while (1) { } } ちなみに、最初に 7Byte を正常に受信した後、 huart1.Lock = HAL_UNLOCKED huart1.State = HAL_UART_STATE_READY huart1.ErrorCode = HAL_UART_ERROR_NONE hdma_usart1_rx.Lock = HAL_UNLOCKED hdma_usart1_rx.State = HAL_DMA_STATE_READY となってます。 (この状態で受信も受信による割り込みも発生しない状態になってしまいます。)

  • ラズパイ3のSPI通信で文字列出力

    現在、ラズパイ3とアトメルのマイコン搭載の基板とをSPI通信で通信するためのコードをpythonで作成しています。 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/test20161202.py 前回まで、サンプルのコードを参考に”hello”とい文字列をラズパイ3のSPI1ポートから出力していたのですが、 (中略) print "writing data" #hello spi (ASCII) data = [104, 101, 108, 111, 32] #str(spi.xfer2(data)) spi.xfer2(data) (中略) 文字列をSPIポートから出してみたいと思い、次のようにコードしました。 (中略) print "writing data" #hello spi (ASCII) data = "abcdefg" spi.xfer2(data) (中略) しかしこの場合、 $ sudo python test20161202.py test20161202.py:16: RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings. GPIO.setup(16, GPIO.OUT) writing data このようなエラーがでてpythonでコードを実行できません。 data = "abcdefg" このような文字配列で文字列を出力するコードを書くことはできないのか、ご教示よろしくお願い致します。

  • picからpicへのデータ送信方法について

    pic16f690間でUSARTを使用して、データのやり取りを行おうとしています。 送信側から1~25の10進数を送信し、受信側で受けとった数値の回数の処理を行おうとしています。 コンパイラはCCS社のものを使用しています。 データ送信側は printf("%2x",送りたいデータ) 受信側は usart受信割り込みで  getc(受信したデータを入れる変数) 上記のようにコードを書いています。 しかし、受信側で正しい数値を受信できていないようです。 ただ単に1又は2桁の数値を受信する場合はどのようにすればいいでしょうか? よろしくお願い致します。

  • アトメルのマイコンで、SPI通信で送信ができない

    現在ラズパイ3とAtmelのマイコンATxmega128A1を乗せた基板とをSPI通信させようとしています。 (簡易的な通信の仕様) ・簡易的なパケットデータをラズパイ3側からSPI1の通信ポートからデータを送信。 ・ATxmega128A1側のSPIFポートでデータを受信して、受信内容に応じて1バイトデータをラズパイ3に返送します。 ・ラズパイ3側はパケットデータ3バイトで順番に0x02 -> 0x16 -> 0x00 と送信します。 ・ATxmega128A1側はこのパケットでATxmega128A1のPK1(76番ピン)の入力のH or Lの値をラズパイ3側に返送します。 ATxmega128A1にAtmel-ICEでデバッグしながらプログラムを作っていてわかったのは、ラズパイから送信されてきた3バイトのデータは配列のcmd_data[]の cmd_data[0] = 0x02 cmd_data[1] = 0x16 cmd_data[2] = 0x00 このようにデータが入ってきていて、この部分のSPI通信は問題ないと思うのですが、 https://github.com/KenjiMaehara/raspberryPiTCPClient/blob/master/testSpi161101/M1601A_20161205/MainUnit/event.c こちらの140行目付近の case INPUT_CH18: testtest = get_ch18_Input(); if(testtest==0) { txdata=0x55; } else { txdata=0xaa; } get_ch18_Input()で入力ピンのPK1(76番ピン)のH or Lの値をとって、それによって、txdataに0x55 or 0xaaを入れているのですが、 そのデータを実際に送信しようと SPIF.DATA = txdata; while(!(SPIF.STATUS & 0x80)); dummy = SPIF.DATA; このようにコーディングしたのですが、データ送信されません。 SPIF.DATA = txdata; この部分をデバッガでレジスタの設定などを見ていくと、txdata = 0x55と入っていても SPIF.DATAの内容は全く0x55に書き換わらないのですが、この場合、何かSPI通信の設定で確認したほうがよい内容などをご教示頂きますよう、よろしくお願い致します。

  • C#とマイコンでSCI通信

    マイコンとC#で仮想COMポートを使ってSCI通信しているんですが、 ・「マイコン⇒C#」でデータを受信するときは、  正常に受信でき、 「C#⇒マイコン」がデータを受信するときは    正常に受信できません。 ・C#から何を送っても0x0aの値しかマイコンが受け取りません。 (TeraTermからは正常な値を受け取っています) 以上の点から、C#の送信プログラムの中身が悪いと思うのですが、 C#は初めて手をつけたのでよくわかりません。 送信にはWriteLine()関数を使っています serialPort1.WriteLine("a"); このような感じで一文字一文字送り、マイコンでLCDに表示させ結果を見ています。 シリアルポートの設定は次のように行っています try { beginTime = DateTime.Now; //←プログラムの関係上いれてるだけです this.serialPort1.PortName = this.textBox2.Text; this.serialPort1.BaudRate = 9600; this.serialPort1.Parity = System.IO.Ports.Parity.None; this.serialPort1.DataBits = 8; this.serialPort1.StopBits = System.IO.Ports.StopBits.One; serialPort1.Open(); serialPort1.DtrEnable = true; serialPort1.RtsEnable = true; } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } COMポートに関してはFormに別途ボタンを作りそこから選択するようにしています。 どこが悪いのか概要だけでも教えてほしいください;; よろしくおねがいしますm(__)m