aboutsummaryrefslogtreecommitdiff
path: root/forth/forth/avr/i2c-ds1307.fs
blob: 20aa069df00c380a89fef18774e5f94b1b2652db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
\ *********************************************************************
\                                                                     *
\    Filename:      i2c-ds1307.txt                                    *
\    Date:          12.05.2016                                        *
\    FF Version:    5.0                                               *
\    MCU:           Atmega                                            *
\    Copyright:     Mikael Nordman                                    *
\    Author:        Mikael Nordman                                    *
\ *********************************************************************
\    FlashForth is licensed acording to the GNU General Public License*
\ *********************************************************************

\ ********************************
\ DS1307 RTC i2c words
\ ********************************
-ds1307
marker -ds1307

\ i2c device address
$68 constant addr-ds1307

: i2c! i2c.c! drop ;

: ds1307.addr! ( c -- )  \ Set ds1307 register address
  i2c.init addr-ds1307  i2c.addr.write drop
  i2c! i2c.stop ;

: time! ( c c c c c c c  -- )
  i2c.init addr-ds1307  i2c.addr.write drop
  0 i2c! i2c! i2c! i2c! i2c! i2c! i2c! i2c!
  i2c.stop
;

: time@ ( -- c c c c c c c )
  0 ds1307.addr!
  addr-ds1307 i2c.addr.read drop
  i2c.c@.ack i2c.c@.ack i2c.c@.ack
  i2c.c@.ack i2c.c@.ack i2c.c@.ack i2c.c@.nack
  i2c.stop
;

: bin>bcd ( c -- c )
   #10 u/mod #4 lshift or
;
: set-time ( year month date day hour min sec -- )
  >r >r >r >r >r >r
  $00 swap     \ 11 = 4.096 KHz output 00 = no output
  bin>bcd      \ Year 0-99
  r> bin>bcd   \ Month
  r> bin>bcd   \ Date
  r>           \ Day 1-7
  r> bin>bcd   \ Hours
  r> bin>bcd   \ Minutes
  r> bin>bcd   \ Seconds
  time!
;

: i2c.ds1307.c@ ( addr -- c )
  ds1307.addr! addr-ds1307 i2c.addr.read drop i2c.c@.nack i2c.stop
;
: i2c.ds1307.c! ( c addr -- )
  i2c.init addr-ds1307 i2c.addr.write drop i2c! i2c! i2c.stop
;

 
: i2c.ds1307.n@ ( n addr -- )
  ds1307.addr!
  addr-ds1307  i2c.addr.read drop
  for i2c.c@.ack next 
  i2c.c@.nack i2c.stop
;