/* EEPROM.c*/
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdint.h>
#include <avr/pgmspace.h>
#include "bool.h"
#include "menu.h"
#include "lcd.h"
#include "EEprom.h"
static uint16_t addr;//=ALARMY_POCZ;
unsigned char temp_addr;
unsigned char ret;
extern unsigned char alarmy[10];
extern unsigned char addr_MASTER;
char bufor[3];//unsigned
bool zatwierdz;//=false;
bool koniec;
static unsigned char nr_alarm=0;
void EE_init(void);
void alarmy_dev(void);
void wykonaj_ALARM(unsigned char x,unsigned char *slave,unsigned char *urz);
void alarm_edit(uint16_t addr,unsigned char alarm);
void czysc_LCD(void);
void resetEE(void)
{
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); // start
TWDR = 0xFF;
TWCR = (1<<TWINT) | (1<<TWEN); // ??
TWCR = (1<<TWINT) | (1<<TWSTA) | (1<<TWEN);
while(!(TWCR & (1<<TWINT))); // start
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
while(TWCR & (1<<TWSTO)); // stop
}
void adresEE(uint16_t adress) // wyslij adres cz.H, cz. L
{
temp_addr=adress>>8;
twi_write(temp_addr);
temp_addr=adress&0x00FF;
twi_write(temp_addr);
}
void alarm_na_LCD(char cyfra)
{
if (cyfra<10)
for(int i=0;i<1;i++){lcd_write((unsigned char )bufor[i],1);}
else if (cyfra>=10)
for(int i=0;i<2;i++){lcd_write(bufor[i],1);}
}
/****************************************************************
Inicjacja pamieci EEPROM - wpisanie wartosci poczatkowych i adresów pamieci
****************************************************************/
void EE_init(void)
{
addr=ALARMY_POCZ; // =0x10 to poczatek 2-giej strony pamieci gdzie chcę zapisac liczby
ret=twi_start(EEPROM+TWI_WRITE); // czy wykonano START
if (ret)
{
//Bład połaczenia
return 0;}
else
{
adresEE(FLAGA_ZAP_EE); // (0x01) pod tym adresem odczytuje flagę
twi_start(EEPROM+TWI_READ);
if(twi_readNak()==1)
{ // eeprom ZAPISANY WARTOSCIAMI DOMYSNYMI
twi_stop();
// to wychodze z funkcji
}
else
{
twi_stop();
do // teraz na 13 stronach chcę zapisac wertosci domyslne.
{
twi_start(EEPROM+TWI_WRITE);
adresEE(addr); // j/w 0x0010
twi_write(nr_alarm+1); // nrumer alarmu
twi_write(0x00); // Flaga start
twi_write(0x00); // Flaga stop
twi_write(0x01); // Dot. SLAVE 1-99
twi_write(0x00); // Dot. urzadzenia: 1-3 przekaźniki 4-sygnał
twi_write(0x00); // Godz. Startu
twi_write(0x00); // Min. Startu
twi_write(0x07); // Dzień Startu
twi_write(0x00); // Godz. zatrzymania
twi_write(0x00); // Min. zatrzymaia
twi_write(0x07); // Dzień zatrzymania.
twi_stop();
_delay_ms(15); // wg. noty max 5ms. wydłzyłem do 55
nr_alarm++; //
addr+=16; // przejdz do nastepnej strony EEPROM
}while (!(addr>ALARMY_KONIEC)); // ALARMY_KONIEC to 208 (0xD0)
nr_alarm=0;
addr=0;
}//end if
}//end if ret
twi_start(EEPROM+TWI_WRITE);
adresEE(FLAGA_ZAP_EE);
twi_write(0x01);
twi_stop(); _delay_ms(5);
} // end EE-init
/****************************************************************************************
Przygotowanie danych do wysyłki przez RS485
*****************************************************************************************/
void wykonaj_ALARM(unsigned char x,unsigned char *slave,unsigned char *urz)
{
komenda_na_RS(':',*slave,addr_MASTER,1,x,*urz); // funkcja-1(wlącz/wylacz), parametr ON-wlacz,OFF wyłacz.
}//end wykonaj_ALARM */
/*******************************************************************************
EDYCJA ALARMU
*******************************************************************************/
void alarm_edit(uint16_t addr,unsigned char alarm) // ta funkcja zapisuje ale pod adresem 0x0000
{
bool zatwierdz=false;
//int ad_start;
//unsigned int x=addr;
static unsigned char f_start=0;
static unsigned char g_start=0;
static unsigned char m_start=0;
static unsigned char dey_start=7;
static unsigned char f_stop=0;
static unsigned char g_stop=0;
static unsigned char m_stop=0;
static unsigned char dey_stop=7;
static unsigned char dev=0;
static unsigned char pk=0;
itoa(alarm,bufor,10); // nr alarmu
lcd_gotoxy(7, 0);
alarm_na_LCD(alarm);
LCD_DISP_ON_CURSOR;
//do
//for(int i=0;i<3;i++)
//{
f_start=ustaw_cyfre(f_start,4,1,1,0);
_delay_ms(40);
g_start=ustaw_cyfre(g_start,7,1,23,0);
_delay_ms(40);
m_start=ustaw_cyfre( m_start, 10,1,59,0);
_delay_ms(40);
dey_start=ustaw_cyfre( dey_start, 15,1,7,0);
//}
//}while(!zatwierdz);
//do
//for(int i=0;i<3;i++)
//{
f_stop=ustaw_cyfre(f_stop,4,2,1,0);
_delay_ms(40);
g_stop=ustaw_cyfre(g_stop,7,2,23,0);
_delay_ms(40);
m_stop=ustaw_cyfre( m_stop, 10,2,59,0);
_delay_ms(40);
dey_stop=ustaw_cyfre( dey_stop, 15,2,7,0);
//}
//}while(!zatwierdz);
//do
//for(int i=0;i<2;i++)
//{
dev=ustaw_cyfre(dev,6,3,99,1);
_delay_ms(40);
pk=ustaw_cyfre(pk,12,3,4,1);
_delay_ms(40);
//}
//}while(!zatwierdz);
lcd_gotoxy(10, 0);
lcd_puts_p(PSTR("ZAPIS "));
//TU ZAPIS
twi_start(EEPROM+TWI_WRITE);
adresEE(addr+1);
//twi_write(0x00);
//twi_write(addr+1);
twi_write(f_start);
twi_write(f_stop);
twi_write(dev);
twi_write(pk);
twi_write(g_start);
twi_write(m_start);
twi_write(dey_start);
twi_write(g_stop);
twi_write(m_stop);
twi_write(dey_stop);
twi_stop();
_delay_ms(100);
lcd_command(LCD_DISP_ON);
}//end alarm_edit
/******************************************************************************
Czyść LCD
******************************************************************************/
void czysc_LCD(void)
{
lcd_gotoxy(6, 0);
write_znak(' ',3);
lcd_gotoxy(4, 1);
write_znak(' ',2);
lcd_gotoxy(7, 1);
write_znak(' ',2);
lcd_gotoxy(10, 1);
write_znak(' ',2);
lcd_gotoxy(15, 1);
write_znak(' ',1);
lcd_gotoxy(4, 2);
write_znak(' ',2);
lcd_gotoxy(7, 2);
write_znak(' ',2);
lcd_gotoxy(10, 2);
write_znak(' ',2);
lcd_gotoxy(15, 2);
write_znak(' ',1);
lcd_gotoxy(6, 3);
write_znak(' ',2);
lcd_gotoxy(11,3);
write_znak(' ',2);
}
/******************************************************************************
Ustawienie 15 czasów alarmów załacz/wyłacz
*******************************************************************************/
void alarmy_dev(void)
{
static unsigned char cyfra=0;
addr=ALARMY_POCZ;
//char buf[3];
//static unsigned char nr_alarm;
bool koniec=false;
//lcd_clrscr();
lcd_home();
lcd_gotoxy(1, 0);
lcd_puts_p(PSTR("ALARM Y-edit")); //lcd 7,0
lcd_gotoxy(0, 1);
lcd_puts_p(PSTR("STR g m dey")); // lcd 4,1, lcd 7,1, lcd 10,1 lcd 15,1
lcd_gotoxy(0, 2);
lcd_puts_p(PSTR("STP g m dey")); // lcd 4,2, lcd 7,2 lcd 10,2 lcd 15,2
lcd_gotoxy(0, 3);
lcd_puts_p(PSTR("SLAVE PK-")); // lcd 6,3 lcd 12,3
ret=twi_start(EEPROM+TWI_WRITE);
if(ret) // Bład
{ //twi_write(0x00);
//twi_write(0x00);
//twi_stop();
return 0;
}
else
{
adresEE(0);
twi_write(0);
twi_stop();
_delay_ms(5);
while(1)
{
twi_start(EEPROM+TWI_WRITE);
adresEE(addr);
//twi_write(0x00);
//twi_write(addr);
//twi_stop();
twi_start(EEPROM+TWI_READ);
cyfra=twi_readAck();
nr_alarm=cyfra;
itoa((int)cyfra,bufor,10);
lcd_gotoxy(7,0); // nr alarmu
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(4,1); // flaga start
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(4,2); //flaga stop
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(6,3); // Dev
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(12,3); // urzadzenie
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(7,1); // godzi start
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(10,1); // min. start
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(15,1); // dey start
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(7,2); // godz stop
alarm_na_LCD(cyfra);
cyfra=twi_readAck();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(10,2); //min stop
alarm_na_LCD(cyfra);
cyfra=twi_readNak();
itoa((int)cyfra,bufor,10);
lcd_gotoxy(15,2); //dey stop
alarm_na_LCD(cyfra);
cyfra=0;
twi_stop();
do
{
if(bit_is_clear(PIN(MENU_PORT),PLUS)) // pokaz nastepny
{ lcd_home();
czysc_LCD();
lcd_home();
addr+=16;
if (addr>ALARMY_KONIEC)
{ addr=ALARMY_KONIEC; continue;
}
break;
}
if(bit_is_clear(PIN(MENU_PORT),MINUS))
{ lcd_home();
czysc_LCD();
lcd_home();
addr-=16;
if (addr<ALARMY_POCZ)
{ addr=ALARMY_POCZ; continue;
}
break;
}
if(bit_is_clear(PIN(MENU_PORT),Y_MENU)) // edytuj
{ lcd_home();
czysc_LCD();
lcd_home();
alarm_edit(addr,nr_alarm); // edytuj bierzacy alarm
lcd_home();
lcd_gotoxy(10, 0);
lcd_puts_p(PSTR("Y-EDIT"));
czysc_LCD();
lcd_home();
break;
}
if(bit_is_clear(PIN(MENU_PORT),POWROT)) // koniec przegladania
{ koniec=true;
break;
}
}while(!(koniec));//end while
if (koniec)
{ lcd_clrscr();
_delay_ms(2);
break;}
}//while (!(addr==ALARMY_KONIEC));
nr_alarm=0;
addr=0;
}// end else
}//end alarmy_dev