Нашел в сети код для тини 2313
Спойлер
Код: Выделить всё
/*****************************************************
This program was produced by the
CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 29.07.2011
Author :
Company :
Comments:
Chip type : ATtiny2313
Clock frequency : 8,000000 MHz
Memory model : Tiny
External RAM size : 0
Data Stack size : 32
*****************************************************/
#include <tiny2313.h>
#include <delay.h>
#define dht_dpin 3
char bGlobalErr;
char dht_dat[5];
char dht_in;
flash char znak[]={63,6,91,79,102,109,125,7,127,111,0,99,57,118};
char cyf=1;
char out[]={0,0,0,0};
char des=0, ed=0;
char fase=0;
void InitDHT(void);
void ReadDHT(void);
char read_dht_dat();
char hex2dec(char);
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
cyf=cyf*2;
if (cyf==16) cyf=1;
if (fase==0){
switch (cyf)
{
case 1: PORTB=~znak[12]; PORTD.0=1; PORTD.3=0; break;
case 2: PORTB=~znak[11]; PORTD.1=1; PORTD.0=0; break;
case 4: PORTB=~znak[out[2]]; PORTD.2=1; PORTD.1=0; break;
case 8: PORTB=~znak[out[3]]; PORTD.3=1; PORTD.2=0; break;
}
}
else
{
switch (cyf)
{
case 1: PORTB=~znak[out[0]]; PORTD.0=1; PORTD.3=0; break;
case 2: PORTB=~znak[out[1]]; PORTD.1=1; PORTD.0=0; break;
case 4: PORTB=~znak[10]; PORTD.2=1; PORTD.1=0; break;
case 8: PORTB=~znak[13]; PORTD.3=1; PORTD.2=0; break;
}
}
}
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
PORTB=0x80;
DDRB=0x7F;
PORTD=0x7F;
DDRD=0x0F;
UCSRA=0x00;
UCSRB=0x00;
UCSRC=0x00;
UBRRH=0x00;
UBRRL=0x00;
TCCR0A=0x00;
TCCR0B=0x03;
TCNT0=0x00;
TIMSK=0x02;
#asm("sei")
InitDHT();
delay_ms(1000);
while (1)
{
#asm("cli")
PORTB=0xFF;
fase=1-fase;
ReadDHT();
#asm("sei")
if (bGlobalErr==0)
{
hex2dec(dht_dat[2]);
out[3]=des;
out[2]=ed;
hex2dec(dht_dat[0]);
out[1]=des;
out[0]=ed;
}
else
{
out[0]=10;
out[1]=10;
out[2]=10;
out[3]=10;
}
delay_ms(3000);
};
}
void InitDHT(void)
{
DDRD.6=1;
PORTD.6=1;
}
void ReadDHT(void)
{
char dht_check_sum;
char i = 0;
bGlobalErr=0;
PORTD.6=0;
delay_ms(23);
PORTD.6=1;
delay_us(40);
DDRD.6=0;
delay_us(40);
dht_in=PIND.6;
if(dht_in)
{
bGlobalErr=1;
return;
}
delay_us(80);
dht_in=PIND.6;
if(!dht_in)
{
bGlobalErr=2;
return;
}
delay_us(80);
for (i=0; i<5; i++)
dht_dat[i] = read_dht_dat();
DDRD.6=1;
PORTD.6=1;
dht_check_sum = dht_dat[0]+dht_dat[1]+dht_dat[2]+dht_dat[3];
if(dht_dat[4]!= dht_check_sum)
{bGlobalErr=3;}
};
char read_dht_dat()
{
char i = 0;
char result=0;
for(i=0; i< 8; i++)
{
while(PIND.6==0);
delay_us(30);
if (PIND.6==1) result |=(1<<(7-i));
while (PIND.6==1);
}
return result;
}
char hex2dec(char num)
{
char result=0;
char hex=num;
des=0;
ed=0;
while (hex>9)
{
hex=hex-10;
des=des+1;
}
ed=hex;
result=((des<<4)|ed);
return result;
} Попытался его переложить для меги8 и ЖКИ
Спойлер
Код: Выделить всё
#include <mega8.h>
#asm
.equ __lcd_port=0x12 ;PORTD
#endasm
#include <lcd.h>
#include <stdio.h>
#include <delay.h>
unsigned char dht_dat[5];
unsigned char H0=0, T2 =0;
unsigned char H1=1, T3 =3;
unsigned char read_dht_dat();
void InitDHT(void)
{ DDRD.3=1, PORTD.3=1; }
void ReadDHT(void)
{unsigned char RD = 0;
PORTD.3=0; delay_ms(23);
PORTD.3=1; delay_us(40);
DDRD.3=0; delay_us(200);
for (RD=0; RD<5;RD++)
dht_dat[RD] = read_dht_dat();
DDRD.3=1; PORTD.3=1;
};
char read_dht_dat()
{
unsigned char res = 0;
unsigned char result=0;
for(res=0; res< 8; res++)
{ while(PIND.3==0); delay_us(30);
if (PIND.3==1) result |=(1<<(7-res)); while (PIND.3==1); }
return result;
}
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
}
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
// TCNT1H=0;
// TCNT1L=0;
}
void main(void)
{
PORTB=0b00000000;
DDRB=0b00000000;
PORTC=0b00000000; //
DDRC=0b00000000;
PORTD=0b00000000; //
DDRD=0b00000000;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x1E;
OCR1AL=0x85;
OCR1BH=0x00;
OCR1BL=0x00;
MCUCR=0x00;
TIMSK=0x11;
ACSR=0x80;
SFIOR=0x00;
lcd_init(16);
InitDHT();
delay_ms(100);
lcd_gotoxy(0,0);
lcd_putsf(" error ");
// Watchdog Timer initialization
// Watchdog Timer Prescaler: OSC/2048k
#pragma optsize-
WDTCR=0x1F;
WDTCR=0x0F;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
#asm("sei")
while (1)
{
// #asm("wdr"); //Сбрасываем счетчик WDT
ReadDHT();
H0= dht_dat[0];
T2= dht_dat[2];
H1-- ; // инкрементирруем
T3++;
lcd_gotoxy(0,0);
lcd_putsf("T2=");
lcd_putchar((T2/100)%10+0x30);
lcd_putchar((T2/10)%10+0x30);
lcd_putchar(T2%10+0x30);
lcd_putsf(" T3=");
lcd_putchar((T3/100)%10+0x30);
lcd_putchar((T3/10)%10+0x30);
lcd_putchar(T3%10+0x30);
lcd_gotoxy(0,1);
lcd_putsf("H0=");
lcd_putchar((H0/100)%10+0x30);
lcd_putchar((H0/10)%10+0x30);
lcd_putchar(H0%10+0x30);
lcd_putsf(" H1=");
lcd_putchar((H1/100)%10+0x30);
lcd_putchar((H1/10)%10+0x30);
lcd_putchar(H1%10+0x30);
delay_ms(200);
};
}
Но тут меня ожидала засада не получается сделать счет секундных импульсов таймером TIM1_COMPA
Очевидно дело в настройке задержками тут я потратил много времени но все пока впустую, эта часть кода что для меги 8 измерения производит, но не больше.... добавить какие либо функции в программу больше не получается, DHT11 уходит в ступор...
Подскажите что в энтом коде можно сделать так чтобы он работал более стабильно (как например ds18b20), или укажите на еще какойнибудь благополучный пример использования DHT11 в CodeVisionAV....