Weekdag alarm in PCF8583

O

otuzsubat

Guest
Ik wil gebruik weekdag alarm in PCF8583.Bijvoorbeeld, ik wil dat hij produceert een interrupt op elke maandag 13:30.Mijn code wordt hieronder.Kunt u mij zeggen waar is de fout?

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

void rtc_set () (
i2c_start ();
i2c_write (0xA2); / / verzenden apparaatadres
i2c_write (0x00); / / verzenden adres byte

i2c_write (0x80); / / Stop RTC tellen
/************* Schrijf werkelijke tijd ****************/
i2c_write (0x00); / / honderdste van seconde
i2c_write (0x00); / / Seconden
i2c_write (RTC [3 ]);// Notulen (in het BCD-formaat)
i2c_write (RTC [2 ]);// Uren (in BCD formaat, 24hour formaat)
i2c_write (RTC [0 ]);// Jaar / Datum (in BCD-formaat)
i2c_write (RTC [1 ]);// Weekdag / maand (in BCD-formaat)
i2c_write (0x00); / / Timer Uitschakelen
/************* Schrijf alarmtijdstip ****************/
i2c_write (0xa0); / / Alarm Flag, Interrupt,
nr. timer alarm Weekdag alarm
i2c_write (0x00); / / Alarm honderdste van seconde
i2c_write (0x00); / / Alarm Seconden
i2c_write (int2bcd (alarm.minute ));// Alarm notulen
i2c_write (int2bcd (alarm.hour ));// Alarm Uren
i2c_write (0x00); / / Alarm Datum
i2c_write ((waarde 0x01 <<(alarm.day-1 )));// Alarm Weekdag
i2c_stop ();
delay_ms (5);

i2c_start ();// start verzending
i2c_write (0x00); / / verzenden apparaatadres
i2c_write (0x00); / / Stuur adres byte
i2c_write (0x04); / / Start RTC tellen
i2c_stop ();
delay_ms (5);
)

 
Allereerst moet ik zeggen dat ik niet met behulp van PCF8583.

Maar als ik kijk naar uw code in:
i2c_start ();// start verzending); //send device address

i2c_write (0x00);
/ / verzenden apparaatadres
i2c_write (0x00); / / Stuur adres byte
i2c_write (0x04); / / Start RTC tellen
i2c_stop ();
delay_ms (5);

Ik denk dat je moet gebruiken als het apparaat 0xA2 adres als u in uw vorige commando.

hoop dat dit helpt

 
Neem een kijkje op: http://www.fernando-heitor.de/pic/projekte/pcf8583/index.htm

Geeft u volledige voorbeelden Tijd, alarm, evenementen met behulp van PCF8583.SAR

 
Cman; ik een typefout heeft gemaakt en gecorrigeerd is.

SAR; It's nice site.Maar er is geen voorbeeld van het gebruik van weekdag alarm.

Ik heb mijn probleem aan Philips.Ik hoop dat ze me helpen.Omdat er niet voldoende informatie in deze notitie.
Ook probeer
ik verschillende codes te gebruiken weekdag alarm.Als ik geslaagd, ik schrijf de code hier.

 
Voordat, ik was het invoeren van alarm en tijd waarden door keypad.To er zeker van zijn dat RTC werkt, ik schreef een eenvoudig programma.
In dit programma de eerste plaats schreef ik 23:59:55:00 maandag (Ik veronderstel dat het 000 is maandag, dinsdag 001 .. 110 zondag) aan RTC.
Vervolgens schreef ik 00:00:05:00 dinsdag als alarmtijdstip.Na, ik powered de PIC zij een interrupt.
In plaats van met behulp van externe onderbreken, kunt u ook lezen alarm vlag die de 1.beetje controle register.
Vergeet niet clearing alarm vlag na onderbreken geproduceerd en het aansluiten van een pull-up weerstand aan de interrupt output van RTC.
Want het is een open collector uitgang.
#
include <18F452.h>
#
include <string.h>
#
include <stdlib.h>
# zekeringen GS,
te beschermen, NOWDT, NOBROWNOUT, PUT, NOLVP
# gebruik vertraging (clock = 20000000)
#
use I2C (MASTER, sda = PIN_C4, SCL = PIN_C3, SLOW)
#
include <lcd.c>
short int ex_interrupt = 0;
# INT_EXT
void EXT_ISR () (
ex_interrupt = 1;
)
void main () (
byte temp = 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); / / verzenden apparaatadres
i2c_write (0x00); / / verzenden adres byte
/ / Schrijf RTC 23:59:55:00 maandag
/ / alarmtijdstip is 00:00:05:00 dinsdag
i2c_write (0x80); / / Control register, Stop tellen
i2c_write (0x00); / / hund.seconden
i2c_write (0x55); / / Seconden
i2c_write (0x59); / / notulen
i2c_write (0x23); / / Uren
i2c_write (waarde 0x01); / / Year_Date
i2c_write (waarde 0x01); / / Weekday_Month
i2c_write (0x00); / / Timer
i2c_write (0xa0); / / Alarm Control Register
i2c_write (0x00); / / Alarm hund.seconden
i2c_write (0x05); / / Alarm Seconden
i2c_write (0x00); / / Alarm notulen
i2c_write (0x00); / / Alarm Uren
i2c_write (0x00); / / Alarm Date heeft geen effect in weekdag alarm
i2c_write (0x02); / / Alarm Weekdag
i2c_stop ();
delay_ms (5);

i2c_start ();// begint het tellen opnieuw
i2c_write (0xA2); / / verzenden apparaatadres
i2c_write (0x00); / / verzenden adres byte
i2c_write (0x04);
i2c_stop ();
delay_ms (5);

/ / U kunt nieuwe waarden aan wekker alarm registers zonder stoppen tellen
i2c_start ();
i2c_write (0xA2); / / verzenden apparaatadres
i2c_write (0x08); / / verzenden adres byte
i2c_write (0xa0); / / Alarm Control Register
i2c_write (0x00); / / Alarm hund.seconden
i2c_write (0x05); / / Alarm Seconden
i2c_write (0x00); / / Alarm notulen
i2c_write (0x00); / / Alarm Uren
i2c_write (0x00); / / Alarm Date heeft geen effect in weekdag alarm
i2c_write (0x02); / / Alarm Weekdag
i2c_stop ();

lcd_init ();
lcd_gotoxy (1,1);
delay_ms (10);
enable_interrupts (INT_EXT); / / Buitenlandse onderbreken moet inschakelen na RTC is ingesteld.
while (1) (
i2c_start ();// Reading alarm vlag
i2c_write (0xA2); / / verzenden apparaatadres
i2c_write (0x00); / / verzenden RTC adres byte
i2c_start ();// opnieuw beginnen transmissie voor het lezen van gegevens
i2c_write (0xA3); / / lezing adres
temp = i2c_read (0);
i2c_stop ();
if (bit_test (temp, 1)) (
lcd_putc ( "Vlag \ n");
)
if (ex_interrupt) (
lcd_putc ( "Onderbreek \ n");
)
if (bit_test (temp, 1) | | ex_interrupt) (
harici_interrupt = 0;
lcd_putc ( "Alarm Ringing");
i2c_start ();// Na onderbreken moet u duidelijk signaal vlag
i2c_write (0xA2); / / apparaatadres
i2c_write (0x00); / / adres byte
i2c_write (0x04); / / controle registreren
i2c_stop ();
delay_ms (60000);
)
)
)

 

Welcome to EDABoard.com

Sponsor

Back
Top