Собираю метеостанцию, на отладочной плате 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);
};
}