avr-gcc termometr na atmega32

Bash, C, C++, Java, PHP, Ruby, GTK, Qt i wiele innych - wszystko tutaj.
kamil1cos7
Piegowaty Guziec
Piegowaty Guziec
Posty: 23
Rejestracja: 22 lis 2010, 23:01
Płeć: Mężczyzna
Wersja Ubuntu: 11.04
Środowisko graficzne: GNOME
Architektura: x86_64

avr-gcc termometr na atmega32

Post autor: kamil1cos7 »

Cześć, kurcze mam problem i nie mogę go przebrnąć... Zrobiłem sobie termometr i wszystko jest ok, temperatura dość dokładna, ale chciałbym żeby oprócz pokazywania aktualnej temperatury rejestrował mi najniższa, najwyższą i średnią w danym okresie.
Mam trzy przyciski, jeden swMeasure_DOWN po którego naciśnięciu rozpoczyna się pomiar i on jest wtedy cały czas wciśnięty a gdy pomiar zakańczam to go po prostu wyłączam, drugi swDisplayMIN_DOWN po którego naciśnięciu powinienem mieć na wyświetlaczu minimalną temperaturę jaka została zarejestrowana w czasie pomiaru, trzeci swDisplayMAX_DOWN analogicznie jak z poprzednim przyciskiem z tym że, wyświetla najwyższą temperaturę.
A gdy naciśnięte są naraz oba przyciski od maksymalnej i minimalnej temperatury to chciałem żeby na wyświetlaczu ukazała się średnia temperatura mierzona co 10 min przez okres pomiaru... Jednak lipa jest taka że, mi to nie działa ale nie wiem czemu:P Błąd musi być raczej gdzieś przy obsłudze tych przycisków, zerknijcie w kod może coś się wam rzuci w oczy... Z góry dzięki za pomoc...

Kod: Zaznacz cały


#ifndef ADD_H_
#define ADD_H_

#define sw_measure				(1 << PC0)
#define sw_min_display			(1 << PC1)
#define sw_max_display			(1 << PC2)
#define swMeasure_DOWN			(!(PINC & sw_measure))
#define swDisplayMIN_DOWN		(!(PINC & sw_min_display))
#define swDisplayMAX_DOWN		(!(PINC & sw_max_display))
#define SW_DDR					DDRC

extern 	int16_t 	T_MIN, T_MAX, T_SR;
extern 	uint16_t 	buffor_vp, buffor_time;
extern	int32_t		BUFF;


void 		add_init(void);
int16_t		t_min(uint16_t);
int16_t		t_max(uint16_t);
uint8_t	*	display(int16_t);
int32_t		TS( uint16_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, T_SR;
uint16_t buffor_vp, buffor_time;
int32_t	BUFF;

void add_init(void)
{
	T_MIN	=	500;
	T_MAX	=  -500;
	SW_DDR	&=	~ (sw_min_display | sw_measure | sw_max_display);
	PORTC	|=	(sw_measure | sw_min_display | sw_max_display);
}

int32_t		TS( uint16_t	adcw )
{
	int16_t temp = 0;

	temp	=	(ADCW_0 - adcw) * 4;

	BUFF	+=	temp;

	buffor_time = 0;
	buffor_vp++;

	return BUFF;
}

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.0044 1/K
 */


int main(void)
{
	add_init();

	wys_7_init();

	adc_init();

	sei();

	while(1)
	{
		if(swMeasure_DOWN)
		{
			t_min(measure(0));
			t_max(measure(0));
			(buffor_time == 600)	?	buffor_time++ : TS(measure(0));
		}

		if(swDisplayMIN_DOWN && !(swMeasure_DOWN || swDisplayMAX_DOWN))
		{
			display(T_MIN);
		}

		if(!swDisplayMAX_DOWN && !(swMeasure_DOWN || swDisplayMIN_DOWN))
		{
			display(T_MAX);
		}

		if((swDisplayMAX_DOWN && swDisplayMIN_DOWN) && (!swMeasure_DOWN))
		{
			T_SR	=	BUFF / buffor_vp;
			display(T_SR);
		}

		if(!swDisplayMIN_DOWN || swDisplayMAX_DOWN)
		{
			convert_to_temp(measure(0));
		}

		_delay_ms(1000);
	}

}
-- 07 wrz 2011 17:03 --

Jeszcze jedna zagadka, gdy poddam przeróbce funkcje główną do takiej formy jak poniżej to tak jak chce rejestruje mi najniższą temperaturę i wyświetla ją po naciśnięciu przycisku...

Kod: Zaznacz cały

int main(void)
{
	add_init();

	wys_7_init();

	adc_init();

	sei();

	while(1)
	{
		if(swMeasure_DOWN)
		{
			t_min(measure(0));
//			t_max(measure(0));
//			(buffor_time == 600)	?	buffor_time++ : TS(measure(0));
		}

		if(swDisplayMIN_DOWN && !(swMeasure_DOWN))// || swDisplayMAX_DOWN))
		{
			display(T_MIN);
		}
/*
		if(!swDisplayMAX_DOWN && !(swMeasure_DOWN || swDisplayMIN_DOWN))
		{
			display(T_MAX);
		}

		if((swDisplayMAX_DOWN && swDisplayMIN_DOWN) && (!swMeasure_DOWN))
		{
			T_SR	=	BUFF / buffor_vp;
			display(T_SR);
		}
*/
		if(!swDisplayMIN_DOWN)// || swDisplayMAX_DOWN)
		{
			convert_to_temp(measure(0));
		}

		_delay_ms(1000);
	}

}
ODPOWIEDZ

Wróć do „Programowanie”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 22 gości