【问题标题】:Hardware interrupt between Raspberry pi and Atmega 328Raspberry pi 和 Atmega 328 之间的硬件中断
【发布时间】:2016-01-31 11:22:53
【问题描述】:

我已将我的 RPI 和 atmega328 连接在一起,以便在我的 arduino 上控制事件的开始。为此,GPIO 25 (RPI) 直接连接到 pin7 (Arduino PD7)。我在 RPI 上有一个 python 脚本,将 GPIO 25 设置为高,然后再设置为低:

    import RPi.GPIO as GPIO 

    GPIO.setmode(GPIO.BCM)
    GPIO.setup(25, GPIO.OUT)

    GPIO.output(25, 1)
    #Do some stuff
    GPIO.output(25, 0)

arduino 正在循环等待按下物理按钮或 RPI 将 pin7 设置为高:

const int interrupt = 7;
const int button = 13;
const int led = 9;

void setup() {
  Serial.begin(9600);
  pinMode(interrupt, INPUT);
  pinMode(button,INPUT);
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
}

void loop() {
  bool on = false;
  bool buttonOn = false;

  while (!on || !buttonOn) {
    on = digitalRead(interrupt);
    buttonOn = digitalRead(button);
    digitalWrite(led, LOW);
  }
  digitalWrite(led, HIGH);
  delay(1000);
}

现在不幸的是,这不起作用。我检查了 atmega328 (https://learn.sparkfun.com/tutorials/logic-levels) 的逻辑电平,看起来 3.3V 对 HIGH 信号来说已经足够了。

我是否缺少上拉/下拉阻力的东西?我知道 atmega 上的 PD7 指定如下:

端口 D 是一个 8 位双向 I/O 端口,带有内部上拉电阻 电阻器(为每个位选择)。端口 D 输出缓冲器有 具有高灌电流和源电流的对称驱动特性 能力。作为输入,外部拉低的端口 D 引脚将 如果上拉电阻被激活,源电流。端口 D 引脚 当复位条件变为有效时,即使时钟处于三态 没有运行。

编辑: 我做了更多的测试,我得到了正确的 HIGH 或 LOW 值。问题似乎来自:

while ((!on) || (!buttonOn)) {

在 while 循环中,Arduino 和 OR 运算符是否存在问题?即使一个条件为真而另一个条件为假,它也永远不会退出循环。

【问题讨论】:

  • 1.我永远不会直接使用 3.3v 系统和 5v 系统。始终使用电平转换器或某种缓冲器。 2. buttonOn = digitalRead(中断); -> buttonOn = digitalRead(按钮); 3、你有没有用万用表检查过输入管脚的电压?
  • 我认为从 3.3V 到 5V 是安全的,我总是使用 5V 到 3.3V 的电平转换器。是的,我用万用表检查过,ATmega 的输入引脚上的电压约为 3.3V。

标签: raspberry-pi atmega


【解决方案1】:
while ((!on) || (!buttonOn)) {
}

只要其中一个变量为假,该循环就会运行。 昨天我出于某种原因认为您在读取代码时读取了两次中断引脚。

【讨论】:

  • 谢谢,我应该使用 && 运算符。现在可以了。
【解决方案2】:

3.3 v 输出应该可以将 Arduino 输入设为高电平。

你可能有接线问题,或者你的树莓派太快以至于 arduino 错过了脉冲。

更改您在树莓派上的程序,让输出保持高电平如此长的时间(例如 10 秒),以便您可以用万用表测量它以查看您设置的引脚是否正确。

Arduino 现在看到输入了吗?

【讨论】:

  • 我应该精确它,但“#do stuff”部分持续超过 20 秒。使用万用表,RPI 引脚上的电压为 3.29V,ATmega 的引脚 7 上的电压相同。
  • 嗯。会不会是你把电线连接到了 arduino 上的错误引脚? arduino 看到引脚总是低还是高?
  • 这绝对是正确的引脚,我已经检查了多次。 arduino 永远不会脱离循环“while (!on || !buttonOn)”,因此即使引脚 7 上经过验证的电压为 3.29V,它仍保持在低电平...
  • 2 条建议:1) 从循环中删除引脚 7 的双重读数,只是为了好玩,看看它是否有任何作用。 2)如果这不起作用,请使用微调电位器,其值约为 1K 至 10KOhm。断开 rpi 与 arduino 的连接。将修剪器的一端连接到 arduino +5v,另一端接地。将微调电位器的中间连接到引脚 7 和万用表。现在在 0.5...4.5v 之间调整引脚 7 的电压,看看您的代码是否触发。如果不是,则代码或 atmega 有问题。请勿将微调器调整到接近任一端的 10% 以内,以免损坏。
  • 感谢您的回答,我今天早上做了一些测试,它似乎达到了预期的 HIGH 和 LOW 水平。问题似乎来自 while 循环和 OR 运算符。
猜你喜欢
  • 1970-01-01
  • 2021-03-31
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-30
  • 2017-05-25
相关资源
最近更新 更多