roboforum.ru

Технический форум по робототехнике.

Геркон

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Геркон

Сообщение Alim » 20 сен 2012, 01:55

Здарово.
Собираю метеостанцию, на отладочной плате Seem0007 atmega32.
Но анемометр и датчик осадков ни в какую не хотят работать.
Подключил их на ножки D2,D3 пытаюсь считать количество переключений герконов.
осадкометр работает через раз, а анемометр то вообще не реагирует, то выдает
какие то ограменные значения. Вот сам код:

Код: Выделить всёРазвернуть
#include <mega32.h>
#asm ("wdr")
#asm
   .equ __w1_port=0x12;PORTD
   .equ __w1_bit=5
#endasm
#include <1wire.h>
#include <delay.h>
#include <ds18b20.h>
#include <stdio.h>
#define REFERENCE (1<<REFS0)
#define ADC_VREF_TYPE 0x40

unsigned char devices;
unsigned  int read_d=0;
unsigned char RomCode[3][9];
unsigned  long read_v=0;
unsigned  long v=0;
int t1,t1_old;
float d,b,b_old,l,l_old,acs;
unsigned int dav=0;
int a,k,ss,mm;
char s=0,m=0, minute=1;
unsigned int FL_0=0;

interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H=0;
  TCNT1L=0;
 
    if (++s==60)
           {
               s=0;
               if (++m==5)
               {m=0;}
           }
}
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{

    if (++ss==60)
           {
               ss=0;
               if (++mm==5)
               {mm=0;}
           }
}

interrupt [EXT_INT0] void ext_int0_isr(void)
{
delay_ms(50);
k++;

}

interrupt [EXT_INT1] void ext_int1_isr(void)
{
delay_ms(50);
a++;

}
unsigned int read_adc(unsigned char adc_input)

{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

void main(void)
{
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;

    ASSR|=(1<<AS2);
    TCCR2|=(1<<CS20)|(1<<CS21)|(1<<CS22)|(1<<WGM21);
    OCR2=(32-1);
    TIMSK|=(1<<OCIE2);
    SREG |= (1<<7);

TIMSK=0x94;

UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;

ACSR=0x80;
SFIOR=0x00;

WDTCR=0x0C;

ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
SFIOR&=0xEF;

devices=w1_search(DS18B20_SEARCH_ROM_CMD, RomCode);

PORTB=0xff;
DDRB=0x00;


#asm("sei")

while(1)

   {       
      t1= ds18b20_temperature(&RomCode[0][0]);
      if( t1> 1000 )
       { t1 = 4096- t1;
        t1= -t1;}
      if(t1>-100)
       {t1_old=t1;}
       
           read_v=read_adc(6);
           v=read_v;
           v=read_adc(6)*1.57664-258;

            FL_0=read_adc(0);
           
            read_d=read_adc(7);
            d=(read_d*0.00488+0.095*5)/(0.009*5);
            dav=(1000*d)/133.322;
           
            acs=read_adc(5);
           
            printf(" vl%u",v/10,v%10);
            printf(" d%i",dav);
           
            if (t1< -100)
            {printf(" tz%i", t1_old);}
            else
            {printf(" tz%i", t1);}
           

         {  if ((FL_0<=790)&(FL_0>=770))
            { printf(" nv8");}
               else 
          if ((FL_0<=650)&(FL_0>=630))
                { printf(" nv7");}
                 else
            { if ((FL_0<=480)&(FL_0>=460))
                 { printf(" nv6");}
                   else 
                    {  if ((FL_0<=900)&(FL_0>=880))
                          { printf(" nv5");}
                         else 
                          {  if ((FL_0<=1000)&(FL_0>=980))
                                { printf(" nv4");}
                               else 
                                {  if ((FL_0<=550)&(FL_0>=530))
                                      { printf(" nv3");}
                                     else 
                                      {  if ((FL_0<=1023)&(FL_0>=1010))
                                            { printf(" nv2");}
                                           else 
                                            {  if ((FL_0<=960)&(FL_0>=940))
                                                  { printf(" nv1");}
                                                 else 
                                            { printf(" nv0");};
                                                  };
                                            };
                                      };
                                };
                          };
                    };
            };
             
             if (m==4)
                {minute=0;}
             if (minute==m)
                {
                  minute++;
                  b = 0.45*k/60;
                  b_old=b;
                  k=0;
                  l=a*0.1;
                  l_old=l;
                  a=0;
                }   
            printf(" sv%.2f",b_old);
            printf(" ko%.1f",l_old);
            printf(" acs%.2f", acs/256);
            printf(" X");
            //printf(" \r");
            delay_ms(2000);
   };
}
поможите кто чем сможет! :beer:
Alim
 
Сообщения: 36
Зарегистрирован: 09 апр 2012, 17:19

Re: Геркон

Сообщение elmot » 20 сен 2012, 02:17

Плавали, знаем. геркон дребезжит. Замени на датчик Холла
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья

Re: Геркон

Сообщение Alim » 20 сен 2012, 20:04

на данный момент датчик Холла ставить не вариант.
Осадкометр заработал, а анемометр int0 ни в какую не реагирует?
В чем может быть дело?
Alim
 
Сообщения: 36
Зарегистрирован: 09 апр 2012, 17:19

Re: Геркон

Сообщение elmot » 20 сен 2012, 23:37

предусмотреть задержку на дребезг контактов.
Аватара пользователя
elmot
 
Сообщения: 5691
Зарегистрирован: 10 ноя 2011, 12:02
Откуда: Turku, Finland
Skype: elmot73
прог. языки: Java и все-все=все
ФИО: Илья


Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7