首页 > 应用与设计 > 电器 > Service Robots > 服务型机器人 > TI机器人系统学习套件(TI-RSLK) >

服务型机器人

最新课程

热门课程

TI-RSLK 模块 6 - 讲座视频 - GPIO 编程

大家好,我是 Jon Valvano。 在本视频中, 我们将讨论 通用输入输出接口的编程。 我们在前一个视频中 看到了“连接”的概念。 换句话说,如果我 在这里有一个系统, 然后我将它连接到 那里的另一个系统, 那么当一个数字 逻辑连接到另一个 数字逻辑时,我必须 关心电压和电流。 那么,在前一个 视频中,我们 讨论了该 硬件互连, 硬件接口。 那么,在该 模块中, 我们将讨论 它的软件方面。 我如何编写这些 系统上存在的软件, 以便我可以 执行输入输出? 与该模块 关联的 实验中的最终 目标是光传感器。 在光传感器 接口中,您将 看到硬件 和软件。 换句话说,我们将 看到与 8 个传感器 关联的电压和电流。 然后,这将为我 提供 1 和 0 输入, 具体取决于它 是否看到了线。 然后,第二点 将是中心集成, 其中您获取 这 8 个数字数 并将其合并到 单个数字中, 该数字可告诉您 相对于线的位置。 希望您喜欢本次实验。 该实验应该很有趣。 那么,让我们来讨论 软件是怎样工作的。 对于通用输入/输出, 您有两种可能的选择, 即输入和输出。 这不是很复杂。 输入意味着 来自世界的 信号将进入 微控制器。 我们在前一个视频中 看到,如果我有一个 输入引脚并且该引脚上的 电压小于 VIL,那么 该电路会将其 视为低电平。 它是输入。 如果该电压 大于 VIH,嗯, 那么该电路会 将其视为高电平。 因此,当我们 在软件中看到它时, 它将在该寄存器中 为 0,或者在该寄存器中 为 1。 为了将引脚 设置为输入, 我们要将其方向 寄存器设置为 0。 当我们将方向寄存器 设置为 0 时,它将 断开所有关联的 输出物理硬件,从而 使该引脚成为输入, 因为它不是输出, 它是输入。 因此,当我想进行 输入时,我要将 寄存器,一个 称为端口 1 的 内存映射 I/O 位置中的数据 读取到该输入寄存器中, 因为您应该记得,I/O 设备 划分到多个 引脚中,然后 大约 8 个引脚组合 在一起,形成一个端口。 当我说 P1 时, 我指的是端口 1。 在这里,当我看到 P1.1 时, 我将讨论的是端口 1 的 引脚 1。 初始化该端口 需要执行两个步骤。 换句话说,让我们 使它成为一个 GPIO。 我们通过向选定的 寄存器进行写入来实现它。 我们实际上 向其写入 0。 我们所做的第二件事是, 我们对方向寄存器进行写入 -- 0 意味着输入。 那么,正如我说过的, 像大多数端口一样, 端口 1 的宽度为 8 位。 因此您可以将该 寄存器,P1 视为输入, 它具有 8 位的宽度。 7, 6, 5, 4, 3, 2, 1, 0. 我感兴趣的 特定位是位 1。 但还有一个 选择寄存器。 选择寄存器、 选择 1 寄存器和 方向寄存器 有一个 P1。 因此每项操作 有 4 个寄存器。 此外,还会有 另一个 8 位寄存器。 具体而言,为了 将 P1 设置为输入, 我需要在两个选择 寄存器的位 1 位置中 设置 0,并且我 需要在方向寄存器, DIR 寄存器的位 1 位置中设置 0。 我将使用该 C 代码来实现它。 我将 -- 该 C 代码的 作用是访问这 3 个 寄存器的位 1 并清除位 1。 现在,您会注意到 一件奇怪的事情 -- 我是通过一种非常有趣的方式来实现它的。 再说一次,它是读取-修改-写入。 那么,让我们 来看看这里的 方向寄存器。 该方向寄存器中 将具有 7 个位 -- 具有 8 个位。 1, 2, 3, 4, 5. 再说一次,我最 感兴趣的是这个位,位 1。 7,6,等等等,2,1,0。 因此,我要做的是, 我将为其添加一个 用于清除位 1 的掩码, 它是 1111,1101。 当我向它添加 该 FD 后,这将 导致位 1 变为 0。 这正是我需要的结果。 但是,请注意它对 其他 7 个位的影响。 它完全没有更改这些位。 因此,如果我的实验 伙伴要使用位 7, 我未更改他或 她的方向寄存器。 我没有动它。 那么,每当您 在编写 I/O 代码时仅更改 您必须更改的位, 而不更改 不属于您 或您不必 更改的位, 我们就将该类 编程定义为友好的。 这样您就可以 对某个寄存器中的 几个位进行操作,而您的 实验伙伴对其他位进行操作, 然后你们的两个 软件可以合并在一起, 并且不会以不利的方式相互影响。 那么,我们将反复 不断地看到该情况。 那么,使用输入引脚的 第一步是对其进行初始化。 那么,这里的代码 恰好在开头执行一次。 这会将端口 1 位 1 建立为输入引脚。 但是,然后我希望实际上 反复不断地执行输入。 我们将看到,由于 该寄存器中有 8 个位, 每个引脚 1 个,7、6、5、4、 3、2、1、0 -- 再说一次, 我只对位 1 感兴趣 -- 读取寄存器中 特定的一组 引脚的过程 包含两个步骤。 我将首先读取 全部 8 个位, 然后我将 屏蔽 -- 2、3、4、5、6、7 -- 或者对其执行与 运算,从而使结果 仅是位 1 的函数。 您可以在这里 明显地看到该情况。 那么,第一步是 读取全部 8 个位。 那么,我将获得该值, 然后我将对它执行与运算, 然后我将在这里 获得一个数字, 它将是 0000 -- 如果引脚 处于低电平,那么 我将获得该值, 或者如果引脚处于高电平, 那么我将获得该数字。 换句话说,我 将获得 0 或 2, 具体取决于端口 1 位 1 的状态。 现在,您可以通过包含两个 步骤的过程来显式实现它, 即读取和与运算。 再说一次,这将返回 0 或 1。 或者,如果您愿意, 可以将这合并到 一行 C 代码中, 其中它首先将 该值临时 读取到一个 寄存器中,然后 执行掩码运算, 即选择, 以获取 我感兴趣的位, 然后返回该 0 或 2。 现在,如果您的 编译器功能良好, 那么这部分 C 代码 和那部分 C 代码 实际上将生成完全 相同的机器码,因此 使用一种方法 或另一种方法 没有任何速度优势。 因此,您可以 选择这两种 方法中您感觉 最易于了解实际 发生的情况的一种。 那么,这是输入。 那么,再说一次,输入会 将数据引入到处理器中。 现在,要进行输出,我 必须做相同的两类事情。 我要将同一程序 恰好执行一次, 这会将引脚 建立为输出, 然后,我将反复 不断地根据需要 进行输出。 那么,我要执行的示例是, 我有 P1,即端口 1, 现在位 0 将是我的 微控制器的一个输出。 因此,我需要能够将其 设置为高电平或低电平。 再说一次,我们 曾在前面的一个 讲座中看到,如果 这需要是高电平, 那么这里的电压将大于 VOH。 因此,如果数字 1 出现在这里,即 布尔高电平,那么该电压 将上升到接近 3.3 伏。 如果您需要使其 成为低电平,那么 这里的软件将 使其成为低电平, 但硬件将在该点 建立电压,小于 VOL。 然后,再说一次,只要 该输入或输出设备上的 电流小于 6 毫安, 那么一切就没有问题。 您应该记得有 这个选择寄存器, 0 意味着常规。 那么,再说一次,我们将 使该引脚成为常规引脚。 这恰好要 清除位 0。 我们在前一张幻灯片中看到, 输入引脚方向寄存器为 0 意味着输入。 但我们需要输出, 因此我们将设置该位。 那么,再说一次, 这是对方向寄存器 进行读取-修改-写入, 这将设置位 0,从而 导致端口 1 位 0 成为输出。 这全部三项操作都访问 一个 8 位寄存器,但仅 修改位 0。 换句话说, 它们仅修改 需要修改的位, 而不更改其他 7 个位,它们不是 这里的规范的一部分。 我们要将这 称为友好的。 然后,您可以 在这里看到 初始化,几张 幻灯片之前的 初始化可以在完全 不相互影响的情况下 分别进行。 那么,这个将访问位 0。 另一个访问位 1。 任何一个都不会破坏 另一个人的初始化。 那么,这是初始化。 再说一次,我们恰好 可以将其执行一次。 我们要做的下一件 事实际上是进行输出。 正如我说过的,您将进行写入, 如果您对端口 1 进行写入, 位-- 哦,就像那里的那个。 如果您对端口 1 进行写入,对于 作为输出的引脚, 这将设置或清除位。 现在,它恰好是输入引脚, 因此不会执行任何操作。 但对于输出引脚,它将 变为高电平或低电平。 但我们希望通过 友好的方式加以 实现,因为 在本例中, 我们只能访问 或需要修改 端口 1 位 0。 那么,我们将通过一个包含 四个步骤的过程来实现它。 我们将首先读取 全部 8 个位。 换句话说, 我将读取 我的实验伙伴在他或 她的寄存器中剩余的位。 我将屏蔽我将 最终更改的位。 我将设置或清除 我想更改的位。 在本例中只有 1 个位。 然后我要写回 整个内容,从而 再次修改整个 8 位 端口,但再说一次, 仅更改我拥有的位 -- 在本例中,仅更改位 0。 因此,我们将在 这里看到该步骤。 那么,在这里,我要将全部 8 个位读到一个局部变量中。 我将屏蔽、清除 我要最终更改的位, 然后我要将 原来的位, 即我的实验伙伴 留下的其他 7 个 位与我希望修改的 这个新位 -- 它来自 我的函数 -- 进行合并,从而 使这里的运算 现在包含我希望 更改的 1 个位和 我不希望更改的其他 7 个位。 因此,当我再次 将它写回时, 我将仅更改这 1 个位。 现在,我要提醒您, 这里的代码行不会 更改输出。 您可以看到,old 是一个局部变量。 那么,当我清除和设置 某个变量中的位时, 不会对外部世界 产生任何影响。 仅当我将该合并的 内容写回到端口 1 时, 才会输出实际的位变为 高电平或低电平的寄存器, 正如我所指定的。 再说一次,该包含四个步骤的 序列是一种用于实现友好 代码的方法。 现在,您可以通过 该方法显式写出 这四个步骤,您也 可以通过 1 行 C 代码来写出它们,其中 它在这里读取值,它清除 我将最终 更改的位, 我更改我想更改的 位,然后我将其写回。 那么,事实上,这里显式 提供了全部四个步骤, 但它在我的 C 代码行中。 再说一次,如果您的 编译器功能良好, 这个函数和那个 函数将生成完全 相同的机器码。 换话句话说,它们 将以相同的速率 和相同的速度执行。 那么,我们选择对您 更有意义的一个。 再说一次,对于某个输出 引脚,我们对其进行初始化, 然后每当我想 更改它时,我会 执行这个函数, 这将设置 LED。 或者,我会执行 这个函数,这会 清除 LED。 那么,再说一次, 我可以在更高的 级别打开和关闭与端口 1 位 0 相关联的 LED。 让我们来执行一个示例。 这个恰好是 负逻辑,因为 这里有一个灯泡。 那么,这是一个常规 120 伏交流灯泡。 那么,这是电源线。 这是灯泡。 那么,我有 某种电器 设备,我要使用我的 微控制器来控制它。 我将使用一种称为 固态继电器的设备, 它在输入端用作 一个可选接口。 那么,它的工作 方式是,如果这是 高电平,您知道,如果是 3.2 伏,那么所发生的是, 该 LED 现在是暗的, 该开关断开,您将 在它周围放置 一个框,然后 这里的电器将关闭, 因为没有电流,因为 开关是断开的。 但是,如果我发送 一个低电平,0.1 伏 -- 我将在这里放一个圆圈 -- 那么光线将进入 这里的 LED。 这将使开关闭合, 因此现在电流将流动, 该电器将打开。 电灯打开, 电机旋转, 无论我们要做什么, 在这一点上, 该微控制器都可以 影响它的世界。 这称为 固态继电器。 它没有那么复杂。 但是,如果您看看 与它相关联的软件, 它看起来就像 另一个 LED。 在本例中,我恰好 使用了 20 毫安 输出引脚之一。 MSP432 上有 4 个可以 生成 20 毫安的引脚。 我将通过友好的 方式清除该位, 以便它成为一个常规 位,而不是交替位。 我将使它成为一个输出。 很显然,它是输出。 信息将沿着 这个方向传递。 它是一个输出引脚。 但我可以添加另一个 步骤,将该引脚的驱动 强度设置为高,以便 该端口现在可以拉取 或同步高达 20 毫安的电流。 那么,这几乎可以 驱动我要连接的 任何固态继电器。 那么,当我想 打开灯泡时 -- 再说一次,要友好一些 -- 我将使用读取-修改-写入 来清除位 3,因为它现在是 负逻辑,您还记得吧? 0 使其变为低电平, 但灯泡会亮起。 这就是我将其称为 负逻辑的原因。 然后,如果我想 将灯关闭,那么 我就将端口引脚设置为 1, 从而使电压变为高电平, LED 将熄灭, 电器将关闭。 那么,再说一次, 该软件具有两个组件。 您应该注意到抽象。 我们已经完全抽象出了 我们实际上绑定到端口 2 位 3 的性质。 我们已经抽象出了这样 一个事实,即它是负逻辑 并且它的驱动 强度为 20 毫安。 那么,从另一个 观点而言,我们 具有一个简单的 功能,如打开灯 或关闭灯。 它就是这么简单。 这是您可以在 实验室中实现的功能。 当您开始进行实验时, 您将看到它的细节。 但您将具有 输入和输出。 那么,所有这些 电阻器和电容器 都内置到实际 传感器中。 那么,除了将 3.3,将该引脚 通过导线连接到那里, 将那个引脚连接到那里, 以及将这个引脚连接到 那里,这些有 8 个。 那么 8,9,10,11 -- 我们现在有 11 个 引脚,我们要连接它们, 从而使该线传感器正常工作。 我向已经您展示了 这些传感器之一。 但我现在想 讨论的是 GPIO。 关于 GPIO,您知道些什么? 引脚可以是 输入或输出。 那么我们要使端口 5 位 3 成为输出。 您知道如何实现它 -- 方向寄存器,选择 寄存器等,清除 选择寄存器, 将方向寄存器设置为高电平。 您将使端口 7 位 0 成为高电平。 我们再次将其 方向寄存器, 将其选择寄存器 设置为 0,然后向 数据寄存器或 输出寄存器输出 1。 我们将等待 10 微秒 -- 它是一段很短的时间 -- 以 48 兆赫兹的频率运行它 -- 这是 480 个总线周期,因此 它是一段很短的时间。 然后我们将做 一件奇怪的事情。 这个用作 输出的引脚 现在将成为输入。 这些有 8 个,抱歉 -- 这些有 8 个,这些有 1 个。 那么,这是 P7.7,P7.6。 这些有一组。 那么,这些有 8 个, 这些有 1 个。 是的,有 1 个灯, 8 个传感器。 是的,好了。 我们将切换该引脚, 使其成为一个输入。 这个引脚,正如您 看到的,将保持 10 微秒。 该引脚是一个 输出,就在这里。 该引脚是一个输出。 然后,我们将做的是, 将其切换回输入。 请注意,这不是按比例 绘制的,因为这里的距离 是 10 微秒,而那个 距离是 1 毫秒。 因此它不是按比例绘制的。 我们将 等待 1 毫秒。 请注意,这是很多总线周期。 这是 48,000 个总线周期。 然后,我们将 读取该引脚。 根据您在该传感器 下方看到的是白色 还是黑色 -- 如果您看到白色, 它会更快地放电。 然后,当我读取时, 我将获得 0, 相反,如果我具有黑色, 那么当我读取它时, 我将看到 1。 因此,如果我在 1 毫秒时 读取它,那么这将返回 0, 而那将返回 1。 那么,通过这种 方法,您将能够 在您的机器人的 底部询问您的 机器人是否 位于线上。 为了节能,在该 1 毫秒之后, 在我读取它之后,我们 要将该引脚 设置为低电平。 这将关闭该灯, 从而可以节能。 因此,我们将仅 驱动该 LED 1 毫秒。 事实上,如果我 每 10 毫秒驱动 该传感器一次,那么 我们要将它关闭 9 毫秒, 然后我们将重新执行 该操作,反复不但地执行。 因此,我们在这里进行 该实验的目的 -- 很显然, 您将使用 线传感器 使机器人感应线,但 正是通过该传感器, 您可以实际看到 输入引脚、输出引脚、 等待时间。 那么,这是一个您需要 连接的很有趣的传感器。 具体而言,您 可以通过它 了解 VIH 的概念,VIH 是一个电压, 当高于该电压时,它可在 VIL 中 感应到高电平,VIL 也是 一个电压,当低于该电压时, 会将该引脚感应为低电平。 对于该传感器, 您必须了解 该特性。 总之,我们 将实现 GPIO。 事实上,它们无处不在。 在本节课中,我们 将在各种情形下 看到 GPIO。 本实验将使用 线传感器,但 我们的碰撞 传感器将是 GPIO。 一个输出引脚将设置 我们的电机方向 -- 我们 是要前进还是后退? 如果您在实验 11 中 实现液晶显示器, 您将看到会采用 GPIO。 您的转速计输入 引脚将是 GPIO。 如果我们有一个超声波 传感器,它将具有 GPIO。 蓝牙引脚具有 GPIO。 Wi-Fi 模块具有 GPIO。 因此,它实际上在 本课程中无处不在。 我们将在本实验中实现 一个非常简单的此类引脚。 希望您喜欢本次实验。 它比较有趣。 431

大家好,我是 Jon Valvano。

在本视频中, 我们将讨论

通用输入输出接口的编程。

我们在前一个视频中 看到了“连接”的概念。

换句话说,如果我 在这里有一个系统,

然后我将它连接到 那里的另一个系统,

那么当一个数字 逻辑连接到另一个

数字逻辑时,我必须 关心电压和电流。

那么,在前一个 视频中,我们

讨论了该 硬件互连,

硬件接口。

那么,在该 模块中,

我们将讨论 它的软件方面。

我如何编写这些 系统上存在的软件,

以便我可以 执行输入输出?

与该模块 关联的

实验中的最终 目标是光传感器。

在光传感器 接口中,您将

看到硬件 和软件。

换句话说,我们将 看到与 8 个传感器

关联的电压和电流。

然后,这将为我 提供 1 和 0 输入,

具体取决于它 是否看到了线。

然后,第二点 将是中心集成,

其中您获取 这 8 个数字数

并将其合并到 单个数字中,

该数字可告诉您 相对于线的位置。

希望您喜欢本次实验。

该实验应该很有趣。

那么,让我们来讨论 软件是怎样工作的。

对于通用输入/输出, 您有两种可能的选择,

即输入和输出。

这不是很复杂。

输入意味着 来自世界的

信号将进入 微控制器。

我们在前一个视频中 看到,如果我有一个

输入引脚并且该引脚上的 电压小于 VIL,那么

该电路会将其 视为低电平。

它是输入。

如果该电压 大于 VIH,嗯,

那么该电路会 将其视为高电平。

因此,当我们 在软件中看到它时,

它将在该寄存器中 为 0,或者在该寄存器中

为 1。

为了将引脚 设置为输入,

我们要将其方向 寄存器设置为 0。

当我们将方向寄存器 设置为 0 时,它将

断开所有关联的 输出物理硬件,从而

使该引脚成为输入, 因为它不是输出,

它是输入。

因此,当我想进行 输入时,我要将

寄存器,一个 称为端口 1 的

内存映射 I/O 位置中的数据

读取到该输入寄存器中, 因为您应该记得,I/O 设备

划分到多个 引脚中,然后

大约 8 个引脚组合 在一起,形成一个端口。

当我说 P1 时, 我指的是端口 1。

在这里,当我看到 P1.1 时, 我将讨论的是端口 1 的

引脚 1。

初始化该端口 需要执行两个步骤。

换句话说,让我们 使它成为一个 GPIO。

我们通过向选定的 寄存器进行写入来实现它。

我们实际上 向其写入 0。

我们所做的第二件事是, 我们对方向寄存器进行写入 --

0 意味着输入。

那么,正如我说过的, 像大多数端口一样,

端口 1 的宽度为 8 位。

因此您可以将该 寄存器,P1 视为输入,

它具有 8 位的宽度。

7, 6, 5, 4, 3, 2, 1, 0.

我感兴趣的 特定位是位 1。

但还有一个 选择寄存器。

选择寄存器、 选择 1 寄存器和

方向寄存器 有一个 P1。

因此每项操作 有 4 个寄存器。

此外,还会有 另一个 8 位寄存器。

具体而言,为了 将 P1 设置为输入,

我需要在两个选择 寄存器的位 1 位置中

设置 0,并且我 需要在方向寄存器,

DIR 寄存器的位 1 位置中设置 0。

我将使用该 C 代码来实现它。

我将 -- 该 C 代码的 作用是访问这 3 个

寄存器的位 1 并清除位 1。

现在,您会注意到 一件奇怪的事情 --

我是通过一种非常有趣的方式来实现它的。

再说一次,它是读取-修改-写入。

那么,让我们 来看看这里的

方向寄存器。

该方向寄存器中 将具有 7 个位 --

具有 8 个位。

1, 2, 3, 4, 5.

再说一次,我最 感兴趣的是这个位,位 1。

7,6,等等等,2,1,0。

因此,我要做的是, 我将为其添加一个

用于清除位 1 的掩码,

它是 1111,1101。

当我向它添加 该 FD 后,这将

导致位 1 变为 0。

这正是我需要的结果。

但是,请注意它对 其他 7 个位的影响。

它完全没有更改这些位。

因此,如果我的实验 伙伴要使用位 7,

我未更改他或 她的方向寄存器。

我没有动它。

那么,每当您 在编写 I/O

代码时仅更改 您必须更改的位,

而不更改 不属于您

或您不必 更改的位,

我们就将该类 编程定义为友好的。

这样您就可以 对某个寄存器中的

几个位进行操作,而您的 实验伙伴对其他位进行操作,

然后你们的两个 软件可以合并在一起,

并且不会以不利的方式相互影响。

那么,我们将反复 不断地看到该情况。

那么,使用输入引脚的 第一步是对其进行初始化。

那么,这里的代码 恰好在开头执行一次。

这会将端口 1 位 1 建立为输入引脚。

但是,然后我希望实际上 反复不断地执行输入。

我们将看到,由于 该寄存器中有 8 个位,

每个引脚 1 个,7、6、5、4、 3、2、1、0 -- 再说一次,

我只对位 1 感兴趣 --

读取寄存器中 特定的一组

引脚的过程 包含两个步骤。

我将首先读取 全部 8 个位,

然后我将 屏蔽 --

2、3、4、5、6、7 --

或者对其执行与 运算,从而使结果

仅是位 1 的函数。

您可以在这里 明显地看到该情况。

那么,第一步是 读取全部 8 个位。

那么,我将获得该值, 然后我将对它执行与运算,

然后我将在这里 获得一个数字,

它将是 0000 -- 如果引脚

处于低电平,那么 我将获得该值,

或者如果引脚处于高电平, 那么我将获得该数字。

换句话说,我 将获得 0 或 2,

具体取决于端口 1 位 1 的状态。

现在,您可以通过包含两个 步骤的过程来显式实现它,

即读取和与运算。

再说一次,这将返回 0 或 1。

或者,如果您愿意, 可以将这合并到

一行 C 代码中, 其中它首先将

该值临时 读取到一个

寄存器中,然后 执行掩码运算,

即选择, 以获取

我感兴趣的位, 然后返回该 0 或 2。

现在,如果您的 编译器功能良好,

那么这部分 C 代码 和那部分 C 代码

实际上将生成完全 相同的机器码,因此

使用一种方法 或另一种方法

没有任何速度优势。

因此,您可以 选择这两种

方法中您感觉 最易于了解实际

发生的情况的一种。

那么,这是输入。

那么,再说一次,输入会 将数据引入到处理器中。

现在,要进行输出,我 必须做相同的两类事情。

我要将同一程序 恰好执行一次,

这会将引脚 建立为输出,

然后,我将反复 不断地根据需要

进行输出。

那么,我要执行的示例是, 我有 P1,即端口 1,

现在位 0 将是我的 微控制器的一个输出。

因此,我需要能够将其 设置为高电平或低电平。

再说一次,我们 曾在前面的一个

讲座中看到,如果 这需要是高电平,

那么这里的电压将大于 VOH。

因此,如果数字 1 出现在这里,即

布尔高电平,那么该电压 将上升到接近 3.3 伏。

如果您需要使其 成为低电平,那么

这里的软件将 使其成为低电平,

但硬件将在该点 建立电压,小于 VOL。

然后,再说一次,只要 该输入或输出设备上的

电流小于 6 毫安, 那么一切就没有问题。

您应该记得有 这个选择寄存器,

0 意味着常规。

那么,再说一次,我们将 使该引脚成为常规引脚。

这恰好要 清除位 0。

我们在前一张幻灯片中看到, 输入引脚方向寄存器为 0

意味着输入。

但我们需要输出, 因此我们将设置该位。

那么,再说一次, 这是对方向寄存器

进行读取-修改-写入, 这将设置位 0,从而

导致端口 1 位 0 成为输出。

这全部三项操作都访问 一个 8 位寄存器,但仅

修改位 0。

换句话说, 它们仅修改

需要修改的位, 而不更改其他

7 个位,它们不是 这里的规范的一部分。

我们要将这 称为友好的。

然后,您可以 在这里看到

初始化,几张 幻灯片之前的

初始化可以在完全 不相互影响的情况下

分别进行。

那么,这个将访问位 0。

另一个访问位 1。

任何一个都不会破坏 另一个人的初始化。

那么,这是初始化。

再说一次,我们恰好 可以将其执行一次。

我们要做的下一件 事实际上是进行输出。

正如我说过的,您将进行写入, 如果您对端口 1 进行写入,

位--

哦,就像那里的那个。

如果您对端口 1 进行写入,对于

作为输出的引脚, 这将设置或清除位。

现在,它恰好是输入引脚, 因此不会执行任何操作。

但对于输出引脚,它将 变为高电平或低电平。

但我们希望通过 友好的方式加以

实现,因为 在本例中,

我们只能访问 或需要修改

端口 1 位 0。

那么,我们将通过一个包含 四个步骤的过程来实现它。

我们将首先读取 全部 8 个位。

换句话说, 我将读取

我的实验伙伴在他或 她的寄存器中剩余的位。

我将屏蔽我将 最终更改的位。

我将设置或清除 我想更改的位。

在本例中只有 1 个位。

然后我要写回 整个内容,从而

再次修改整个 8 位 端口,但再说一次,

仅更改我拥有的位 -- 在本例中,仅更改位 0。

因此,我们将在 这里看到该步骤。

那么,在这里,我要将全部 8 个位读到一个局部变量中。

我将屏蔽、清除 我要最终更改的位,

然后我要将 原来的位,

即我的实验伙伴 留下的其他 7 个

位与我希望修改的 这个新位 -- 它来自

我的函数 --

进行合并,从而 使这里的运算

现在包含我希望 更改的 1 个位和

我不希望更改的其他 7 个位。

因此,当我再次 将它写回时,

我将仅更改这 1 个位。

现在,我要提醒您, 这里的代码行不会

更改输出。

您可以看到,old 是一个局部变量。

那么,当我清除和设置 某个变量中的位时,

不会对外部世界 产生任何影响。

仅当我将该合并的 内容写回到端口 1 时,

才会输出实际的位变为 高电平或低电平的寄存器,

正如我所指定的。

再说一次,该包含四个步骤的 序列是一种用于实现友好

代码的方法。

现在,您可以通过 该方法显式写出

这四个步骤,您也 可以通过 1 行 C

代码来写出它们,其中 它在这里读取值,它清除

我将最终 更改的位,

我更改我想更改的 位,然后我将其写回。

那么,事实上,这里显式 提供了全部四个步骤,

但它在我的 C 代码行中。

再说一次,如果您的 编译器功能良好,

这个函数和那个 函数将生成完全

相同的机器码。

换话句话说,它们 将以相同的速率

和相同的速度执行。

那么,我们选择对您 更有意义的一个。

再说一次,对于某个输出 引脚,我们对其进行初始化,

然后每当我想 更改它时,我会

执行这个函数, 这将设置 LED。

或者,我会执行 这个函数,这会

清除 LED。

那么,再说一次, 我可以在更高的

级别打开和关闭与端口 1 位 0 相关联的 LED。

让我们来执行一个示例。

这个恰好是 负逻辑,因为

这里有一个灯泡。

那么,这是一个常规 120 伏交流灯泡。

那么,这是电源线。

这是灯泡。

那么,我有 某种电器

设备,我要使用我的 微控制器来控制它。

我将使用一种称为 固态继电器的设备,

它在输入端用作 一个可选接口。

那么,它的工作 方式是,如果这是

高电平,您知道,如果是 3.2 伏,那么所发生的是,

该 LED 现在是暗的, 该开关断开,您将

在它周围放置 一个框,然后

这里的电器将关闭, 因为没有电流,因为

开关是断开的。

但是,如果我发送 一个低电平,0.1 伏 --

我将在这里放一个圆圈 --

那么光线将进入 这里的 LED。

这将使开关闭合, 因此现在电流将流动,

该电器将打开。

电灯打开, 电机旋转,

无论我们要做什么, 在这一点上,

该微控制器都可以 影响它的世界。

这称为 固态继电器。

它没有那么复杂。

但是,如果您看看 与它相关联的软件,

它看起来就像 另一个 LED。

在本例中,我恰好 使用了 20 毫安

输出引脚之一。

MSP432 上有 4 个可以 生成 20 毫安的引脚。

我将通过友好的 方式清除该位,

以便它成为一个常规 位,而不是交替位。

我将使它成为一个输出。

很显然,它是输出。

信息将沿着 这个方向传递。

它是一个输出引脚。

但我可以添加另一个 步骤,将该引脚的驱动

强度设置为高,以便 该端口现在可以拉取

或同步高达 20 毫安的电流。

那么,这几乎可以 驱动我要连接的

任何固态继电器。

那么,当我想 打开灯泡时 --

再说一次,要友好一些 --

我将使用读取-修改-写入 来清除位 3,因为它现在是

负逻辑,您还记得吧?

0 使其变为低电平, 但灯泡会亮起。

这就是我将其称为 负逻辑的原因。

然后,如果我想 将灯关闭,那么

我就将端口引脚设置为 1, 从而使电压变为高电平,

LED 将熄灭, 电器将关闭。

那么,再说一次, 该软件具有两个组件。

您应该注意到抽象。

我们已经完全抽象出了 我们实际上绑定到端口

2 位 3 的性质。

我们已经抽象出了这样 一个事实,即它是负逻辑

并且它的驱动 强度为 20 毫安。

那么,从另一个 观点而言,我们

具有一个简单的 功能,如打开灯

或关闭灯。

它就是这么简单。

这是您可以在 实验室中实现的功能。

当您开始进行实验时, 您将看到它的细节。

但您将具有 输入和输出。

那么,所有这些 电阻器和电容器

都内置到实际 传感器中。

那么,除了将 3.3,将该引脚 通过导线连接到那里,

将那个引脚连接到那里, 以及将这个引脚连接到

那里,这些有 8 个。

那么 8,9,10,11 -- 我们现在有 11 个

引脚,我们要连接它们, 从而使该线传感器正常工作。

我向已经您展示了 这些传感器之一。

但我现在想 讨论的是 GPIO。

关于 GPIO,您知道些什么?

引脚可以是 输入或输出。

那么我们要使端口 5 位 3 成为输出。

您知道如何实现它 -- 方向寄存器,选择

寄存器等,清除 选择寄存器,

将方向寄存器设置为高电平。

您将使端口 7 位 0 成为高电平。

我们再次将其 方向寄存器,

将其选择寄存器 设置为 0,然后向

数据寄存器或 输出寄存器输出 1。

我们将等待 10 微秒 --

它是一段很短的时间 --

以 48 兆赫兹的频率运行它 --

这是 480 个总线周期,因此 它是一段很短的时间。

然后我们将做 一件奇怪的事情。

这个用作 输出的引脚

现在将成为输入。

这些有 8 个,抱歉 --

这些有 8 个,这些有 1 个。

那么,这是 P7.7,P7.6。

这些有一组。

那么,这些有 8 个, 这些有 1 个。

是的,有 1 个灯, 8 个传感器。

是的,好了。

我们将切换该引脚, 使其成为一个输入。

这个引脚,正如您 看到的,将保持 10 微秒。

该引脚是一个 输出,就在这里。

该引脚是一个输出。

然后,我们将做的是, 将其切换回输入。

请注意,这不是按比例 绘制的,因为这里的距离

是 10 微秒,而那个 距离是 1 毫秒。

因此它不是按比例绘制的。

我们将 等待 1 毫秒。

请注意,这是很多总线周期。

这是 48,000 个总线周期。

然后,我们将 读取该引脚。

根据您在该传感器 下方看到的是白色

还是黑色 --

如果您看到白色, 它会更快地放电。

然后,当我读取时, 我将获得 0,

相反,如果我具有黑色, 那么当我读取它时,

我将看到 1。

因此,如果我在 1 毫秒时 读取它,那么这将返回 0,

而那将返回 1。

那么,通过这种 方法,您将能够

在您的机器人的 底部询问您的

机器人是否 位于线上。

为了节能,在该 1 毫秒之后, 在我读取它之后,我们

要将该引脚 设置为低电平。

这将关闭该灯, 从而可以节能。

因此,我们将仅 驱动该 LED 1 毫秒。

事实上,如果我 每 10 毫秒驱动

该传感器一次,那么 我们要将它关闭 9 毫秒,

然后我们将重新执行 该操作,反复不但地执行。

因此,我们在这里进行 该实验的目的 -- 很显然,

您将使用 线传感器

使机器人感应线,但 正是通过该传感器,

您可以实际看到 输入引脚、输出引脚、

等待时间。

那么,这是一个您需要 连接的很有趣的传感器。

具体而言,您 可以通过它

了解 VIH 的概念,VIH 是一个电压, 当高于该电压时,它可在 VIL 中

感应到高电平,VIL 也是 一个电压,当低于该电压时,

会将该引脚感应为低电平。

对于该传感器, 您必须了解

该特性。

总之,我们 将实现 GPIO。

事实上,它们无处不在。

在本节课中,我们 将在各种情形下

看到 GPIO。

本实验将使用 线传感器,但

我们的碰撞 传感器将是 GPIO。

一个输出引脚将设置 我们的电机方向 -- 我们

是要前进还是后退?

如果您在实验 11 中 实现液晶显示器,

您将看到会采用 GPIO。

您的转速计输入 引脚将是 GPIO。

如果我们有一个超声波 传感器,它将具有 GPIO。

蓝牙引脚具有 GPIO。

Wi-Fi 模块具有 GPIO。

因此,它实际上在 本课程中无处不在。

我们将在本实验中实现 一个非常简单的此类引脚。

希望您喜欢本次实验。

它比较有趣。 431

视频报错
手机看
扫码用手机观看
收藏本课程

相关下载

查看全部

视频简介

TI-RSLK 模块 6 - 讲座视频 - GPIO 编程

所属课程:TI机器人系统学习套件(TI-RSLK) 发布时间:2018.08.27 视频集数:69 本节视频时长:23:29
在该模块中,你将设计、开发及测试迷宫机器人所需要的线传感器度量。
已有6人参与了讨论去论坛跟帖交流