搜索
bottom↓
回复: 26

M16 11.0592M UART 9600bps 电路连接正确,为何通信不成功,手头只有万用表一块。请高手

[复制链接]

出0入0汤圆

发表于 2008-7-17 10:10:10 | 显示全部楼层 |阅读模式
如题,程序如下:

void UART_Init(void)
{
  UBRRL= UBRR%256;//波特率设置
  UBRRH= UBRR/256;
  UCSRA=0x00;
  UCSRB=0x98;// (1<<RXCIE)&(1<<RXEN)&(1<<TXEN);        //使能接受中断、接收器与发送器使能
  UCSRC=0x86;// (1<<URSEL)&(1<<UCSZ1)&(1<<UCSZ0);        //设置帧格式:8个数据位,1个停止位。
  DDRD|=0x01;
}
void UART_Send(unsigned char data)//发送8位的帧数据
{
  while(!(UCSRA&0x20));// while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
  UDR=data;//将数据放入缓冲器,发送数据
}

int main(void)
{
  UART_Init();
  asm("sei");//使能全局中断
  while(1)
  {
    UART_Send(1);  //UART异步串行通信
  }
}

我初衷只想简单的发一个数字1 , 上位机软件已经设置好。 com1;9600;8个数据位;1个停止位;串口已经打开。

可惜无数据,调了1天半了,请各位朋友帮忙指点一二。不胜感激。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2008-7-17 10:11:36 | 显示全部楼层
我用JTAG仿真为何UCSRC会变成0x00呢?

不解。

而且程序执行一次while(1)之后,UCSRA就一直为0x60;

似乎是执行不了发送程序一样。我看UDR里面的数据一直是没有的。

出0入0汤圆

 楼主| 发表于 2008-7-17 10:23:01 | 显示全部楼层
在JTAG仿真中改UCSRC的数值,为何UBRRH随之也变化呢?

我先把UCSRC的最高位置位,可是后面的还是随之变化,哎,请高手指点一二。

出0入0汤圆

 楼主| 发表于 2008-7-17 10:44:47 | 显示全部楼层
顶贴!

我不大会用JTAG,我的程序,用WATCH窗口观察 UDR 和 data 怎么看到的是 Not in scope 怎么就不在范围内了呢?

不解。请高手指点。

出0入0汤圆

 楼主| 发表于 2008-7-17 10:51:04 | 显示全部楼层
顶贴,求助。

出0入0汤圆

发表于 2008-7-17 11:02:51 | 显示全部楼层
JTAG时候有些寄存器是不能访问的

出0入0汤圆

发表于 2008-7-17 11:24:01 | 显示全部楼层
DDRD|=0x01;
PORTD = 0x03; //TXD(PD1)&Ecirc;&auml;&sup3;&ouml;
DDRD  = 0x02;//RXD(PD0)&Ecirc;&auml;&Egrave;&euml;&pound;&not;&Eacute;&Iuml;&Agrave;&shy;&Oacute;&ETH;&ETH;§

我也在调

出0入0汤圆

 楼主| 发表于 2008-7-17 11:30:18 | 显示全部楼层
顶贴,求助!

出0入0汤圆

发表于 2008-7-17 11:30:51 | 显示全部楼层
//这个是我以前写的测试程序,用的是ICC6.31A编译的 晶振7.3728M的
#include <iom16v.h>
#include <macros.h>

#define uint8_t unsigned char
#define uint16_t unsigned int


void USART_init(void);
uint8_t USART_Getchar(void);
void USART_Putchar(uint8_t send_char);
void USART_Send_string(uint8_t *str);

void main(void)
  {
         uint8_t temp_data = 0;
         DDRB = 0X0F;
         PORTB = 0XFF;
         USART_init();
         CLI();
     while(1)
       {
                           USART_Send_string("I love AVR!\n");
                        temp_data = USART_Getchar();
                        switch (temp_data)
                        {
                                 case '1':PORTB &= ~0X01;break;
                                case '2':PORTB |= 0X01;break;
                                case '3':PORTB &= ~0X02;break;
                                case '4':PORTB |= 0X02;break;
                                case '5':PORTB &= ~0X04;break;
                                case '6':PORTB |= 0X04;break;
                                case '7':PORTB &= ~0X08;break;
                                case '8':PORTB |= 0X08;break;
                        }
       }
  }
  
/********************************************/
void USART_init(void)
{
           /****波特率初始化*****/
         UBRRH = 0X00;
         UBRRL = 0x2f;                        //9600@7.3728Mhz
         /*****帧结构设定*****/
         UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//异步,无校验,一位停止位,8位数据
         /*****使能收发器*****/
         UCSRB = (1<<TXEN)|(1<<RXEN);
}
/********************************************/
uint8_t USART_Getchar(void)
{
        while(!(UCSRA & (1<<RXC)));
        return UDR;
}
/********************************************/
void USART_Putchar(uint8_t send_char)
{
        while(!(UCSRA & (1<<UDRE)));
        UDR = send_char;
}
/********************************************/
void USART_Send_string(uint8_t *str)
{
        while((*str) != '\0')
        {
                 USART_Putchar(*str++);
        }
}
/********************************************/

出0入0汤圆

 楼主| 发表于 2008-7-17 12:12:31 | 显示全部楼层
谢谢各位朋友的参与。吃饭回来,继续调试。

出0入0汤圆

 楼主| 发表于 2008-7-17 12:30:47 | 显示全部楼层
错在哪了呀!!疯了。

哎测测测。。

出0入0汤圆

发表于 2008-7-17 12:36:07 | 显示全部楼层
发送程序写的有问题,顺序应该颠倒一下.

出0入0汤圆

 楼主| 发表于 2008-7-17 12:37:51 | 显示全部楼层
void UART_Send(unsigned char data)//发送8位的帧数据
{
  UDR=data;//将数据放入缓冲器,发送数据
  while(!(UCSRA&0x20));// while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
}

如上?

去看看其他人怎么编写的。

出0入0汤圆

发表于 2008-7-17 12:51:57 | 显示全部楼层
你确定硬件正确?这样,你把M16拔了,短接板上TX/RX两脚,用PC串口程序发,看接收区是否接收一样的字符;
以上没问题,抄书上现成的代码,看正常否,正常,再自己写。

出0入0汤圆

 楼主| 发表于 2008-7-17 13:07:56 | 显示全部楼层
嗯,我就这么干的,书上的好使,自己的不行,我今天非找到毛病不可。我一个字母一个字母看!

出0入0汤圆

 楼主| 发表于 2008-7-17 14:25:01 | 显示全部楼层
现在上来的兄弟越来越少了,晚上也许会多起来吧,都进来帮忙看看。为啥我的程序就是不行呢。

编译也通过。。。。

出0入0汤圆

 楼主| 发表于 2008-7-17 15:11:46 | 显示全部楼层
顶贴,谁有好使的程序,我参考一下。

出0入0汤圆

发表于 2008-7-17 15:49:08 | 显示全部楼层
UBRRL= UBRR%256;//波特率设置
UBRRH= UBRR/256;

UBRR是什么?改成:

UBRRH=0;
UBRRL=71;

出0入0汤圆

 楼主| 发表于 2008-7-17 16:23:23 | 显示全部楼层
楼上说的是,我那么写也是这个意思,感谢指点。

不过错误还真不在那。在我自己的头文件里有这样的定义:#define UBRR (F_CPU/BAUDRATE/16-1)

我认真修改了自己编写的程序,也按照【8楼】 lanshuitianxia 编写的程序尝试了一下,都是一个毛病了! 能收不能发,我操的。愁死!

出0入0汤圆

发表于 2008-7-17 16:51:32 | 显示全部楼层
在单片机tx和rx环上,去掉232,单片机自发自收看看什么现象

出0入0汤圆

发表于 2008-7-17 16:54:23 | 显示全部楼层
确定溶丝烧了吗,呵呵可能这个问题哦,我们也遇到过的,郁闷表半天

出0入0汤圆

 楼主| 发表于 2008-7-17 17:17:11 | 显示全部楼层
熔丝位?

烧哪个?

估计是没烧,我就不知道用串口还烧什么熔丝位呵呵。

出0入0汤圆

 楼主| 发表于 2008-7-17 17:18:33 | 显示全部楼层
胡大哥,快来回复我啊。。。

我怎么就没发现哪个熔丝位是跟串口有关的呢?

出0入0汤圆

 楼主| 发表于 2008-7-17 17:26:14 | 显示全部楼层
请各位高手继续跟帖。

出0入0汤圆

 楼主| 发表于 2008-7-17 18:54:53 | 显示全部楼层
顶贴,请各位指点小弟一下。
串口只能收不能发什么原因?

出0入0汤圆

发表于 2008-7-19 16:11:56 | 显示全部楼层
呵呵,楼主在北京工作,昨天我是在北京的清河回你的(好像离你那不远哦),昨天出差发了一个就没南京了,你的熔丝好了吗,就是和你是用的晶振对应呀!

出0入0汤圆

 楼主| 发表于 2008-7-30 13:07:44 | 显示全部楼层
这个问题我已经解决,硬件电路问题,不好意思。示波器一搭,原来的2、3、5弄错了,板子画错了。不好意思。问题已经解决,上面的程序是正确的。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 20:25

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表