打印
[PIC®/AVR®/dsPIC®产品]

18F46k22 串口问题

[复制链接]
1963|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kamen588|  楼主 | 2013-10-17 17:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//#include <p18F46K22.h>/*18F系列单片机头文件*/
#include <p18cxxx.h>
#pragma config FOSC = XT                //外部晶振
#pragma config WDTEN = OFF              //关闭 WDT
#pragma config XINST = OFF              //指令集关
#pragma config LVP = OFF                //低压编程


#define uchar unsigned char
#define uint  unsigned int

#define LED   LATD   
uchar a;
void Interrupt_High(void);

void usart_init(void)
{
    TRISCbits.TRISC7 = 1;       // 设置串口
        TRISCbits.TRISC6 = 0;
       
        SPBRG = 25;                 // 波特率 4MHz 9600 N 8 1
        RCSTAbits.SPEN = 1;         // 串口使能
        TXSTAbits.BRGH = 1;         // 高速模式
        TXSTAbits.SYNC = 0;         // 异步模式
//        TXSTAbits.TXEN = 1;         // 发送允许
        RCSTAbits.CREN = 1;         // 允许接受
               
        PIE1bits.RCIE  = 1;         // 接收中断使能
        PIE1bits.TXIE  = 0;         // 发送中断禁止       
}
//-------------------------------------------------------------------------------
//                     高优先级中断向量
//-------------------------------------------------------------------------------
#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
        _asm
        goto  Interrupt_High     //跳到中断程
        _endasm
}

//-------------------------------------------------------------------------------
//                     高优先级中断服务程序
//-------------------------------------------------------------------------------
#pragma interrupt Interrupt_High
void Interrupt_High(void)
{
        if(PIR1bits.RCIF)            //接收中断
        {
           LED=RCREG;
        }

       
}
       

void main (void)
{
   
       
    TRISD=0b00000000;
        usart_init();
        INTCONbits.PEIE = 1;    //外设中断允许
        INTCONbits.GIE  = 1;    //总中断允许
        while(1)
        {
               
        }


}
这个程序就是用PORTD端口的8个led 显示串口助手发送的数据 在4520上经测试正常显示  在46k22上就不好用  很郁闷
沙发
NE5532| | 2013-10-17 21:04 | 只看该作者
“不好用”是外行的用词,不是一个电子工程师应该用的描述语言,请用工程师的语言详细描述你遇到的现象。

使用特权

评论回复
板凳
kamen588|  楼主 | 2013-10-18 16:20 | 只看该作者
谢谢版主批评
以上程序在pic18f4520单片机上 PORTD端口的8个led  能正常显示 串口调试助手发送的16进制数据 比如发送0xff  8个led全部熄灭 发送0x00  8个led全部点亮
在18f46k22单片机上就不能显示 RCREG 寄存器根本就接不到数据

后来解决了  问题是 pic18f4520 PORTC端口上电复位为数字端口 这样RC6 RC7 两个I/O可以被配置为串口功能
而 pic18f46K22 PORTC 端口上电复位为模拟端口 必须加一句     ANSELC = 0b00000000;            配置为数字IO口,这样RC6 RC7才可以正常使用

修改后 程序正常 后来又发现不能正常显示了 超级郁闷 。。。。。。。。。。。。。。。
后来经过一番曲折 发现MAX3232 坏了 严重鄙视 国产芯片
更换一个国家半导体的232 后 一切正常

用惯了4520 的朋友们 在使用46K22时一定要注意 PORTC 端口上电复位的状态 不用再犯我的错误 浪费时间 啊

使用特权

评论回复
地板
NE5532| | 2013-10-18 16:23 | 只看该作者
呵呵,这次描述得不错。但是用PIC的都应该注意模拟端口的功能,从PIC16开始就一直是这样的了。

使用特权

评论回复
5
yklstudent| | 2013-10-19 12:22 | 只看该作者
顶下

使用特权

评论回复
6
opal11| | 2013-10-19 16:37 | 只看该作者
顶!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

16

主题

240

帖子

3

粉丝