<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=14139&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-10T00:46:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14139&amp;mode</id>
<entry>
<author><name><![CDATA[konradxb]]></name></author>
<updated>2016-01-10T00:46:02+01:00</updated>
<published>2016-01-10T00:46:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14139&amp;p=150127#p150127</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14139&amp;p=150127#p150127"/>
<title type="html"><![CDATA[Problem z DHT11]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14139&amp;p=150127#p150127"><![CDATA[
Witam wszystkich. Jestem szczęśliwym posiadaczem procesora ATmega328P-PU. Ostatnio próbowałem się dostać do czujnika DHT11 i skorzystałem przy okazji z gotowego programu umieszczonego na pewnym blogu. Jak zapewniał autor dane powinny być dostępne w tabilcy data[], niestety ja nie potrafię się do nich dostać. Ustawiłem swój timer, dodatkowo zamieściłem bibliotekę do obsługi wyświetlacza LCD i jedyna dana jaką uzyskuję to 0. Stąd moje pytanie, gdzie może być ewentualny błąd i co źle robię? Dużo ludzi pisało, że obsługa tego czujnika jest bardzo prosta, niestety mi przyspożyła sporo problemów. Pozdrawiam i z góry dziękuję za odpowiedź <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Poniżej załączam kod:<br />PS sprawdzałem czujnik pod Arduino i jest sprawny.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 5 sty 2016<br /> *      Author: Konrad<br /> */<br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdint.h&gt;<br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br />#define LED_DIR_SET_OUT DDRB|=(1&lt;&lt;PB0) //port PB0 jako wyjscie<br />#define LED_ON PORTB|=(1&lt;&lt;PB0) //port PB0 podciagniety do zasilania<br />#define LED_OFF PORTB&amp;=~(1&lt;&lt;PB0) // ustaw stan niski na PB0<br />#define LED_TOGGLE PORTB^=(1&lt;&lt;PB0) // zmien stan na PB0<br />#define DHT_PORT PORTB<br />#define DHT_PIN PB1<br />#define DHT_DIR DDRB<br />#define DHT_PIN_STATE PINB<br /><br />//#define F_CPU 1000000UL<br /><br />void init_dht(void);<br />uint8_t fetchData(uint8_t* arr);<br /><br /><br />int main(void)<br />{<br />// ****** inicjalizacja *********<br />d_led_init();   // inicjalizacja wyświetlacza multipleksowanego<br />sei();// włączenie globalnego zezwolenia na przerwania<br />uint8_t data&#91;4&#93;;<br />uint8_t tempka;<br />//uint8_t wilgotnosc;<br />init_dht();<br />uint8_t d1,d2; //2 liczby na wyswietlaczu<br />//**********************  pętla główna<br />while(1)<br />{<br /><br />if (fetchData(data)) {<br /><br />tempka= data&#91;2&#93;;<br />d1=((tempka/5)/10);<br />if(d1) cy1=d1;<br />else cy1=NIC; // nic się nie wyświetli na wyświetlaczu<br />d2=((tempka/5)%10);<br />if(d2) cy2=d2;<br />else cy2=NIC;<br /><br />   //tutaj dostępne są dane w postaci tablicy data&#91;&#93;<br />}<br />return 0;<br />}<br />}<br /><br />void init_dht(void) //done<br />{<br />/* Set LED as output */<br />LED_DIR_SET_OUT;<br />/* Zgodnie z datasheet DHT11 potrzebuje jakieś 1 do 2 sekund<br /> * po włączeniu zasilania dla osiągnięcia stanu stabilnego<br /> */<br />_delay_ms(2000);<br />LED_ON;<br />_delay_ms(1000);<br />}<br /><br />uint8_t fetchData(uint8_t* arr)<br />{<br />uint8_t data&#91;5&#93;;<br />uint8_t cnt, check;<br />int8_t i, j;<br /><br />/******************* Inicjalizacja  *******************/<br /><br />/* Ustaw pin danych jako wyjście */<br />DHT_DIR |= (1 &lt;&lt; DHT_PIN);<br /><br />//TCCR1B = 0; //zerujemy licznik<br />TCCR1B |= (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10); //preskaler 1024<br />//TCCR1B= 0x05;<br />TIMSK1 |= (1&lt;&lt;TOIE1); //overflow przepelnienie<br />TCNT1L = 0; //licz do 20 dla 20ms (przy clk=1000000Hz)<br /><br />/* stan niski na 20 ms */<br />DHT_PORT &amp;= ~(1 &lt;&lt; DHT_PIN);<br /><br />/* czekaj około 20 ms */<br />while (TCNT1L &lt; 20);<br />///////////////////////////////////////////////////////////////////////<br />/* Teraz ustaw Timer0 z preskalerem clk/1 */<br />//TCCR1B=0; // zerujemy licznik<br />TCCR1B |= (1&lt;&lt;CS20); // preskaler 1<br />//TCCR1B=0x01;<br />TIMSK1 |= (1&lt;&lt;TOIE1);<br />TCNT1L = 0;<br /><br />/* Stan wysoki */<br />DHT_PORT ^= (1 &lt;&lt; DHT_PIN);<br /><br />/* Ustaw pin danych jako wejście */<br />DHT_DIR &amp;= ~(1 &lt;&lt; DHT_PIN);<br /><br />/* Czekaj na odpowiedź z sensora 20-40µs */<br />while (DHT_PIN_STATE &amp; (1 &lt;&lt; DHT_PIN)) {<br />if (TCNT1L &gt;= 60)<br />return 0;    // 60us --&gt; TCNT0 musi liczyć do 60 z 1000000CPU_CLK<br />}<br />/************************* Rozpoczęcie transmisji *************************/<br /><br />TCNT1L = 0;<br /><br />/* Czekamy aż sensor odpowie. Najpierw stan niski ~80µs */<br />while (!(DHT_PIN_STATE &amp; (1 &lt;&lt; DHT_PIN))) {<br />if (TCNT1L &gt;= 100)<br />return 0;    //jeśli więcej niż 100us, fail<br />}<br /><br />TCNT1L = 0;<br /><br />/* Teraz stan wysoki: ~80µs */<br />while (DHT_PIN_STATE &amp; (1 &lt;&lt; DHT_PIN)) {<br />if (TCNT1L &gt;= 100)<br />return 0; //if more than 100us - fail<br />}<br /><br />/********************* Przesył danych **********************/<br /><br />for (i = 0; i &lt; 5; ++i) {<br />for (j = 7; j &gt;= 0; --j) {<br />TCNT1L = 0;<br /><br />/* Najpierw 50µs stanu niskiego */<br />while (!(DHT_PIN_STATE &amp; (1 &lt;&lt; DHT_PIN))) {<br />if (TCNT1L &gt;= 70)<br />return 0;            //70us<br />}<br /><br />TCNT1L = 0;<br /><br />/* Teraz dane. 26 to 28µs stanu wysokiego wskazuje<br /> zero, a około 70µs to wysłana jedynka */<br /><br />while (DHT_PIN_STATE &amp; (1 &lt;&lt; DHT_PIN)) {<br />if (TCNT1L &gt;= 90)<br />return 0;            //90us<br />}<br /><br />/* Żeby nie psuć zmiennej TCNT1, skopiujemy ją sobie */<br />cnt = TCNT1L;<br /><br />if (cnt &gt;= 20 &amp;&amp; cnt &lt;= 35) {       //pomiędzy 20 i 35us<br />data&#91;i&#93; &amp;= ~(1 &lt;&lt; j); //ustaw zero<br />}<br />else if (cnt &gt;= 60 &amp;&amp; cnt &lt;= 80) { //pomiędzy 60 and 80us<br />data&#91;i&#93; |= (1 &lt;&lt; j); //jedynka<br />}<br /><br />else return 0;<br />}<br />}<br /><br /><br />/********************* Zakończenie komunikacji, CRC *********************/<br /><br />check = (data&#91;0&#93; + data&#91;1&#93; + data&#91;2&#93; + data&#91;3&#93;) &amp; 0xFF;<br /><br />if (check != data&#91;4&#93;)<br />return 0;<br /><br />for (i = 0; i &lt; 4; ++i)<br />{ arr&#91;i&#93; = data&#91;i&#93;; }<br />return 1;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12355">konradxb</a> — 10 sty 2016, o 00:46</p><hr />
]]></content>
</entry>
</feed>