成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

MCP23017中断教程

此页面是如何使用多个MCP23017中断的信息。如果你是 寻找MCP23017的更多信息然后转到 这一页 那里有更多关于所有的一般信息 设备的各个方面包括其他示例代码和寄存器 descriptions.

在上面的页面链接中,存在中断使用的示例,但这是 一个设备。什么促使我写这个页面是胜利者的一个问题, 如下所示:


我读过你的出色工作 MCP23017,最好的网上!我需要你的专业知识 使用我的RFID棋盘项目。我的原型使用MCP23017控制A. 天线矩阵(下棋下方)仅连接到一个RFID 读者模块。概念证明与天线矩阵很好。现在我 需要从项目的这个阶段进行。加快我需要的系统 将霍尔效应开关放在各个国际象棋广场上。我需要使用8 MCP23017S,4控制天线和4以监控交换机。这意味着我 必须使用交换机的中断。

我需要的帮助是我如何去监控4 mcps中断/ btw i 计划使用Macetech.com使用蜈蚣。

谢谢

维克多菲亚

用许可转载。

我看看蜈蚣产品,看起来很有用 木板。它有四种MCP23017设备,提供64个引脚的I / O能力和您 可以将另一个连接到I2C总线上,最多为128个I / O引脚。在这一点 板是设置每个板的地址范围的跳线。

然后,您可以使用MaceTech提供的软件库访问引脚 每个板(2个电路板最大最大为128个引脚)以类似的方式 Arduino函数如DigitalWrite等。

关于董事会的假设

我不'我自己拥有一个,所以做了一些,希望合理,假设 关于PCB以来网站未显示实际的PCB迹线。

假设是:

  • 每个MCP23017中断引脚的INTA输出都没有连接到任何地方 else on the board.
  • 在蜈蚣板上没有连接Arduino Pin 3。
  • 板设置为地址0(左侧跳线) - 意思是 MCP23017引脚0 - 64处于地址0 - 64 I.低地址 software.

用于蜈蚣的接线Mods board

用于多个23017的多个中断操作的接线原理图

查看放大的图像 这里.

接线很简单:

  1. 使电路板在地址0:跳线到左侧的左侧。
  2. 将所有INTA焊盘连接在一起,将它们连接到PIN 3(一个 interrupt pin).
  3. 将10K电阻从其中一个焊盘和5V连接到5V。
提示: 我注意到每个板都有一组I2C上拉 电阻器 - 如果使用2个板时,他们只需要一个 放。电阻值越低,边缘更快,但电源越大 使用(较高电流)。如果您将它们留在两个董事会上的价值 电阻将是平行的,即测量的R4或R5的一半。如果他们是1k 然后500欧姆正在降低一点 - 下拉电流将是5/500 = 10mA - 不是太多但不必要。

PIN映射到数字

你可以有点困惑(或者至少我做过) - 只是不够支付 注意力。端口B占据芯片的引脚1至8(见下文),您倾向于 假设这些是第一个端口。然而,端口A占用销21至28。 在蜈蚣布局端口A首先使用 - 这是有意义的 最低端口标识符首先。这是23017创作者没有的耻辱 label 1-8 as Port A.

因此,当思考Arduino时'like'引脚,PIN零是芯片销21 MCP23017(芯片的不方便销钉1)。如果你想 访问引脚20(这将是第二端口(或芯片),并且是GPA4 - 四个引脚 向下在芯片的右侧。 (GPA0 = APIN 16,GPA1 = APIN 17,GPA2 = apin 18,gpa3 = apin 19,gpa4 = apin 20 - 其中apin代表Arduno'like' pins ).

MCP23017引脚向上

软件库和版本

arduino. IDE版本

版本:1.8.5.

图书馆

MaceTech为电路板提供自己的库(最多两台连接 电路板),这提供了arduino的命令功能。下载库 (centipede.zip)并将其解压缩在您的Arduino图书馆文件夹中;就像是: c:/用户/文档/ arduino - 在此处创建一个名为蜈蚣和解压缩的文件夹 into that!

下载Centipede.zip 这里 from http://macetech.com

蜈蚣库中中断控制的库函数是:

  • portinterructs.
  • portintpinconfig

成员函数portintRrupts,具有设置的隐藏操作 子端口A和B的镜像位,因此在A或B子端口上的任何中断(GPIOA 和GPIOB)也以INTA和INTB引脚发出信号。

写作不正确 Centipede.cpp功能:

警告: 以下成员函数(Centipede.cpp)是 wrong
void Centipede::portintpinconfig(在 t port, 在 t drain, 在 t polarity) {

  WriteRegisterPin(port, 1, 0x0A, drain);
  WriteRegisterPin(port, 1, 0x0B, drain);
  WriteRegisterPin(port, 0, 0x0A, polarity);
  WriteRegisterPin(port, 0, 0x0B, polarity);

}

以下是Iocon的注册描述:

MCP23017 IOCON控制寄存器位

正如上面所识别的位0是未定义和未使用的位。 Intpol应该是 位1,odr应该是位2。

重新编写Centipede.cpp中的函数,如下所示:

提示: 重写以下成员函数(来自Centipede.cpp) as shown below:
void Centipede::portintpinconfig(在 t port, 在 t drain, 在 t polarity) {

  WriteRegisterPin(port, 2, 0x0A, drain);
  WriteRegisterPin(port, 2, 0x0B, drain);
  WriteRegisterPin(port, 1, 0x0A, polarity);
  WriteRegisterPin(port, 1, 0x0B, polarity);

}

缺少蜈蚣功能

该图书馆尚未为多个开放排放而发展得足够远 操作并缺少Member函数以检测Intfa的状态和 INTFB寄存0x0e和0x0f。这些返回允许的中断标志状态 您可以确定哪个端口(设备)产生中断(并且它可能是 多个设备)。

将此成员函数添加到Centipede.cpp

// JFM: Return port interrupt flags (1=pin interrupted)
uint16_t Centipede::getIntF(在 t port)  {

  ReadRegisters(port, 0x0e, 2);

  在 t receivedval = CSDataArray[0];
  receivedval |= CSDataArray[1] << 8;

  return receivedval;
}

将成员函数添加到Centipede.h中,在公共定义中:

uint16_t getIntF(在 t port);

示例MCP23017中断 Code

以下示例显示了如何使用MCP23017使用多个中断 芯片并将它们送入Arduino上的一个外部中断。这样做 使用修改的蜈蚣库(见上面的代码片段)。

以下代码还使用相同的原理使用 interrupts on 这个 page。也就是说,在MCP23017中允许线条库中断 interrupt routine.

注意:使用例程findports()是因为我只使用一个MCP23017 测试代码。芯片'S地址被设置为'1'意思是它是第二芯片 设备地址0-3。

检测存在 MCP23017 chips

从每个设备检索INTF数据时,如果设备未存在,则 在我的情况下,返回的数据结果为0xFFFF。这意味着所有16 中断位高(实际上不存在),所以中断标志是 错误地检测到不存在的芯片。

该解决方案是创建检索的函数findports() Iocon.mirror位从设备中取代,反转它并将其写回来。然后阅读 它再次。如果返回的位被反转,则存在设备和 阵列portexists []的相关索引已设置。

笔记: 您应该将portexists []更改为16位整数 如果您担心,请使用BIT操作来设置和检索标志位 节省RAM空间。但是数组索引方法快速。

您可以找到用于检查的例程:

  1. 所有芯片都是运作的。
  2. 如果附上第二个蜈蚣板。

多个MCP23017中断 Setup()

在setup()例程中,实例化(初始化)串行实例。这个 仅用于显示如上所述的芯片的存在 - 如果芯片 不存在,那么您可以通过船上的LED和删除表示。 串行输出。而是在此代码中,LED用于表示任何 钥匙已被按下。表示错误条件通常通过a进行 串行接口显示有关错误的详细信息。

对于4个端口中的每一个,采取以下操作:

1.所有端口引脚都设置为输入,所有端口都具有启用的上拉。

2.通过调用portinterrupts()2次来设置中断,以便 spurious 未生成中断(通过更改中断寄存器值 然后与销的现有条件反应)。在这之间 calls, the 捕获寄存器被调用以清除中断。

3.最后启用开漏输出中断。

在设置结束时,将启用外部中断。

多MCP23017 中断toggle_led()

当它发出声音时,即可切换船上LED(APIN 13)。

多个MCP23017中断ISR()

这是中断服务例程(ISR)由外部激活 打断。在文件的顶部选择外部中断并使用a 宏插入代码:controlarduinoint。

在例程本身中断关闭,外部中断是 分离(忽略)然后打开中断以使线路库启用 operate.

由于中断发射​​,我们现在需要了解哪个芯片给了 中断所以我们循环到4个端口并读取INTF寄存器(也忽略 使用portexists数据不存在的芯片)。发现LED是 toggled.

这意味着LED打开和关闭的唯一方法是如果是 中断由MCP23017中的一个生成。

注意:由于假设在LED的时间仅按下一个引脚 切换为非零点是非零 - 你可以使用休息时间 切换后的声明 - 显示代码有点更快和良好的做法 手术。在实践中,您将想要使用Bit Maniplulation宏来提取 哪个引脚导致中断。

arduino.有以下比特宏:

Bitset(x,nthbit)

达卡(x,nthbit)

bitread(x,nthbit)

多个MCP23017中断 Loop()

这是一个没有的循环,因为我们只对ISR操作感兴趣。 我们所做的只是有300ms的延迟(可以留空)。

// MCP23017 Example: MCP23017 Interrupt operation.
//
// This code sends an interrupt from multiple MCP23017s
//
// www.best-microcntroller-projects.com/mcp23017.html
//
// Copyright : John Main
// Free for non commercial use.
//
// V1.01
//  Descripted interrupt controls in setup.
//  Removed text in intf loop saying stops at 1st int found.
// V1.02
//  Changed to using I2C NACK for chip detecction.
//
#include <Wire.h>
#include <Centipede.h>


// Arduino pins
#define INTPIN 3   // Interrupt on this Arduino Uno pin.
#define LED 13
#define LED_HIGH digitalWrite(LED,HIGH)
#define LED_LOW digitalWrite(LED,LOW)

#define CSAddress 0b0100000 // base address of MCP23017

#define controlArduioInt attachInterrupt(digitalPinToInterrupt(INTPIN),isr,FALLING)

static uint8_t portExists[8]={0,0,0,0,0,0,0,0}; // For single chip debug detect chips.

Centipede CS; // Create Centipede object.

//////////////////////////////////////////////
// Read and change a register bit to see if device is present
uint8_t findPorts(uint8_t port) {
uint8_t err;

   Wire.beginTransmission(CSAddress + port);
   Wire.write((byte)0x0a); // IOCON
   err =  Wire.endTransmission();
   // Since only sending the address can get
   // OK(0), or NACK on address(2), or other error(4).
   // Assume any error = not present.
   if (err==0 )return 1;
   return 0;
}

//////////////////////////////////////////////
void setup(void) {
uint8_t i;

  Serial.begin(115200);
  Serial.println("MCP23017 MULTI");

  pinMode(LED,OUTPUT);
  LED_LOW;

  Wire.begin(); // start I2C

  CS.initialize(); // set all registers to default

  // Check if ports exist.
  for(i=0;i<8;i++) {

     Serial.print("Port: ");Serial.print(i);
     if (findPorts(i)) {
         Serial.println(" Exists: ");
         portExists[i] = 1; // Flag that it exists.
     }
     else Serial.println(" Not found");
  }

  for(i=0;i<4;i++) {
     CS.portMode(i, 0xffff);   // Chip pins on port to inputs.
     CS.portPullup(i, 0xffff); // All pins on port to pullup.

     // Disable interrupt but set conditions for interrupt to occur
     // This stops an intial interrupt firing in error.
     // portInterrupts(int port, int gpinten, int defval, int intconval)
     CS.portInterrupts(i, 0x0000, 0xFFFF, 0X0000);  //
     CS.portCaptureRead(i); // Read capture reg. to clear ints.
     // GPINTEN = 0xffff enabled.
     // DEFVAL  = 0xffff all default to pulled high.
     // INTCON  = 0x0000 all interrupt on change.
     CS.portInterrupts(1, 0xffff, 0xFFFF, 0X0000);

     // Set open drain ( ODR high overrides IPOL)
     // portIntPinConfig(int port, int drain, int polarity) {
     CS.portIntPinConfig(i,1,0);
  }

  controlArduioInt; // Enable Arduino interrupt control.

}

//////////////////////////////////////////////
void toggle_LED(void) {
static uint8_t tog=1;
  tog = !tog;
  if(tog) {
     LED_HIGH;
  } else {
     LED_LOW;
  }
}

//////////////////////////////////////////////
// The interrupt routine handles LED1
// This is the button press since this is the only active interrupt.
void isr(void){
uint8_t i,val;
static uint16_t ledState=0;

   noInterrupts();

   // Stop interrupts from external pin.
   detachInterrupt(digitalPinToInterrupt(INTPIN));
   在 terrupts(); // re-start interrupts for mcp

   // Find out which port produced the interrupt reg INTFAB 0x0E
   // Assumption is that only one event happens at a time.
   for(i=0;i<4;i++) {

      if ( portExists[i] &&
           CS.getIntF(i)  != 0) {
           CS.portCaptureRead(i); // Read capture reg. to clear ints.
           toggle_LED();
      }
   }

   controlArduioInt;  // Reinstate interrupts from external pin.
}

//////////////////////////////////////////////
void loop(){
  delay(300);
}

探测 棋子的位置使用MCP23017中断。

一个更精致的程序,可以根据您识别一致的位置 棋盘1-8和a-h。作为交换机改变状态,所以一块被识别为 被放置或移除。此外,棋盘位置是 reported.

要完成棋牌检测,您需要一块标识符; s 维克多暗示了维克多的一种方式,因为维克多是一种方式使用RFID。

下面的代码类似于上述代码,但添加'place' and 'remove' 通过向MCP23017的引脚输入的按钮模拟的检测。

Debouncing作为快速按钮移动至关重要,导致多个 中断ISR()例程中使用30ms延迟(新中断是 输入稳定时忽略30ms)。

ISR通过INTFired的变量和仅限于主要通信 代码是恢复MCP中断。

GetMultipin标识唯一的PIN码,这是转换为 使用划分(/)和mod(%)运算符的行和列棋谱。注意 使用ASCII表方法转换为A-H.

// MCP23017 Example: MCP23017 Interrupt operation.
//
// This code sends an interrupt from multiple MCP23017s
// 4 mcp23017S which are used detect placing and removal
// of chess pieces from a board thus requiring 64 (8x8)
// positions These are provided by 4x16 digital inputs
// probably also using reed relays and a magnet in each
// piece.
// Additional h/w is required to identify the pieces
// e.g. RFID h/w
//
// www.best-microcntroller-projects.com/mcp23017-interrupt.html
//
// Copyright : John Main
// Free for non commercial use.
//
// V1.00
//
// Inspired by Victor Feria's Chessboard Project.
//
// CHESSBOARD NOTATION
// Row
//  8 [ ][ ][ ][ ][ ][ ][ ][ ]        GPIOB b0-b7
//  7 [ ][ ][ ][ ][ ][ ][ ][ ]  chip4 GPIOA b0-b7
//  6 [ ][ ][ ][ ][ ][ ][ ][ ]        GPIOB b0-b7
//  5 [ ][ ][ ][ ][ ][ ][ ][ ]  chip5 GPIOA b0-b7
//  4 [ ][ ][ ][ ][ ][ ][ ][ ]        GPIOB b0-b7
//  3 [ ][ ][ ][ ][ ][ ][ ][ ]  chip2 GPIOA b0-b7
//  2 [ ][ ][ ][ ][ ][ ][ ][ ]        GPIOB b0-b7
//  1 [ ][ ][ ][ ][ ][ ][ ][ ]  chip1 GPIOA b0-b7
//  .  a  b  c  d  e  f  g  h ----> Columns
//
#include <Wire.h>
#include <Centipede.h>

// Arduino pins
#define INTPIN 3   // Interrupt on this Arduino Uno pin.
#define LED 13

#define CSAddress 0b0100000 // I2C Base address of chip.

#define controlArduioInt attachInterrupt(digitalPinToInterrupt(INTPIN),isr,FALLING)

static uint8_t portExists[8]={0,0,0,0,0,0,0,0}; // For single chip debug detect chips.
static uint8_t 在 tFired=0;
static uint16_t storeINTF;  // For later processing.
static uint16_t storeCAP;   // For later processing.
static uint8_t storePort;   // For later processing.

Centipede CS; // Create Centipede object.

//////////////////////////////////////////////
// Read and change a register bit to see if device is present(1).
uint8_t findPorts(uint8_t port) {
uint8_t err;

  // Use I2c NACK to detect chip
  Wire.beginTransmission(CSAddress + port);
  Wire.write((byte)0x0a); // IOCON
  err =  Wire.endTransmission();

  if (err==0 )return 1;
  return 0;
}

//////////////////////////////////////////////
void setup(void) {
uint8_t i;

  在 tFired=0;

  pinMode(LED,OUTPUT);
  digitalWrite(LED,LOW);

  Wire.begin(); // start I2C

  CS.initialize(); // set all registers to default

  Serial.begin(115200);

  // Check if ports exist.
  for(i=0;i<8;i++) {

     Serial.print("Port: ");Serial.print(i);
     if (findPorts(i)) {
         Serial.println(" Exists: ");
         portExists[i] = 1; // Flag that it exists.
     }
     else Serial.println(" Not found");
  }

  for(i=0;i<4;i++) {
     CS.portMode(i, 0xffff);   // Chip pins on port to inputs.
     CS.portPullup(i, 0xffff); // All pins on port to pullup.
     //  port, int on pin, default, int !=default
     // Disable interrupt but set conditions for interrupt to occur
     // This stops an intial interrupt firing in error.
     // portInterrupts(int port, int gpinten, int defval, int intconval)
     CS.portInterrupts(i, 0x0000, 0xFFFF, 0X0000);  //
     CS.portCaptureRead(i); // Read capture reg. to clear ints.
     // GPINTEN = 0xffff enabled.
     // DEFVAL  = 0xffff all default to pulled high.
     // INTCON  = 0x0000 all interrupt on change.
     CS.portInterrupts(i, 0xffff, 0xFFFF, 0X0000);

     // Set open drain ( ODR high overrides IPOL)
     // portIntPinConfig(int port, int drain, int polarity) {
     CS.portIntPinConfig(i,1,0);
  }

  controlArduioInt; // Enable Arduino interrupt control.
}

//////////////////////////////////////////////
void toggle_LED(void) {
static uint8_t tog=0;
  tog = !tog;
  if(tog) {
     digitalWrite(LED,HIGH);
  } else {
     digitalWrite(LED,LOW);
  }
}

//////////////////////////////////////////////
// The interrupt routine handles LED1
// This is the button press since this is the only active interrupt.
void isr(void){
uint8_t i;
uint16_t val;

   noInterrupts();

   // Debounce. This debunce time is essential as you must wait for the
   // input to the MCP23017 to settle - if not multiple interrupts will
   // hang the code.
   // Note: Can not use delay() in interrupt code (not interrupt safe).
   delayMicroseconds(30000);

   // Stop interrupts from external pin.
   detachInterrupt(digitalPinToInterrupt(INTPIN));
   在 terrupts(); // re-start interrupts for wire library.

   // Find out which port produced the interrupt reg INTFAB 0x0E
   // This stops at 1st interrupt detected
   // Assumption is that only one event happens at a time.

   for(i=0;i<4;i++) {

      if ( portExists[i] &&
         (val=CS.getIntF(i)) != 0) {

          storePort = i;
          storeINTF = val;
          storeCAP =  CS.portCaptureRead(i); // Read capture reg. to clear ints.

          在 tFired=1; // Indicate low and high changes.

          break;
      }
   }

   toggle_LED();
}

//////////////////////////////////////////////
// Return a unique pin number from multiple MCP23017s
// or return -1 on fail.
//
// Return value can be 0-127 as can return 1 of 128
// pins if 8 chips are used.
//
// valINTF - The MCP interrupt register value.
//
// Note: Only returns 1st found interrupt bit that is high
// for each port not multiple interrupts.
//
在 t8_t getMultiPin(uint8_t port, uint16_t valINTF) {
uint16_t mask=1;
uint8_t i;

   for (i=0;i<16;i++) {
      if ( (valINTF & mask) !=0 ) break; // i contains index
      mask=mask<<1;
   }
   if (i==16) return -1; // Failed
   return port*16+i;
}

//////////////////////////////////////////////
void loop(){
static uint8_t pin;
uint8_t val,row,col,colChar,i;
uint16_t val_16;
char str[2];

  if (intFired) {

      // Find which pin caused an interrupt.
      pin = getMultiPin(storePort,storeINTF);

      val = CS.digitalRead(pin);

      if (pin != -1) {  // No error so use the pin.

        row = pin / 8 + 1 ; // +1 : index from 1 not zero.
        col = pin % 8;

        colChar = col+'a';  // Convert 0-8 to a-h

        str[0]=colChar; str[1]='\0'; // Convert to string for printing.

        Serial.print("Pin ");Serial.print(pin);
        Serial.print(" row ");Serial.print(row);
        Serial.print(" col ");Serial.print(str);

        if (val==0) Serial.println(" Placed"); else Serial.println(" Removed");
      }

      在 tFired = 0; // Restart.
      controlArduioInt;  // Reinstate MCP interrupts from external pin.
  }
}

从上面的典型输出 program:

在这种情况下,地址设置为1,所以可以使用行3和4

MCP23017棋盘检测模拟

更多的 关于MCP23017中断的关于代码操作的问题

#1。如何 我确定哪个芯片托管了MPC23017中断?

这就是我添加了端口的INTF寄存器读取功能的原因 (chip) getIntF().

您通过所有预期端口(芯片)循环,直到找到一个中断 位设置为高(即非零16位值作为INTF寄存器返回 state).

您需要INTF读取功能,因为其中一个位将很高(取决于 引发中断的引脚)。捕获寄存器告诉您实际 引起中断的销的状态。

因为你可以将引脚设置为 单独捕获捕获寄存器的低或高读取中断活动 向您展示哪个中断触发。无论输入的极性如何,INTF寄存器始终高度升高 扳机。结合这两条信息为您提供导致中断的实际引脚及其当前状态。

以下代码片段(中断例程中的第1个示例)显示 循环到值0到3的4个端口,如果中断,则切换LED 标志很高。函数cs.getIntf(i)返回16位中断 每个芯片的标志寄存器:

  for(i=0;i<4;i++) {

      if ( portExists[i] &&
           CS.getIntF(i)  != 0) {
           CS.portCaptureRead(i); // Read capture reg. to clear ints.
           toggle_LED();
      }
   }

注意:如果你不'T关注芯片正在出现删除portexists [i]检查 当我需要它时(没有4个筹码)。当你有4个连接时 默认状态是全部工作!

MCP代码设置为“更改”中断(如第1版中所讨论的) mcp23017.html页面)。因此,看看是否按下引脚检测中断 使用INTF REG。并检查捕获reg。要查看低=按下,如果高= release.

#2什么港口 银行导致MCP23017中断

请参阅上面的代码。由于例程GetMultipin()返回来自的PIN数 0-127,您可以使用%和/您解码'T直接需要港口/银行 information

#3 检测引脚导致MCP23017中断。

查看上面的代码和getMultipin()

#4. 哪种方法是四个MCP23017中断或开漏方法更快?

开漏方法只是电线或功能,每个MCP23017拉动 通过激活具有其收集器的晶体管(或 漏极开放的FET)发射器(或FET源)连接到地面。所以 对于下降沿,即开放式漏极活跃的边缘速度快。在上升 边缘10k拉起,因此慢速(取决于电容 PIN) - 速度速度降低10K值。但是我们正在寻找一个 坠落边缘所以都很好。

您的问题可能是您对交换机的反应有多快 制成。因此,我测量了GetIntf的访问功能并在820US 520US捕获 对于getIntf()。所以要扫描所有4个芯片只需要2ms扫描 getIntf()。这似乎足够快。如果您使用了4个中断,那么您可以反应 对于520us的每个芯片,所以是4个中断更快。

但是看系统,没有必要速度。拿起和放置 棋子在您的代码中需要100毫秒或多毫秒,甚至 一个100ms去抖动时间(什么都不做)。对于这个系统,没有必要 更快的速度。我在ISR中使用了30毫秒延迟(使用微秒()和您使用 can'在中断中使用延迟()),似乎有足够的时间来弹跳 为按钮输入定居(但可能对您的设置不同)。

如果在一个人下面做某事,你会想要速度 毫秒。即便如此,I2C总线速度也可以增加到1.7MHz或使用a 20MHz SPI版本。这不会自动将速度提高到该速率 最终,处理器需要在I2C或SPI写道之间做某事,但它 would help.

对于这种设计,它全部关于输入速率慢。所有交换机 可以在大约4ms中阅读,中断标志告诉您哪一个 改变了。你只需要处理开关反弹。

当您有4个中断时,您必须管理4 - 4 - that'很多代码维护和每条代码都将与之相同 另一个!即它需要变化时疼痛。

另请注意PIN码检测的方法和输出数字的方式, 它使用标准的ASCII表输出技巧:I +'a';


新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。




隐私政策 | 接触 | 关于我

网站地图 | 使用条款


ezoic.报告此广告

访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位ADC进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部