PCF8583 Atmega128 – Mikrokontroléry – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

PCF8583 Atmega128 – Mikrokontroléry – Fórum – Programujte.comPCF8583 Atmega128 – Mikrokontroléry – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
GeorgeW0
Newbie
24. 8. 2012   #1
-
0
-

Dobrý den,

reším už několikátý den komunikaci I2C s PCF8583. Čtení a nastavení času není problém, ale jaksi jsem se zamotal do čtení dne týdne měsíce a roku. Vím, že jsou na netu k sehnání různé zdroje, jenže každy si řeší i2c komunikaci po svém. Využívám knihovnu i2c Procyon od Pascala Stanga pro komunikaci s PCF8574 bez problémů, a jaksi není knižnice pro PCF8583. Vyšel jsem tedy z z knihovny http://code.google.com/codesearch#32N_WlsRyAE/trunk/lib/lib/pcf8583/get_date.c&type=cs  a začal ji upravovat pro i2c Procyonu. Jak jsem již psal výše čas je bez problémů. Při úpravě na čtení týdne datumu roku se mi to totálně sekne. Pokud vynechám čtení roku je to bez problémů. Mam to takto:
// čtení času:
rprintf("T: %d:%d:%d", PCF8583_read_bcd(hour_register), PCF8583_read_bcd(minute_register), PCF8583_read_bcd(second_register));

  lcdGotoXY(0,1);

  x= bcd2bin(PCF8583_read(week_month_register)&0x1f);     
  y= PCF8583_read(date_register);
  daysr = bcd2bin(y&0x3f);
// potud v pořádku 

    y1=PCF8583_read(16)|((u16) PCF8583_read(17)<<8); // tu už je to podezřelé - registr 16 a 17 jsem v katalogu nenašel
 // tu mi to zacne inkrementovat roky
// if (((u08) y1&3)!=y)                                  
//   PCF8583_write_word(16,++y1);
 
// rprintf("D: %d:%d:%d", y, x, y1); // by to mělo vypsat den, měsíc a rok - pokud vynecham rok vypise mi to den a měsíc. Jakmile přečtu rok začne problikávat display a vytuhne to pochvilce.

pro někoho to snad bude maličkost, nejsem profík jen si pro svoji potřebu sem tam něco ubastlím a tu jsem momentálně v koncích snad někdo poradí díky   

 

Nahlásit jako SPAM
IP: 90.177.83.–
Reklama
Reklama
GeorgeW0
Newbie
26. 8. 2012   #2
-
0
-

   

#include "pcf8583.h"
#include "main.h"
#include "i2c.h"
#include "timer128.h"


#define PCF8583Addr  0xA0 //Adres PCF8583
#define control_register  0x00  //controle register aanspreken
#define second_register 0x02  //seconde register
#define minute_register 0x03  //minuten register
#define hour_register 0x04   //uren register
#define date_register 0x05   //datum register
#define week_month_register 0x06 //weekdag, maand register
#define clock_calendar_register 0x08 //
#define year_register 0xFF   //Jaartal register


volatile u08 PCF8583_status;
volatile u08 PCF8583_alarm;

unsigned char pcf8583data[2];
unsigned char *ptpcf8583data = &pcf8583data[0]; //Pointer naar PCF8583 data

u08 bcd2bin(u08 bcd)                    
{
#ifdef OPTIMIZE_SPEED
  return (10*(bcd>>4)|(bcd&0x0f));
#else
  u08 Temp = bcd & 0x0F; 
  while (bcd>=0x10) 
  { 
    Temp += 10; 
    bcd -= 0x10; 
  } 
  return Temp; 
#endif
}

u08 bin2bcd(u08 bin)                    
{
#ifdef OPTIMIZE_SPEED
  return (((bin/10)<<4)|(bin%10));
#else
  u08 Temp = 0; 
  while(bin>9) 
  { 
    Temp += 0x10; 
    bin-=10; 
  } 
  return Temp+bin; 
#endif
}


void PCF8583_init(void)
{
  PCF8583_status=0;
  PCF8583_alarm=0;

  	pcf8583data[0] = control_register;			// control_register 0x00
	PCF8583_write(0x01, ptpcf8583data);		
  
  	pcf8583data[0] = control_register;			// control_register 0x00
	pcf8583data[1] = PCF8583_read(4)&0x3f;		// hour_register    0x04
  	PCF8583_write(0x02, ptpcf8583data);
  
  	pcf8583data[0] = clock_calendar_register;	// clock_calendar_register 0x08
	pcf8583data[1] = 0x90; 						// 1011010
  	PCF8583_write(0x02, ptpcf8583data);

}

void PCF8583_stop(void)
{
  	pcf8583data[0] = control_register; 			// control_register 0x0
	pcf8583data[1] = 0x80; 
	PCF8583_write(0x02, ptpcf8583data);
}


void PCF8583_start(void)
{
    pcf8583data[0] = control_register;
	pcf8583data[1] = 0x00;
	PCF8583_write(0x02, ptpcf8583data);
}

void PCF8583_write(u08 lenght,unsigned char data[2])
{
	i2cMasterSend(PCF8583Addr, lenght, ptpcf8583data);
}

void PCF8583_write_bcd(u08 address,u08 data)
{
  	pcf8583data[0] = address;
	pcf8583data[1] = bin2bcd(data); 
	PCF8583_write(0x02,pcf8583data);
}


void PCF8583_write_date(u08 address,u08 day,u16 year)
{
  	pcf8583data[0] = address;
	pcf8583data[1] = bin2bcd(day)|(((u08) year&3)<<6); 
	PCF8583_write(0x02,pcf8583data);
  //  PCF8583_write(address,bin2bcd(day)|(((u08) year&3)<<6));
}

void PCF8583_write_word(u08 address,u16 data)
{
  	pcf8583data[0] = address;
	pcf8583data[1] = (u08) data&0xff; 
	PCF8583_write(0x02, pcf8583data);
	pcf8583data[0] = ++address;
	pcf8583data[1] = (u08)(data>>8); 
	PCF8583_write(0x02,pcf8583data);
 
 // PCF8583_write(address,(u08) data&0xff);
 // PCF8583_write(++address,(u08)(data>>8));
}

void PCF8583_set_time(u08 hour,u08 min,u08 sec,u08 hsec)
{
//  if (hour>23) hour=0;
//  if (min>59) min=0;
//  if (sec>59) sec=0;
//  if (hsec>100) hsec=0;
  //PCF8583_stop();
  PCF8583_write_bcd(1,hsec);
  PCF8583_write_bcd(2,sec);
  PCF8583_write_bcd(3,min);
  PCF8583_write_bcd(4,hour);
  //PCF8583_start();
}

void PCF8583_set_date(u08 day,u08 month,u16 year)
{
  PCF8583_write_word(16,year);
  PCF8583_stop();
  PCF8583_write_date(5,day,year);
  PCF8583_write_bcd(6,month);
  PCF8583_start();
}

void PCF8583_set_alarm_time(u08 hour,u08 min,u08 sec,u08 hsec)
{
  PCF8583_write_bcd(0x9,hsec);
  PCF8583_write_bcd(0xa,sec);
  PCF8583_write_bcd(0xb,min);
  PCF8583_write_bcd(0xc,hour);
}

void PCF8583_set_alarm_date(u08 day,u08 month)
{
  PCF8583_write_date(0xd,day,0);
  PCF8583_write_bcd(0xe,month);
}

u08 PCF8583_read_bcd(u08 address)
{
  return bcd2bin(PCF8583_read(address));
}

unsigned char PCF8583_read(u08 address)
{
	pcf8583data[0] = address;
	PCF8583_write(0x01, ptpcf8583data);
	timerPause(5);
	i2cMasterReceive(PCF8583Addr, 0x1, ptpcf8583data);
	return pcf8583data[0];
}

void PCF8583_hold_on(void)
{
	PCF8583_get_status();
  	PCF8583_status|=0x40;
	pcf8583data[0] = 0; 
	pcf8583data[1] = PCF8583_status;
	PCF8583_write(0x02,pcf8583data);
}

void PCF8583_hold_off(void)
{
	PCF8583_get_status();
	PCF8583_status&=0xbf;
	pcf8583data[0] = 0;
	pcf8583data[1] = PCF8583_status;
	PCF8583_write(0x02,pcf8583data);
}

void PCF8583_get_time(u08 *hour,u08 *min,u08 *sec,u08 *hsec)
{
  PCF8583_hold_on();
  *hsec=PCF8583_read_bcd(1);
  *sec=PCF8583_read_bcd(2);
  *min=PCF8583_read_bcd(3);
  *hour=PCF8583_read_bcd(4);
  PCF8583_hold_off();
}


u08 PCF8583_get_status(void)
{
	pcf8583data[0] = 0;
	PCF8583_status = PCF8583_read(0);
 	PCF8583_alarm=(PCF8583_status & 2);
  return PCF8583_status;
}

void PCF8583_get_date(u08 *day,u08 *month,u16 *year)
{
  u08 dy;
  u16 y1;
  PCF8583_hold_on();
  pcf8583data[0] = 0;	
  pcf8583data[1] = 0;	
  dy=PCF8583_read(date_register);							// date_register 0x05
  pcf8583data[0] = 0;	
  pcf8583data[1] = 0;	
  *month=bcd2bin(PCF8583_read(week_month_register)&0x1f);	// week_month_register 0x06
  PCF8583_hold_off();
  *day=bcd2bin(dy&0x3f);
  dy>>=6;
  pcf8583data[0] = 0;	
  pcf8583data[1] = 0;	
  y1=PCF8583_read(16)|((u16) PCF8583_read(17)<<8);
  if (((u08) y1&3)!=dy) 
     PCF8583_write_word(16,++y1);
  *year=y1;
}

void PCF8583_get_alarm_time(u08 *hour,u08 *min,u08 *sec,u08 *hsec)
{
  *hsec=PCF8583_read_bcd(0x9);
  *sec=PCF8583_read_bcd(0xa);
  *min=PCF8583_read_bcd(0xb);
  *hour=PCF8583_read_bcd(0xc);
}

void PCF8583_get_alarm_date(u08 *day,u08 *month)
{
  *day=bcd2bin(PCF8583_read(0xd)&0x3f);
  *month=bcd2bin(PCF8583_read(0xe)&0x1f);
}

void PCF8583_alarm_on(void)
{
  PCF8583_get_status();
 // PCF8583_status|=4;
	pcf8583data[0] = 0;
	pcf8583data[1] = PCF8583_status|=4; 	// set 00000100 
	
	PCF8583_write(0x02,pcf8583data);
}

void PCF8583_alarm_off(void)
{
  	PCF8583_get_status();
  //PCF8583_status&=0xfb;					
	pcf8583data[0] = 0;
	pcf8583data[1] = PCF8583_status&= 0x03;	// set 00000011
	PCF8583_write(0x02,pcf8583data);
}

Nahlásit jako SPAM
IP: 90.177.83.–
GeorgeW0
Newbie
26. 8. 2012   #3
-
0
-

   

#ifndef __PCF8583_H__
#define __PCF8583_H__

#include "conv.h"
#include "i2c.h"
#include "global.h"
#include "main.h"


#ifndef PCF8583_A0

#define PCF8583_A0	0
#endif // PCF8583_A0

extern volatile u08 PCF8583_status;

extern volatile u08 PCF8583_alarm;

unsigned char PCF8583_read(u08 address);

void PCF8583_write(u08 lenght, unsigned char data[2]);

unsigned char PCF8583_read_bcd(u08 address);

void PCF8583_write_bcd(u08 address,u08 data);

u08 PCF8583_get_status(void);

void PCF8583_init(void);

void PCF8583_stop(void);

void PCF8583_start(void);

void PCF8583_hold_off(void);

void PCF8583_hold_on(void);

void PCF8583_alarm_off(void);

void PCF8583_alarm_on(void);

void PCF8583_write_word(u08 address,u16 data);

void PCF8583_write_date(u08 address,u08 day,u16 year);

void PCF8583_get_time(u08 *hour,u08 *min,u08 *sec,u08 *hsec);

void PCF8583_set_time(u08 hour,u08 min,u08 sec,u08 hsec);

void PCF8583_get_date(u08 *day,u08 *month,u16 *year);

void PCF8583_set_date(u08 day,u08 month,u16 year);

void PCF8583_get_alarm_time(u08 *hour,u08 *min,u08 *sec,u08 *hsec);

void PCF8583_set_alarm_time(u08 hour,u08 min,u08 sec,u08 hsec);

void PCF8583_get_alarm_date(u08 *day,u08 *month);

void PCF8583_set_alarm_date(u08 day,u08 month);


#endif // __PCF8583_H__
Nahlásit jako SPAM
IP: 90.177.83.–
Stingi
~ Anonymní uživatel
1 příspěvek
25. 11. 2012   #4
-
0
-

Ahoj,

podarilo sa ti vyriesit citanie roku ? Ja som sa s tym tiez trapil a myslim si ze to nejde. Ked si pozries registre tak pre rok sa pouzivaju posledna dva bity spolocneho registra pre rok a datum. A v Datasheete je vo vseobecnom popise napisane ze obvod obsahuje 4 rocny kalendar. Mne sa ani nepodarilo odvodit od tych dvoch bitov inkrementaciu roku v programe tak som to vyriesli uplne inak. Toz tak...

Nahlásit jako SPAM
IP: 85.216.145.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 27 hostů

Podobná vlákna

ATmega128 ICR1 — založil GeorgeW

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý