<?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=13338&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-10-24T13:16:51+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=13338&amp;mode</id>
<entry>
<author><name><![CDATA[swiezy87]]></name></author>
<updated>2015-10-24T13:16:51+01:00</updated>
<published>2015-10-24T13:16:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13338&amp;p=143240#p143240</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13338&amp;p=143240#p143240"/>
<title type="html"><![CDATA[Kod do DS18b20 nie działa]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13338&amp;p=143240#p143240"><![CDATA[
Witam,<br /><br />Napisałem prosty kod do obsługi termometru DS18b20 na atmega 328p.<br />Moim celem było jak najprostsze uruchomienie  termometru korzystając z delay.<br />Po uruchomieniu programu w zmiennych temp1 i temp2 mam same 11111111<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;stdbool.h&gt;<br />///////////////definicja//////////////<br />#define pdswyjscieDDRC |=(1&lt;&lt;PC4); //wyjscie<br />#define pdswejscieDDRC &amp;=~(1&lt;&lt;PC4);//wejscie<br />#define pdsniskiPORTC &amp;=~(1&lt;&lt;PC4);//niski  <br />#define pdswysokiPORTC |=(1&lt;&lt;PC4); //stan wysoki<br />#define pdiniski bit_is_clear(PINC,PC4)<br />#define pdiwysoki bit_is_set(PINC,PC4)<br />//////////////////////ds zmienne//////////////////////<br />unsigned char temp1 = 0; // zmienne przechowujące wartości<br />unsigned char temp2 = 0; // odebraną z ds18b20<br />unsigned char gotowy = 0; // zmienna gotowości DS <br />///////////////////////////////////////////////////////////<br />void konfiguracja_pwm()<br />{<br />//Timer1 wyjscia<br />DDRB |=(1&lt;&lt;PB2); //OC1B OK<br />DDRB |=(1&lt;&lt;PB1); //OC1A OK<br />ICR1 = 255;      // TOP<br />TCCR1A |=(1&lt;&lt;COM1A1);//|(1&lt;&lt;COM1A0); // OK strona 105 tab 15-3. 1--1 Set OC2A on Compare Match, clear OC2A at BOTTOM, (inverting mode).<br />TCCR1A |=(1&lt;&lt;COM1B1);//|(1&lt;&lt;COM1B0); // OK<br />TCCR1A |= (1 &lt;&lt; WGM11);   // set Fast PWM mode using ICR1 as TOP<br />TCCR1B |= (1 &lt;&lt; WGM12)|(1 &lt;&lt; WGM13);<br />TCCR1B |= (1 &lt;&lt; CS10);  // 256 presc (No prescaling)*/<br /><br />//Timer0 wyjscia<br />DDRD |=(1&lt;&lt;PD5); //OC0B<br />DDRD |=(1&lt;&lt;PD6); //OC0A<br />TCCR0A |=(1&lt;&lt;COM0A1);//|(1&lt;&lt;COM0A0); // strona 105 tab 15-3. 1--1 Set OC2A on Compare Match, clear OC2A at BOTTOM, (inverting mode).<br />TCCR0A |=(1&lt;&lt;COM0B1)|(1&lt;&lt;COM0B0);<br />TCCR0A |=(1&lt;&lt;WGM01)|(1&lt;&lt;WGM00); // strona 107 tab 15-8. tryb 3 Fast PWM<br />TCCR0B |=(1&lt;&lt;CS00); // strona 109 15-9. 0--0--1 clkI/O/(No prescaling)*/<br />}<br /><br />/////////////////////////// //////////////////////////////////<br />int reset_ds(void)<br />{<br />int stan;<br />pdsniski<br />pdswyjscie<br />_delay_us(500); <br />pdswysoki<br />_delay_us(50);<br />pdswejscie<br />_delay_us(10);<br />if(pdiniski)//if odpowiedz stanem niskim<br />{stan=1;} //jest<br />else <br />{stan=0;} //brak<br />_delay_us(500);<br />return stan;<br />}<br />/////////////////////////////////////////////////////////////////////////////////////<br />void wyslij_bajt_ds(char bajt)<br />{<br />pdswyjscie<br />for (int i=0; i&lt;8; i++)<br />{<br />if (bajt &amp; 0x01)         // jeżeli trzeba wysłać 1<br /> {<br />   pdsniski            // stan niski<br />   _delay_us(2);           // czekamy 7us<br />   pdswysoki;            // stan wysoki<br />   _delay_us(60);  // czekamy do końca write time slot<br />         }<br />        else                             // jeżeli trzeba wysłać 0<br />         {<br />           pdsniski;           // stan niski<br />           _delay_us(70);         // czekamy 70us<br />           pdswysoki;            // stan wysoki<br />           _delay_us(2);           // czekamy 7us do następnego write time slot<br />         }<br /> bajt &gt;&gt;= 1;<br />}<br /><br />}<br />//////////////////////////////////////////////////////////////////////////////////////////<br />unsigned char czytaj_bajt_ds(void)<br />{<br />pdswejscie<br />unsigned char bitt=0;<br />for(int i=0; i&lt;8;i++)<br />{<br />pdsniski                             // stan niski<br />        _delay_us(2);                            // czekamy 2us<br />pdswysoki                             // stan wysoki - zwalniamy magistrale<br />        _delay_us(10);       // czekamy 10us<br />if(pdiwysoki) <br />bitt |= 0x01&lt;&lt;i;   // jeżeli stan wysoki to ustaw bit 1, <br />_delay_us(50);       <br />}<br />return bitt;<br />}<br />void wyswietl_bajt_ds(char bajt)<br />{<br />for (int i=0; i&lt;8; i++)<br />{<br />if (bajt &amp; 0x01)         <br /> {<br />   OCR1B=255;<br />   OCR1A=0;         <br />         }<br />        else                             <br />         {<br />   OCR1B=0;<br />   OCR1A=255;                 <br />         }<br /> bajt &gt;&gt;= 1;<br /> _delay_ms(1000);<br /> OCR1B=0;<br /> OCR1A=0;<br /> _delay_ms(100);<br />}<br />}<br /><br />                                                                                                                                                                                                                                                                                                                                                         <br />int main(void)<br />{<br />sei();<br />konfiguracja_pwm();<br />if(reset_ds())<br />{<br />wyslij_bajt_ds(0xCC);<br />wyslij_bajt_ds(0x44);<br />_delay_ms(740);<br />}<br />if(reset_ds())<br />{<br />wyslij_bajt_ds(0xCC);<br />wyslij_bajt_ds(0xBE);<br />temp1 = czytaj_bajt_ds(); // czytaj 2 bajty temperatury<br />temp2 = czytaj_bajt_ds(); <br />wyswietl_bajt_ds(temp1);<br />wyswietl_bajt_ds(temp2);<br />}<br />while(1)<br />{<br /><br />}<br />}[/syntax]<br /><br />Pozdrawiam.<br /><br />W chwili obecnej doszedłem do wniosku że DS nie wykonuje konwersji po wykonaniu<br />wyslij_bajt_ds(0xCC);<br />wyslij_bajt_ds(0x44);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4531">swiezy87</a> — 24 paź 2015, o 13:16</p><hr />
]]></content>
</entry>
</feed>