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);
}
}
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);
}
}