打印
[AVR单片机]

大家帮忙看看AVR编写的24C02程序的错误,谢谢

[复制链接]
2520|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
qustklw|  楼主 | 2008-5-14 20:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//ICC-AVR application builder : 2008-5-13 16:24:58
// Target : M8515
// Crystal: 4.0000Mhz

#include <iom8515v.h>
#include <macros.h>

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x03;
 PORTB = 0x00;
 DDRB  = 0x70;
 PORTC = 0x00;
 DDRC  = 0x70;
 PORTD = 0xff;
 DDRD  = 0x00; 
 PORTE = 0x00;
 DDRE  = 0x00; 
}


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

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


#define uchar unsigned char 
#define uint unsigned int

#define led_str_off PORTC&=~(1<<PC6)
#define led_clk_off PORTC&=~(1<<PC5)
#define led_d_off PORTC&=~(1<<PC4)
#define led_str_on PORTC|=(1<<PC6)
#define led_clk_on PORTC|=(1<<PC5)
#define led_d_on PORTC|=(1<<PC4)

#define    OP_READ    0xa1        // 器件地址以及读取操作
#define    OP_WRITE 0xa0        // 器件地址以及写入操作
#define    MAX_ADDR 0x7f        // AT24C02最大地址

unsigned char dis_code[] = {0x81,0xB7,0xC2,0x92,0xB4,0x98,0x88,0xB3,0x80,0x90};
unsigned char a[]={90,11,12,13,14,15,22,7,8,9};
uchar led_buffer[4]={0,3};                

#define SDA  PA1
#define SCL  PA0

#define SDA_on    PORTA|=(1<<SDA)
#define SDA_off  PORTA&=~(1<<SDA)
#define SCL_on    PORTA|=(1<<SCL)
#define SCL_off  PORTA&=~(1<<SCL)

//void start();
//void stop();
//unsigned char shin();
//unsigned char shout(unsigned char write_data);
unsigned char read_random(unsigned char random_addr);
void write_byte( unsigned char addr, unsigned char write_data);
void fill_byte(unsigned char fill_data);
void delayms(unsigned char ms);
void update_display_dp(void);
void jisuan(uchar b_data );

unsigned char ndatatodisplay,gewei,shiwei;


main(void)
{   
    uchar i;
    port_init();   
    SDA_on;
    SCL_on;
    fill_byte(0xff);        // 全部填充0xff
 
    for(i = 0 ; i < 10; i++)        //写入显示代码到AT24Cxx
    {
     write_byte(i, a);
    }
    init_devices();
    while(1);
}

#pragma interrupt_handler int0_isr:2
void int0_isr(void) 
{   
   uchar i;
   jisuan((read_random(i)));
   ndatatodisplay =( shiwei*10+gewei);    // 循环读取24Cxx内容,并输出到P0口
   i++;
   if(i>9)i=0;        // 循环读取范围为0x00~0x07
   delayms(250);
   update_display_dp();
  }
void _nop_()
{
 }
void update_display_dp(void)
{
     uchar bit_count=0;
     uchar byte_counter=0;
     uchar temp_i=0;
     led_buffer[3]=ndatatodisplay/1000;
     led_buffer[2]=(ndatatodisplay%1000)/100;
     led_buffer[1]=(ndatatodisplay%100)/10;
     led_buffer[0]=ndatatodisplay%10;
     led_str_off;
     led_clk_off;
     for(byte_counter=0;byte_counter<4;byte_counter++)
       {
          bit_count=8;
           temp_i=dis_code[led_buffer][byte_counter]];

           while(bit_count>0)
              {
              if((temp_i&0x01)==0)
                 {
                    led_d_off;
                  }
                else
                    {
                   led_d_on;
                       }
        temp_i=(temp_i>>1);
        
    
        led_clk_on;
    
        led_clk_off;
    
        bit_count--;            
        
        }
    
    }

    led_str_on;
 
 
}

void jisuan(uchar b_data )
{

   uchar e,d;
   e=b_data;
   d=e;
   e=e&0x0f;
   d=d>>4;
   gewei=(e&0x01)+((e>>1)&0x01)*2+((e>>2)&0x01)*4+((e>>3)&0x01)*8;
   shiwei=(d&0x01)+((d>>1)&0x01)*2+((d>>2)&0x01)*4+((d>>3)&0x01)*8;




void start()
// 开始位
{
    SDA_on;
    SCL_on;
    _nop_();
    _nop_();
    SDA_off;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SCL_off;
}

void stop()
// 停止位
{
    SDA_off;
    _nop_();
    _nop_();
    SCL_on;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    SDA_on;
}

unsigned char shin()
// 从AT24Cxx移入数据到MCU
{
    unsigned char i,read_data;
    
    for(i = 0; i < 8; i++)
    {         
        SCL_on;
        DDRA&=0xfd;
        read_data <<= 1;
        read_data |= (PINA&0X02);
        SCL_off;
        DDRA&=0xfd;
    }
    return(read_data);
}
uchar shout(unsigned char write_data)
// 从MCU移出数据到AT24Cxx
{
    unsigned char i;
    uchar ack_bit;
    
    for(i = 0; i < 8; i++)        // 循环移入8个位
    {
        if(write_data & 0x80)
        {    
        SDA_on;
        DDRA=0XFF;
        _nop_();
        }
        else 
        {
        SDA_off;
        DDRA=0XFF;
        _nop_();
        }
        
        SCL_on;
        DDRA=0XFF;
        _nop_();
        _nop_();
        SCL_off;
        DDRA=0XFF;
        write_data <<= 1;
    }
    SDA_on;
    DDRA=0XFF;            // 读取应答
    _nop_();
    _nop_();
    SCL_on;
    DDRA=0XFF;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    ack_bit = PINA&0X02;
    SCL_off;
    DDRA=0XFF;
    return ack_bit;            // 返回AT24Cxx应答位
}

void write_byte(unsigned char addr, unsigned char write_data)
// 在指定地址addr处写入数据write_data
{
    start();
    shout(OP_WRITE);
    shout(addr);
    shout(write_data);
    stop();
    delayms(10);        // 写入周期
}

void fill_byte(unsigned char fill_data)
// 填充数据fill_data到EEPROM内
{
    unsigned char i;
    for(i = 0; i < MAX_ADDR; i++)
    {
        write_byte(i, fill_data);
    }

}

unsigned char read_current()
// 在当前地址读取
{
    unsigned char read_data;
    
    start();
    shout(OP_READ);
    
    read_data = shin();
    stop();
    return read_data;
}

unsigned char read_random(unsigned char random_addr)
// 在指定地址读取
{
    start();
    shout(OP_WRITE);
    shout(random_addr);
    return(read_current());
}

void delayms(unsigned char ms)    
// 延时子程序
{
    unsigned char i;
    while(ms--)
    {
        for(i = 0; i < 120; i++);
    }
}

相关帖子

沙发
hotpower| | 2008-5-14 20:33 | 只看该作者

不知道8515有无TWI模块???

使用特权

评论回复
板凳
dai_weis| | 2008-5-14 20:54 | 只看该作者

自带EEPROM为何还有24C02?

而且有硬件TWI,呵呵

使用特权

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

本版积分规则

1

主题

2

帖子

0

粉丝