質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

受付中

Raspberry Piの割り込みについて

TatsuyaMorita
Billiecharlie

総合スコア55

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

1評価

0クリップ

233閲覧

投稿2022/06/21 04:00

Raspberry Pi PicoからRaspberry Pi 4Bに一定時間ごとに割り込みをかけ、spi通信をおこない、Raspberry Pi 4BのSCLKの立ち上がりで、Raspberry Pi Picoに割り込みをかけて、Raspberry Pi PicoからMSBから順に16ビット送って、SCLKの立下りで、Raspberry Pi Picoからの信号をRaspberry Pi 4Bで読み取りたいと思うのですが、Raspberry Pi PicoからRaspberry Pi 4Bへの割り込みが一回しかかからないのですが、どうすれば良いでしょうか?

Raspberry Pi Picoに書き込んだC言語とpioアセンブリのプログラムは以下のものです。

C言語

#include <stdio.h> #include <string.h> #include <math.h> #include "hardware/gpio.h" #include "pico/stdlib.h" #include "hardware/pio.h" #include "hardware/clocks.h" #include "myapp.pio.h" #define INTERRUPT_RASPBERRY4B 28 #define MISO 26 #define RASPBERRY4B_SCLK 27 void callback_MISO2(); void callback_MISO3(); void callback_MISO4(); void callback_MISO5(); void callback_MISO6(); void callback_MISO7(); void callback_MISO8(); void callback_MISO9(); void callback_MISO10(); void callback_MISO11(); void callback_MISO12(); void callback_MISO13(); void callback_MISO14(); void callback_MISO15(); void callback_MISO16(); static inline void INTERRUPT_RASPBERRY4B_select(){ asm volatile("nop \n nop \n nop"); gpio_put(INTERRUPT_RASPBERRY4B, 0); asm volatile("nop \n nop \n nop"); } static inline void INTERRUPT_RASPBERRY4B_deselect(){ asm volatile("nop \n nop \n nop"); gpio_put(INTERRUPT_RASPBERRY4B, 1); asm volatile("nop \n nop \n nop"); } uint bitdata1; uint bitdata2; void callback_MISO1(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); pio_sm_clear_fifos(pio1, 0); bitdata2 = bitdata1 & 0b1000000000000000>>15; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO2); } void callback_MISO2(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO2); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0100000000000000)>>14; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO3); } void callback_MISO3(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO3); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0010000000000000)>>13; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO4); } void callback_MISO4(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO4); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0001000000000000)>>12; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO5); } void callback_MISO5(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO5); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000100000000000)>>11; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO6); } void callback_MISO6(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO6); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000010000000000)>>10; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO7); } void callback_MISO7(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO7); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000001000000000)>>9; sleep_us(10); pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO8); } void callback_MISO8(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO8); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000100000000)>>8; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO9); } void callback_MISO9(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO9); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000010000000)>>7; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO10); } void callback_MISO10(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO10); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000001000000)>>6; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO11); } void callback_MISO11(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO11); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000000100000)>>5; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO12); } void callback_MISO12(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO12); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000000010000)>>4; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO13); } void callback_MISO13(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO13); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000000001000)>>3; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO14); } void callback_MISO14(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO14); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0000000000000100)>>2; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO15); } void callback_MISO15(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO15); pio_sm_clear_fifos(pio1, 0); bitdata2 = (bitdata1 & 0b0100000000000010)>>1; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO16); } void callback_MISO16(){ gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO16); pio_sm_clear_fifos(pio1, 0); bitdata2 = bitdata1 & 0b0000000000000001; pio_sm_put_blocking(pio1, 0, bitdata2); sleep_us(10); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO1); } int main() { stdio_init_all(); sleep_ms(3000); gpio_init(INTERRUPT_RASPBERRY4B); gpio_set_dir(INTERRUPT_RASPBERRY4B, GPIO_OUT); gpio_init(RASPBERRY4B_SCLK); gpio_set_dir(RASPBERRY4B_SCLK, GPIO_IN); gpio_pull_down(RASPBERRY4B_SCLK); uint addr = pio_add_program(pio1, &pioasm_program); sleep_ms(5000); pioasm_exec( pio1, 0, addr, MISO, 1, 0, 0, 0, 0, 125.0 ); bitdata1 = 43690; gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); while(true){ INTERRUPT_RASPBERRY4B_deselect(); sleep_us(5); INTERRUPT_RASPBERRY4B_select(); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, true, callback_MISO1); sleep_ms(8000); gpio_set_irq_enabled_with_callback(RASPBERRY4B_SCLK, 0x8u, false, callback_MISO1); } return 0; }

pioアセンブリ

.program pioasm .wrap_target pull block out pins, 1 .wrap % c-sdk { void pioasm_exec( PIO pio, uint state_machine, uint prog_addr, uint outpin_base, uint num_outpin, uint inpin_base, uint num_inpin, uint sidepin_base, uint num_sidepin, float clkdiv ) { 省略 } %} Raspberry Pi 4Bに書き込んだPythonのプログラムは以下のものです。

Python

#coding: utf-8 import RPi.GPIO as GPIO import spidev import time import datetime dummyData = [0x00,0x00] spi = spidev.SpiDev() spi.open(0, 0) # Settings spi.max_speed_hz = 10000 # 10kHz spi.mode = 0 # SPI mode : 0 def write_csv(bitData): dt_now = datetime.datetime.now() with open('ADS8329.csv', 'a') as f: f.write(dt_now.strftime('%Y/%m/%d %H:%M:%S') + "," + str(bitData) + "\n") class CallBack: def __init__(self): # 4番pinを入力、プルアップに設定 self.pin = 4 GPIO.setmode(GPIO.BCM) GPIO.setup(self.pin, GPIO.IN, GPIO.PUD_UP) def callback_test(self): while(True): # 立下りエッジイベント、タイムアウトイベント待ち isr = GPIO.wait_for_edge(self.pin, GPIO.FALLING, timeout=5, bouncetime=1) if isr is None: # 5m秒間割り込みがないときに実行される print("5ms秒間割り込みなし") else: readByteArray = spi.xfer2(dummyData) bitData = ((readByteArray[0] & 0b11111111) << 8) | (readByteArray[1]) write_csv(bitData) cb = CallBack() cb.callback_test()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

y_waiwai

2022/06/21 04:13

回路図がわからないのであれですが、ラズパイ4の4番ピンにはちゃんと繰り返し波形がきているでしょうか
TatsuyaMorita

2022/06/21 04:30

申し訳ございません。 Raspberry Pi4BのGPIO4は、Raspberry Pi PicoのGPIO28に接続しています。 Raspberry Pi4BのGPIO11(SCLK)はRaspberry Pi PicoのGPIO27に接続しています。 Raspberry Pi4BのGPIO9(MISO)はRaspberry Pi PicoのGPIO26に接続しています。
TatsuyaMorita

2022/06/21 04:36

Raspberry Pi Picoが最初に1回GPIO28から信号を出したあと、ずっと割り込みがかかった状態になって、GPIO28から信号を出せなくなっているのではないかと思いました。
y_waiwai

2022/06/21 04:40

まずはそこの信号を確認しないと、いくらコードをいじっても無駄になりますんで、オシロスコープ持ってきてそこの波形を確認しよう
TatsuyaMorita

2022/06/21 05:10 編集

回答ありがとうございます。 オシロスコープで確認したら、やはりRaspberr Pi PicoのGPIO28からの信号は1回しか出てないようでした。
y_waiwai

2022/06/21 05:46

これで、pico側に不具合があるということがわかったわけですね

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。