PIC小结文档格式.docx
《PIC小结文档格式.docx》由会员分享,可在线阅读,更多相关《PIC小结文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
![PIC小结文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/27/29206ae5-dce8-47e4-88fb-775e284b8c43/29206ae5-dce8-47e4-88fb-775e284b8c431.gif)
2、准备连接线
和powersupply连接,注意红+、黑-,注意连线的正确性,看pcb的j12.
编写程序
1、设置引脚方向寄存器(从电路图看到是RD8、RD9、RD10、RD11),查看数据手册,找到
TRISD:
决定端口的方向,0输出,1输入
PORTD:
当方向为输入时,存放端口的值
LATD:
数据锁存器
ODCD:
漏极开路控制寄存器
2、设置锁存器
#include
<
p24FJ128GA010.h>
int
main(void)
{
_TRISD8
=
0;
//设置引脚方向:
0输出;
1输入
_TRISD9=
_TRISD10
_TRISD11=
_LATD8=
0;
//设置锁存器的值,低电平(由前面得知)
_LATD9=0;
_LATD10=0;
_LATD11=0;
while
(1)
{
}
return
3、编译
设置好项目的输出路径、当前路径、头文件路径、库文件路径。
编译,连接
烧写
1、连接ICD和电脑,PIC板
2、注意ICD上小白色的箭头指向板子上带有小突起的引脚,
3、加电,烧写
4、断电,断开ICD和PIC板,加电,看是否点亮
检查uart电路的连通性
由图知调试口的1接发送、2接地、3接接收口。
由图知j1的下边的为第一脚,1接u18、3接u17。
测量u18连接的三个TXD和1;
u17和3;
2和gnd的连通性。
注意,测量连通性时,注意不要和其他线路短路,以免烧坏板子。
编写串口发送程序
1、串口初始化
设置BRGx寄存器为25
由程序配置字知道
选用主振荡器+4xPLL做为时钟源。
OSC1做为输入、OSC2做为输出
此时波特率=8*4/2M/(16*(25+1))=38461约为38400
初始化uart的状态和控制寄存器、模式寄存器。
2、编写中断处理程序
如何声明ISR以及怎样使用正确的矢量地址初始化IVT,将取决于编程语言(即C语言或汇编语言)和用于开发此应用程序的语言开发工具包。
查看链接描述文件,我们可以看到中断向量表段。
SECTIONS
/*
**InterruptVectorTable
*/
.ivt__IVT_BASE:
{
找到预定的uart收发中断名
LONG(DEFINED(__U1RXInterrupt)?
ABSOLUTE(__U1RXInterrupt):
ABSOLUTE(__DefaultInterrupt));
LONG(DEFINED(__U1TXInterrupt)?
ABSOLUTE(__U1TXInterrupt):
我们看到中断名为__U1RXInterrupt和__U1TXInterrupt为串口1的收发中断函数名,我们知道c语言中编译器处理后会自动在函数名前加一个下划线,我们为中断处理函数命名_U1RXInterrupt和_U1TXInterrupt.。
查看数据手册,我看中断向量表存放在固定的地址。
IVT位于程序存储器中,起始单元地址是000004h。
IVT包含126个矢量,这些矢量由8个不可屏蔽的陷阱向量和最多118个中断源组成。
一般来说,每个中断源都有自己的中断矢量。
每个中断矢量都包含一个24位宽的地址。
每个中断矢量单元的存放值是其对应的中断服务程序(ISR)的起始地址。
编译器会把预定的中断入口函数地址放在与中断矢量号对应的地址单元中。
当触发中断时,系统会从中断矢量号查找对应的中断服务程序,从而运行中断服务程序。
3、编写串口收发函数
由于涉及到全局变量,又涉及到中断,所以在对临界资源访问时要记得开关中断。
4、启动串口
设置接收使能开始接收、开中断、设置发送使能开始发送
5、发送数据
判断发送数据状态
注意发送是时可能会忙标志位置位,
在while的发送中点亮led后显示灰暗,用万用表测量亮的led的压降,发现压降和前面的不一样,原因:
因为数据位为忙时没有点亮led,这样不停的循环给led加电压,整个过程中电压不稳定,故led的压降偏向于占用时钟周期多的那个电压,但低于那个电压,所以会亮但没前面的亮。
连接PIC板和电脑的rs232口
1、确认连接顺序,由前面知道j1的1接发送、2接地、3接接收口
2、找到rs232的接口顺序
1.载波检测
2.接收数据
3.发送数据
4.数据终端准备好
5.gnd
6.通讯终端准备好
7.请求发
8.允许发
9.响铃指示器
3、接rs232的2、3、5口和j1的3、1、2口
4、注意串口线是交叉线
测试
1、将程序烧写到PIC板中
2、连接好连线
3、设置超级终端,选择com1
4、加电,看是否收到数据
5、如没有收到数据检查前面各项
串口线是否连接正确、电路是否短路、板子上是否有异物、程序上有没有错误等。
6、直到正确为止
串口接收程序
intuart_recv(unsignedchar*pData)
_U1RXIE=0;
inti;
intcount=0;
count=Rcv_Count;
for(i=0;
i<
Rcv_Count;
i++){
pData[i]=Rcv_Buf[i];
//取出串口接收到的数据,以做处理
}
Rcv_Count=0;
_U1RXIE=1;
returncount;
遇到的问题:
1、接收没反应
怀疑接收函数没有调用到,程序处于不断重启状态。
在while里面添加点亮led灯语句,发现while执行正常。
怀疑没有进入接收中断处理函数,使用debug模式。
debug模式进不去。
1、线路没有问题
2、查看pcb图
我们看到是芯片的26和27引脚。
查看数据手册
我们看到26和27对应于PGC2和PGD2。
查看闪存配置字。
_CONFIG1(JTAGEN_OFF//JTAGportdisabled
&
GCP_OFF//CodeProtectdisable
GWRP_OFF//Writestoprogrammemoryaredisabled
COE_OFF//Clip-onEmulationmode
FWDTEN_OFF//WatchdogTimerisdisabled
ICS_PGx1//EMUC/EMUDsharePGC1/PGD1
)
程序被配置为PGC1和PGD1,故进入不了debug模式,修改之,ok
在接收中断中加入断电,在调试模式下运行,发现能够进入中断,说明收到数据了。
怀疑接收缓冲区有问题,仔细查看没有问题。
怀疑接收函数有问题,仔细查看发现,接收函数中引用了全局变量,而全局变量容易被其他地方改变,在函数中加入开关中断操作,ok
2、发送乱序
仔细查看发送中断函数,发现在发送函数中,只进行了开中断操作,而其他地方也找不到关中断操作,因为发送函数每次有一个字符就触发一次中断,所以当发送多个字符时,由于时序上的问题就会出现发送的顺序的不对,在发送前先关中断,发送后开中断,问题解决,ok
总结:
1、遇到问题,先怀疑自己写的程序是否有问题。
2、检查环境配置是否有问题
3、检查线路连接问题
4、检查程序逻辑问题
5、用debug调试
6、学着举一反三