ATmega32A串口通信奇怪问题

2019-03-24 20:22发布

测试ATmega32A串口通信,使用内部1M振荡,
熔丝设置 ATmega32A.jpg 通信发送ASCII码0~2,返回十六进制均为两个字节,3e 00, 4c 00, 66 00,如此简单的东西都无法正常工作,令人费解。请大家帮帮忙,谢谢啦!
//ICC-AVR application builder : 2015-09-05 10:23:35
// Target : M32
// Crystal: 1.0000Mhz

#include <iom32v.h>
#include <macros.h>

void USART_Transmit( unsigned char data );

void port_init(void)
{
PORTA = 0x00;
DDRA  = 0x00;
PORTB = 0x00;
DDRB  = 0x00;
PORTC = 0x00;
DDRC  = 0x00;
PORTD = 0x00;
DDRD  = 0x00;
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x02;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x0C; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x98;
}

#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
//uart has received a character in UDR
unsigned char i=0;
i=UDR;
USART_Transmit(i);
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();

MCUCR = 0x00;
GICR  = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}


void USART_Transmit( unsigned char data )
{
/* 等待发送缓冲器为空 */
while ( !( UCSRA & (1<<UDRE)) )
;
/* 将数据放入缓冲器,发送数据 */
UDR = data;
}

void main(void)
{
        init_devices();
        while(1)
        {
        }
}


此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
wangjiafu1985
2019-03-25 07:19
本帖最后由 wangjiafu1985 于 2015-9-6 11:24 编辑

用示波器观察一下输出波形,看和你发送的数据是否相同,如果有逻辑分析仪就最好了。感觉楼上说的很有道理。不过也有可能是系统时钟频率不正确,你最好是用定时器做一个频率输出看看对不对。

一周热门 更多>