Witam ponownie. Mówią nie chwal dnia przed zachodem słońca...jak z jednym się uporałem to znów co innego mi mąci. Kłopot z wyborem gdzie zapisać nastawy dwukanałowego timera bo zmiennych jednocyfrowych jest łącznie 4x4 dziesiątki godzin , jednostki godzin , dziesiątki minut , jednostki minut osobno dla włącz osobno wyłącz razy dwa kanały.Ma do wyboru PCF8583 ale obawiam się że to się nie zmieści albo eeproma 24C02 co do którego też mam małe wątpliwości....druga sprawa to kłopoty w programie z lokalnymi zmiennymi [komunikatami txt] wyświetlanymi z zależności od spełnienia warunków danej funkcji...wrzucam cały kod programu który w 90% procentach chodzi.....programistów zapewne zaboli głowa...ale może poradzą jak go zoptymalizować......gwiazdki to problemy...
//#######################################
//########## A T M E G A _ 3 2 ##########
//#######################################
#include <stdint.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include "HD44780.h"
#include <avr/pgmspace.h>
//-----define przetwornik ADC
char buffer_n[16];
volatile uint16_t pomiar[6] __attribute__((section(".noinit")));
void inline SetAdcKanal(unsigned char kanal)
{
ADMUX = ((ADMUX&0xE0)+ kanal);
}
double aku,lad,sol,out,power,inpower;
//-----define progi napięciowe
float aku_min = 11.5;
float aku_max = 14.2;
float aku_stab = 14.0;
float sol_ref = 13.0;
float zas_ref = 10.0;
//-----obsługa TWI dla PCF8583 oraz 24C02
#define ACK 1
#define NOACK 0
#define eeprom ?????
#define zegar 0xA2 // A0 PCF8583 do plusa
//-----
static void TWI_start(void)
{
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
}
//-----
static void TWI_stop(void)
{
TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}
//-----
void TWI_write(unsigned char scalak,unsigned char adres_rejestru,unsigned char liczba)
{
TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
while(!(TWCR & (1 << TWINT)));
TWDR =scalak;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWDR =adres_rejestru;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWDR =liczba;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWCR =(1 << TWINT) | (1<<TWEN) | (1<<TWSTO);
}
//-----
unsigned char TWI_read(unsigned char scalak,unsigned char adres_rejestru)
{
unsigned char odczyt;
TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
while(!(TWCR & (1 << TWINT)));
TWDR =scalak;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWDR =adres_rejestru;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWCR =(1 << TWINT) | (1 << TWSTA) | ( 1 << TWEN );
while(!(TWCR & (1 << TWINT)));
TWDR =scalak | 0x01;
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
TWCR =(1 << TWINT) | (1 << TWEN);
while(!(TWCR & (1 << TWINT)));
odczyt =TWDR;
TWCR =(1 << TWINT) | (1<<TWEN) | (1<<TWSTO);
return(odczyt);
}
//-----konwersja dcd na dec
char dec_na_bcd(char num)
{
return ((num/10 * 16) + (num % 10));
}
//-----konwersja dec na bcd
char bcd_na_dec(int num)
{
return ((num/16 * 10) + (num % 16));
}
//-----define obsługa przerwań
int IRQ=0;
void INT1_init(void)
{
GICR |= (1 << INT1); //obsługa zewnętrznych przerwań
MCUCR = _BV(ISC01)|_BV(ISC11); //przez opadające zbocze na INT0 INT1
}
ISR(INT1_vect)
{
IRQ=1;
}
//-----define nastaw i wyświetlania czasu zegara
unsigned char PCF8583;
unsigned char buffer_t[16];
unsigned int rtc_bin[10]; //czas i data bierząca binarnie
unsigned int rtc_dec[10]; //czas i data bierząca dziesiętnie
unsigned int set_rtc[4]; //czas i data ustawiany dziesiętnie
unsigned int rtc_temp[4]; //data i czas po konwersji przed zapisem do PCF
//-----tablica czasów zał/wył
unsigned int kanal_1_on[4];
unsigned int kanal_2_on[4];
unsigned int kanal_3_on[4];
unsigned int kanal_4_on[4];
unsigned int kanal_1_off[4];
unsigned int kanal_2_off[4];
unsigned int kanal_3_off[4];
unsigned int kanal_4_off[4];
unsigned int kanal_tryb[4];
//-----define tablica komunikatów
unsigned char komunikat;//******* do poprawy nie wyświetlają się na LCD
unsigned char *info[5]={
(" "), //info[0]
("-----"), //info[1]- oczekiwanie
("SOLAR"), //info[2]- zasialanie z solara
("ZAS_1"), //info[3]- zasialanie z zasialcza głównego
("ZAS_2"), //info[4]- zasialanie z zasilacza rezerwowego
("AUTO "), //info[6]- tryb automatyczny sterowanie przez timer
("MANUAL"), //info[7]- tryb manual sterowanie z klawiatury
("ON "), //info[8]- status obwód załączony
("OFF"), //info[9]- status obwód wyłaczony
};
//-----define LCD menu
unsigned int ekran=0;
unsigned int menu;
//***** MAIN
int main()
{
DDRA=0xC0; //flaga PA6
PORTA=0x80; //pul-up klawisza podświetlenia LCD
DDRB=0x01; //podświetlenie LCD (reszta pinów 4 bity,RS,RW,E pod LCD)
DDRC=0xFC; //wyjścia sterujące oraz SCL SDA układu PCF8583 oraz 24C04
PORTC=0x03; //pul-up dla SCL SDA INT1 układu PCF8583 oraz 24C04
DDRD=0x00; //wejścia klawiatura oraz INT1 układu PCF8583
PORTD=0xF8; //pull-up klawiatura oraz INT1 układu PCF8583
//----- LCD init LCD_menu init
LCD_Initalize();
_delay_ms(200);
ekran=0;
//----- ADC init
ADMUX = _BV(REFS0)|_BV(REFS1)|_BV(ADLAR);
ADCSRA = _BV(ADEN)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
//----- TWI init
TWSR=0x00; //preskaler I2C
TWBR=0x48; //((F_CPU / 100000UL - 16) / 2);
INT1_init(); //inicjacja przerwań
sei();
while(1)
{
if(!(PIND & _BV(4)))
{
while(!(PIND & _BV(4)))
{
PORTB |= _BV(0); //włącza podświetlenie LCD
ekran++;
_delay_ms(600);
LCD_GoTo(0,0); LCD_WriteText(" ");
LCD_GoTo(0,1); LCD_WriteText(" ");
if(ekran>7)
{
ekran=0;
}
}
}
switch(ekran)
{
case 0: //EKRAN GLOWNY-----WYŚWIETLANIE-----DANYCH
LCD_GoTo(1,0); LCD_WriteText(dtostrf(rtc_bin[6],1,0,buffer_t)); //dziesiątki dni
LCD_GoTo(2,0); LCD_WriteText(dtostrf(rtc_bin[7],1,0,buffer_t)); //jednostki dni
LCD_GoTo(3,0); LCD_WriteText("-");
LCD_GoTo(4,0); LCD_WriteText(dtostrf(rtc_bin[8],1,0,buffer_t)); //dziesiątki miesięcy
LCD_GoTo(5,0); LCD_WriteText(dtostrf(rtc_bin[9],1,0,buffer_t)); //jednostki miesięcy
LCD_GoTo(6,0); LCD_WriteText("-");
LCD_GoTo(7,0); LCD_WriteText("10");
LCD_GoTo(11,0); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t)); //jednostki godzin
LCD_GoTo(12,0); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t)); //dziesiatki godzin
LCD_GoTo(13,0); LCD_WriteText(":"); //dwukropek
LCD_GoTo(14,0); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t)); //jednostki minut
LCD_GoTo(15,0); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t)); //dziesiatki minut
LCD_GoTo(16,0); LCD_WriteText(":"); //dwukropek
LCD_GoTo(17,0); LCD_WriteText(dtostrf(rtc_bin[4],1,0,buffer_t)); //jednostki sekund
LCD_GoTo(18,0); LCD_WriteText(dtostrf(rtc_bin[5],1,0,buffer_t)); //dziesiatki sekund
LCD_GoTo(0,1); LCD_WriteText("AKU");
LCD_GoTo(4,1); LCD_WriteText(dtostrf(aku=aku,4,1,buffer_n));
LCD_GoTo(8,1); LCD_WriteText("V"); //napięcie akumulatora
LCD_GoTo(10,1); LCD_WriteText("SOL");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(sol=sol,4,1,buffer_n));
LCD_GoTo(18,1); LCD_WriteText("V"); //napięcie solara
//*********************
LCD_GoTo(21,0); LCD_WriteText(komunikat); //status zasilania
//*********************
LCD_GoTo(20,1); LCD_WriteText(dtostrf(lad=lad,4,1,buffer_n));
LCD_GoTo(24,1); LCD_WriteText("A"); //prąd ładowania
LCD_GoTo(28,0); LCD_WriteText("AKUM");
LCD_GoTo(27,1); LCD_WriteText(dtostrf(inpower=inpower,4,1,buffer_n));
LCD_GoTo(31,1); LCD_WriteText("A"); //prąd akumulatora
LCD_GoTo(35,0); LCD_WriteText("OBCI");
LCD_GoTo(34,1); LCD_WriteText(dtostrf(out=out,4,1,buffer_n));
LCD_GoTo(38,1); LCD_WriteText("A"); //prąd obciążenia
if(!(PINA & _BV(7)))
{
_delay_ms(30);
PORTB ^=_BV(0); //podświetlenie LCD
_delay_ms(30);
}
break;//-----koniec ekran główny
case 1://-----indywidualne przełączanie trybu pracy kanałów [auto/manual]
//gdy auto włączaniem i wyłaczaniem kanałów steruje zegar
//gdy reczny można z poziomu menu sterować nimi indywidualnie
//-----ale zdrowo namieszałem i to nie chodzi *********
LCD_GoTo(0,0); LCD_WriteText("Obw.1");
if(kanal_tryb[1]=0)
{
LCD_GoTo(10,0); LCD_WriteText("reczny");
}
if(kanal_tryb[1]=1)
{
LCD_GoTo(10,0); LCD_WriteText("automat");
}//---------------------------------------
LCD_GoTo(0,1); LCD_WriteText("Obw.2");
if(kanal_tryb[2]=0)
{
LCD_GoTo(10,1); LCD_WriteText("reczny");
}
if(kanal_tryb[2]=1)
{
LCD_GoTo(10,1); LCD_WriteText("automat");
}//---------------------------------------
LCD_GoTo(20,0); LCD_WriteText("Obw.3");
if(kanal_tryb[3]=0)
{
LCD_GoTo(30,0); LCD_WriteText("reczny");
}
if(kanal_tryb[3]=1)
{
LCD_GoTo(30,0); LCD_WriteText("automat");
}//---------------------------------------
LCD_GoTo(20,1); LCD_WriteText("Obw.4");
if(kanal_tryb[3]=0)
{
LCD_GoTo(30,1); LCD_WriteText("reczny");
}
if(kanal_tryb[3]=1)
{
LCD_GoTo(30,1); LCD_WriteText("automat");
}
// LCD_WriteCommand(0x0E);//cursor no flash
// LCD_WriteCommand(0x0F);//cursor flash
break;//-----koniec indywidualne przełączanie trybu pracy kanałów
case 2://-----programowanie czasu załączenia kanał nr.1
LCD_GoTo(1,0); LCD_WriteText("KANAL nr.1 WLACZ");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(":");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t));
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(":");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//do zrobienia zapis ustawinego czasu do PCF8583 lub 24C02*********
// TWI_write
// TWI_write
_delay_ms(50);
}
break;
case 3://-----programowanie czasu wyłączenia kanał nr.1
LCD_GoTo(1,0); LCD_WriteText("KANAL nr.1 WYLACZ");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(":");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t));
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(":");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//do zrobienia zapis ustawinego czasu do PCF8583 lub 24C02*********
// TWI_write
// TWI_write
_delay_ms(50);
}
break;
case 4://-----programowanie czasu załączenia kanał nr.2
LCD_GoTo(1,0); LCD_WriteText("KANAL nr.2 WLACZ");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(":");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t));
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(":");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//do zrobienia zapis ustawinego czasu do PCF8583 lub 24C02*********
// TWI_write
// TWI_write
_delay_ms(50);
}
break;
case 5://-----programowanie czasu wyłączenia kanał nr.2
LCD_GoTo(1,0); LCD_WriteText("KANAL nr.2 WYLACZ");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(":");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t));
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(":");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//do zrobienia zapis ustawinego czasu do PCF8583 lub 24C02*********
// TWI_write
// TWI_write
_delay_ms(50);
}
break;
case 6://programowanie daty
LCD_GoTo(0,0); LCD_WriteText(" PROGRAMOWANIE DATA");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(9,1); LCD_WriteText(dtostrf(rtc_bin[6],1,0,buffer_t));
LCD_GoTo(10,1); LCD_WriteText(dtostrf(rtc_bin[7],1,0,buffer_t));
LCD_GoTo(11,1); LCD_WriteText("-");
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[8],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(dtostrf(rtc_bin[9],1,0,buffer_t));
LCD_GoTo(14,1); LCD_WriteText("-2010");
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(29,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(31,0); LCD_WriteText("-");
LCD_GoTo(32,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
LCD_GoTo(34,0); LCD_WriteText("-2010");
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//zapis ustawinej daty do PCF8583
TWI_write(zegar,0x06,rtc_temp[0]);
TWI_write(zegar,0x05,rtc_temp[1]);
_delay_ms(50);
}
break;//-----koniec programowania daty
case 7://-----programowanie czasu
LCD_GoTo(0,0); LCD_WriteText(" PROGRAMOWANIE CZAS");
LCD_GoTo(1,1); LCD_WriteText("ODCZYT");
LCD_GoTo(11,1); LCD_WriteText(dtostrf(rtc_bin[0],1,0,buffer_t));
LCD_GoTo(12,1); LCD_WriteText(dtostrf(rtc_bin[1],1,0,buffer_t));
LCD_GoTo(13,1); LCD_WriteText(":");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(rtc_bin[2],1,0,buffer_t));
LCD_GoTo(15,1); LCD_WriteText(dtostrf(rtc_bin[3],1,0,buffer_t));
LCD_GoTo(16,1); LCD_WriteText(":");
LCD_GoTo(17,1); LCD_WriteText(dtostrf(rtc_bin[4],1,0,buffer_t));
LCD_GoTo(18,1); LCD_WriteText(dtostrf(rtc_bin[5],1,0,buffer_t));
if(!(PIND & _BV(5)))
{
if(++set_rtc[0] >= 24)
{
set_rtc[0]++;
set_rtc[0] = 0;
}
}
if(!(PIND & _BV(6)))
{
if(++set_rtc[1] >= 60)
{
set_rtc[1]++;
set_rtc[1] = 0;
}
}
LCD_GoTo(21,0); LCD_WriteText("USTAW");
LCD_GoTo(31,0); LCD_WriteText(dtostrf(set_rtc[0],2,0,buffer_n));
LCD_GoTo(33,0); LCD_WriteText(":");
LCD_GoTo(34,0); LCD_WriteText(dtostrf(set_rtc[1],2,0,buffer_n));
LCD_GoTo(36,0); LCD_WriteText(":00");
rtc_temp[0]= dec_na_bcd(set_rtc[0]);
rtc_temp[1]= dec_na_bcd(set_rtc[1]);
if(!(PIND & _BV(7)))
{//zapis ustawinego czasu do PCF8583
TWI_write(zegar,0x04,rtc_temp[0]);
TWI_write(zegar,0x03,rtc_temp[1]);
TWI_write(zegar,0x02,0x00);
_delay_ms(50);
}
break;
}
if(!(PIND & _BV(7)))
{
_delay_ms(10);
while(!(PIND & _BV(7)))
{
LCD_GoTo(0,0); LCD_WriteText(" ");
LCD_GoTo(0,1); LCD_WriteText(" ");
LCD_GoTo(0,0); LCD_WriteText(" ZAPISUJE DANE ");
_delay_ms(1500);
ekran=0;
LCD_GoTo(0,0); LCD_WriteText(" ");
}
}
//---------------------------------------pomiary napięć i prądów
int kan;
for(kan = 0; kan<5; kan++)
{
SetAdcKanal(kan);
ADCSRA |= (1 << ADSC);
while(ADCSRA & (1 << ADSC));
pomiar[kan] = (ADC | ADCH<<8);
aku = (pomiar[0]/2.54)/1024; //napięcie akumulatora
lad = (pomiar[1]/2.54)/1024; //prąd akumulatora
sol = (pomiar[2]/2.54)/1024; //napięcie ogniwa słonecznego
out = (pomiar[3]/2.54)/1024; //prąd obciążenia [obwody 12V]
power = (pomiar[4]/2.54)/1024; //monitorowanie zasialacza głównego
_delay_ms(40);
{
inpower =(lad-out); //prąd wejściowy
//---------------------------------------monitorowanie napięć
unsigned char bbb=10;
for(bbb=10; bbb<15; bbb++)
{
switch(bbb)
{
case 10://-------------------------zasilacz główny
if(power > zas_ref)
{
if((aku < aku_min)&&(sol < sol_ref))
{
PORTC &=~ 0x04; //enable kanal 1
PORTC |= 0x08; //disable kanal 2
komunikat=info[3]; //text zas-1
}
}
break;
case 11:
if(power > zas_ref)
{
if((aku > aku_max)||(sol > sol_ref))
{
PORTC |= 0x04; //disable kanal 1
PORTC |= 0x08; //disable kanal 2
}
}
break;
case 12://------------------------zasilacz rezerwowy
if(power < zas_ref)
{
if((aku < aku_min)&&(sol < sol_ref))
{
PORTC |= 0x04; //disable kanal 1
PORTC &=~ 0x08; //enable kanal 2
komunikat=info[4]; //text zas-2
}
}
break;
case 13:
if(power < zas_ref)
{
if((aku > aku_max)&&(sol > sol_ref))
{
PORTC |= 0x08; //disable kanal 2
PORTC |= 0x04; //disable kanal 1
}
}
break;
case 14://------------------------status zasilania
if (sol > sol_ref)
{
komunikat=info[2]; //text solar
}
if((aku > aku_stab)&&(sol < sol_ref))
{
komunikat=info[1]; //text -----
}
break;
default:
break;//--------------------------koniec pomiarów i monitorowania napięc
}
}
}
if(IRQ==1)//------------------------odczyt czasu oraz daty
{
PCF8583=TWI_read(zegar,0x04); //dziesiatki i jednostki godzin
rtc_bin[0]=(PCF8583 & 0x30)>>4;
rtc_bin[1]=PCF8583 & 0x0F;
PCF8583=TWI_read(zegar,0x03); //dziesiatki i jednostki minut
rtc_bin[2]=PCF8583 >> 4;
rtc_bin[3]=PCF8583 & 0x0F;
PCF8583=TWI_read(zegar,0x02); //dziesiatki i jednostki sekund
rtc_bin[4]=PCF8583 >> 4;
rtc_bin[5]=PCF8583 & 0x0F;
PCF8583=TWI_read(zegar,0x05); //dziesiatki i jednostki dni
rtc_bin[6]=PCF8583 >> 4;
rtc_bin[7]=PCF8583 & 0x0F;
PCF8583=TWI_read(zegar,0x06); //dziesiatki i jednostki miesięcy
rtc_bin[8]=PCF8583 >> 4;
rtc_bin[9]=PCF8583 & 0x0F;
IRQ==0;
}//---------------------------------koniec odczytu czasu oraz daty
unsigned char ccc=21;
for(ccc=21; ccc<25; ccc++)
{
switch(ccc)//----------porównanie czasu zegara z nastawami timera
{
case 21://sprawdzanie czy kanał 1 włączyć lub wyłączyć
if(kanal_tryb[1]=1)//jeżeli automatyczny to sprawdz nastawy
{
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_1_on[0])&&(kanal_1_on[1])))
{
if(((rtc_dec[3])&&(rtc_dec[4]))==((kanal_1_on[3])&&(kanal_1_on[4])))
{
PORTC |=0x10;
}
}
}
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_1_off[0])&&(kanal_1_off[1])))
{
if(((rtc_dec[3])&&(rtc_dec[4]))==((kanal_1_off[3])&&(kanal_1_off[4])))
{
PORTC &=~0x10;
}
}
case 22://sprawdzanie czy kanał 2 włączyć lub wyłączyć
if(kanal_tryb[1]=1)
{
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_2_on[0])&&(kanal_2_on[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_2_on[2])&&(kanal_2_on[3])))
{
PORTC |=0x20;
}
}
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_2_off[0])&&(kanal_2_off[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_2_off[2])&&(kanal_2_off[3])))
{
PORTC &=~0x20;
}
}
}
case 23://sprawdzanie czy kanał 3 włączyć lub wyłączyć
if(kanal_tryb[1]=1)
{
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_3_on[0])&&(kanal_3_on[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_3_on[2])&&(kanal_3_on[3])))
{
PORTC |=0x40;
}
}
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_3_off[0])&&(kanal_3_off[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_3_off[2])&&(kanal_3_off[3])))
{
PORTC &=~0x40;
}
}
}
case 24://sprawdzanie czy kanał 4 włączyć lub wyłączyć
if(kanal_tryb[1]=1)
{
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_4_on[0])&&(kanal_4_on[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_4_on[2])&&(kanal_4_on[3])))
{
PORTC |=0x80;
}
}
if(((rtc_dec[0])&&(rtc_dec[1]))==((kanal_4_off[0])&&(kanal_4_off[1])))
{
if(((rtc_dec[2])&&(rtc_dec[3]))==((kanal_4_off[2])&&(kanal_4_off[3])))
{
PORTC &=~0x80;
}
}
}
default:
break;
}
}
}
}
return;
}
//********** END MAIN **********
