Kod: Zaznacz cały
#define Uref 		2.66			// Nap ref
#define Rpom 		0.1		        // Rez pom
#define R1			100000			// Dziel - R1 100k ohm
#define R2			7665			// Dziel - R2 7k5  ohm
#define Temp_wl		50				// Temp wl wiat
#define Temp_wy		30				// Temp wyl wiat
#define Temp_max    50              // Temp wyl przek
#define Temp_min    40              // Temp wl przek
#define Imax        3.15
#include <avr/io.h>
//#include <math.h> 
#include <stdio.h>
#include <stdlib.h>
#include "naglowkowy.h"
 
void lcd_U_I(void);
void lcd_P_R(void);
void lcd_T_FAN(void);
void lcd_TON_TOFF(void); 
char data0[8] = {0x0E, 0x11, 0x11, 0x11, 0x0A, 0x0A, 0x1B, 0x00}; //ohm		numer 0
char data1[8] = {0x02, 0x05, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00}; //stopien numer 1
char data2[8] = {0x00, 0x04, 0x15, 0x0E, 0x15, 0x04, 0x00, 0x00}; // gwiazdka
char x;
	int i, ADC_H, ADC_L;
	float prad, napiecie, temperatura, ogran, pradogr;
	long ADC_temp, ADC_temp_sr;
	float Uin;
	int napiecie_int , napiecie_float;
	int prad_int , prad_float;
	int pradogr_int , pradogr_float;
	char menu = 0;
	char setup;
int main(void)
{
	Ust_Portow();
	LCD_init();
	ADC_init();
	lcd_def_char(data0,0);
	lcd_def_char(data1,1);
	lcd_def_char(data2,2);
	pierwsza();
	write_char(0b00000010);
	write_text(" Zas.30V");
		
	druga();
	write_text(" 3.15A");
	write_char(0b00000010);	
	Waitms(100);		
	
	PORTB|= _BV(PB1);
	Waitms(500);	
	
	PORTB &= ~_BV(PB1);
	czysc();
	
	while(1)
	{
		prad = 0;
		napiecie = 0;
		temperatura = 0;				
		ADC_temp = 0;
		ADC_temp_sr = 0;
		Uin = 0;
        pradogr = 0;
		ogran = 0;
   		// pomiar wartosci ADC0 - napiecie
   		for(i = 0 ; i < 20 ; i++)
		{
			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
   			while(bit_is_set(ADCSRA,ADSC)){};   
   			ADC_L = ADCL;
   			ADC_H = ADCH;
			ADC_temp  = ADC_H*256+ADC_L;
			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
			if(i==19)			
			{
				ADC_temp = ADC_temp_sr/20;
				Uin = (Uref/1024)*ADC_temp;
				napiecie = ((R1+R2)/R2)*Uin;
				
				napiecie_int = napiecie;
				napiecie_float = (napiecie*100)-(napiecie_int*100);
					
			}
  		}
		temperatura = 0;				
		ADC_temp = 0;
		ADC_temp_sr = 0;
		Uin = 0;
		//prad = 0;
   		// pomiar wartosci ADC1
   		ADMUX |= _BV(PC0); 			
   		for(i = 0 ; i < 20 ; i++)
		{
			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
   			while(bit_is_set(ADCSRA,ADSC)){};   
   			ADC_L = ADCL;
   			ADC_H = ADCH;
			ADC_temp  = ADC_H*256+ADC_L;
			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
			if(i==19)			
			{
				ADC_temp = ADC_temp_sr/20;
				Uin = (Uref/1024)*ADC_temp;
				prad = Uin/Rpom;
				
				prad_int = prad;
				prad_float = (prad*1000)-(prad_int*1000);
			}
  		}
		temperatura = 0;				
		ADC_temp = 0;
		ADC_temp_sr = 0;
		Uin = 0;
  		ADMUX &= ~_BV(PC0);
   		// pomiar wartosci ADC2
   		ADMUX |= _BV(PC1); 			
   		for(i = 0 ; i < 20 ; i++)
		{
			ADCSRA|= _BV(ADSC); 			//start pojedynczej konwersji
   			while(bit_is_set(ADCSRA,ADSC)){};   
   			ADC_L = ADCL;
   			ADC_H = ADCH;
			ADC_temp  = ADC_H*256+ADC_L;
			ADC_temp_sr = ADC_temp_sr + ADC_temp;	
			if(i==19)			
			{
				ADC_temp = ADC_temp_sr/20;
				Uin = (Uref/1024)*ADC_temp;
				temperatura = Uin*90;
			}
  		}
		ADMUX &= ~_BV(PC1);
 
        
        ADC_temp = 0;
        ADC_temp_sr = 0;
        Uin = 0;
        //prad = 0;
           // pomiar wartosci ADC3
           ADMUX |= _BV(PC2);           
           for(i = 0 ; i < 20 ; i++)
        {
            ADCSRA|= _BV(ADSC);             //start pojedynczej konwersji
               while(bit_is_set(ADCSRA,ADSC)){};   
               ADC_L = ADCL;
               ADC_H = ADCH;
            ADC_temp  = ADC_H*256+ADC_L;
            ADC_temp_sr = ADC_temp_sr + ADC_temp;   
            if(i==19)           
            {
                ADC_temp = ADC_temp_sr/20;
                pradogr = (Imax/1024)*ADC_temp;
                ogran = pradogr;
               
                pradogr_int = ogran;
                pradogr_float = (ogran*1000)-(pradogr_int*1000);
            }
         } 
		ADMUX &= ~_BV(PC2);
		if(temperatura >= Temp_wl)
		{
			PORTB|= _BV(PB1);
		}
		if(temperatura <= Temp_wy)
		{
			PORTB &= ~_BV(PB1);
		}
        if(temperatura >= Temp_max)
		{
		    PORTD &= ~_BV(PD0);
        }
		if(temperatura <= Temp_min)
		{
		   PORTD|= _BV(PD0);
        }
				
		if(bit_is_clear(PINB,PB2))
		{
			
//		while(bit_is_clear(PINB,PB2)){}
				Waitms(100);
				menu=menu+1;
				if(menu > 3)
					{
					menu=0;
					}
		}
	
		
		if(menu==0) // prad napiecie
			{
			lcd_U_I();					
			}
		if(menu==1) /// moc rezystancja
			{
			lcd_P_R();		
			}
		if(menu==2) // temp fan
			{
			lcd_T_FAN();
			}
					
		if(menu==3) // temp on off
			{
			lcd_TON_TOFF();
			}
		
				
	//	if(bit_is_set(PINB,PB1))
	//	{
	//	czysc();
	//	write_text("Fan ON  ");
	//	}
	}
	return 0;
}
void lcd_U_I(void)
{
				pierwsza();   
				write_text(" ");
				write_data(napiecie_int);
				write_text(".");
				if(napiecie_float<10)
				{
				write_text("0");
				}
				write_data(napiecie_float);				
				write_text("V");					
				write_text(" ");
				write_data(pradogr_int);
				write_text(".");
				if(pradogr_float<10)
				{
				write_text("0");
				}
				
				if(pradogr_float<100)
				{
				write_text("0");
				}		
				write_data(pradogr_float);				
				write_text("A");
				druga();
				write_text(" ");
				write_data(prad_int);
				write_text(".");
				if(prad_float<10)
				{
				write_text("0");
				}
				
				if(prad_float<100)
				{
				write_text("0");
				}		
				write_data(prad_float);				
				write_text("A");
				write_text(" ");
				
				if((napiecie*prad)<1)
				{
				write_data(napiecie*prad*1000);
				write_text(" mW ");
				}
				else
				{
				write_data(napiecie*prad);
				write_text(" W ");				
				}
}
void lcd_P_R(void)
{
				pierwsza();
				write_text("      ");
				
				if((napiecie*prad)<1)
				{
				write_data(napiecie*prad*1000);
				write_text(" mW   ");
				}
				else
				{
				write_data(napiecie*prad);
				write_text(" W    ");				
				}
				
				
				druga();
				if(((napiecie/prad)>=1000000)||(napiecie==0)||(prad==0))
					{
					write_text("   R > 1M");
					write_char(0b00000000);
					write_text("     ");
					}
				else
					{
				  
					write_text("      ");
					write_data(napiecie/prad);
					write_char(0b00000000);
					write_text("     ");	
					
					}
}
void lcd_T_FAN(void)
{
				
				
				pierwsza();
				write_text("      ");
				write_data(temperatura);
				
				write_char(0b00000001);
				write_text("C  ");			
				
				druga();
				if(bit_is_set(PINB,PB1))
				write_text("    Fan ON  ");
				if(bit_is_clear(PINB,PB1))	
				write_text("    Fan OFF  ");
}
void lcd_TON_TOFF(void)
{
		druga();
		write_text("  ON ");					
		write_data(Temp_wl);
		write_char(0b00000001);		
		write_text("C  ");		
		pierwsza();	
		write_text("  OFF ");		
		write_data(Temp_wy);
		write_char(0b00000001);		
		write_text("C  ");
}
A co byś powiedział na zastosowanie TL431 jako zewnętrzenego źródła napięcia odniesienia???? Różne opinie czytałem jedni mówią że to coś daje a inni że nic


