打印
[AVR单片机]

看看我初学者的程序,做一个UART中断收发。错在何处

[复制链接]
1697|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xloop|  楼主 | 2008-3-21 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



//=============头文件===========
#include <iom64v.h>                   //chip----ATMEGA64
#include <eeprom.h>    
#include <macros.h>
#include <stdlib.h> 
#include <math.h>

//==========================================
void init_timer0(void);
void init_uart0(void);
void init_uart1(void);
void init_port(void);
//=========================================
//RAM define.

unsigned char Buf0[10];
unsigned char count=0;

//==================================================================
//==================================================================

//=============定时器T0初始化函数============
void init_timer0(void)
{
      TCCR0 = 0x00; //stop
      ASSR  = 0x00; //set async mode
      TCNT0 = 0x70; //set count
      OCR0  = 0x90;
      TCCR0 = 0x06; //start timer
}

/*****************************************************/
//calculating  register UBRR reult .
//algorithm:if(u2x=0) ubrr=fosc/(16*baud)-1. 
//          if(u2x=1) ubrr=fosc/(8*baud)-1 .
//UART0初始化函数,晶体:7.37258M
//====================
void init_uart0(void)
{
    UCSR0B=(1<<RXEN0)|(1<<TXEN0);  //允许发送和接收
    UBRR0L=47;                     //设置波特率寄存器的低位  (7.3728MHz 47=9600 23=19200)
    UBRR0H=0;                      //设置波特率寄存器的高位
    UCSR0C=(1<<UCSZ01)|(1<<UCSZ00);//8位数据+1位STOP位
    UCSR0B=0xD8;
}
//===================================
//UART0发送中断处理函数 9200 baudrate
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TX
void uart0_tx_isr(void)
{
    while(count<=10)   
      {UDR0=Buf0[count];
      count++;
      while(!(UCSR0A&(1<<UDRE0))) ; 
     }
}
/*{
  F0_TxEnd=0;
  if(TxBuf0_end!=TxBuf0_begin)
  {
   UDR0=TxBuf0[TxBuf0_begin];
   F0_TxEnd=1;
   TxBuf0_begin++;
   if (TxBuf0_begin>=UART_TX0_BUFFER_SIZE) TxBuf0_begin=0;
  }
}*/
//===================================
//UART0接收中断处理函数
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RX
void uart0_rx_isr(void)
{  
     Buf0[count]=UDR0;
     count++;
     if(count>=10) count=0;
}    
    
 /* RxBuf0[RxBuf0_end]=UDR0;
  RxBuf0_end++;
  if(RxBuf0_end>=UART_RX0_BUFFER_SIZE) RxBuf0_end=0;
}*/

/*************************************************************/
//calculating  register UBRR reult .
//algorithm:if(u2x=0) ubrr=fosc/(16*baud)-1. 
//          if(u2x=1) ubrr=fosc/(8*baud)-1 .
//UART1(PC)初始化函数,晶体:7.37258M.
//===================================
void init_uart1(void)
{
    UCSR1B=(1<<RXEN1)|(1<<TXEN1);//允许发送和接收
    UBRR1L=95;//设置波特率寄存器的低位  (7.3728MHz 95=4800 47=9600 23=19200)
    UBRR1H=0;//设置波特率寄存器的高位
    UCSR1C=(1<<UCSZ11)|(1<<UCSZ10);//8位数据+1位STOP位
    UCSR1B=0xD8;
}
//=====================================
//UART1(GPS)发送中断处理函数
/*#pragma interrupt_handler uart1_tx_isr:iv_USART1_TXC
void uart1_tx_isr(void)
{
    F1_TxEnd=0;
    if(TxBuf1_end!=TxBuf1_begin)
     {
        UDR1=TxBuf1[TxBuf1_begin];
        F1_TxEnd=1;
        TxBuf1_begin++;
        if (TxBuf1_begin>=UART_TX1_BUFFER_SIZE) TxBuf1_begin=0;
      }    
}*/
//=================================
//UART1(GPS)接收中断处理函数
/*#pragma interrupt_handler uart1_rx_isr:iv_USART1_RXC
void uart1_rx_isr(void)
{   
    RxBuf1[RxBuf1_end]=UDR1;RxBuf1_end++;
    if(RxBuf1_end>=UART_RX1_BUFFER_SIZE) RxBuf1_end=0;
}*/
/*************************************************************/
void init_port(void)
{
 DDRA = 0x00;             //INPUT
 DDRB = 0x00;             //INPUT
 DDRC = 0x00;             //INPUT
 DDRD = 0x00;             //INPUT
 DDRE = 0x00;             //INPUT
 DDRF = 0x00;             //INPUT
 DDRG = 0x00;             //INPUT

 PORTA = 0xFF;            //上拉电阻
 PORTB = 0xFF;
 PORTC = 0xFF;
 PORTD = 0xFF;
 PORTE = 0xFF;
 PORTF = 0xFF;
 PORTG = 0xFF;

// DDRG |= BIT(RUN);           //RUN
// DDRB |= BIT(LED_WXCHCY); 
// DDRG |= BIT(LED_GPS);
}     

/**************************************************************/
//===========================================================//
void main(viod)
{
    init_uart0();
//    init_uart1();
//    init_timer0();
    init_port();
    MCUCR=0x00;
  TIMSK=0x00;
  TIMSK |= BIT(TOIE0);
//    SEI();
    UDR0=Buf0[count];    
    while(1)
    {;
    }
}  

相关帖子

沙发
xloop|  楼主 | 2008-3-21 17:26 | 只看该作者

错误提示:Code address 0x25 already contains a value

使用特权

评论回复
板凳
xloop|  楼主 | 2008-3-21 17:30 | 只看该作者

这个文件编辑没有通过

使用特权

评论回复
地板
xloop|  楼主 | 2008-3-21 17:47 | 只看该作者

发表一下意见哦

使用特权

评论回复
5
hxh_8555| | 2008-4-9 08:59 | 只看该作者

1

应该是没有选择目标MCU吧,project-->option-->target,选ATMega64就可以了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
luling5897 + 1
6
ldyeah| | 2008-4-17 12:16 | 只看该作者

恩,同意楼上

我以前遇到过
就是MCU型号没有选择

使用特权

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

本版积分规则

27

主题

61

帖子

0

粉丝