سلام
ممکنه اساتید من رو راهنمایی کنند. هیچ دیتایی از DS1307 نمی گیرم :cry2:
پین های ارتباطی رو هم با 10 کیلو به 3.3 ولت وصل کردم، به 5 ولت هم وصل کردم فرقی نکرد.
اینم کل برنامه
ممکنه اساتید من رو راهنمایی کنند. هیچ دیتایی از DS1307 نمی گیرم :cry2:
پین های ارتباطی رو هم با 10 کیلو به 3.3 ولت وصل کردم، به 5 ولت هم وصل کردم فرقی نکرد.
اینم کل برنامه
کد:
/*****************************************************
Chip type : ATxmega32A4
Program type : Application
AVR Core Clock frequency: 32.000000 MHz
Memory model : Small
Data Stack size : 1024
*****************************************************/
#include <io.h>
#include <twix.h>
#include <alcd.h>
#include <delay.h>
#include <bcd.h>
#include <stdio.h>
#define byte unsigned char
// Declare your global variables here
struct {
byte sec;
byte minute;
byte hour;
byte day_week;
byte day;
byte month;
byte year;
}t_d;
// System Clocks initialization
void system_clocks_init(void)
{
unsigned char n,s;
// Optimize for speed
#pragma optsize-
// Save interrupts enabled/disabled state
s=SREG;
// Disable interrupts
#asm("cli")
// Internal 32 kHz RC oscillator initialization
// Enable the internal 32 kHz RC oscillator
OSC.CTRL|=OSC_RC32KEN_bm;
// Wait for the internal 32 kHz RC oscillator to stabilize
while ((OSC.STATUS & OSC_RC32KRDY_bm)==0);
// Internal 32 MHz RC oscillator initialization
// Enable the internal 32 MHz RC oscillator
OSC.CTRL|=OSC_RC32MEN_bm;
// System Clock prescaler A division factor: 1
// System Clock prescalers B & C division factors: B:1, C:1
// ClkPer4: 32000.000 kHz
// ClkPer2: 32000.000 kHz
// ClkPer: 32000.000 kHz
// ClkCPU: 32000.000 kHz
n=(CLK.PSCTRL & (~(CLK_PSADIV_gm | CLK_PSBCDIV1_bm | CLK_PSBCDIV0_bm))) |
CLK_PSADIV_1_gc | CLK_PSBCDIV_1_1_gc;
CCP=CCP_IOREG_gc;
CLK.PSCTRL=n;
// Internal 32 MHz RC osc. calibration reference clock source: 32.768 kHz Internal Osc.
OSC.DFLLCTRL&= ~(OSC_RC32MCREF_bm | OSC_RC2MCREF_bm);
// Enable the autocalibration of the internal 32 MHz RC oscillator
DFLLRC32M.CTRL|=DFLL_ENABLE_bm;
// Wait for the internal 32 MHz RC oscillator to stabilize
while ((OSC.STATUS & OSC_RC32MRDY_bm)==0);
// Select the system clock source: 32 MHz Internal RC Osc.
n=(CLK.CTRL & (~CLK_SCLKSEL_gm)) | CLK_SCLKSEL_RC32M_gc;
CCP=CCP_IOREG_gc;
CLK.CTRL=n;
// Disable the unused oscillators: 2 MHz, external clock/crystal oscillator, PLL
OSC.CTRL&= ~(OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm);
// Peripheral Clock output: Disabled
PORTCFG.CLKEVOUT=(PORTCFG.CLKEVOUT & (~PORTCFG_CLKOUT_gm)) | PORTCFG_CLKOUT_OFF_gc;
// Restore interrupts enabled/disabled state
SREG=s;
// Restore optimization for size if needed
#pragma optsize_default
}
TWI_MASTER_INFO_t twie_master;
void twie_init(void)
{
// General TWIE initialization
// External Driver Interface: Off
// SDA Hold: Off
twi_init(&TWIE,false,false);
// TWIE Master initialization
// Master interrupt: Low Level
// System Clock frequency: 32000000 Hz
// SCL Rate: 100000 bps
// Real SCL Rate: 100000 bps, Error: 0.0 %
twi_master_init(&twie_master,&TWIE,TWI_MASTER_INTLVL_LO_gc,
TWI_BAUD_REG(32000000,100000));
// TWIE Slave is disabled
TWIE.SLAVE.CTRLA=0;
}
// TWIE Master interrupt service routine
#pragma optsize- // optimize for speed
interrupt [TWIE_TWIM_vect] void twie_master_isr(void)
{
twi_master_int_handler(&twie_master);
}
#pragma optsize_default
void main(void)
{
unsigned char n;
#pragma optsize-
#asm("cli")
// Low level interrupt: On
// Round-robin scheduling for low level interrupt: On
// Medium level interrupt: Off
// High level interrupt: Off
// The interrupt vectors will be placed at the start of the Application FLASH section
n=(PMIC.CTRL & (~(PMIC_RREN_bm | PMIC_IVSEL_bm | PMIC_HILVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_LOLVLEN_bm))) |
PMIC_LOLVLEN_bm | PMIC_RREN_bm;
CCP=CCP_IOREG_gc;
PMIC.CTRL=n;
// Set the default priority for round-robin scheduling
PMIC.INTPRI=0x00;
// Restore optimization for size if needed
#pragma optsize_default
system_clocks_init();
twie_init();
lcd_init(20);
#asm("sei")
PORTD.DIRSET=(1<<2); // led out
lcd_putsf(" Microware\nThis is DS1307 Test");
while (1)
{
char buf[100],res;
res=twi_master_trans(&twie_master,0xd0,0,0,(byte*)&t_d,7);
sprintf(buf," %02u/%02u/%02u %02u:%02u:%02u\n%p ",bcd2bin(t_d.year),bcd2bin(t_d.month)
,bcd2bin(t_d.day),bcd2bin(t_d.hour),bcd2bin(t_d.minute),bcd2bin(t_d.sec),(res)?"ok":"error");
lcd_gotoxy(0,2);
lcd_puts(buf);
PORTD.OUTTGL=(1<<2); //led blinking
delay_ms(300);
}
}







دیدگاه