Witam. Do programu zarządzania zasilaniem który już działa usiłuje dopisać obsługę PCF8583 oraz część programu który pozwoliłby wyeliminować mechaniczny dwu kanałowy zegar sterujący który o określonych godzinach włącza lub wyłącza dwa obwody 230V. Mam z tym problem bo nie posiadam dostatecznej wiedzy i jak na razie to dopisana część kodu rozwala na drobne resztę programu.Aha...menu LCD gdzie będą realizowane wszystkie nastawy zegar,kanały.sterowanie obwodami 230V jest w wersji DEMO tzn wyświetlane są tylko komunikaty tekstowe.
//#######################################
//########## A T M E G A _ 3 2 ##########
//#######################################
#include <stdint.h>
#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <twi.h>
#include "HD44780.h"
//-----define variable ADC
char buffer_n[8];
volatile uint16_t pomiar[6] __attribute__((section(".noinit")));
void inline SetAdcKanal(unsigned char kanal)
{
ADMUX = ((ADMUX&0xE0)+ kanal);
}
double aku;
double lad;
double sol;
double out;
double power;
double inpower;
//-----define threshold voltage
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;
//-----define TWI and PCF8583
unsigned char czas[4]={0,}; // zerowanie wszystkich elementów tablicy
unsigned char PCF_time=0;
unsigned char buf_t2;
unsigned char buf_t3;
unsigned char buf_t4;
unsigned char buf_t5;
//-----
//***** MAIN
int main()
{
DDRA=0xC0; //znacznik PORTA6 do wykorzystania
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_Initalize();
_delay_ms(200);
//----- ADC init
ADMUX = _BV(REFS0)|_BV(REFS1)|_BV(ADLAR);
ADCSRA = _BV(ADEN)|_BV(ADPS0)|_BV(ADPS1)|_BV(ADPS2);
//----- TWI init
TWSR =0x00; // Preskaler = 1 ->> TWPS1=0 TWPS0=0
TWBR =0x48; //((F_PU/100000Hz)-16)/2
while(1)
{
//--------------------------zegar
TWI_write(zegar,0x00,0b00000000);
{
PCF_time=TWI_read(zegar,0x04);
czas[0]=(PCF_time & 0b00110000) >> 4; // dziesatki_godzin
czas[1]=PCF_time & 0b00001111; // godziny
PCF_time=TWI_read(zegar,0x03);
czas[2]=PCF_time >> 4; // dziesatki_minut
czas[3]=PCF_time & 0b00001111; // minuty
//bez sekund
buf_t2=(czas[0]+0x30);
buf_t3=(czas[1]+0x30);
buf_t4=(czas[2]+0x30);
buf_t5=(czas[3]+0x30);
}
//--------------------------processing of the input voltages
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;//battery voltage measurement
lad = (pomiar[1]/2.54)/1024;//measurement of battery current
sol = (pomiar[2]/2.54)/1024;//measurement of voltage photovoltaic cell
out = (pomiar[3]/2.54)/1024;//measuring the output current
power = (pomiar[4]/2.54)/1024;//monitoring of mains supply
_delay_ms(40);
{
inpower =(lad-out); //calculate the input current
char *napis=" ";
char napis1="----- ";
char napis2="Solar ";
char napis3="Zas-1 ";
char napis4="Zas-2 ";
//--------------------------automatic power switch circuits
unsigned char val;
for(val=1; val<6; val++)
{
switch(val)
{
case 1://--------------------------main circuit
if(power > zas_ref) //if the voltage of the.1
{
if((aku < aku_min)&&(sol < sol_ref))
{
PORTC &=~ 0x04; //enable kanal 1
PORTC |= 0x08; //disable kanal 2
LCD_GoTo(21,0); LCD_WriteText(napis3); //text zas-1
}
}
break;
case 2:
if(power > zas_ref)
{
if((aku > aku_max)||(sol > sol_ref))
{
PORTC |= 0x04; //disable kanal 1
PORTC |= 0x08; //disable kanal 2
}
}
break;
case 3://--------------------------backup circuit
if(power < zas_ref) //if there is no voltage in the circuit.1
{
if((aku < aku_min)&&(sol < sol_ref))
{
PORTC |= 0x04; //disable kanal 1
PORTC &=~ 0x08; //enable kanal 2
LCD_GoTo(21,0); LCD_WriteText(napis4); //text zas-2
}
}
break;
case 4:
if(power < zas_ref)
{
if((aku > aku_max)&&(sol > sol_ref))
{
PORTC |= 0x08; //disable kanal 2
PORTC |= 0x04; //disable kanal 1
}
}
break;
case 5://---------------------------power status
if (sol > sol_ref)
{
LCD_GoTo(21,0); LCD_WriteText(napis2); //text solar
}
if((aku > aku_stab)&&(sol < sol_ref))
{
LCD_GoTo(21,0); LCD_WriteText(napis1); //text -----
}
break;
//--------------------------end automatic power switch circuits
default:
break;
}
//----- MENU LCD four lines of 20 characters
unsigned char key;
for(key=4; key<7; key++)
if(!(PIND & _BV(key)))
{
switch(key)//************** ta część jest w fazie projektowania
{
case 4://przełączenie do menu ustawień czasu i daty zegara
LCD_GoTo(0,0);
LCD_WriteText(" ");//czysczenie LCD
LCD_GoTo(0,1);
LCD_WriteText(" ");
while(1)
{
LCD_GoTo(0,0); LCD_WriteText("USTAW CZAS");
LCD_GoTo(10,1); LCD_WriteText("18:00");//ustaw czas
LCD_GoTo(20,0); LCD_WriteText("USTAW DATE");
LCD_GoTo(30,1); LCD_WriteText("10/10.10");//ustaw date
{
if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
{
goto exit;
}
}
}
break;
case 5://przełączenie do menu nastaw zegara sterującego
LCD_GoTo(0,0);
LCD_WriteText(" ");//czyszczenie LCD
LCD_GoTo(0,1);
LCD_WriteText(" ");
while(1)
{
LCD_GoTo(0,0); LCD_WriteText("K-1");
LCD_GoTo(6,0); LCD_WriteText("01:00");//ustaw czas k-1 wł poniedziałek-piątk
LCD_GoTo(13,0); LCD_WriteText("11:00");//ustaw czas k-1 wył
LCD_GoTo(0,1); LCD_WriteText("K-2");
LCD_GoTo(6,1); LCD_WriteText("02:00");//ustaw czas k-2 wł
LCD_GoTo(13,1); LCD_WriteText("12:00");//ustaw czas k-2 wył
LCD_GoTo(20,0); LCD_WriteText("K-3");
LCD_GoTo(26,0); LCD_WriteText("03:00");//ustaw czas k-1 wł sob,niedziela
LCD_GoTo(33,0); LCD_WriteText("13:00");//ustaw czas k-1 wył
LCD_GoTo(20,1); LCD_WriteText("K-4");
LCD_GoTo(26,1); LCD_WriteText("04:00");//ustaw czas k-2 wł
LCD_GoTo(33,1); LCD_WriteText("14:00");//ustaw czas k-2 wył
{
if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
{
goto exit;
}
}
}
break;
case 6://przełączenie do menu sterowania kanałami 1-2-3-4 (230V)
LCD_GoTo(0,0);
LCD_WriteText(" ");//czyszczenie LCD
LCD_GoTo(0,1);
LCD_WriteText(" ");
while(1)
{
LCD_GoTo(0,0); LCD_WriteText("OBW-1");
LCD_GoTo(11,1); LCD_WriteText("zalaczony"); //obwód nr1 230V
LCD_GoTo(0,1); LCD_WriteText("OBW-2");
LCD_GoTo(11,1); LCD_WriteText("zalaczony"); //obwód nr2 230V
LCD_GoTo(20,0); LCD_WriteText("OBW-3");
LCD_GoTo(31,0); LCD_WriteText("zalaczony"); //obwód nr3 230V
LCD_GoTo(20,1); LCD_WriteText("OBW-4");
LCD_GoTo(31,1); LCD_WriteText("zalaczony"); //obwód nr4 230V
if(!(PINA & _BV(7)))//jeżeli naciśnięty to wyjście z petli
{
goto exit;
}
}
break;
{}exit:
default:
LCD_GoTo(0,0);
LCD_WriteText(" ");
LCD_GoTo(0,1);
LCD_WriteText(" ");
break;
}
}
}
if(!(PINA & _BV(7)))
PORTB ^=_BV(0); //podświetlenie LCD PORTB pin 1
_delay_ms(200);
}
}
//-----------------------------
LCD_GoTo(1,0); LCD_WriteText("16/10/10"); //będzie wyświetlanie daty
LCD_GoTo(10,0); LCD_WriteText("PON"); //będzie wyświetlanie dnia tygodnia
LCD_GoTo(14,0); LCD_WriteData(buf_t2); //jednostki godzin
LCD_GoTo(15,0); LCD_WriteData(buf_t3); //dziesiatki godzin
LCD_GoTo(16,0); LCD_WriteText(":"); //dwukropek
LCD_GoTo(17,0); LCD_WriteData(buf_t4); //jednostki minut
LCD_GoTo(18,0); LCD_WriteData(buf_t5); //dziesiatki minut
LCD_GoTo(0,1); LCD_WriteText("AKU");
LCD_GoTo(4,1); LCD_WriteText(dtostrf(aku=aku,4,1,buffer_n));//napięcie akumulatora
LCD_GoTo(8,1); LCD_WriteText("V");
LCD_GoTo(10,1); LCD_WriteText("SOL");
LCD_GoTo(14,1); LCD_WriteText(dtostrf(sol=sol,4,1,buffer_n));//napięcie solara
LCD_GoTo(18,1); LCD_WriteText("V");
LCD_GoTo(20,1); LCD_WriteText(dtostrf(lad=lad,4,1,buffer_n));//prąd ładowania
LCD_GoTo(24,1); LCD_WriteText("A");
LCD_GoTo(28,0); LCD_WriteText("AKU");
LCD_GoTo(27,1); LCD_WriteText(dtostrf(inpower=inpower,4,1,buffer_n));//prąd akumulatora
LCD_GoTo(31,1); LCD_WriteText("A");
LCD_GoTo(35,0); LCD_WriteText("OBC");
LCD_GoTo(34,1); LCD_WriteText(dtostrf(out=out,4,1,buffer_n));//prąd obciążenia(obwody 12V)
LCD_GoTo(38,1); LCD_WriteText("A");
//------------------------------------
}//end while
return;
}//end main
//********** END MAIN **********