#include <p18f4550.h>
#include "header.h"
#include <stdio.h>
#include <delays.h>				//Késleltetések
#include <stdlib.h>
#include "lcd.c"
//#include "ds1820.h"
#include "i2c.c"

#define LED LATDbits.LATD0
#define EEPROM 0xA0			//az EEPROM I2C címe, földre kötött címvonalakkal
#define BLKSIZE 64			//blokkméret: egy memórialap 16 bájtos

/** Várakozás arra, hogy az EEPROM befejezze az írást. Amíg az írás tart,
 *  addig az EEPROM nem küld nyugtázó jelet a címének kiküldésekor.
 *  A függvény blokkoló típusú, addig nem tér vissza, amíg az EEPROM foglalt.
 * \param addr a vizsgálni kívánt slave eszköz I2C címe.
 */
void MCP24LC515_wait(uint8 addr) {
  uint8 ack;
  do {
    i2c_start();
    ack = i2c_putc(addr);					//ACK bit figyelése
    i2c_stop();
  } while (ack == I2C_NAK);
}

/** Egy memórialap (64 bájt) írása a bemenő adatbufferből, az EEPROM egy
 *  megadott lapcímétől kezdődően.
 *  \param addr az EEPROM I2C címe
 *  \param memaddr a memórialap kezdőcíme, ahová írunk
 *  \param *pbuf mutató az adatbuffer kezdetéhez
 */
void MCP24LC515_write(uint8 addr,  union16 memaddr, uint8* pbuf) {
  pbuf[1] = memaddr.lo_byte;				//a lapcímet is a bufferbe tesszük
  pbuf[0] = memaddr.hi_byte;
  if (memaddr.hi_byte & 0x80) {				// ha MSB='1', beállítjuk a blokkválasztó bitet
    addr = addr | 0x08;
  }
  MCP24LC515_wait(addr);					//Várunk, ha az EEPROM elfoglalt
  i2c_writeN(addr,pbuf,BLKSIZE+2);			//Az adatbuffer kiírása (cím+adatok)
}

/** Egy memórialap (64 bájt) olvasása az EEPROM egy megadott lapcímétől kezdődően,
 *  és eltárolása az adatbufferbe.
 *  \param addr az EEPROM I2C címe
 *  \param memaddr a beolvasni kívánt memórialap kezdőcíme
 *  \param *pbuf mutató az adatbuffer kezdetéhez
 */
void MCP24LC515_read(uint8 addr,union16 memaddr,uint8* pbuf) {
  if (memaddr.hi_byte & 0x80) {				// ha MSB='1', beállítjuk a blokkválasztó bitet
    addr = addr | 0x08;
  }
  MCP24LC515_wait(addr);
  i2c_write2(addr,memaddr.hi_byte,memaddr.lo_byte);		//lapcím beállítása
  i2c_readN(addr,pbuf,BLKSIZE);				//memórialap olvasása
}


void Delay_ms(unsigned int ms);

void main(){ 
	uint8  buf[BLKSIZE+2];		//2 extra bájt kell a címnek
	union16 MemAddr,ReadAddr;
	
	TRISA = 0;
	TRISB = 0;
	TRISC = 0;
	TRISD = 0;
	TRISE = 0;
	ADCON1 = 0x0F;  //Minden port legyen digitális
	CMCON = 7;		//comparators kikapcsolva
	INTCONbits.GIE = 0;

	lcd_init();
	
	i2c_init(400);                    	//400 kHz-es I2C bitráta 
	MemAddr.word = 0;			//A memória 0 címétől kezdünk
	
	buf[3] = 0xff;		// Irunk bele adatot.
	MCP24LC515_write(EEPROM,MemAddr,buf);//Memória lap írása
    MemAddr.word += BLKSIZE;
	
	printf("I2C MEM TESZT       ");
	lcd_write(0xC0,0,1,1);   
	printf("                    ");
	lcd_write(0x94,0,1,1);
	printf("                    ");
	lcd_write(0xD4,0,1,1);
	printf("Adat                ");
	lcd_write(0x80,0,1,1);	
	
	while(1){
		LED = !LED; 
		Delay_ms(500);
	}
}
void Delay_ms(unsigned int ms){ //Bemenet*ms várakozás
   unsigned int i=0;
   for (i=0;i<=ms;i++) Delay1KTCYx(12);
}
