ماژول ساعت ds3231

saalek110

Well-Known Member
ds3231_pinout.png

32k : این پایه توسط بیت EN32KHZ در رجیستر Control/Status(0Fh) تعیین وضعیت می شود . اگر بیت 1=EN32KHZ باشد سیگنال موج مربعی با فرکانس 32.768 کیلو هرتز روی این پایه تولید می شود و اگر بیت 0=EN32KHZ باشد این پایه به وضعیت High-impedance در می آید .

SQW : این پایه دو وضعیت دارد . یک وضعیت برای خروجی موج مربعی و یک وضعیت برای وقفه آلارم ها استفاده می شود . توسط بیت INTCN در رجیستر Control(0Eh) تعیین وضعیت می شود . اگر بیت INTCN=0 باشد پایه SQW به عنوان خروجی موج مربعی عمل می کند و اگر بیت INTCN=1 باشد به عنوان اینتراپت آلارم ها عمل می کند . که بصورت ACTIVE LOW می باشد یعنی حالت فعال شدن این پایه با سطح صفر است . خروجی این پایه OPEN-DRAIN است و باید توسط یک مقاومت 10 کیلو اهم ، پول آپ شود .

SCL : پایه کلاک برای ارتباط با میکروکنترلر با پروتکل I2C

SDA : پایه دیتا برای ارتباط با میکروکنترلر با پروتکل I2C

VCC : پایه تغذیه ماژول است ، ولتاژ مناسب تغذیه ماژول 3.3 ولت می باشد .

GND : پایه گراند ماژول است و باید به زمین مدار متصل شود.


 

saalek110

Well-Known Member


تراشه DS2331 آی سی تکمیل شده و پیشرفته‌تر DS1307 می‌باشد. این تراشه علاوه بر امکانات DS1307 از دقت بالاتر، با قابلیت تنظیم آلارم می‌باشد. ولتاژ کاری ماژول ۳٫۳ الی ۵٫۵ ولت بوده و از باتری بک آپ و جریان مصرفی بسیار پایین استفاده می‌کند. در واقع این ماژول ساعت زمان واقعی یا همان RTC مخفف شده real time clock می‌باشد. ساعت DS3231 از پروتکل سریال I2C پشتیبانی می‌کند. کارکرد این ماژول براساس کدهای binary coded decimal که اصطلاحا کد BCD نامیده می‌شود، است. باتری بک آپ قرار گرفته بر روی این ماژول زمانی که جریان برق در دسترس نیست باعث جلوگیری از عقب افتادن زمان خواهد شد. منبع کلاک این آی سی از یک کریستال ساعت به فرکانس ۳۲٫۷۶۸KHZ استفاده می‌کند. این آی سی قابل کارکرد در دو حالت ۲۴ ساعته و ۱۲ساعته AM/PM را دارد. همچنین علاوه بر ساعت بصورت ثانیه، دقیقه، ساعت امکان ذخیره تاریخ بصورت روز، هفته، ماه، سال را نیز دارد. در ضمن اطلاعات نوشته شده بر روی این آی سی تا سال ۲۱۰۰ برنامه ریزی شده است. از دیگر امکانات این ماژول می‌توان به اندازه‌گیری دما اشاره نمود.


 

saalek110

Well-Known Member

اتصال به میکروکنترلر atmega8 و lcd کاراکتری
با i2c کار کرده.

در عکس زیر ، طرز تعیین پورت i2c در کدویژن نشان داده شده:
Annotation-2020-02-05-141630.png

کد آن:
PHP:
#include <mega8.h>
#include <alcd.h>
#include <stdio.h>
#include <i2c.h>
#include <ds1307.h>
#include <delay.h>

#define h PINC.1
#define m PINC.2

unsigned char hour,min,sec,buffer[16];

void main(void)
  {
  //IO
  DDRC=0x00;
  //LCD
  lcd_init(16);
  #asm("sei")
  while (1)
    {
    rtc_get_time(&hour,&min,&sec);
    sprintf(buffer,"%02d:%02d:%02d",hour,min,sec);     
    lcd_gotoxy(4,0);
    lcd_puts(buffer);
    lcd_gotoxy(2,1);
    lcd_puts("Digispark.ir");
    if(h==0)
      { 
      hour++;
      if(hour>23)hour=0;
      delay_ms(250);
      rtc_set_time(hour,min,sec);
      }
    if(m==0)
      { 
      min++; 
      if(min>59)min=0;
      delay_ms(250);
      rtc_set_time(hour,min,sec); 
      }
    }
  }

ds3231-clock-with-avr-and-atmega8-digispark-810x666.png
در عکس بالا ، طرز وصل کردن نشان داده شده.


تحلیل کد توسط سایت منبع:

در ابتدای کدها کتابخانه‌های مورد نیاز را به پروژه اضافه کرده‌ایم. سپس چند متغیر برای دریافت ساعت از ماژول و نمایش آن بر روی سگمنت تعریف کرده‌ایم. داخل تابع main ابتدا تظیماتی از جمله فعال سازی بخش I2C و تایمر و معرفی پایه‌ها بعنوان ورودی و خروجی قرار دارد. سپس برنامه وارد حلقه‌ی بی نهایت شده و ابتدا ساعت را دریافت و سپس نمایش می‌دهد. در آخر دو کلید برای تنظیم ساعت و دقیقه به صورت Pull up تعریف شده است. توجه داشته باشید هنگام پروگرام کردن میکروکنترلر فیوز بیت‌ها بر روی ۸ مگاهرتز تنظیم شده باشد.

سخت افزار مورد نیاز​


 

saalek110

Well-Known Member

توضیحات این سایت هم جالبه.
 

saalek110

Well-Known Member
Screenshot_3.jpg

در عکس بالا که از سایت آخری یعنی imax است در مرحله آخر ماژول DS1307 را هم فعال کرده.


در کدویزارد lcd را هم فعال می کنیم. با همان حالت پورت هاییکه دارد.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک:من از کد سایت آخری یعنی imax co استفاده کردم یعنی این کد:
PHP:
rtc_get_time(&h,&m,&s);
lcd_clear();
lcd_gotoxy(0,0);
sprintf(buffer,"%d:%d:%d" ,h,m,s);
lcd_puts(buffer);
delay_ms(20);

سایت آخری در این خط اشکال دارد:
JavaScript:
sprintf(buffer,"%d:%d:%d" ,h,m,s);

اون دابل کوتیشن اولی را سایت مذکور یادش رفته بزاره.

همچنین متغیر بافر را تعریف نکرده بود ...من این جوری تعریف کردم:قبل main گذاشتم فعلا، بقیه متغیرها داخل main هستند ، علت خاصی نداره ، کمی به هم ریخته شد کدهایم...چون از دو سایت مختلف استفاده کردم.
PHP:
unsigned char buffer[16];

عکس زیر هم نتیجه اجرای برنامه است که ساعت مشغول کار است. البته ساعت تنظیم نیست و باید تنظیم شود.

۲۰۲۳۱۰۲۴_۲۲۲۵۵۳.jpg

این کدها هم اول تابع main است:

JavaScript:
char h=0,m=0,s=0;

i2c_init();
rtc_init(0,0,0);
lcd_init(16);

اینکلود های برنامه:

PHP:
#include <mega16a.h>
 #include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>

سالک: من بعد اینکه کدها را اینجا نقل کردم ، یک بار دیگه کامپایل کردم تا مطمئن شوم کدها درست است.


بهتره اول با یک چاپ ساده lcdخود را امتحان کنید ... بعد کدهای ساعت را جایگزین کنید.
یعنی اول کارکرد lcd خود را امتحان کنید.که کاری منطقی است. بروید تاپیک lcd و موارد را اونجا بررسی کنید.

 
آخرین ویرایش:

saalek110

Well-Known Member
می توان از منو Project بخش Configure را انتخاب کنید سپس در پنجره باز شده بخش C Compiler را انتخاب کرده و سپس بر روی بخش Libraries کلیک کنید. در این قسمت وارد بخشهای مختلف می توانید بشوید.

همون تنظیمات کدویزارد میشه.
 

saalek110

Well-Known Member
پس می توانید بروید به بخش کانفیگور و ببینید چه پایه هایی را تعیین کردید موقع کدویزارد....
من کدویزاردها را اینجا نگفتم ، به همون سایتها نگاه کنید. ...برای i2c من نگاه کردم دیدم همون پایه هایی که کدویزارد تعین کرده خوبه ولی یکی از سایتها پایه ها را عوض کرده بود که من توجهی به پایه های اون نکردم....
برای lcd هم باز همون پایه هایی که کدویزارد پیشنهاد داده بود من قبول کردم.

این دو تا کدویزارد را فکر کنم داشتیم فقط.... یکی i2c و یکی lcd
اون سایتهای ایرانی اینها را گفته ولی من دارم در این پست باز تکرار می کنم تا بفهمید قبل درج کدها چه کارهایی کردیم.

سیم های ماژول ساعت ، من از همون ۶ محل اتصال چهارتایش را استفاده کردم و دو تایش را بی استفاده رها کردم.
قبلش اون طرف ماژول لحیم کاری کردم ... ولی باز برگشتم از همون اتصالات موجود استفاده کردم.....


۲۰۲۳۱۰۲۴_۲۳۰۰۳۸.jpg

در عکس بالا در قسمت پایین من یک پین هدر لحیم کردم ولی بعدا باز ۴ تا سیم به اون قسمت بالا ، که ۶ محل اتصال داشت وطل کردم.

سعی کردم کل محیط کار را شرح بدهم. ولی ممکن است چیزهایی را من درست نگفتم که در اون سایت های ایرانی گفته اند.

من ساده ترین کد را اینجا پست کردم.... عوض کردن کد از آموزش های دیگه کار نداره...
من بعدا ممکنه کدهای دیگری را برای ساعت استفاده کنم.
 
آخرین ویرایش:

saalek110

Well-Known Member
PHP:
 // rtc_set_time(2,0,0);

سالک: با کد بالا ساعت را تنظیم کردم و بعد تنظیم به حالت کامنت درآوردم.
ساعت بالا 2 صبح است و دقیقه اش صفر است. ثانیه اش هم صفر است.
 

saalek110

Well-Known Member
PHP:
if (s>20)   
{
  lcd_gotoxy(7,1);
 lcd_puts("up");
 }

delay_ms(20);

کد بالا را قبل delay افزودم .... البته مسلما ساعت برام مهم بود ولی با ثانیه برنامه را می سازم.
منظورم اینه بعد یک ساعت یک لامپ خاموش شود.

برنامه بالا کار کرد .... یعنی بعد ثانیه 20 یک چاپ اضافه در lcd داریم.
می توانید با بررسی ساعت یک پایه میکرکنترلر را روشن کنید و به یک رله وصل کنید تا وسیله ای روشن و خاموش شود. به تاچیک های مربوطه مراجعه کنید.


در کد زیر ابتدا من خط زیر یک پایه را برای خروجی تعیین کردم....پایه شماره 4 را ببینید 1 کردم.

PHP:
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);

و سپس با کد زیر اون پایه را به نگاه به ثانیه تغییر دادم.

PHP:
if (s>20)      
{
  lcd_gotoxy(7,1);
 lcd_puts("up");
 PORTD = (0x01 << PORTD4);  
 }
 if (s<20)      
{
 PORTD = (0x00 << PORTD4);  
 }

یک led وصل بود به پایه d4 .....بین تانیه صفر تا 20 خاموش و بقیه زمانها روشن بود.
بعدا به رله وصل می کنم و به جای نگاه به ثانیه به ساعت نگاه می کنم.
 
آخرین ویرایش:

saalek110

Well-Known Member
سالک:
....بعد چند روزی.... ساعت من رسیده به ۴۶ ....
ساعت که ۶۵ نمیشه ، بعد ۲۳ باید صفر بشه...کدش را بنویسید.
مثلا این کد:
PHP:
   if(h>23)h=0;

این کد را از سایت ایرانی که در بالا لینک دادم کپی کردم ، ولی هنوز تست نکردم ببینم درست کار می کنه یا نه.
 
آخرین ویرایش:

saalek110

Well-Known Member
کل کد:

PHP:
#include <mega16a.h>
#include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>


void main(void)
{
unsigned char buffer[16];
char h=0,m=0,s=0;
i2c_init();
rtc_init(0,0,0);
lcd_init(16);



DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);


 // rtc_set_time(2,0,0);
lcd_init(16);

    while(1)
    {
 
 
 
rtc_get_time(&h,&m,&s);
lcd_clear();
       if(h>23)h=0;
sprintf(buffer,"%d:%d:%d" ,h,m,s);
lcd_puts(buffer);
 
    if (s>20)      
{
  lcd_gotoxy(7,1);
 lcd_puts("up");
 PORTD = (0x01 << PORTD4);  
 }
 if (s<20)      
{
 PORTD = (0x00 << PORTD4);  
 }
delay_ms(20);
 
 

}   //while

}   //main


سالک: من 3 تنظیم 3 عکس زیر را در کدویزارد انجام دادم و بعد کدهای بالا را در جای مناسب درج کردم و کامپایل کردم.
 

پیوست ها

  • w1.jpg
    w1.jpg
    14 کیلوبایت · بازدیدها: 0
  • w2.jpg
    w2.jpg
    24.6 کیلوبایت · بازدیدها: 0
  • w3.jpg
    w3.jpg
    17.3 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

saalek110

Well-Known Member
بعدش کل کد این شد:

PHP:
/*******************************************************
This program was created by the
CodeWizardAVR V3.12 Advanced
Automatic Program Generator
© Copyright 1998-2014 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 11/4/2023
Author  :
Company :
Comments:


Chip type               : ATmega16A
Program type            : Application
AVR Core Clock frequency: 8.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 256
*******************************************************/


// Declare your global variables here
#include <mega16a.h>
#include <i2c.h>
#include <ds1307.h>
#include <alcd.h>
#include <delay.h>
#include <stdio.h>
void main(void)
{

unsigned char buffer[16];
char h=0,m=0,s=0;
i2c_init();
rtc_init(0,0,0);
lcd_init(16);

// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRA=(0<<DDA7) | (0<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0);

// Port B initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (0<<DDB0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In
DDRC=(0<<DDC7) | (0<<DDC6) | (0<<DDC5) | (0<<DDC4) | (0<<DDC3) | (0<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<<PORTC7) | (0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=In Bit6=In Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=In Bit0=In
DDRD=(0<<DDD7) | (0<<DDD6) | (0<<DDD5) | (1<<DDD4) | (0<<DDD3) | (0<<DDD2) | (0<<DDD1) | (0<<DDD0);
// State: Bit7=T Bit6=T Bit5=T Bit4=0 Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=(0<<WGM00) | (0<<COM01) | (0<<COM00) | (0<<WGM01) | (0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer1 Stopped
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (0<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0<<AS2;
TCCR2=(0<<PWM2) | (0<<COM21) | (0<<COM20) | (0<<CTC2) | (0<<CS22) | (0<<CS21) | (0<<CS20);
TCNT2=0x00;
OCR2=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
MCUCSR=(0<<ISC2);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);
SFIOR=(0<<ACME);

// ADC initialization
// ADC disabled
ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

// Bit-Banged I2C Bus initialization
// I2C Port: PORTC
// I2C SDA bit: 1
// I2C SCL bit: 0
// Bit Rate: 100 kHz
// Note: I2C settings are specified in the
// Project|Configure|C Compiler|Libraries|I2C menu.
i2c_init();

// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTA Bit 0
// RD - PORTA Bit 1
// EN - PORTA Bit 2
// D4 - PORTA Bit 4
// D5 - PORTA Bit 5
// D6 - PORTA Bit 6
// D7 - PORTA Bit 7
// Characters/line: 16
lcd_init(16);

 // rtc_set_time(2,0,0);
lcd_init(16);


while (1)
      {
   
   
rtc_get_time(&h,&m,&s);
lcd_clear();  
       if(h>23)h=0;
sprintf(buffer,"%d:%d:%d" ,h,m,s);
lcd_puts(buffer);
   
    if (s>20)        
{
  lcd_gotoxy(7,1);
 lcd_puts("up");
 PORTD = (0x01 << PORTD4);    
 }
 if (s<20)        
{
 PORTD = (0x00 << PORTD4);    
 }
delay_ms(20);
   
   

}   //while

}   //main

که ریختم در میکروکنترلر و درست کار می کند.
 

saalek110

Well-Known Member
برای تست دفعه بعد داخل کدویزارد نرفتم..... فقط گفت میکروکنترلر من چیه و کد زیر را ساخت:
PHP:
#include <io.h>

void main(void)
{
while (1)
    {
    // Please write your application code here

    }
}

من هم کد پست قبل را جایگزین کد قبل کردم.
ولی خطا داد:
Packed library error: C:\cvavr\lib\alcd.lib(131): #error directive: Alphanumeric LCD library not set in the project configuration.

برای رفع این خطا از منوی پروجکت رفنم آخری یعنی کانفیگور و طبق عکس ضمیمه تنظیم کردم:

ww1.jpg
 
آخرین ویرایش:

saalek110

Well-Known Member
چنین خطایی داد:
Error: F:\my_test\Debug\List\a.asm(2437): Undefined symbol: __i2c_port
باز رفتم سراغ کانفیگور:.....


www.jpg

دیگه خطا نداد و کامپیال شد.
 

saalek110

Well-Known Member
کارهای بالا را انجام دادم تا رفتار کدویژن را بفهمید.
و اگر کسی خواست کد من را استفاده کنه و خطا داد بداند چطوری خطاها را رفع کند.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا