ΠΠΈΠΊΡΠΎΡΡ
Π΅ΠΌΠ° DS1307 ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ· ΡΠ΅Π±Ρ ΡΠ°ΡΠΈΠΊΠΈ Ρ ΠΊΠ°Π»Π΅Π½Π΄Π°ΡΠ΅ΠΌ. ΠΡΡ :) ΠΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΡ
Π΅ΠΌΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· ΠΊΠ²Π°ΡΡΠ° Ρ ΡΠ°ΡΡΠΎΡΠΎΠΉ 32768 ΠΡ ΠΈ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΠΎΠ³ΠΎ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° ΠΏΠΈΡΠ°Π½ΠΈΡ. ΠΡΠ»ΠΈ Π²Π΅ΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ, Π±Π°ΡΠ°ΡΠ΅ΠΉΠΊΠΈ 48ΠΌΠΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Ρ
Π²Π°ΡΠΈΡΡ Π½Π° 10 Π»Π΅Ρ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΡ ΡΠ°ΡΠΎΠ². ΠΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΌΠ΅ΠΆΠ΄Ρ DS1307 ΠΈ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΌΠΈΡΠΎΠΌ ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ ΠΏΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΠΌΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ I2C, ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠ°ΠΊ ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π²ΡΠ΅Π³ΠΎ Π΄Π²Π΅ Π΄Π²ΡΠ½Π°ΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ Π»ΠΈΠ½ΠΈΠΈ ΡΠ²ΡΠ·ΠΈ (SDA ΠΈ SCL), ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π° ΠΎΠ΄Π½ΠΎΠΉ I2C ΡΠΈΠ½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π½Π°Ρ
ΠΎΠ΄ΠΈΡΡΡΡ Π΄ΠΎ 127 ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΡΡΡΠΎΠΉΡΡΠ². ΠΠΈΠΊΡΠΎΡΡ
Π΅ΠΌΠ° DS1307 Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Ρ
I2C Π²ΡΠ΅Π³Π΄Π° ΡΠ²Π»ΡΠ΅ΡΡΡ Π²Π΅Π΄ΠΎΠΌΠΎΠΉ (Slave), Ρ.Π΅. Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ½ΠΈΡΠΈΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠ±ΠΌΠ΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ. ΠΠ΅Π΄ΡΡΠΈΠΌ (Master) Π² Π½Π°ΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ Π±ΡΠ΄Π΅Ρ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ PIC18F4620, Ρ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ Π½Π° Π±ΠΎΡΡΡ ΠΈΠΌΠ΅Π΅ΡΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΉ I2C.
Π ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠ»Π΅Π½ΠΈΡ Π½Π°ΡΡΠΎΡΡΠ΅Π»ΡΠ½ΠΎ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π½Π° DS1307. Π ΡΠ»ΡΡΠ°Π΅ Ρ ΡΠΈΠ½ΠΎΠΉ I2C Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π²Π°ΠΆΠ½Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Ρ
Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ - ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΠΎΡΠ° ΡΠ°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ SCL (ΠΎΡ ΡΡΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½Π°Ρ ΡΠΊΠΎΡΠΎΡΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ
), ΡΠΈΠ·ΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π΄ΡΠ΅Ρ ΠΌΠΈΠΊΡΠΎΡΡ
Π΅ΠΌΡ (ΠΈΠ· 127 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ
) Π½Π° ΡΠΈΠ½Π΅ ΠΈ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΊΠ°ΡΡΠ° ΠΏΠ°ΠΌΡΡΠΈ (Π°Π΄ΡΠ΅ΡΠ° ΡΠ΅Π³ΠΈΡΡΡΠΎΠ²). Π’Π°ΠΊ ΠΊΠ°ΠΊ I2C ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠΌ, ΡΠΎ ΠΈΠΌΠ΅Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ Π²Π΅ΡΡ
Π½ΡΡ Π³ΡΠ°Π½ΠΈΡΠ° ΡΠ°ΡΡΠΎΡΡ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΠΌΠ΅Π½Π° Π·Π°Π΄Π°ΡΡΡΡ ΠΌΠ°ΡΡΠ΅ΡΠΎΠΌ ΠΈ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π»ΡΠ±ΠΎΠΉ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎΠΉ - ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅Ρ ΠΌΠΎΠΆΠ΅Ρ ΡΠΏΠΎΠΊΠΎΠΉΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΡΠ΅ Π·Π°Π΄Π°ΡΠΈ Π±Π΅Π· ΠΏΠΎΡΠ΅ΡΠΈ Π΄Π°Π½Π½ΡΡ
Π½Π° ΡΠΈΠ½Π΅. ΠΡΠΎ ΡΠ΅ΡΡΡΠ·Π½ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΡ
ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΏΠ΅ΡΠ΅Π΄Π° Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΡΠΌΠΈ.
config.h | i2c-hw.c | liquid-crystal.c | hex | picsim.js
Π Π°Π±ΠΎΡΠ° Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌ Π΄ΠΈΡΠΏΠ»Π΅Π΅ΠΌ ΠΎΠΏΠΈΡΡΠ²Π°Π»Π°ΡΡ Π² ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π΅. Π‘ΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅Π»Π°Π»ΠΈ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Ρ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌ I2C Π΄Π»Ρ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° ΠΏΠΎΠΌΠ΅ΡΠ΅Π½Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» i2c-hw.c. Π§ΡΠ΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· DS1307 ΠΏΡΠΎΠΈΡΡ
ΠΎΠ΄ΠΈΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ rtc_r. ΠΠΎ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ I2C Π²Π΅Π΄ΠΎΠΌΠΎΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ (Π²ΡΡΡΠ°Π²Π»ΡΡΡ Π² 0) Π»ΠΈΠ½ΠΈΡ SCL, ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡΡΡ ΠΎ Π½Π΅Π³ΠΎΡΠΎΠ²Π½ΠΎΡΡΠΈ ΠΊ ΠΎΠ±ΠΌΠ΅Π½Ρ Π΄Π°Π½Π½ΡΠΌΠΈ - ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ½ΠΊΡΠΈΡ i2c_idle
ΠΆΠ΄ΡΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΡΠΏΡΡΡΡΡ SCL. Π‘ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΡΠ΅ΡΠ΅Π΄Π½ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° i2c_rb
Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΉ Π°Π΄ΡΠ΅Ρ ΠΊΠ°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ DS1307 ΠΈΠ½ΠΊΡΠΈΠΌΠΈΠ½ΠΈΡΡΠ΅ΡΡΡ, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΌΠΈΠ½ΡΡΡ...Π³ΠΎΠ΄ Π±Π΅Π· ΡΠ²Π½ΠΎΠ³ΠΎ ΡΠΊΠ°Π·ΡΠ²Π°Π½ΠΈΡ ΠΈΡ
Π°Π΄ΡΠ΅ΡΠΎΠ² - Π½ΡΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΡΠ΅ΠΊΡΠ½Π΄. Π ΡΠ΅ΡΠΈ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»Π° Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΡΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° I2C, ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ
Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΉ i2c_open
, i2c_start
ΠΈ Ρ.Π΄. Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΠΏΡΠ΅Π΄Π΅Π»ΡΠ½ΠΎ ΡΡΠ½ΡΠΌ.
rtc_r.c
#include <stdint.h>
#include <stdbool.h>
#include <time.h>
#include "i2c-hw.c"
static uint8_t bcd2dec(const uint8_t bcd) {
return ((bcd / 16) * 10) + (bcd % 16);
}
// http://microchip.wikidot.com/i2c:sequential-read
void rtc_r(struct tm * const t) {
i2c_open(); // Open I2C module as master, low speed
i2c_idle(); // Ensure I2C is idle
i2c_start(false); // I2C Start condition
i2c_wb(0xD0); // DS1307 slave I2C address + I2C write flag
i2c_idle(); // Ensure I2C is idle
i2c_wb(0); // Sequential read start address
i2c_idle(); // Ensure I2C is idle
i2c_start(true); // Restart condition
i2c_wb(0xD1); // DS1307 slave I2C address + I2C read flag
i2c_idle(); // Ensure I2C is idle
t->tm_sec = bcd2dec(i2c_rb(true)); // secs, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_min = bcd2dec(i2c_rb(true)); // minutes, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_hour = bcd2dec(i2c_rb(true)); // hours, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_wday = i2c_rb(true); // Day of Week, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_mday = bcd2dec(i2c_rb(true)); // Day of Month, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_mon = bcd2dec(i2c_rb(true)); // month, I2C ACK condition
i2c_idle(); // Ensure I2C is idle
t->tm_year = bcd2dec(i2c_rb(false)); // year, I2C NACK condition (end of sequential read)
t->tm_yday = t->tm_isdst = -1; // less than zero if the information is not available
i2c_stop_and_close(); // I2C Stop condition, then close I2C module
}
main.c
/*
xc8 --chip=18f4620 main.c
*/
#define _XTAL_FREQ 25e4
#include <xc.h>
#include <stdio.h>
#include <time.h>
#include <stdint.h>
#include "config-4620.h"
#include "liquid-crystal.c"
#include "rtc_r.c"
// http://microchip.wikidot.com/faq:29
void putch(const uint8_t byte) {
lcd_dat(byte);
}
int main() {
// lcd
PORTD = TRISD = 0;
PORTE = TRISE = 0;
// i2c
TRISC3 = TRISC4 = 1;
lcd_init();
lcd_no_cursor();
lcd_no_blink();
while(1) {
const char * const daysOfWeek[7] = {
"Sun.", "Mon.", "Tues.", "Wed.", "Thurs.", "Fri.", "Sat."
};
struct tm t;
lcd_home();
rtc_r(&t);
printf("%02d:%02d:%02d %s",
t.tm_hour, t.tm_min, t.tm_sec,
t.tm_wday >= 0 && t.tm_wday < 7 ? daysOfWeek[t.tm_wday] : ":(");
lcd_set_cursor(0, 1);
printf("%02d/%02d/%02d", t.tm_mday, t.tm_mon, t.tm_year);
}
return 0;
}
Π’Π΅ΠΊΡΡΡΡ Π²ΡΠ΅ΠΌΡ ΠΈ Π΄Π°ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ ΠΆΠ΅ Π²ΡΡΡΠ°Π²Π»ΡΡΡ - Π°Π΄ΡΠ΅ΡΠ° Π²Π½ΡΡΡΠ΅Π½Π½Π΅ΠΉ ΠΊΠ°ΡΡΡ ΠΏΠ°ΠΌΡΡΠΈ DS1307 Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π½Π° ΡΡΠ΅Π½ΠΈΠ΅. ΠΡΠ»ΠΈ ΡΠΊΠΎΡΠΎΡΡΡ ΠΎΠ±ΠΌΠ΅Π½Π° Π΄Π°Π½Π½ΡΠΌΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠΎΠ±ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ, ΡΠΎ Π½ΠΈΡΡΠΎ Π½Π΅ ΠΌΠ΅ΡΠ°Π΅Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΉ I2C (ΡΠ°ΠΉΠ» i2c-hw.c) ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ (ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎ ΡΡΠΈΡΡΠ²Π°ΡΡ/Π²ΡΡΡΠ°Π²Π»ΡΡΡ Π½ΠΎΠ³ΠΈ ΠΌΠΈΠΊΡΠΎΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° SCL/SDA) - ΡΡΠΎ ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ»ΠΎΡΡ ΠΈ Π΄Π°ΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² ΡΠΈΠΌΡΠ»ΡΡΠΈΠΈ PICSim.js.
ΠΠ°Π»Π΅Π΅ ΡΠΎΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
There are comments.