Weekday de alarmă în PCF8583

O

otuzsubat

Guest
Vreau să folosesc alarma zi în PCF8583.De exemplu, vreau ca ea produce o întrerupere la fiecare zi de luni, 13:30.Codul meu este mai jos.Aţi putea să-mi spui unde este greseala?

int2bcd int (int DEC) (
return ((dec/10) <<4) (DEC 10%);
)

rtc_set void () (
i2c_start ();
i2c_write (0xA2); / / trimite adresa de dispozitiv
i2c_write (0x00); / / trimite octet adresa de

i2c_write (0x80); / / Stop RTC de numărare
/************* Scrie timp real ****************/
i2c_write (0x00); / / sutime de secundă
i2c_write (0x00); / / Seconds
i2c_write (RTC [3 ]);// Proces-verbal (în format BCD)
i2c_write (RTC [2 ]);// ore (în format BCD, format de 24 oră)
i2c_write (RTC [0 ]);// Anul / data (în format BCD)
i2c_write (RTC [1 ]);// Weekday / lună (în format BCD)
i2c_write (0x00); / / nu fi de acord timer
Scrieti /************* ora de alarmă ****************/
i2c_write (0xA0); / / Alarmă Flag, de întrerupere, nr alarma cronometrul, alarma în timpul săptămânii
i2c_write (0x00); / / Alarmă sutime de secundă
i2c_write (0x00); / / Alarmă Seconds
i2c_write (int2bcd (alarm.minute ));// procesul-verbal de alarmă
i2c_write (int2bcd (alarm.hour ));// Ore de alarmă
i2c_write (0x00); / / Alarmă Date
i2c_write ((0x01 <<(alarm.day-1 )));// de alarmă în timpul săptămânii
i2c_stop ();
delay_ms (5);

i2c_start ();// de transmisie a începe
i2c_write (0x00); / / trimite adresa de dispozitiv
i2c_write (0x00); / / Trimite adresa de byte
i2c_write (0x04); / / Start RTC de numărare
i2c_stop ();
delay_ms (5);
)

 
În primul rând trebuie să spun că eu nu sînt folosire PCF8583.

Dar când mă uit la codul dvs.:
i2c_start ();// de transmisie a începe); //send device address

i2c_write (0x00);
/ / trimite adresa de dispozitiv
i2c_write (0x00); / / Trimite adresa de byte
i2c_write (0x04); / / Start RTC de numărare
i2c_stop ();
delay_ms (5);

Cred că ar trebui să folosiţi 0xA2 ca adresa de dispozitiv, astfel cum aţi utilizat în comanda dvs. anterioare.

Hope this ajutor

 
Arunca o privire la: http://www.fernando-heitor.de/pic/projekte/pcf8583/index.htm

Va va oferi exemple plin de evenimente Time, alarma, folosind PCF8583.RAS

 
Cman, am făcut o greşeală de dactilografiere şi corectat-o.

SAR; It's nice site.Dar nu există nici un exemplu de utilizare a zi de alarmă.

Eu am scris problema mea la Philips.Sper că ei vor să mă ajute.Pentru că nu există suficiente informaţii în foi de date.
De asemenea, Im 'trying coduri diferite de a utiliza alarma zi.Când am reuşit, i se va scrie codul de aici.

 
Înainte, am fost intrarea de alarmă şi timpul de valorile de keypad.To fi sigur că RTC este de lucru, am scris un program simplu.
În acest program în primul rând, am scris 23:59:55:00 luni (Presupun că 000 este luni, marţi 001 .. 110 duminică) la RTC.
Apoi, am scris 00:00:05:00 marţi ca timp de alarmă.După ce, am pornit PIC acesta a produs o întrerupere.
În loc de a utiliza extern întrerupă, puteţi utiliza, de asemenea, de lectură pavilion de alarmă, care este 1.bit de registru de control.
Nu uita de compensare pavilion de alarmă, după întreruperea produsă şi de a conecta un pull-up rezistor pentru a întrerupe producţia de RTC.
Pentru că, este o ieşire open collector.
# include <18F452.h>
# include <string.h>
# include <stdlib.h>
# sigurante SA, proteja, NOWDT, NOBROWNOUT, pune, NOLVP
# întârziere de utilizare (ceas = 20000000)
# USE I2C (master, sda = PIN_C4, scl = PIN_C3, lent)
# include <lcd.c>
short int ex_interrupt = 0;
# INT_EXT
EXT_ISR void () (
ex_interrupt = 1;
)
void main () (
Temperatura de octet = 0;
enable_interrupts (global);
ext_int_edge (H_TO_L);
set_tris_b (0x03);
set_tris_c (0xC0);
set_tris_d (0x08);

i2c_start ();
i2c_write (0xA2); / / trimite adresa de dispozitiv
i2c_write (0x00); / / trimite octet adresa de
/ / Scrie-RTC 23:59:55:00 luni
/ / alarma de timp este 00:00:05:00 marţi
i2c_write (0x80); / / Control Register, Stop de numărare
i2c_write (0x00); / / Hund.de secunde
i2c_write (0x55); / / Seconds
i2c_write (0x59); / / procesul-verbal
i2c_write (0x23); / / ore
i2c_write (0x01); / / Year_Date
i2c_write (0x01); / / Weekday_Month
i2c_write (0x00); / / Timer
i2c_write (0xA0); / / Alarm Control Register
i2c_write (0x00); / / Alarmă Hund.de secunde
i2c_write (0x05); / / Alarmă Seconds
i2c_write (0x00); / / procesul-verbal de alarmă
i2c_write (0x00); / / Alarmă Ore
i2c_write (0x00); / / Data de alarmă nu are nici un efect în zi de alarmă
i2c_write (0x02); / / de alarmă în timpul săptămânii
i2c_stop ();
delay_ms (5);

i2c_start ();// de numărare a începe din nou
i2c_write (0xA2); / / trimite adresa de dispozitiv
i2c_write (0x00); / / trimite octet adresa de
i2c_write (0x04);
i2c_stop ();
delay_ms (5);

/ / Aveţi posibilitatea să încărcaţi valori de alarmă noi la registrele de alarmă, fără oprire de numărare
i2c_start ();
i2c_write (0xA2); / / trimite adresa de dispozitiv
i2c_write (0x08); / / trimite octet adresa de
i2c_write (0xA0); / / Alarm Control Register
i2c_write (0x00); / / Alarmă Hund.de secunde
i2c_write (0x05); / / Alarmă Seconds
i2c_write (0x00); / / procesul-verbal de alarmă
i2c_write (0x00); / / Alarmă Ore
i2c_write (0x00); / / Data de alarmă nu are nici un efect în zi de alarmă
i2c_write (0x02); / / de alarmă în timpul săptămânii
i2c_stop ();

lcd_init ();
lcd_gotoxy (1,1);
delay_ms (10);
enable_interrupts (INT_EXT); / / extern întrerupe trebuie să se permită, după RTC este setat.
în timp ce (1) (
i2c_start ();// Reading pavilion de alarmă
i2c_write (0xA2); / / trimite adresa de dispozitiv
i2c_write (0x00); / / trimite RTC adresa de octet
i2c_start ();// începe din nou, de transmitere de date pentru citirea
i2c_write (0xA3); / / adresa de lectură
temp = i2c_read (0);
i2c_stop ();
în cazul în care bit_test ((temp, 1)) (
lcd_putc ( "Flag \ n");
)
în cazul în care (ex_interrupt) (
lcd_putc ( "Interrupt \ n");
)
în cazul în care bit_test ((temp, 1) | | ex_interrupt) (
harici_interrupt = 0;
lcd_putc ( "Alarma de apel");
i2c_start ();// După ce trebuie să vă întrerup clar pavilion de alarmă
i2c_write (0xA2); / / adresa de dispozitiv
i2c_write (0x00); / / adresa de octet
i2c_write (0x04); / / registru de control al
i2c_stop ();
delay_ms (60,000);
)
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top