Raspberry pi和Atmega 328之间的硬件中断

时间:2016-01-31 11:22:54

标签: raspberry-pi atmega

我已将我的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设置为HIGH:

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)) {

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

2 个答案:

答案 0 :(得分:0)

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

你可能遇到布线问题,或者树莓派的速度太快,以至于arduino错过了脉冲。

更改覆盆子pi上的程序,使输出保持高电平很长时间(例如10秒),您可以用万用表测量它,看是否正在设置正确的引脚。

Arduino现在看到了输入吗?

答案 1 :(得分:0)

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

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