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

atmega 32, obsługa przycisków

kamil1cos7 07 Wrz 2011 20:55 1545 1
REKLAMA
  • #1 9905075
    kamil1cos7
    Poziom 14  
    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. Z góry dzięki za pomoc...
    
    
    #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 "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);
       }
    
    }
    


    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...
    
    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);
       }
    
    }
  • REKLAMA
  • #2 9906881
    kamil1cos7
    Poziom 14  
    W sumie rozwiązałem problem, podpiąłem pod inny pin jeden z przycisków i działa git.
    Może pin był wadliwy albo sam go jakoś przez przypadek wcześniej uszkodziłem...
    Pozdrawiam.
REKLAMA