REKLAMA

proba.c

Sterownik do CO i wymiennika ciepła

Wrzucam to co mam jeśli się przyda..lcd.c bojler .c(proba.c) Dokładam zaktualizowany soft wzbogacony o alarm przy przekroczeniu temp.kotła powyżej 90 stopni oraz z opcją podgrzewania elektrycznego jeśli piec wygaśnie. wyjścia: PC3-sterowanie siłownikiem PC4-alarm PC5-grzałka Pozdrawiam.


Pobierz plik - link do postu

#include & lt; avr/io.h & gt;
#include & lt; util/delay.h & gt;
#include & lt; stdlib.h & gt;
#include & lt; avr/eeprom.h & gt;
#include & lt; avr/pgmspace.h & gt;
#include & lt; inttypes.h & gt;
#include & lt; avr/interrupt.h & gt;
#include & lt; avr/wdt.h & gt;
#include & lt; math.h & gt;


#define LCD_RS 1
#define LCD_RW 2
#define LCD_E 3
#define LCD_PORT PORTB


#define lcd_e_high() LCD_PORT |= _BV(LCD_E);
#define lcd_e_low() LCD_PORT & = ~_BV(LCD_E);
#define lcd_rw_high() LCD_PORT |= _BV(LCD_RW)
#define lcd_rw_low() LCD_PORT & = ~_BV(LCD_RW)
#define lcd_rs_high() LCD_PORT |= _BV(LCD_RS)
#define lcd_rs_low() LCD_PORT & = ~_BV(LCD_RS)

volatile char k=0;
volatile char T1UP ;



volatile unsigned char out = 1;
volatile unsigned char flag=0;
volatile unsigned char flaga=1;
volatile unsigned char flagn=1;



uint8_t saved_T1UP EEMEM = 0; // T1 zadana
uint8_t saved_T1DOWN EEMEM = 8;


//uint8_t saved_T1UP1 EEMEM = 56;
//uint8_t saved_T1DOWN1 EEMEM = 64;
//uint8_t saved_T2UP EEMEM = 16;
//uint8_t saved_T2UP1 EEMEM = 48;
//uint8_t saved_T2DOWN EEMEM = 24;
//uint8_t saved_T3UP EEMEM = 32;
//uint8_t saved_T3DOWN EEMEM = 40;

void menu(void);
int main(void);

int init_uart(void)
{
UBRRL = 51;
UCSRB = (1 & lt; & lt; TXEN)|(1 & lt; & lt; RXEN);
UCSRC = (1 & lt; & lt; URSEL)|(3 & lt; & lt; UCSZ0);
return 0;
}

int USART_Transmit(char data ) //, , FILE *stream
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1 & lt; & lt; UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
return 0;
}

int USART_Receive(void)
{
/* Wait for data to be received */
while ( !(UCSRA & (1 & lt; & lt; RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}

void WriteByteToLcd(char X)
{
lcd_e_high();
LCD_PORT |= 0xF0; // ustawienie górnej polówki portu PORT na " 1 "
LCD_PORT & = (X | 0x0F); // " bezkolizyjny " zapis 1-szej polówki bajtu (przez funkcje logiczna)
lcd_e_low(); // zapis do wyswietlacza (opadajace zbocze sygnalu E)

lcd_e_high(); // zapis 2-giej polówki bajtu
X & lt; & lt; = 4; // przesuniecie 4x w lewo
LCD_PORT |= 0xF0; // ustawienie górnej polówki portu PORT na " 1 "
LCD_PORT & = (X | 0x0F); // zapis 2-giej polówki bajtu i maskowanie 4 mlodszych bitów
lcd_e_low(); // opadajace zbocze E - zapis do LCD

_delay_ms(1);
}


// zapis bajtu do rejestru kontrolnego LCD
void WriteToLcdCtrlRegister(char X)
{
lcd_rw_low();
lcd_rs_low(); // ustawienie sygnalów sterujacych
WriteByteToLcd(X);
}

void LcdWrite(char X)
{
lcd_rs_high(); // ustawienie sygnalów sterujacych
lcd_rw_low();
lcd_e_high();
WriteByteToLcd(X);
}

// czyszczenie ekranu LCD
void LcdClrScr(void)
{
WriteToLcdCtrlRegister(0x01);
}

// inicjalizacja wyswietlacza LCD w trybie 4 bity
void LcdInitialize(void)
{
char i;
_delay_ms(15);
lcd_e_low(); // wyzerowanie linii LcdReg,LcdRead,LcdEnable
lcd_rs_low();
lcd_rw_low();

for (i=0;i & lt; 3;i++)
{
lcd_e_high(); // impuls na E
LCD_PORT & = 0x3F; // ustawienie wartosci inicjujacej
lcd_e_low();
_delay_ms(15);
}

lcd_e_high(); // wpisanie wartosci 2 do rejestru kontrolnego
LCD_PORT & = 0x2F; // tylko " górne " 4 bity
lcd_e_low();
_delay_ms(15);
WriteToLcdCtrlRegister(0x28); // interfejs 4 bity,znaki 5x7
WriteToLcdCtrlRegister(0x08); // wylaczenie LCD
WriteToLcdCtrlRegister(0x01); // kasowanie ekranu, powrót do pozycji home
WriteToLcdCtrlRegister(0x06); // przesuwanie kursora z inkrementacja
WriteToLcdCtrlRegister(0x0C); // zalaczenie wyswietlacza
}


void WriteText(char *S)
{
while (*S) // petla dziala dotad,az napotkany zostanie znak konca lancucha (/0)
{
LcdWrite(*S); // wyswietlenie pojedynczego znaku
S++;
}
}

void lcd_clr(void)
{
//WriteToLcdCtrlRegister(0x01);
WriteToLcdCtrlRegister(0x02);
}

void CustomChar(void)
{
WriteToLcdCtrlRegister(0x40);

LcdWrite(6);
LcdWrite(9);
LcdWrite(9);
LcdWrite(6);
LcdWrite(32);
LcdWrite(32);
LcdWrite(32);
LcdWrite(32);
}

void delay (int p)
{
for(int z=1;z & lt; p;z++)
{
_delay_ms(10);
}
}

void jeden(void)
{
lcd_clr();
char txt[6];
WriteText( " ZADANA T. WODY " );

while(flag==1)
{
if(bit_is_clear(PIND,1))
{
eeprom_write_byte( & saved_T1UP, T1UP);
delay(25);
flag = 0;
}

if (bit_is_clear(PIND,0))
{
T1UP++;
delay(15);
}

if (bit_is_clear(PIND,2))
{
T1UP--;
delay(15);
}

itoa(T1UP,txt,10);
WriteToLcdCtrlRegister(0xC0);
WriteText( " " );
WriteToLcdCtrlRegister(0xC0);
WriteText(txt);
delay(5);
}
}

void exito(void)
{
lcd_clr();
WriteText( " NACISNIJ 2xSET " );

while(flag==1)
{
if(bit_is_clear(PIND,1))
{
flagn = 0;
flaga = 0;
flag = 0;
out = 0;
reti();
}
}
}

void menu(void)
{
void (*twf[2][1] ) (void) = {{jeden},{exito}};

unsigned int i=0;

WriteToLcdCtrlRegister(0x01);
WriteText( " MENU " );

wdt_reset();

while(out==1)
{
WriteText( " " );
WriteToLcdCtrlRegister(0xC0);
WriteText( " " );

if(bit_is_clear(PIND,0)) // UP
{
WriteToLcdCtrlRegister(0x01);
delay(20);
if(flaga==1) i++;
}

if(bit_is_clear(PIND,1)) // SET
{
wdt_disable();
WriteToLcdCtrlRegister(0x01);
lcd_clr();
WriteText( " SET " );
delay(20);
flag = 1;
}


if(bit_is_clear(PIND,2)) // DOWN
{
WriteToLcdCtrlRegister(0x01);
delay(20);
if(flaga==1) i--;
}

(*twf[i][0]) ();
}

sei();
reti();
}

void temp1(void) //LM
{
ADMUX & =~_BV(MUX0);
ADMUX & =~_BV(MUX1);
ADMUX & =~_BV(MUX2);
}

void temp2(void) // pot
{
ADMUX |= _BV(MUX0);
}

int main(void)

{

DDRB = 0xFF;
DDRD = 0b11000000;
DDRC = 0b00111000; // 3,4,5 - wyjscia
PORTD = 0b00111111;
SFIOR = 0x00;

//wdt_reset();

//init_uart();

//stdout = stdin = & mystdout;

int a,t1,t2,marker=0;
char txt[16];


T1UP= eeprom_read_byte( & saved_T1UP);


if(T1UP == 0xff) T1UP = 30; // histereza
//out = 1;

LcdInitialize();

MCUCR = (1 & lt; & lt; ISC01)|(1 & lt; & lt; ISC00);

ADMUX = (1 & lt; & lt; REFS0)|(1 & lt; & lt; REFS1);
ADCSRA = (1 & lt; & lt; ADEN) | (1 & lt; & lt; ADSC) | (1 & lt; & lt; ADFR) | (1 & lt; & lt; ADPS2) | (1 & lt; & lt; ADPS1);

GICR = (1 & lt; & lt; INT1)|(1 & lt; & lt; INT0);

CustomChar();
WriteToLcdCtrlRegister(0x02);
wdt_enable(WDTO_2S);
sei();

while(1)
{
char setup=2;
//flaga = 1;
//wdt_enable(WDTO_2S);
wdt_reset();
out = 1;

a = ADC;
_delay_ms(50);
temp1();
t1 = (a*256)/1024;

//USART_Transmit(0xdb);
//USART_Transmit(ADC);

//WriteToLcdCtrlRegister(0x01);
WriteToLcdCtrlRegister(0x80);
WriteText( " " );
WriteToLcdCtrlRegister(0x80);

itoa(t1,txt,10);

WriteText( " Tw: " );
WriteText(txt);
LcdWrite(0);
WriteText( " C " );

if(t1 & lt; T1UP)
{
marker = 1;
//PORTC |= _BV(PC3);
//WriteToLcdCtrlRegister(0xC0);
//WriteText( " WY1:ON " );
}

if(t1 & gt; T1UP)
{
marker = 0;
//PORTC & = ~_BV(PC3);
//WriteToLcdCtrlRegister(0xC0);
//WriteText( " WY1:OFF " );
}

a = ADC;

temp2();
t2 = (a*256)/1024;

//USART_Transmit(0xbd);
//USART_Transmit(ADC);

itoa(t2,txt,10);
WriteToLcdCtrlRegister(0x88);
WriteText( " Tk: " );
WriteText(txt);
LcdWrite(0);
WriteText( " C " );

if(marker==1)
{
if(t2 & gt; (t1+2))
{
PORTC |= _BV(PC4);
//PORTC & = ~_BV(PC5);
WriteToLcdCtrlRegister(0xC0);
WriteText( " " );
WriteToLcdCtrlRegister(0xC0);
WriteText( " ZAWOR OTWARTY " );
}

if(t2 & lt; t1)
{
PORTC & = ~_BV(PC4);
//PORTC |= _BV(PC5);
WriteToLcdCtrlRegister(0xC0);
WriteText( " ZAWOR ZAMKNIETY " );
}

}

if(marker==0)
{
PORTC & = ~_BV(PC4);
WriteToLcdCtrlRegister(0xC0);
WriteText( " WY: ZAMKNIETY " );
}

}
return 0;
}

ISR(SIG_INTERRUPT0)
{
cli();
menu();
reti();
}