Arduino 中断

各种型号Arduino外部中断引脚

型号Int.0Int.1Int.2Int.3Int.4Int.5备注
UNO23
Mega25602321201918
Leonardo3201
Due所以IO都可

中断函数

中断函数不能带任何参数,且没有返回类型

例如:

void hello()
{
  Serial.println("hello");
}

中断模式

在大多数arduino上有以下四种触发方式:

LOW低电平触发
CHANGE            电平变化,高电平变低电平、低电平变高电平
RISING              上升沿触发
FALLING            下降沿触发
HIGH                 高电平触发(该中断模式仅适用于Arduino Due)

设置中断

配置函数如下:
attachInterrupt(interrupt, function, mode);

interrupt为你中断通道编号,function为中断函数,mode为中断触发模式

需要注意的是在Arduino Due中,中断设置有点不同:
attachInterrupt(pin, function, mode); 

due 的每个IO均可以进行外部中断,所以这里第一个参数为pin,即你使用的引脚编号。

例子

int pin = 13;
volatile int state = LOW;

void setup()
{
  pinMode(pin, OUTPUT);
  attachInterrupt(0, blink, CHANGE);//当int.0电平改变时,触发中断函数blink
}

void loop()
{
  digitalWrite(pin, state);
}

void blink()//中断函数
{
  state = !state;
}

ESP32

const byte interruptPin = 25;
volatile int interruptCounter = 0;
int numberOfInterrupts = 0;
portMUX_TYPE mux = portMUX_INITIALIZER_UNLOCKED;


void handleInterrupt() {
  portENTER_CRITICAL_ISR(&mux);
  interruptCounter++;
  portEXIT_CRITICAL_ISR(&mux);
}

void setup() {
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), handleInterrupt, FALLING);
}

void loop() {
  if(interruptCounter>0){
    portENTER_CRITICAL(&mux);
    interruptCounter--;
    portEXIT_CRITICAL(&mux);
    numberOfInterrupts++;
    Serial.print("An interrupt has occurred. Total: ");
    Serial.println(numberOfInterrupts);
  }

  delay(1000);
}

Arduino ESP32 AD7176数据采集

新完成了一个AD7176数据采集项目:

这个板卡的质量很好,高速采集下仍然很稳定

  // --------A: ADc和接口模式配置 -------------
  // A.1:  ADC模式寄存器
  setupAdcModeReg();    // 0x01
  delay(1);

  // GPIO配置寄存器
  setupGPIOReg();      // 0x06

  //-------- B: ADC设置 ---------------------
  // B.1: 设置配置寄存器
  setupConfigReg();   // 0x20
  // B.2: 滤波器配置寄存器
  setupFilterReg();  // 0x28
  // B.3: 失调寄存器
  setupOffsetReg();  // 0x30
  // B.4: 增益寄存器
  setupGainReg();    // 0x38

  // ------C: 通道映射设置 -----------------
  // C.1: 通道映射
  setupChMap();     // 0x10

  // A.2: 接口模式寄存器
  setupIfModeReg();    // 0x02

理解了上面这个配置流程,开发起来也就很容易了。

ESP_8_BIT:ESP32 带你体验怀旧游戏机

Rossum 是一位有名的 maker,他在最近的一篇博文中向大家介绍了他的最新作品 ESP_8_BIT。这是一个有趣的小工具,只用一颗 ESP32 芯片,即可让用户在电视上享受 Atari 8-bit、NES (Nintendo Entertainment System,红白机) 和 SMS (Sega Master System) 游戏机带来的怀旧游戏体验。

ESP_8_BIT 基于 Arduino IDE 框架,可在 ESP32 上正常运行。它支持 NTSC/PAL 彩色合成视频输出,其 4x 彩色载波信号是由音频 PLL/DAC 在 14.318180 MHz 或 17.734476 MHz 下产生的。ESP_8_BIT 支持经典蓝牙,以及各种 IR 键盘和操纵杆,它包括一个在 VHCI API 上实现的 HCI/L2CAP/HID 栈,支持蓝牙 EDR 外设、WiiMotes 等。ESP_8_BIT 的视频和音频技术十分出色,蓝牙性能也很突出,正因如此,其代码质量也非常高,看起来非常清晰直观。

点此在 YouTube 上观看 ESP_8_BIT 的运行情况。ESP_8_BIT 示意图如下所示:

EESP_8_BIT 示意图

这个项目基于 Atari800 模拟器实现了对 Atari 的支持,乐鑫的 ESP32 在其中也扮演了核心角色。Rossum 对此幽默地表示:“我实在太喜欢 Atari 8-bit 了!四十年了,每当我看到经典的蓝色背景和摇摆的字体时都会十分兴奋。它奇妙的工业设计和磁盘驱动器是一个传奇,很开心看到它以这种新的形式回归!”

ESP_8_BIT 基于 smsplus、playing .sms (Sega Master System) 和 .gg (Game Gear) ROM,实现了对 Sega Master System (SMS) 的支持。正如 Rossum 所言:“这个项目所用的模拟器,就是当时 SpriteTM 第一次向我们展示功能强大的 ESP32 时用的那一个!” 他所提到的 Sprite TM,也是乐鑫的软件工程师、技术营销经理 Jeroen Domburg。Rossum 评价 Jeroen 是“丰富了 ESP32 生态,使其更加有趣和更有价值的一位重要人物。”

点此访问 Rossum 的个人博客,查看更多关于该项目的详细内容

https://zhuanlan.zhihu.com/p/145662878