logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega32][C] Termometr na diodzie

kamil1cos7 29 Sie 2011 11:12 2518 19
REKLAMA
  • #1 9874214
    kamil1cos7
    Poziom 14  
    Cześć.
    Chciałem zrobić sobie taki prosty termometr i wszystko jest w nim ok do momentu, gdy temperatura na wyświetlaczu jest w przedziale 7-33 stopnie... Otóż, gdy spada poniżej 7 to na wyświetlaczy pojawia się ponad 30 a gdy podnosi się ponad 33 to na wyświetlaczu jest ok 7...
    Błąd raczej musi być w poniższym kodzie tylko nie wiem, w którym miejscu...
    Rzućcie na to okiem w wolnej chwili;)
    
    #ifndef CYF_DISP_H_
    #define CYF_DISP_H_
    
    #define ADCW_0		936
    #define ADCW_100	680
    
    
    uint8_t * convert_to_temp( uint16_t );
    
    #endif /* CYF_DISP_H_ */
    
    #include <avr/io.h>
    
    #include "wys_7.h"
    #include "convert_to_temp.h"
    #include "_adc_.h"
    
    
    
    uint8_t * convert_to_temp(uint16_t	adcw)
    {
    	int16_t temp = 0;
    
    
    
    	temp	=	(-1000 * adcw)/(ADCW_0 - ADCW_100) + (1000 * ADCW_0)/(ADCW_0 - ADCW_100);
    
    	if(temp < 0)
    	{
    		cyf[3] = MINUS;
    		temp *= -1;
    	}
    	
    	else if(temp < 0)
    	{
    		cyf[3] = EMPTY;
    	}
    	
    	else
    
    	cyf[2]	=	temp / 100;
    	cyf[1]	=	(temp - cyf[2]*100) / 10;
    	cyf[0]	=	temp - cyf[2]*100 - cyf[1]*10;
    
    	return cyf;
    
    }
  • REKLAMA
  • #2 9874235
    MirekCz
    Poziom 35  
    1.Wszędzie używasz liczb 16bitowych, a z obliczeń wygląda na to, że zdecydowanie przekroczysz zakres dopuszczalnych wartości

    2. Warunki else są zupełnie bez sensu.
    Powinno być:
    
    cyf[3]=EMPTY;
    if (temp<0) 
    {
      cyf[3]=MINUS;
      temp=-temp;
    }
    cyf[2]=temp/100%10;
    cyf[1]=temp/10%10;
    cyf[0]=temp%10;
    

    %10 to reszta z dzielenia. Nie jest to optymalne pod względem prędkości, ale o ile prędkość tego kawałka kodu nie jest krytyczna to dużo łatwiejszy w czytaniu.
  • REKLAMA
  • #3 9874364
    kamil1cos7
    Poziom 14  
    Nie wykraczam nigdzie poza zakres liczby 16bitowej, zmienna temp będzie to temperatura tylko że bez przecinka... np jeśli jest 15.3 stopnia to temp będzie równe 153... wiec temp będzie przy 100 stopniach równe 1000 więc na pewno nie w tym błąd...
    Co do warunku else to tablica cyf jest zmienna typu uint8_t więc tam będzie niejawne rzutowanie na ten typ... więc to też nie jest błąd... A faktycznie tam jest bez sensu ten warunek bo powinno być else if(temp > 0)
  • #4 9874558
    snnaap
    Poziom 25  
    Jakie wartości przybiera zmienna adcw dla temperatury do 7 i ponad 33?


    Nie wiem jak uK to przelicza ale np
    1000 * ADCW_0
    jest już poza zakresem liczby 16bitowej, i czemu te obliczenia

    temp = (-1000 * adcw)/(ADCW_0 - ADCW_100) + (1000 * ADCW_0)/(ADCW_0 - ADCW_100);

    są tak "skomplikowane"?

    Dodano po 9 [minuty]:

    i pokaż jak te warunki mają wyglądać prawidłowo?
  • #5 9875545
    kamil1cos7
    Poziom 14  
    Nie wiedziałem że funkcja liniowa może wyglądać skomplikowanie...
    Ogólnie to chodzi tam o to, żeby nie podstawiać w wielu miejscach ciągle tych wartości adcw dla 100stopni i dla 0 stopni tylko w jednym miejscu.
    Robię to tak że, mam osobną funkcje która mi odczytuje właśnie adcw na wyświetlaczu i ja sobie to spisuje i wstawiam do programu, tą funkcje potem podmieniam z tą która tutaj jest widoczna. Temperatura się zmienia liniowo z adcw wiec jest tam funkcja liniowa...
    Ja też myślałem nad tym że jakby w locie mogą być za duże liczby ale to jest niemożliwe ponieważ temp maleje ze wzrostem adcw więc mogło by się tak dziać dla temperatur tych niższych ale przecież dla 33stopni adcw jest mniejsze niż dla 10 i to o wiele...
    1 adcw ~ 0.4 stopnia
    
    #ifndef CYF_DISP_H_
    #define CYF_DISP_H_
    
    #define ADCW_0		936
    #define ADCW_100	680
    
    uint8_t * convert_to_temp( uint16_t );
    
    #endif /* CYF_DISP_H_ */
    
    
    #include <avr/io.h>
    
    #include "wys_7.h"
    #include "convert_to_temp.h"
    #include "_adc_.h"
    
    
    
    uint8_t * convert_to_temp(uint16_t	adcw)
    {
    	int16_t temp = 0;
    
    	temp	=	(-1000 * adcw)/(ADCW_0 - ADCW_100) + (1000 * ADCW_0)/(ADCW_0 - ADCW_100);
    
    	cyf[3]	=	EMPTY;
    
    	if(temp < 0)
    	{
    		cyf[3] = MINUS;
    		temp = -temp;
    	}
    
    	else
    
    	cyf[2]	=	temp / 100;
    	cyf[1]	=	(temp - cyf[2]*100) / 10;
    	cyf[0]	=	temp - cyf[2]*100 - cyf[1]*10;
    
    	return cyf;
    
    }
    
  • Pomocny post
    #6 9875873
    snnaap
    Poziom 25  
    No to jeżeli dobrze rozumuje i jest tak jak mówisz to obliczanie temperatury powinno wyglądać tak :

    temp = (ADCW_0 - adcw) *4

    co daje ci dla przykładu wynik równy 72 dla adcw = 918 czyli 7,2 st a i analogicznie dla liczb ujemnych.
    Ale sprawdź to jeszcze.
    Odniesieniem dla nas jest zero.
  • REKLAMA
  • #7 9876434
    kamil1cos7
    Poziom 14  
    Nom tylko jeśli tak zapisze to mi niedokładnie liczy:P ale i tak to jest o wiele lepszy sposób niż ja wcześniej zapisałem bo nie mam już tego problemu co miałem... Musiało być coś z tymi typami... ale nie mogę dalej rozkminić co robiłem źle...
    Hmmm, mam jeszcze takie pytanko.... Bo ten termometr mój jest zrobiony na zwykłej diodzie;]
    I jest mały problem bo ta temperatura mi ciągle skacze, o jakieś jeden dwa stopnie nawet czasami...
    Jakiś pomysł żeby coś z tym zrobić, czy raczej takie są uroki diody a nie normalnego czujnika...??
  • #8 9876990
    snnaap
    Poziom 25  
    kamil1cos7 napisał:
    Nom tylko jeśli tak zapisze to mi niedokładnie liczy:P


    O jakiej dokładności tu mówimy?
    Teraz temperatura jest obliczana w odniesieniu do zera co w niczym nie przeszkadza aby w drugiej zmiennej obliczać temperaturę w odniesieniu do 100 a następnie uśredniać wynik.


    kamil1cos7 napisał:

    I jest mały problem bo ta temperatura mi ciągle skacze, o jakieś jeden dwa stopnie nawet czasami...
    Jakiś pomysł żeby coś z tym zrobić, czy raczej takie są uroki diody a nie normalnego czujnika...??


    Podaj symbol diody oraz pokaż fragment schematu jak podłączona jest uK.
    Mniemam, że filtracja zasilania uK oraz jego układu ADC jest prawidłowa.

    Jaki zakres temperatury Ciebie interesuje oraz co jest mierzone tym termometrem (temperatura wody, płynów itp) ?
  • #9 9877240
    dondu
    Moderator na urlopie...
    kamil1cos7 napisał:
    Bo ten termometr mój jest zrobiony na zwykłej diodzie;]
    I jest mały problem bo ta temperatura mi ciągle skacze, o jakieś jeden dwa stopnie nawet czasami...
    Jakiś pomysł żeby coś z tym zrobić, czy raczej takie są uroki diody a nie normalnego czujnika...??

    Pokaż cały schemat, bo mam wrażenie, że jest on przyczyną Twoich problemów.
  • #10 9878052
    kamil1cos7
    Poziom 14  
    Na obrazku jest schemat... Może być tam coś w sumie źle bo sam go robiłem... Przy wzmacniaczu jest potencjometr żeby wyregulować wzmocnienie. Założyłem że najwyższe napięcie jakie będzie mierzone będzie ok 750mV to jest dla ok -30stopni, więc wzmocnienie dobrałem tak żeby dla 750mV na wyjściu wzmacniacza było ok 2.56 czyli tyle ile wewnętrzne źródło odniesienia w uK. Kondensatory są jak najbliżej się dało nóżek uK i mają 100nF. Prąd płynący przez diodę 1mA... To chyba tyle...
  • REKLAMA
  • #11 9878146
    snnaap
    Poziom 25  
    Jaki zakres temperatury Ciebie interesuje rozumiem że od -30 ale górna granica jaka jest?
    Czemu wybrałeś akurat diodę jako wskaźnik? Były jakieś szczególne powody ku temu?

    Polecam też poczytać w tym temacie lekturę Elektronika Praktyczna 2/98 jest tam opis termometru wykorzystującego diodę i opisane są aspekty związane z pomiarem temperatury za pomocą diody.
  • #12 9880267
    kamil1cos7
    Poziom 14  
    W tym przypadku nie będzie górnej granicy bo ogranicza mnie tylko minimalna temperatura dla której będzie max wartość napięcia na diodzie, żeby nie przekroczyć po wzmocnieniu wartości napięcia odniesienia... Jeśli zrobię jeszcze układ odejmujący ze wzmacniaczy operacyjnych to wtedy tak... Już w sumie sobie to obmyśliłem. Ale wcześniej przeczytam tą Elektronikę Praktyczną.
    Dlaczego diodę półprzewodnikową... Bo taką miałem pod ręką...
    Dzięki za dobre rady;)
  • #13 9881537
    kamil1cos7
    Poziom 14  
    Mam takie pytanie. Bo jak sobie pisałem funkcje do obsługi wyświetlacza 7_segmentowego to tablice z segmentami dla liczb zapisałem w pamięci flash, możliwe że ta temperatura skacze mi dlatego że, z pamięci flash jest wolniejszy odczyt...??
    To jest kod obsługi tego przerwania:
    
    #ifndef WYS_7_H_
    #define WYS_7_H_
    
    //definition ports
    #define anody_port 	PORTD
    #define anody_ddr 	DDRD
    #define katody_port PORTB
    #define katody_ddr	DDRB
    
    //define port bits to anode
    #define	mod_1		(1<<PD0)
    #define	mod_2		(1<<PD1)
    #define mod_3		(1<<PD2)
    #define mod_4		(1<<PD3)
    
    //definition displays segments
    #define segA		(1<<0)
    #define segB		(1<<1)
    #define segC		(1<<2)
    #define segD		(1<<3)
    #define segE		(1<<4)
    #define segF		(1<<5)
    #define segG		(1<<6)
    #define segH		(1<<7)
    
    #define EMPTY		11
    #define MINUS		10
    
    extern volatile uint8_t cyf[4];
    
    void wys_7_init(void);
    
    #endif /* WYS_7_H_ */
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    
    #include "wys_7.h"
    
    
    volatile uint8_t cyf[4];
    
    uint8_t signs[12] PROGMEM	=
    {
    		~(segA|segB|segC|segD|segE|segF),		//0
    		~(segB|segC),							//1
    		~(segA|segB|segG|segE|segD),			//2
    		~(segA|segB|segG|segC|segD),			//3
    		~(segF|segG|segB|segC),					//4
    		~(segA|segF|segG|segC|segD),			//5
    		~(segA|segF|segG|segE|segC|segD),		//6
    		~(segA|segB|segC),						//7
    		~(segA|segB|segC|segD|segE|segF|segG),	//8
    		~(segA|segB|segC|segD|segF|segG),		//9
    		~(segG),								//	-
    		0xFF									// 	empty segment
    };
    
    
    void wys_7_init(void)
    {
    	katody_ddr 	= 	0xFF;		
    	katody_port = 	0x00;			
    
    	anody_ddr 	|= 	( mod_1 | mod_2 | mod_3 | mod_4 );		
    	anody_port 	&= 	~(mod_1 | mod_2 | mod_3 | mod_4);		
    
    	TCCR0 	|= 	(1<<WGM01);				//CTC mode (licznika)
    	TCCR0 	|=	(1<<CS02) | (1<<CS00);	        //ustawiamy na podzial przez /1024
    	OCR0	=	39;				//dodatkowy rejestr porownania, przepelnienia 
    
    	TIMSK	|=	(1<<OCIE0);		//zezwolenie na przerwanie "compare match"
    }
    
    ISR(TIMER0_COMP_vect)
    {
    	static	uint8_t	licznikANODY	=	1;
    
    	anody_port	=	licznikANODY;			
    
    	/*
    	 * pgm_read_byte( &variable )
    	 * function to read from flash memory
    	 */
    
    	if(licznikANODY == 1)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[0]]);
    	}
    
    	else	if(licznikANODY == 2)
    	{
    		katody_port	=	0x80	+	pgm_read_byte(&signs[cyf[1]]);
    	}
    
    	else	if(licznikANODY == 4)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[2]]);
    	}
    
    	else	if(licznikANODY == 8)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[3]]);
    	}
    
    	licznikANODY	<<=	1;
    
    	if(licznikANODY > 8)					//back to the first module
    	{
    		licznikANODY	=	1;
    
    	}
    }
    


    Dodano po 15 [minuty]:

    Zmiana tego nie pomogła.
  • #14 9881728
    snnaap
    Poziom 25  
    kamil1cos7 napisał:
    Mam takie pytanie. Bo jak sobie pisałem funkcje do obsługi wyświetlacza 7_segmentowego to tablice z segmentami dla liczb zapisałem w pamięci flash, możliwe że ta temperatura skacze mi dlatego że, z pamięci flash jest wolniejszy odczyt...??
    To jest kod obsługi tego przerwania:
    
    #ifndef WYS_7_H_
    #define WYS_7_H_
    
    //definition ports
    #define anody_port 	PORTD
    #define anody_ddr 	DDRD
    #define katody_port PORTB
    #define katody_ddr	DDRB
    
    //define port bits to anode
    #define	mod_1		(1<<PD0)
    #define	mod_2		(1<<PD1)
    #define mod_3		(1<<PD2)
    #define mod_4		(1<<PD3)
    
    //definition displays segments
    #define segA		(1<<0)
    #define segB		(1<<1)
    #define segC		(1<<2)
    #define segD		(1<<3)
    #define segE		(1<<4)
    #define segF		(1<<5)
    #define segG		(1<<6)
    #define segH		(1<<7)
    
    #define EMPTY		11
    #define MINUS		10
    
    extern volatile uint8_t cyf[4];
    
    void wys_7_init(void);
    
    #endif /* WYS_7_H_ */
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    
    #include "wys_7.h"
    
    
    volatile uint8_t cyf[4];
    
    uint8_t signs[12] PROGMEM	=
    {
    		~(segA|segB|segC|segD|segE|segF),		//0
    		~(segB|segC),							//1
    		~(segA|segB|segG|segE|segD),			//2
    		~(segA|segB|segG|segC|segD),			//3
    		~(segF|segG|segB|segC),					//4
    		~(segA|segF|segG|segC|segD),			//5
    		~(segA|segF|segG|segE|segC|segD),		//6
    		~(segA|segB|segC),						//7
    		~(segA|segB|segC|segD|segE|segF|segG),	//8
    		~(segA|segB|segC|segD|segF|segG),		//9
    		~(segG),								//	-
    		0xFF									// 	empty segment
    };
    
    
    void wys_7_init(void)
    {
    	katody_ddr 	= 	0xFF;		
    	katody_port = 	0x00;			
    
    	anody_ddr 	|= 	( mod_1 | mod_2 | mod_3 | mod_4 );		
    	anody_port 	&= 	~(mod_1 | mod_2 | mod_3 | mod_4);		
    
    	TCCR0 	|= 	(1<<WGM01);				//CTC mode (licznika)
    	TCCR0 	|=	(1<<CS02) | (1<<CS00);	        //ustawiamy na podzial przez /1024
    	OCR0	=	39;				//dodatkowy rejestr porownania, przepelnienia 
    
    	TIMSK	|=	(1<<OCIE0);		//zezwolenie na przerwanie "compare match"
    }
    
    ISR(TIMER0_COMP_vect)
    {
    	static	uint8_t	licznikANODY	=	1;
    
    	anody_port	=	licznikANODY;			
    
    	/*
    	 * pgm_read_byte( &variable )
    	 * function to read from flash memory
    	 */
    
    	if(licznikANODY == 1)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[0]]);
    	}
    
    	else	if(licznikANODY == 2)
    	{
    		katody_port	=	0x80	+	pgm_read_byte(&signs[cyf[1]]);
    	}
    
    	else	if(licznikANODY == 4)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[2]]);
    	}
    
    	else	if(licznikANODY == 8)
    	{
    		katody_port	=	pgm_read_byte(&signs[cyf[3]]);
    	}
    
    	licznikANODY	<<=	1;
    
    	if(licznikANODY > 8)					//back to the first module
    	{
    		licznikANODY	=	1;
    
    	}
    }
    


    Dodano po 15 [minuty]:

    Zmiana tego nie pomogła.



    Nie, co to znaczy że temperatura skacze?
  • #15 9881752
    tmf
    VIP Zasłużony dla elektroda
    Nie, odczyt z FLASH nie ma żadnego wpływu.
    Nie, static uint8_t licznikAnowy = 1 znaczy, że ta zmienna jest inicjowana tylko raz, przy starcie aplikacji, a jej wartość jest zachowywana pomiędzy kolejnymi wywołaniami, niezależnie czy jest to zmienna globalna, czy lokalna.
    Co do skakania odczytów - trzeba uśrednić kilka wyników i problem zniknie. Dioda szumi, ten wzmacniacz to też nie jest szczyt precyzji, ADC szumi, jak się to wszystko doda to te 1-2 stopnie są normalne. BTW, diody od siebie też się na tyle różnią, że praktyczniej żadnej dokładności absolutnej nie uzyskasz (no z grubsza 20-30 stopni).
  • #16 9882285
    kamil1cos7
    Poziom 14  
    'Nie, static uint8_t licznikAnowy = 1 znaczy, że ta zmienna jest inicjowana tylko raz, przy starcie aplikacji, a jej wartość jest zachowywana pomiędzy kolejnymi wywołaniami, niezależnie czy jest to zmienna globalna, czy lokalna. ', po co to napisałeś... wiem po co użyłem static, a ten komentarz tam oznacza praktycznie tyle ze licznik wraca do pierwszego modułu wyświetlacza... mogę go usunąć jeśli tak Cię drażni....
  • #18 9883095
    pancio
    Poziom 16  
    Cytat:
    Na obrazku jest schemat... Może być tam coś w sumie źle bo sam go robiłem... Przy wzmacniaczu jest potencjometr żeby wyregulować wzmocnienie. Założyłem że najwyższe napięcie jakie będzie mierzone będzie ok 750mV to jest dla ok -30stopni, więc wzmocnienie dobrałem tak żeby dla 750mV na wyjściu wzmacniacza było ok 2.56 czyli tyle ile wewnętrzne źródło odniesienia w uK. Kondensatory są jak najbliżej się dało nóżek uK i mają 100nF. Prąd płynący przez diodę 1mA... To chyba tyle...


    a nie masz czasami błędu w schemacie? Zasilanie na diodę przez rezystor do masy i wejścia wzmacniacza?
  • #19 9884227
    kamil1cos7
    Poziom 14  
    @tmf

    A to sorki:P
    Myślałem że, chcesz się pochwalić wiedzą na temat zmiennych statycznych.

    Dodano po 7 [minuty]:

    @pancio

    Masz rację, ale to jest błąd w przerysowaniu, na płytce jest dobrze czyli katoda do masy a anoda do wejścia nieodwracającego...

    Dodano po 7 [minuty]:

    Wyeliminowałem te wahania temperatury, tylko niech mi ktoś wytłumaczy dlaczego to było akurat przyczyną... bo wystarczyło zakomentować linijkę gdzie gasiłem 4 moduł wyświetlacza...
    "//cyf[3] = EMPTY"
    Trochę mnie teraz razi że, się zero wyświetla cały czas na czwartym segmencie ale lepsze to niż tak znaczne skakanie wartości temperatury... Teraz praktycznie się temperatura nie waha, a jeśli coś to o 0.4 stopnia czyli o 1 adcw.
    
    #include <avr/io.h>
    
    #include "wys_7.h"
    #include "convert_to_temp.h"
    #include "_adc_.h"
    
    
    
    uint8_t * convert_to_temp(uint16_t	adcw)
    {
    	int16_t temp = 0;
    
    	temp	=	(ADCW_0	- adcw)*4;
    
    //	cyf[3]	=	EMPTY;
    
    	if(temp < 0)
    	{
    		cyf[3] = MINUS;
    		temp = -temp;
    	}
    
    	cyf[3]	=	temp / 1000;
    	cyf[2]	=	(temp / 100) % 10;
    	cyf[1]	=	(temp / 10) % 10;
    	cyf[0]	=	temp % 10;
    
    	return cyf;
    
    }
  • #20 9897203
    kamil1cos7
    Poziom 14  
    Cześć, mam kolejny problem, myślę że może być to coś w operatorami ale nie mogę dojść co i gdzie. Napisałem kolejne funkcje które po włączeniu przycisku keyMeasure_DOWN mają szukać najniższej i najwyższej temperatury a po wciśnięciu keyDispleyMIN_DOWN i keyDispleyMAX_DOWN mają je wyświetlać... tylko że właśnie po ich wciśnięciu nic się nie dzieje... Rzućcie na to okiem...
    
    
    #ifndef ADD_H_
    #define ADD_H_
    
    #define key_measure				(1 << PC0)
    #define key_min_display			(1 << PC1)
    #define key_max_display			(1 << PC2)
    #define keyMeasure_DOWN			(!(PINC & key_measure))
    #define keyDisplayMIN_DOWN		(!(PINC & key_min_display))
    #define keyDisplayMAX_DOWN		(!(PINC & key_max_display))
    #define KEY_DDR					DDRC
    
    extern int16_t T_MIN, T_MAX;
    
    void 		add_init(void);
    int16_t		t_min(uint16_t);
    int16_t		t_max(uint16_t);
    uint8_t	*	display(int16_t);
    
    #endif /* ADD_H_ */
    
    
    #include <avr/io.h>
    #include <avr/delay.h>
    
    #include "add.h"
    #include "wys_7.h"
    #include "convert_to_temp.h"
    
    int16_t	T_MIN, T_MAX;
    
    void add_init(void)
    {
    	T_MIN	=	500;
    	T_MAX	=  -500;
    	KEY_DDR	&=	~ (key_min_display | key_measure | key_max_display);
    	PORTC	|=	(key_measure | key_min_display | key_max_display);
    }
    
    int16_t		t_min( uint16_t 	adcw )
    {
    	int16_t temp = 0;
    
    	temp	=	(ADCW_0	- adcw) * 4;
    
    	if(temp < T_MIN)
    	{
    		T_MIN	=	temp;
    	}
    
    	return T_MIN;
    }
    
    int16_t 	t_max( uint16_t		adcw )
    {
    	int16_t temp = 0;
    
    	temp	=	(ADCW_0 - adcw) * 4;
    
    	if(temp > T_MAX)
    	{
    		T_MAX	=	temp;
    	}
    
    	return T_MAX;
    }
    
    uint8_t *	display(int16_t	temp)
    {
    
    	cyf[3]	=	temp / 1000;
    
    	if(temp < 0)
    	{
    		cyf[3] = MINUS;
    		temp = -temp;
    	}
    
    	cyf[2]	=	(temp / 100) % 10;
    	cyf[1]	=	(temp / 10) % 10;
    	cyf[0]	=	temp % 10;
    
    
    	return cyf;
    }
    
    
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/pgmspace.h>
    #include <avr/delay.h>
    
    #include "wys_7.h"
    #include "_adc_.h"
    #include "convert_to_temp.h"
    //#include "adcw.h"
    #include "add.h"
    
    /*
     * RANGE:  		> 222 K
     * PRECISION:	-0.007 1/K
     */
    
    
    int main(void)
    {
    	add_init();
    
    	wys_7_init();
    
    	adc_init();
    
    	sei();
    
    	while(1)
    	{
    		if(keyMeasure_DOWN)
    		{
    			t_min(measure(0));
    			t_max(measure(0));
    		}
    
    		if(keyDisplayMIN_DOWN & (!keyMeasure_DOWN & (!keyDisplayMAX_DOWN)))
    		{
    			display(T_MIN);
    		}
    
    		if(keyDisplayMAX_DOWN & (!keyMeasure_DOWN & (!keyDisplayMIN_DOWN)))
    		{
    			display(T_MAX);
    		}
    
    		if(~(keyDisplayMIN_DOWN | keyDisplayMAX_DOWN))
    		{
    			convert_to_temp(measure(0));
    		}
    
    		_delay_ms(1000);
    	}
    
    }
REKLAMA