wisebaby 发表于 2008-7-17 10:10:10

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

如题,程序如下:

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天半了,请各位朋友帮忙指点一二。不胜感激。

wisebaby 发表于 2008-7-17 10:11:36

我用JTAG仿真为何UCSRC会变成0x00呢?

不解。

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

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

wisebaby 发表于 2008-7-17 10:23:01

在JTAG仿真中改UCSRC的数值,为何UBRRH随之也变化呢?

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

wisebaby 发表于 2008-7-17 10:44:47

顶贴!

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

不解。请高手指点。

wisebaby 发表于 2008-7-17 10:51:04

顶贴,求助。

zc3909 发表于 2008-7-17 11:02:51

JTAG时候有些寄存器是不能访问的

hl0716 发表于 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;§

我也在调

wisebaby 发表于 2008-7-17 11:30:18

顶贴,求助!

lanshuitianxia 发表于 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++);
        }
}
/********************************************/

wisebaby 发表于 2008-7-17 12:12:31

谢谢各位朋友的参与。吃饭回来,继续调试。

wisebaby 发表于 2008-7-17 12:30:47

错在哪了呀!!疯了。

哎测测测。。

peaceliu 发表于 2008-7-17 12:36:07

发送程序写的有问题,顺序应该颠倒一下.

wisebaby 发表于 2008-7-17 12:37:51

void UART_Send(unsigned char data)//发送8位的帧数据
{
UDR=data;//将数据放入缓冲器,发送数据
while(!(UCSRA&0x20));// while(!(UCSRA&(1<<UDRE)));//等待发送缓冲器为空
}

如上?

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

teddeng 发表于 2008-7-17 12:51:57

你确定硬件正确?这样,你把M16拔了,短接板上TX/RX两脚,用PC串口程序发,看接收区是否接收一样的字符;
以上没问题,抄书上现成的代码,看正常否,正常,再自己写。

wisebaby 发表于 2008-7-17 13:07:56

嗯,我就这么干的,书上的好使,自己的不行,我今天非找到毛病不可。我一个字母一个字母看!

wisebaby 发表于 2008-7-17 14:25:01

现在上来的兄弟越来越少了,晚上也许会多起来吧,都进来帮忙看看。为啥我的程序就是不行呢。

编译也通过。。。。

wisebaby 发表于 2008-7-17 15:11:46

顶贴,谁有好使的程序,我参考一下。

ChipArt 发表于 2008-7-17 15:49:08

UBRRL= UBRR%256;//波特率设置
UBRRH= UBRR/256;

UBRR是什么?改成:

UBRRH=0;
UBRRL=71;

wisebaby 发表于 2008-7-17 16:23:23

楼上说的是,我那么写也是这个意思,感谢指点。

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

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

zc3909 发表于 2008-7-17 16:51:32

在单片机tx和rx环上,去掉232,单片机自发自收看看什么现象

huyugv_830913 发表于 2008-7-17 16:54:23

确定溶丝烧了吗,呵呵可能这个问题哦,我们也遇到过的,郁闷表半天

wisebaby 发表于 2008-7-17 17:17:11

熔丝位?

烧哪个?

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

wisebaby 发表于 2008-7-17 17:18:33

胡大哥,快来回复我啊。。。

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

wisebaby 发表于 2008-7-17 17:26:14

请各位高手继续跟帖。

wisebaby 发表于 2008-7-17 18:54:53

顶贴,请各位指点小弟一下。
串口只能收不能发什么原因?

huyugv_830913 发表于 2008-7-19 16:11:56

呵呵,楼主在北京工作,昨天我是在北京的清河回你的(好像离你那不远哦),昨天出差发了一个就没南京了,你的熔丝好了吗,就是和你是用的晶振对应呀!

wisebaby 发表于 2008-7-30 13:07:44

这个问题我已经解决,硬件电路问题,不好意思。示波器一搭,原来的2、3、5弄错了,板子画错了。不好意思。问题已经解决,上面的程序是正确的。
页: [1]
查看完整版本: M16 11.0592M UART 9600bps 电路连接正确,为何通信不成功,手头只有万用表一块。请高手