Bug corrected in Soft_I2C_RTC_Read

General discussion on mikroBasic for AVR.
Post Reply
Author
Message
Tess
Posts: 49
Joined: 27 Dec 2006 18:49

Bug corrected in Soft_I2C_RTC_Read

#1 Post by Tess » 30 Dec 2006 12:24

'
'* Project name:
' Softare I2C RTC Read (PCF8583)
'* Author:
' MikroElektronika, September 2006.
' * Description:
' This program demonstrates how to use soft_i2c library.
' * Test configuration:
' MCU: ATmega16
' Dev.Board: Easy AVR 4
' Oscillator: External, 8 MHz
' Ext. Modules: Real Time Clock board
' SW: mikroBasic for AVR 4.0
' * NOTES:
' put pull-up resisteors on i2c port for communication
' bug corrected in YEAR
'

program Soft_I2C_RTC_Read
dim sec, min, hr, day, mn, year as byte
temp as string[5]
txt as string[5]
' Reads time and date information from RTC (PCF8583)
sub procedure Read_Time(dim byref sec, min, hr, day, mn, year as byte)
year = 0
Soft_I2C_Start
Soft_I2C_Write($A0)
Soft_I2C_Write(2)
Soft_I2C_Start
Soft_I2C_Write($A1)
sec = Soft_I2C_Read(1)
min = Soft_I2C_Read(1)
hr = Soft_I2C_Read(1)
day = Soft_I2C_Read(1)
mn = Soft_I2C_Read(0)
Soft_I2C_Stop()
end sub
sub procedure Transform_Time(dim byref sec, min, hr, day, mn, year as byte)
dim tmp as byte
sec = Bcd2Dec(sec)
min = Bcd2Dec(min)
hr = Bcd2Dec(hr)
year = (day and $C0) >> 6
tmp = ((day and $30) >> 4)*10
day = day and $0F + tmp
tmp = ((mn and $10) >> 4)*10
mn = (mn and $0F) + tmp
year = 8 - year '(next leap year - year)
end sub ' after 2008 replace 8 by 12
main:
Soft_I2C_Init(PORTC,4,3)
Glcd_Init(PORTD, 2, 3, 4, 5, 7, 6, PORTA)
Glcd_Set_Font(font5x7,5,8,32)
Glcd_Fill(0x00)
Glcd_Write_Text("Current time",10,0,1)
Glcd_Write_Text(": :" ,36,1,1)
Glcd_Write_Text("Current date",10,3,1)
Glcd_Write_Text("200",52,4,1)
Glcd_Write_Text(" Software I2C",10,6,1)
' Main loop
while TRUE
Read_Time(sec, min, hr, day, mn, year)
Transform_Time(sec, min, hr, day, mn, year)
select case mn
case 1 txt = "Jan"
case 2 txt = "Feb"
case 3 txt = "Mar"
case 4 txt = "Apr"
case 5 txt = "May"
case 6 txt = "Jun"
case 7 txt = "Jul"
case 8 txt = "Aug"
case 9 txt = "Sep"
case 10 txt = "Oct"
case 11 txt = "Nov"
case 12 txt = "Dec"
case else txt = "..."
end select
' Dump date and time to GLCD
Glcd_Write_Text(txt,30,4,1)
ByteToStr(sec, temp)
Glcd_Write_Text(temp, 70, 1, 1)
ByteToStr(min, temp)
Glcd_Write_Text(temp, 40, 1, 1)
ByteToStr(hr, temp)
Glcd_Write_Text(temp, 10, 1, 1)
ByteToStr(day, temp)
Glcd_Write_Text(temp, 10, 4, 1)
ByteToStr(year, temp)
Glcd_Write_Text(temp, 70, 4, 1)
Delay_ms(200)
wend
end.

User avatar
zristic
mikroElektronika team
Posts: 6608
Joined: 03 Aug 2004 12:59
Contact:

Re: Bug corrected in Soft_I2C_RTC_Read

#2 Post by zristic » 02 Jan 2007 10:17

Can you please describe what you changed here?

Tess
Posts: 49
Joined: 27 Dec 2006 18:49

#3 Post by Tess » 03 Jan 2007 12:07

Of course, the variable YEAR was bad in the procedure transform_Time.
The pcf8583 display the difference between the next leap year (2008) and the current year (2007) : 2008-2007=1
YEAR= 1


sub procedure Transform_Time(dim byref sec, min, hr, day, mn, year as byte)
dim tmp as byte
sec = Bcd2Dec(sec)
min = Bcd2Dec(min)
hr = Bcd2Dec(hr)
year = (day and $C0) >> 6
tmp = ((day and $30) >> 4)*10
day = day and $0F + tmp
tmp = ((mn and $10) >> 4)*10
mn = (mn and $0F) + tmp
year = 8 - year '(next leap year - year)
end sub ' after 2008 replace 8 by 12


Tess.

Post Reply

Return to “mikroBasic for AVR General”