1、2、 准备连接线和power supply 连接,注意红+、黑-, 注意连线的正确性,看pcb的j12. 编写程序1、 设置引脚方向寄存器(从电路图看到是RD8、RD9、RD10、RD11),查看数据手册,找到TRISD:决定端口的方向,0输出,1输入PORTD:当方向为输入时,存放端口的值LATD:数据锁存器ODCD:漏极开路控制寄存器2、 设置锁存器#includeintmain(void)_TRISD8 =0;/设置引脚方向:0 输出;1 输入_TRISD9 =_TRISD10_TRISD11 =_LATD8 = 0;/设置锁存器的值,低电平(由前面得知)_LATD9 = 0;_LATD
2、10 = 0;_LATD11 = 0;while(1)return3、 编译设置好项目的输出路径、当前路径、头文件路径、库文件路径。编译,连接烧写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寄存器为
3、25由程序配置字知道选用主振荡器+4xPLL做为时钟源。OSC1做为输入、OSC2做为输出此时波特率=8*4/2M/(16*(25+1)=38461约为38400初始化uart的状态和控制寄存器、模式寄存器。2、 编写中断处理程序如何声明ISR以及怎样使用正确的矢量地址初始化IVT,将取决于编程语言(即 C 语言或汇编语言)和用于开发此应用程序的语言开发工具包。查看链接描述文件,我们可以看到中断向量表段。SECTIONS/* Interrupt Vector Table*/.ivt _IVT_BASE : 找到预定的uart收发中断名 LONG( DEFINED(_U1RXInterrupt)
4、 ? ABSOLUTE(_U1RXInterrupt) : ABSOLUTE(_DefaultInterrupt); LONG( DEFINED(_U1TXInterrupt) ? ABSOLUTE(_U1TXInterrupt) : 我们看到中断名为_U1RXInterrupt和_U1TXInterrupt为串口1的收发中断函数名,我们知道c语言中编译器处理后会自动在函数名前加一个下划线,我们为中断处理函数命名_U1RXInterrupt和_U1TXInterrupt.。 查看数据手册,我看中断向量表存放在固定的地址。IVT 位于程序存储器中,起始单元地址是 000004h。 IVT 包含
5、126 个矢量,这些矢量由 8 个不可屏蔽的陷阱向量和最多118 个中断源组成。 一般来说,每个中断源都有自己的中断矢量。 每个中断矢量都包含一个 24 位宽的地址。 每个中断矢量单元的存放值是其对应的中断服务程序(ISR)的起始地址。编译器会把预定的中断入口函数地址放在与中断矢量号对应的地址单元中。当触发中断时,系统会从中断矢量号查找对应的中断服务程序,从而运行中断服务程序。3、 编写串口收发函数由于涉及到全局变量,又涉及到中断,所以在对临界资源访问时要记得开关中断。4、 启动串口设置接收使能开始接收、开中断、设置发送使能开始发送5、 发送数据判断发送数据状态注意发送是时可能会忙标志位置位,
6、在while的发送中点亮led后显示灰暗,用万用表测量亮的led的压降,发现压降和前面的不一样,原因:因为数据位为忙时没有点亮led,这样不停的循环给led加电压,整个过程中电压不稳定,故led的压降偏向于占用时钟周期多的那个电压,但低于那个电压,所以会亮但没前面的亮。连接PIC板和电脑的rs232口1、 确认连接顺序,由前面知道j1的1接发送、2接地、3接接收口2、 找到rs232的接口顺序1. 载波检测2. 接收数据3. 发送数据4. 数据终端准备好5. gnd6. 通讯终端准备好7. 请求发8. 允许发9. 响铃指示器3、 接rs232的2、3、5口和j1的3、1、2口4、 注意串口线是
7、交叉线测试1、 将程序烧写到PIC板中2、 连接好连线3、 设置超级终端,选择com14、 加电,看是否收到数据5、 如没有收到数据检查前面各项串口线是否连接正确、电路是否短路、板子上是否有异物、程序上有没有错误等。6、 直到正确为止串口接收程序 int uart_recv(unsigned char *pData) _U1RXIE = 0; int i; int count = 0; count = Rcv_Count; for(i=0;iRcv_Count;i+) pDatai = Rcv_Bufi; /取出串口接收到的数据,以做处理 Rcv_Count = 0; _U1RXIE = 1;
8、 return count;遇到的问题:1、 接收没反应怀疑接收函数没有调用到,程序处于不断重启状态。在while里面添加点亮led灯语句,发现while执行正常。怀疑没有进入接收中断处理函数,使用debug模式。debug模式进不去。1、 线路没有问题2、 查看pcb图我们看到是芯片的26和27引脚。查看数据手册我们看到26和27对应于PGC2和PGD2。查看闪存配置字。_CONFIG1( JTAGEN_OFF /JTAG port disabled & GCP_OFF /Code Protect disable GWRP_OFF /Writes to program memory are
9、disabled COE_OFF /Clip-on Emulation mode FWDTEN_OFF /Watchdog Timer is disabled ICS_PGx1 /EMUC/EMUD share PGC1/PGD1 )程序被配置为PGC1和PGD1,故进入不了debug模式,修改之,ok 在接收中断中加入断电,在调试模式下运行,发现能够进入中断,说明收到数据了。 怀疑接收缓冲区有问题,仔细查看没有问题。 怀疑接收函数有问题,仔细查看发现,接收函数中引用了全局变量,而全局变量容易被其他地方改变,在函数中加入开关中断操作,ok2、 发送乱序仔细查看发送中断函数,发现在发送函数中,只进行了开中断操作,而其他地方也找不到关中断操作,因为发送函数每次有一个字符就触发一次中断,所以当发送多个字符时,由于时序上的问题就会出现发送的顺序的不对,在发送前先关中断,发送后开中断,问题解决,ok总结:1、 遇到问题,先怀疑自己写的程序是否有问题。2、 检查环境配置是否有问题3、 检查线路连接问题4、 检查程序逻辑问题5、 用debug调试6、 学着举一反三
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1