سلام.من تصمیم گرفتم برای یادگیری بهتر avr شروع به یادگیری اتمل استودیوکنم ولی الان در راه اندازی ds1307 به مشکل برخوردم.
اینم کد پروژه:
تنها چیزی که روی صفحه ی lcd می بینیم اینه:"0:0:80"
از سخت افزار مطمئنم چون برنامه ی بسکام و کدویژن به درستی روش کار می کنه.
به نظرتون مشکل از کجاست؟
با تشکر :angry: :angry:
اینم کد پروژه:
کد:
#ifndef F_CPU
#define F_CPU 8000000UL
#endif
#define SCL_CLOCK 100000
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include "lcd.h"
//
void twi_init(void);
void twi_start(void);
void twi_stop(void);
void twi_write(unsigned char data);
unsigned char twi_read_ack(void);
unsigned char twi_read_nack(void);
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec);
void DS1307_SetTime(unsigned char hh, unsigned char mm, unsigned char ss);
char bcd2dec(char num);
//
int main(void)
{
lcdInit();
twi_init();
unsigned char
h,m,s;
char buffer[16];
//DS1307_SetTime(0,0,0);
while (1)
{
rtc_get_time(&h,&m,&s);
lcdClear();
lcdGotoxy(0,0);
sprintf(buffer,"%c:%c:%c",h,m,s);
sprintf(buffer,"%02X:%02X:%02X",h,m,s);
lcdPuts(buffer);
lcdGotoxy(0,1);
lcdPuts("ali");
_delay_ms(400);
}
}
//
void twi_init(void)
{
TWSR=0x00;//100KHZ
TWBR = ((F_CPU/SCL_CLOCK)-16)/2;
TWCR=(1<<TWINT)|(1<<TWEN);
}
//
void twi_start(void)
{
TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));//till start has been transmitted
}
//
void twi_stop()
{
TWCR=(1<<TWINT)|(1<<TWEN)|(TWSTO);
}
//
void twi_write(unsigned char data)
{
TWDR=data;
TWCR=(1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
}
//
unsigned char twi_read_ack(void)
{
TWCR= (1<<TWINT)|(1<<TWEN)|(1<<TWEA);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
//
unsigned char twi_read_nack(void)
{
TWCR= (1<<TWINT)|(1<<TWEN);
while(!(TWCR & (1<<TWINT)));
return TWDR;
}
//
void rtc_get_time(unsigned char *hour,unsigned char *min,unsigned char *sec)
{
twi_start();
twi_write(0xd0);
twi_write(0);
twi_start();
twi_write(0xd1);
*sec=twi_read_ack();
*min=twi_read_ack();
*hour=twi_read_nack();
twi_stop();
}
//
char bcd2dec(char num)
{
return ((num/16 * 10) + (num % 16));
}
از سخت افزار مطمئنم چون برنامه ی بسکام و کدویژن به درستی روش کار می کنه.
به نظرتون مشکل از کجاست؟
با تشکر :angry: :angry:



دیدگاه