0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ATmega芯片以及I/O引脚的简单说明

454398 来源:工程师吴畏 2019-07-31 09:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

原理图

ATmega芯片以及I/O引脚的简单说明

AVR Core

大多数ATmega设备的核心是AVR CPU,它被描述为RISC型CPU。然而,尽管是RISC CPU,AVR内核可以说非常强大,并且与竞争器件(例如Microchip PIC系列)相比具有许多优势。

例如,AVR内核包含通用的8位寄存器可以配对为内存位置创建16位指针。此外,AVR内核有超过130条指令,其中许多是单周期的(由于一级管道),并且没有方案。

然而,AVR设备特别容易发生砖块化用户开始使用保险丝(特定芯片选项),这就是为什么强烈建议您手头有多个AVR设备。 AVR器件的另一个问题是如果没有购买官方编程器,他们很难进行芯片编程(例如与PICKIT3相比)。

尽管如此,AVR已成为最流行的微控制器之一,谢谢Arduino的发明,其核心包含ATmega。事实上,Arduino只是一个AVR微控制器,带有一些特殊的启动加载代码和一个USB转串口转换器

以下是典型ATmega器件的内部架构(在我们的例子中,ATmega168) 。

I/O端口

了解微控制器的内部工作情况很好,但知道如何让芯片与外界交流是很好的。大多数微控制器(如果不是全部)都包含引脚,允许器件读取和写入外部电路的数字值。例如,LED可以连接到I/O(带有串联电阻),这将允许微控制器打开和关闭LED。另一个例子是一个开关,它可以连接在引脚和电源之间,微控制器可以在检测到开关被按下时执行动作。

当然,微控制器可以连接到几乎任何电路,并以您可能想象的任何方式与它进行交互。但要做到这一点,我们需要了解I/O端口如何在AVR设备上工作以及如何正确使用它们!

I/O端口包含三个寄存器:

DDRx - 端口x的数据方向寄存器

PINx - 从端口x读取

PORTx - 写入端口x

数据方向寄存器

数据方向寄存器(DDR)很可能是您配置的第一个寄存器,因为DDR寄存器确定特定端口上的引脚是输入还是输出。 DDR寄存器长8位,每个位对应I/O端口的引脚。

例如,DDRB的第一位(位0)将决定PB0是输入还是输出,最后一位(第7位)将确定PB7是输入还是输出。

在PIC器件中,值1用于输入,值0用于输出,但对于AVR器件则反之亦然; 1表示输出,0表示输入。因此,假设我们想要将PORT B上的所有引脚配置为输出,我们只需使用以下代码:

DDRB = 0xFF;

DDRB = 0b11111111;

第一个示例使用十六进制,而第二个示例使用二进制。虽然通常的做法是使用十六进制,但二进制版本可以更清楚地将端口中的哪些位用作输入或输出。如果我们想将PORT B上的所有引脚转换为输入引脚,那么我们可以使用。。.。。.

DDRB = 0x00;

DDRB = 0b00000000;

更复杂的事情怎么样?假设您希望前两个引脚为输出(PB0和PB1),其余引脚为输入。以下代码可以解决这个问题:

DDRB = 0x03;

DDRB = 0b00000011;

PINx寄存器

我们的DDR寄存器排序out,是时候学习如何从现实世界中将数字值读入微控制器。这是使用寄存器PINx完成的,其中x是要读取的寄存器。从端口读取相当容易,如下面的代码示例所示:

dataValue = PINB;

执行此操作时,PORT B上的所有引脚都被读入dataValue,并且dataValue中的每个位现在将对应于读取时每个引脚上的数字电平。虽然这可能很有用,但我们有时可能希望同时测试单个位而不是所有位。在PIC中,.bits成员可用于访问各个位,但AVR设备不是这种情况。相反,访问单个位涉及一些操作(原谅双关语),包括使用逻辑AND,OR和XOR。

要测试一个位是否打开(逻辑1),以下两个可以使用语句。这些函数对PIN寄存器和位执行逻辑AND(表示为8位数)。如果结果为零,则不会执行if语句,因为if语句仅在条件为非零时执行。第一个语句使用二进制值来表示要测试的位,而第二个语句使用逻辑移位指令来创建位掩码,该掩码表示要测试的位。逻辑移位版本可以说更具可读性,因此更容易理解。但是,执行该指令可能需要比第一次更长的时间(取决于优化)。

if(PINB&(0b00000001))

if(PINB&(1 《

在主要测试(!)

if(!(PINB&(0b00000001)))

或《之前使用否定运算符可以轻松地测试逻辑0 br》 if(!(PINB&(1 《

PORTx寄存器

现在我们可以读取整个端口和各个引脚,我们如何写入端口和单个引脚?这是PORTx寄存器的用武之地。写入该寄存器(其中x表示要写入的端口)将导致输出引脚打开或关闭。请记住,物理输出引脚只有与PORTx寄存器IF对应的数字电平,只有相应的DDR位被设置为输出!

将值写入端口非常容易:

PORTB = 0xFF;

PORTB = 0b11111111;

但个别位怎么样?这再次使用按位运算符完成,并且设置/清除位稍微复杂一些。这是因为我们需要保留PORT寄存器中其他位的值,否则它们可能会被更改,如果它们连接到外部设备(如LED,显示器,IC等),可能会导致意外行为。

要打开特定位,我们可以使用OR逻辑运算符:

PORTB = PORTB | (0b00000001);打开位0

PORTB = PORTB | (1 《

要关闭特定位,我们使用AND运算符和NOT运算符(〜):

PORTB = PORTB& 〜(0b00000001);关闭位0

PORTB = PORTB& 〜(1 《

要切换一点(以便它与以前相反)我们可以使用XOR运算符:

PORTB = PORTB ^(0b00000001);切换位0

o r

PORTB = PORTB ^(1 《

引脚名称

使用数字来表示引脚可能会导致某些不可读代码,这就是为什么WinAVR足够好,可以包含一些我们可以使用的定义。请参阅以下示例:

PORTB = PORTB& 〜(1 《

如果(PINC&(1 《

一个简单的例子

在我们的例子中,我们将制作一个电路当按下连接到PD1的开关时,切换连接到PD0的LED。

/*

* AVR IO.c

*

* Created: 03/01/2018 11:25:21

* Author : RobinLaptop

*/

#define F_CPU 1000000UL

#include

#include

int main(void)

{

// Configure PORT D bit 0 to an output and bit 1 to an input

DDRD = 0b00000001;

// Main program loop

while (1)

{

// Wait until the switch found on PIND1 (bit 1)

if(PIND & (1 《《 PIND1))

{

// Toggle the LED found on PIND0

PORTD = PORTD ^ (1 《《 PIND0);

// Force a delay to prevent de-bounce!

_delay_ms(100);

// Wait until the button is released

while(PIND & (1 《《 PIND1));

}

}

}

结论

现在我们可以控制I/O引脚了,没有理由不能在复杂控制器可以使用的项目中开始使用AVR。使用本文中的知识,您可以创建一个键盘输入系统,一个复杂的7段显示控制器,一个音乐系统,甚至是一个基本的80年代风格的计算机。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • ATmega
    +关注

    关注

    2

    文章

    79

    浏览量

    43779
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    飞凌嵌入式ElfBoard-文件I/O的深入学习之异步I/O

    I/O多路复用中,进程通过系统调用select或poll来主动查询文件描述符上是否可以执行I/O操作。而在异步I/
    发表于 12-05 11:23

    atmega162芯片说明

    atmega162芯片说明
    发表于 11-19 16:30 0次下载

    浅谈光学I/O模块的热挑战

    服务器和机架式网络基础设施系统内的光学 I/O 模块通常接受主动冷却系统的直接冷却,特别是来自机架式设备前面板的强制风冷。机架式设备的散热设计需要平衡 I/O 模块的热管理与处理器或
    的头像 发表于 11-03 09:32 479次阅读
    浅谈光学<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模块的热挑战

    如何解决I/O时钟布局器错误

    I/O 时钟布局器阶段可能会发生错误,指出该工具无法对该时钟结构进行布局,直至最后 BUFG 仍然无法完成布局。
    的头像 发表于 09-23 16:05 621次阅读

    TCA9536 4位I2C/SMBus I/O扩展器技术解析

    Texas Instruments TCA9536 4位I/O扩展器用于I^2^C总线,可在1.65V至 5.5V的V~CC~ 下运行。它可通过I^2^C接口为大多数微控制器系列提供通
    的头像 发表于 09-19 14:45 503次阅读
    TCA9536 4位<b class='flag-5'>I</b>2C/SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析

    TCA9537远程4位I²C/SMBus I/O扩展器技术解析与应用指南

    Texas Instruments TCA9537远程4位I^2^C和SMBus I/O扩展器在1.65V至5.5V V~CC~电压下运行,可通过I²C接口实现通用远程
    的头像 发表于 09-15 16:00 672次阅读
    TCA9537远程4位<b class='flag-5'>I</b>²C/SMBus <b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析与应用指南

    TCAL9539 I2C总线I/O扩展器技术解析与应用指南

    需要额外的I/O时,TCAL9539/TCAL9539-Q1这样的I/O扩展器提供了一个简单的解决方案。
    的头像 发表于 08-08 11:49 958次阅读
    TCAL9539 <b class='flag-5'>I</b>2C总线<b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器技术解析与应用指南

    MAX7325 I²C端口扩展器,提供8路推挽式I/O和8个漏极开路I/O技术手册

    MAX7325 2线串行接口外设具有16路I/O端口。其中8路为推挽输出,另外8路为I/O端口,带有可选择的内部上拉和瞬态检测功能。8路I/
    的头像 发表于 05-22 15:27 695次阅读
    MAX7325 <b class='flag-5'>I</b>²C端口扩展器,提供8路推挽式<b class='flag-5'>I</b>/<b class='flag-5'>O</b>和8个漏极开路<b class='flag-5'>I</b>/<b class='flag-5'>O</b>技术手册

    ADP5588移动I/O扩展器和QWERTY键盘控制器技术手册

    ADP5588是一款I/O端口扩展器和键盘矩阵,适用于需要大型键盘矩阵和扩展I/O线路的QWERTY型电话。I/
    的头像 发表于 05-22 11:37 701次阅读
    ADP5588移动<b class='flag-5'>I</b>/<b class='flag-5'>O</b>扩展器和QWERTY键盘控制器技术手册

    怎样使用无线 I/O 网关搭建物联网系统

    使用无线I/O网关搭建物联网系统是一个复杂但有序的过程,以下是一个基本的搭建步骤指南: 一、明确需求与规划 1. 确定应用场景:    ● 分析物联网网关将部署在哪些环境中,例如工业自动化、智能家居
    的头像 发表于 04-13 07:35 782次阅读
    怎样使用无线 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 网关搭建物联网系统

    评估I/O引脚切换时,为什么NXP S32K344板变砖了?

    我需要帮助,在评估 I/O 引脚切换时,我不知何故将我的 NXP S32K344板变砖了。 我使用 JLink Debug Adapter,它收到消息 my device is locked。我猜我
    发表于 04-08 07:50

    澜起科技发布面向新一代CPU平台的I/O集线器 (IOH) 芯片M88IO3020

    澜起科技正式发布其面向新一代CPU平台的I/O (输入/输出) 扩展器件——I/O集线器 (IOH) 芯片M88IO3020。该
    的头像 发表于 02-28 09:09 1302次阅读

    I/O接口与I/O端口的区别

    在计算机系统中,I/O接口与I/O端口是实现CPU与外部设备数据交换的关键组件,它们在功能、结构、作用及运作机制上均存在显著差异,却又相互协同工作,共同构建起CPU与外部设备之间的桥梁
    的头像 发表于 02-02 16:00 2867次阅读

    单片机I/O接口的传输方式

    单片机(Microcontroller Unit,MCU)作为嵌入式系统的核心部件,其输入输出(Input/Output,I/O)接口是实现与外部设备数据交换的关键。I/O接口不仅承担
    的头像 发表于 02-02 15:56 1663次阅读

    数据I/O模块的概念、特点以及作用

      本文简单介绍了数据I/O模块的概念、特点以及作用。 一、数据 I/O 模块是什么 1. 承接
    的头像 发表于 01-21 11:10 1589次阅读