搜索
bottom↓
回复: 1

急请教:关于DS1302

[复制链接]

出0入0汤圆

发表于 2010-3-15 08:45:52 | 显示全部楼层 |阅读模式
最近调试一个小板子,查到ds1302的波形都有,帮忙看一下是不是程序的问题
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
?Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2010-3-15
Author  :
Company :
Comments:


Chip type           : ATmega128
Program type        : Application
Clock frequency     : 11.059200 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 1024


DS1302 接 mega128 的 E 口

#define ds1302_clk  PORTE.2
#define ds1302_io   PORTE.3
#define ds1302_rst  PORTE.4


*****************************************************/

#include <mega128.h>

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

//DS1302端口定义
#define ds1302_clk  PORTE.2
#define ds1302_io   PORTE.3
#define ds1302_rst  PORTE.4
#define ddre3       DDRE.3





// USART0 Receiver buffer
#define RX_BUFFER_SIZE0 8
char rx_buffer0[RX_BUFFER_SIZE0];

#if RX_BUFFER_SIZE0<256
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;
#else
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;


#endif

// This flag is set on USART0 Receiver buffer overflow
bit rx_buffer_overflow0;

// USART0 Receiver interrupt service routine
interrupt [USART0_RXC] void usart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
   {
   rx_buffer0[rx_wr_index0]=data;
   if (++rx_wr_index0 == RX_BUFFER_SIZE0) rx_wr_index0=0;
   if (++rx_counter0 == RX_BUFFER_SIZE0)
      {
      rx_counter0=0;
      rx_buffer_overflow0=1;
      };
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART0 Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
#asm("cli")
--rx_counter0;
#asm("sei")
return data;
}
#pragma used-
#endif

// USART0 Transmitter buffer
#define TX_BUFFER_SIZE0 8
char tx_buffer0[TX_BUFFER_SIZE0];

#if TX_BUFFER_SIZE0<256
unsigned char tx_wr_index0,tx_rd_index0,tx_counter0;
#else
unsigned int tx_wr_index0,tx_rd_index0,tx_counter0;
#endif

// USART0 Transmitter interrupt service routine
interrupt [USART0_TXC] void usart0_tx_isr(void)
{
if (tx_counter0)
   {
   --tx_counter0;
   UDR0=tx_buffer0[tx_rd_index0];
   if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART0 Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter0 == TX_BUFFER_SIZE0);
#asm("cli")
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer0[tx_wr_index0]=c;
   if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
   ++tx_counter0;
   }
else
   UDR0=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>
#define uint unsigned int
#define uchar unsigned char
uint i,j,k;
uchar sec, min,hou,day,mon,yea,date;



// Declare your global variables here
void delay(void);
void clock_out(uchar dd);
uchar clock_in(void);
uchar read_clock(uchar ord);
void write_clock(uchar ord, uchar dd);
void ds1302_init(void);


/**************************主程序*************************************/


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Port E initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTE=0x00;
DDRE=0x00;

// Port F initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTF=0x00;
DDRF=0x0F;

// Port G initialization
// Func4=In Func3=In Func2=In Func1=In Func0=In
// State4=T State3=T State2=T State1=T State0=T
PORTG=0x00;
DDRG=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=FFh
// OC0 output: Disconnected
ASSR=0x00;
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// Timer/Counter 3 initialization
// Clock source: System Clock
// Clock value: Timer 3 Stopped
// Mode: Normal top=FFFFh
// Noise Canceler: Off
// Input Capture on Falling Edge
// OC3A output: Discon.
// OC3B output: Discon.
// OC3C output: Discon.
// Timer 3 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR3A=0x00;
TCCR3B=0x00;
TCNT3H=0x00;
TCNT3L=0x00;
ICR3H=0x00;
ICR3L=0x00;
OCR3AH=0x00;
OCR3AL=0x00;
OCR3BH=0x00;
OCR3BL=0x00;
OCR3CH=0x00;
OCR3CL=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
// INT3: Off
// INT4: Off
// INT5: Off
// INT6: Off
// INT7: Off
EICRA=0x00;
EICRB=0x00;
EIMSK=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;
ETIMSK=0x00;

// USART0 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART0 Receiver: On
// USART0 Transmitter: On
// USART0 Mode: Asynchronous
// USART0 Baud Rate: 9600
UCSR0A=0x00;
UCSR0B=0xD8;
UCSR0C=0x06;
UBRR0H=0x00;
UBRR0L=0x47;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts
#asm("sei")
ds1302_init();

while (1)
      {
      PORTF=0x0F;
      delay();
        
       yea = read_clock(0x8d); //year
       day = read_clock(0x8b); //day
       mon = read_clock(0x89); //month
       date= read_clock(0x87); //date
       hou = read_clock(0x85); //hour
       min = read_clock(0x83); //minute
       sec = read_clock(0x81); //second
         putchar(yea);
         putchar(day);
         putchar(mon);
         putchar(date);  
         putchar(hou);
         putchar(min);  
         putchar(sec);
         putchar('/n');
      PORTF=0x00;
      delay();

      };
}


/**************************子函数*************************************/               
/**********************************************************************
* 函数名: delay
* 功能描述: 延时 1 秒
************************************************************************/
void delay(void)
{
for(k=0;k<=200;k++)
{
  for(i=0;i<=100;i++)
  {
   for(j=0;j<=100;j++)
   {}
  }
}
}
/*********************DS1302程序***************************************************/

/******************************************************************************************
* 函数名称    :clock_out
* 功能描述    :
******************************************************************************************/
void clock_out(uchar dd)
{
  ddre3=1;  
  for(i=0;i<8;i++)
  {
   ds1302_io=dd&0x01;
   ds1302_clk=1;
   ds1302_clk=0;
   dd>>=1;
  }
  
}
/******************************************************************************************
* 函数名称    :clock_in
* 功能描述    :
******************************************************************************************/
uchar clock_in(void)
{
  uchar inclock=0;
  ddre3=0;
  for(i=0;i<7;i++)
  {  
    if(ds1302_io)
    inclock|=0x80;
    ds1302_clk=1;
    ds1302_clk=0;
    inclock>>=1;
   
  }
  return(inclock);
}
/******************************************************************************************
* 函数名称    :read_clock
* 功能描述    :
******************************************************************************************/
uchar read_clock(uchar ord)
{
  uchar dd=0;
  ds1302_clk=0;
  ds1302_rst=0;
  ds1302_rst=1;
  clock_out(ord);
  dd=clock_in();
  ds1302_rst=0;
  ds1302_clk=1;
  return(dd);
}
/******************************************************************************************
* 函数名称    :write_clock
* 功能描述    :
******************************************************************************************/
void write_clock(uchar ord, uchar dd)
{
    ds1302_clk=0;
    ds1302_rst=0;
    ds1302_rst=1;
    clock_out(ord);
    clock_out(dd);
    ds1302_rst=0;
    ds1302_clk=1;
}

void ds1302_init(void)
{

   write_clock(0x8e,0x00); //控制写入WP=0
   write_clock(0x90,0xa5);
   
   write_clock(0x8c,0x08);//year
   write_clock(0x8a,0x21);//day
   write_clock(0x88,0x10);//month
   write_clock(0x86,0x22);//date
   write_clock(0x84,0x15);//hour
   write_clock(0x82,0x56);//minute
   write_clock(0x80,0x00);//second
   write_clock(0x8e,0x80);


}

出0入0汤圆

 楼主| 发表于 2010-3-15 09:54:58 | 显示全部楼层
7F 7F 7F 7F 7F 7F 7F 6E
7F 7F 7F 7F 7F 7F 7F 6E
返回值是这个
但是和我写入的明显不是一致的
请有经验者帮我看一下是哪里的问题
谢谢
呵呵
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-5-2 07:41

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

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