如何在XC8中使用PIC IO引脚

电子说

1.2w人已加入

描述

原理图

PIC

配置位

大多数PIC程序在main.c文件的最顶部都有一个配置代码块。大部分内容在相关之前不会被覆盖,但重要的是在main.c文件中放入相同的代码(如下所示)。

原因是PIC具有硬件(例如看门狗定时器)可以重置设备,这可能会导致意外的结果。因此,此处的配置代码完全禁用所有这些额外功能,以确保它们不会妨碍您!

PIC

但是如果您很好奇,可以通过单击生产》设置配置位来生成自己的配置代码。

PIC

这将打开以下窗口,可用于更改位。完成所有更改后,单击“生成源代码以输出”。然后,这将在输出窗口中生成可以复制到主文件的代码!

PIC

PIC

配置振荡器

当我们用C编写程序时,有些事情我们不必考虑,例如计算机将如何与键盘对话或CPU正在使用什么振荡器。但是,微控制器与日常计算机不同,它们需要一定程度的配置才能正常运行。那么我们需要配置什么才能使PIC运行?通常,在运行主循环之前需要执行两个主要的配置代码:振荡器配置和I/O配置。

PIC器件由许多不同的模块组成,包括定时器,存储器和I/O外设,但最重要的是CPU。 CPU或中央处理单元是实际以指令形式执行操作的电路。当我们为运行的芯片创建C程序时,编译器将C程序转换为PIC的CPU可以理解的指令。与现有的其他CPU一样,PIC中的CPU以离散的步骤工作,而不是瞬间完成。要使CPU执行这些步骤(运行程序),需要一个时钟源。该时钟源可以来自外部振荡器,晶振,甚至是PIC内部的内部振荡器。为了简化电路,这里的大多数项目都会将PIC配置为使用内部振荡器。

在PIC芯片上配置振荡器要求我们调用一些特定指令并配置特定配置位。根据您使用的PIC,这将有所不同,因此本文中的代码仅考虑PIC16F819。我们的主文件(在上一篇文章中创建)中的第一个任务是确保我们的振荡器配置位设置为使用内部振荡器。

PIC

PIC16F819内部振荡器配置

设置该位不能配置振荡器运行的速度;它只告诉PIC它将运行内部振荡器。

下一步是设置振荡器的速度。由于PIC会逐步执行指令,并且这些步骤发生在来自振荡器的脉冲上,因此更快的振荡器将导致更快的PIC,这意味着它将能够每秒执行更多指令。但有多少? PIC16和PIC18器件通常需要四个时钟周期来执行指令,因此经验法则是将振荡器速度除以4,这就是PIC每秒指令的速度。

例如一个工作在8MHz的PIC每秒可以执行大约200万条指令,而工作在64MHz的PIC每秒可以执行1600万条指令。

那么,我们如何配置速度?这取决于每个PIC,但通常有一个名为OSCCON的寄存器可用于调整速度。找出所涉及寄存器的最佳方法是查看振荡器配置章节下的器件数据表。以下是PIC16F819数据手册中的摘录,描述了第38页上的不同速度(PDF)。

PIC

我们将配置我们的设备以8MHz运行,要做到这一点,我们需要将IRCF设置为111.在XC8中,可以使用它们的名称直接访问寄存器,可以使用位和点指令访问特定位,并且可以访问一组位(例如IRCF)作为单个值,如下所示。

OSCCON = 0b01110000(为整个OSCCON寄存器赋值)

OSCCONbits.IRCF = 0b111(将三个IRCF位分配给111)

OSCCONbits.IRCF0 = 1(为IRCF0指定二进制值1)

在我们的代码中,我们将使用以下指令将振荡器设置为8MHz:

PIC

配置和使用I/O端口

为了使我们的PIC能够与外部电路进行交互,它需要能够读取和写入其I/O引脚的数据。在处理PIC16F819上的I/O端口时,我们需要关注三个寄存器:

TRISA和TRISB寄存器(端口A和端口B上引脚的方向)

PORTA和PORTB寄存器(输入和输出寄存器)

ADCON1寄存器(引脚是数字引脚还是模拟输入引脚)

在我们的大多数项目中,我们将处理数字输出(如LED,显示器等),因此务必确保I/O引脚未配置为模拟输入。为确保这一点,我们将查看ADCON1寄存器(见第82页(PDF))并设置相应的PCFG位,以便与ADC相关的所有引脚都是数字引脚。

PIC

在我们的电路中,我们有一个LED输出连接到RB2(引脚8),因此我们需要将其配置为输出。为此,我们使用TRIS(TRISTATE)寄存器,该寄存器用于确定哪些引脚是输入,哪些是输出。

PIC上的每个端口最多可以为8位宽(RB0-RB7用于示例)并且TRIS寄存器中的每个位对应于输出引脚。如果某位为1(打开),则后续引脚为输入,如果某位为0(关闭),则该位为输出。

例如,如果TRISB等于0,则全部为8 PORT B上的引脚将是输出。如果TRISB = 255(二进制为11111111),则PORT B上的所有引脚都是输入。如果TRISB的值为0xF0(二进制为11110000),则PORT B(RB0-RB3)中的前四个引脚为输出,后四个引脚(RB4-RB7)为输入。请记住,二进制数首先从最右边读取!

有了这些知识,我们需要将RB2配置为输出。这可以使用TRISB寄存器名称并访问TRISB2位来完成,如下所示。

PIC

但我们如何读写I/O销?这在其他PIC上可能略有不同,但在PIC16F819上我们使用PORT寄存器,我们再次使用位和点访问各个引脚!

PIC

端口引脚不限于一次读取一个。您可以改为对整个PORT寄存器进行读写操作。这意味着您可以将PORT用作8位输入/输出端口,这在与字母数字LCD显示器等设备交互时非常有用。

PIC

您可能想要记住的一个简洁功能是您可以随时配置I/O引脚!一分钟你的引脚可能是一个输入引脚,下一个它可能是一个输出!重要的是你设置了TRIS位的正确值。

示例程序

本示例程序配置PIC16F819读取连接到其引脚RA0(引脚17)的触觉开关,然后打开/关闭RB2上的LED(引脚) 8),取决于开关的状态。

PIC

虽然这个例子看起来很基本,但你现在应该可以编写一个PIC设备来运行你的C程序和读/写端口。这已经允许您与市场上的大多数硬件接口,并且您可以开始与您自己的电路和项目进行交互!

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分