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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-31T19:32:16+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=14137&amp;mode</id>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-31T19:32:16+01:00</updated>
<published>2016-01-31T19:32:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152226#p152226</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152226#p152226"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152226#p152226"><![CDATA[
Udało mi się napisać coś takiego:<br />[syntax=c]if( 2 == (sekundy%3) ) {<br />if (  (DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits)) )<br />{<br />a=subzero;<br />b=cel;<br />c=cel_fract_bits;<br />}<br />else<br />{<br /><br />                };<br /><br />if( (DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits)) )<br />{<br />d=subzero;<br />e=cel;<br />f=cel_fract_bits;<br /><br />}<br />else<br />{<br /><br />};<br /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br /><br />} /* koniec sprawdzania flagi */<br />if( !key_lock &amp;&amp; !(PIND &amp; KEY1 ) )<br />   {<br />   key_lock=1;<br />   // reakcja na PRESS (wcinięcie przycisku)<br />   LED1_TOG;<br />   cy1 = (d == 1 ? MINUS : NIC);<br />   cy2 = (e &lt; 10 ? NIC : e/10);<br />   cy3 = ((e)%10);// + 10;         // jedności temperatury (cy2 z kropką) (cel) % 10<br />   cy4 = f;          // część dziesiętna stopnia<br />   } else if( key_lock &amp;&amp; (PIND &amp; KEY1 ) )<br />   {<br />   key_lock++;<br />   cy1 = (a == 1 ? MINUS : NIC);<br />   cy2 = (b &lt; 10 ? NIC : b/10);<br />   cy3 = ((b)%10);// + 10;         // jedności temperatury (cy2 z kropką) (cel) % 10<br />   cy4 = c;          // część dziesiętna stopnia<br />   }[/syntax]<br />.....teraz sytuacja wygląda tak: temperatura z czujnika 2 wyświetla się w momencie naciśnięcia przycisku. (co nawet mi odpowiada)...martwi mnie natomiast, że temperatura z czujnika 1 &quot;nie aktualizuje się&quot;....<br /><br />co do kodu: te zmienne a,b,c...to tak na chwile, później bedą zmienione na odpowiednie nazwy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 31 sty 2016, o 19:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2016-01-31T13:57:45+01:00</updated>
<published>2016-01-31T13:57:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152196#p152196</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152196#p152196"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152196#p152196"><![CDATA[
Może przedstaw, co napisałeś w programie.<br />Napisz, co to oznacza, że nie działa.<br />Zmienne cel itp. non stop są nadpisywane.<br />Ja bym to zrobił tak:<br />- odczyt z 1 czujnika<br />- przypisanie odczytanych wartości z &quot;cel&quot; itp. do zmiennych np. &quot;temp1_cel&quot; etc.<br />-odczyt z 2 czujnika<br />- przypisanie odczytanych wartości z &quot;cel&quot; itp. do zmiennych np. &quot;temp2_cel&quot; etc.<br />-wyświetlenie danych dla temp1 lub temp2 w zależności od wciśnięcia przycisku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 31 sty 2016, o 13:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-31T13:02:22+01:00</updated>
<published>2016-01-31T13:02:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152191#p152191</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152191#p152191"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=152191#p152191"><![CDATA[
Witam ponownie....<br /><br />Testując sobie dalej 1 Wire, pomyślałem, że zrobię dwa DS18b20, które wyświetlane są na jednym wyświetlaczu 7-seg. Wyświetlanie temp zmieniałbym za pomocą przycisku.<br /><br />Napisałem taki oto program: <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />//Dodanie biblioteki odczytu DS18b20<br />#include &quot;1Wire/ds18x20.h&quot;<br />//SPI<br />#define MOSI (1&lt;&lt;PB5)//A (SER IN)<br />#define SCK (1&lt;&lt;PB7)//SHIFT CLOCK (SC)<br />#define LT (1&lt;&lt;PB4)//LATCH CLOCK (LT)<br />//Zatrzask<br />#define LT_OFF PORTB |= LT<br />#define LT_ON PORTB &amp;= ~LT<br />//LED<br />#define LED1 (1&lt;&lt;PD7)<br />#define LED1_ON PORTD &amp;= ~LED1<br />#define LED1_OFF PORTD |= LED1<br />#define LED1_TOG PORTD ^= LED1<br />//Przyciski<br />#define KEY1 (1&lt;&lt;PD0)// PB1 jako przycisk 1<br />#define KEY2 (1&lt;&lt;PD1)// PB2 jako przycisk 2<br />#define KEY_DOWN1 !(PIND &amp; KEY1) //makro sprawdzające, czy jest stan niski<br />#define KEY_DOWN2 !(PIND &amp; KEY2) //makro sprawdzające, czy jest stan niski<br />//Wygaszenie 7-seg<br />#define NIC 10<br />#define KR11<br />#define MINUS 12<br />//definicje zmiennych globalny przechowujących  cyfry do wyświetlenia<br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br />//definicje funkcji<br />void InitSpi(void);<br />void SendSpi( uint8_t wysw , uint8_t segment );<br />//Tablica wyświetlaczy<br />const uint8_t wysw&#91;4&#93; PROGMEM = {<br />0x0E,// wysw 1<br />0x0D,// wysw 2<br />0x0B,// wysw 3<br />0x07,// wysw 4<br />};<br />//Tablica segmentów<br />const uint8_t segment&#91;15&#93; PROGMEM = {<br />0xC0,// 0<br />0xF9,// 1<br />0xA4,// 2<br />0xB0,// 3<br />0x99,// 4<br />0x92,// 5<br />0x82,// 6<br />0xF8,// 7<br />0x80,// 8<br />0x90,// 9<br />0xFF,//NIC<br />0x7F,//kropka<br />0xBF,// minus<br />};<br />//definicja wyświetlania temperatury<br />void display_temp1(uint8_t x);<br />void display_temp2(uint8_t y);<br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br /><br />uint8_t subzero, cel, cel_fract_bits;<br />uint8_t key_lock;<br />uint8_t a,b;<br /><br />int main( void ) {<br /><br />//PortD jako wyjście<br />DDRD |=LED1;<br />//Wygaszenie LED<br />LED1_OFF;<br />PORTD |= KEY1|KEY2; //podciagnięcie linii klawiszy do VCC<br />//Wyświetlenie znaków na 7-seg<br />cy1=NIC;<br />cy2=NIC;<br />cy3=NIC;<br />cy4=NIC;<br />//inicjalizacja SPI<br />InitSpi();<br />//Wygaszenie 7-seg<br />SendSpi( 0xFF , 0xFF );<br />//ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01); //tryb ctc<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00) ;//preskaler 1024<br />OCR0 = 3; //dodatkowy podział przez 38 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE0); //zezwolenie na przerwanie COMPARE MATCH<br />//ustawienie TIMER2<br />TCCR2 |= (1&lt;&lt;WGM21); //tryb ctc<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20) ;//preskaler 1024<br />OCR2 = 7; //dodatkowy podział przez 38 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE2); //zezwolenie na przerwanie COMPARE MATCH<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury<br /> * do wszystkich czujników na magistrali 1Wire<br /> * zakładając, że zasilane są w trybie NORMAL,<br /> * gdyby był to tryb Parasite, należałoby użyć<br /> * jako pierwszego prarametru DS18X20_POWER_PARASITE */<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />/* wyświetlamy temperaturę gdy czujnik wykryty */<br />//if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />//else {<br />//lcd_locate(1,0);<br />//lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />//}<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />//if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />//else {<br />//lcd_locate(1,9);<br />//lcd_str(&quot; error &quot;);<br />//}<br /><br />//zezwolenie na przerwania<br />sei();<br /><br />//pętla główna<br />while(1)<br />{<br /><br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />//LED1_TOG;<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) {<br /><br />uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />czujniki_cnt = search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />//lcd_locate(0,8);<br />//lcd_int( czujniki_cnt );// wyświetlamy ilość czujników na magistrali<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br />*  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br />*  to pokaż komunikat o błędzie<br />    */<br />if( 2 == (sekundy%3) ) {<br />if (  (DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits)) )<br />{<br />a=0;<br />}<br />else<br />{<br /><br />                };<br /><br />if( (DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits)) )<br />{<br />a=0;<br />}<br />else<br />{<br /><br />};<br /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br /><br />} /* koniec sprawdzania flagi */<br />if ((KEY_DOWN1) &amp;&amp; (a==0))<br />{<br />cy1 = NIC;<br />cy2 = NIC;<br />cy3 = NIC;<br />cy4 = NIC;<br />cy4 = MINUS;<br />} else<br />{<br /> display_temp1(0);<br />}<br /><br /><br />}<br />}<br /><br />//wyświetlanie temperatury na 7-seg<br />void display_temp1(uint8_t x){<br />cy1 = (subzero == 1 ? MINUS : NIC);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */<br />cy2 = (cel &lt; 10 ? NIC : cel/10);<br />cy3 = ((cel)%10);// + 10;         // jedności temperatury (cy2 z kropką) (cel) % 10<br />cy4 = (cel_fract_bits);          // część dziesiętna stopnia<br />}<br />void display_temp2(uint8_t y){<br />cy1 = (subzero == 1 ? MINUS : NIC);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */<br />cy2 = (cel &lt; 10 ? NIC : cel/10);<br />cy3 = ((cel)%10);// + 10;         // jedności temperatury (cy2 z kropką) (cel) % 10<br />cy4 = (cel_fract_bits);          // część dziesiętna stopnia<br />}<br /><br />//Funkcja - wysyłanie do rejestrów<br />void SendSpi( uint8_t segment , uint8_t wysw ) {<br />    SPDR = segment;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />    SPDR = wysw;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />LT_OFF;<br /><br />LT_ON;<br />}<br />//Funkcja - inicjalizacja SPI<br />void InitSpi(void) {<br />DDRB |= MOSI|SCK|LT; // piny SPI jako wyjścia<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR); // włącz SPI i ustaw Master<br />SPSR |= (1&lt;&lt;SPI2X); // fosc/2<br />}<br />//Timer0 - timer do wyświetlacza 7-seg.<br />ISR(TIMER0_COMP_vect){<br /><br />static uint8_t licznik = 0;<br /><br />if(licznik == 0) SendSpi(pgm_read_byte(&amp;wysw&#91;0&#93;),(pgm_read_byte(&amp;segment&#91;cy1&#93;)));<br />else if(licznik == 1) SendSpi(pgm_read_byte(&amp;wysw&#91;1&#93;),(pgm_read_byte(&amp;segment&#91;cy2&#93;)));<br />else if(licznik == 2) SendSpi(pgm_read_byte(&amp;wysw&#91;2&#93;),(pgm_read_byte(&amp;segment&#91;cy3&#93;))&amp; ~(1&lt;&lt;7));<br />else if(licznik == 3) SendSpi(pgm_read_byte(&amp;wysw&#91;3&#93;),(pgm_read_byte(&amp;segment&#91;cy4&#93;)));<br />licznik++;<br />if(licznik &gt; 3) licznik = 0;<br />}<br />//Timer2 - timer do DS18b20<br />ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Działa w takim stopniu: temperatura się wyświetla i jeżeli nacisnę przycisk to wyświetla się minus. <br /><br />Teraz chciałem dodać warunek:<br />[syntax=c]display_temp2();[/syntax]<br />zamiast tego minusa i już  nie działa....<br />Próbowałem różne kombinacje i już zaczynam się zniechęcać....<br /><br />Czy ten sposób jest w ogóle prawidłowy, czy trzeba jakiś inny wykombinować?<br />Próbował ktoś robić coś podobnego?Podrzucicie jakieś metody?<br />Pomożecie? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 31 sty 2016, o 13:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-20T20:44:58+01:00</updated>
<published>2016-01-20T20:44:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151225#p151225</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151225#p151225"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151225#p151225"><![CDATA[
Kropkę musisz dodać w momencie wystawiania cyfry w przerwaniu TIMER0_COMP (dla licznik == 2).<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />O nie byłem pierwszy <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Kropkę jest zdefiniowana w [syntax=c]//Tablica segmentów<br />const uint8_t segment&#91;15&#93; PROGMEM = {<br />        0xC0,   // 0<br />        0xF9,   // 1<br />        0xA4,   // 2<br />        0xB0,   // 3<br />        0x99,   // 4<br />        0x92,   // 5<br />        0x82,   // 6<br />        0xF8,   // 7<br />        0x80,   // 8<br />        0x90,   // 9<br />        0xFF,   //NIC<br />        0x7F    //kropka<br />};[/syntax]<br />więc warto z tego skorzystać z tej definicji i dać pobierania z segment [syntax=c]else if(licznik == 2) SendSpi( pgm_read_byte(&amp;wysw&#91;2&#93;), pgm_read_byte(&amp;segment&#91;cy3&#93;) &amp; pgm_read_byte(&amp;segment&#91;11&#93;) ) ;[/syntax]<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 20 sty 2016, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-20T20:40:36+01:00</updated>
<published>2016-01-20T20:40:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151224#p151224</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151224#p151224"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151224#p151224"><![CDATA[
Jeśli chcesz wyświetlić kropkę tylko na 3 wyświetlaczu to spróbuj zrobić tak<br />[syntax=c]ISR(TIMER0_COMP_vect){<br /> <br />        static uint8_t licznik = 0;<br /> <br />        if(licznik == 0) SendSpi( pgm_read_byte(&amp;wysw&#91;0&#93;), pgm_read_byte(&amp;segment&#91;cy1&#93;) );<br />        else if(licznik == 1) SendSpi( pgm_read_byte(&amp;wysw&#91;1&#93;), pgm_read_byte(&amp;segment&#91;cy2&#93;) );<br />        else if(licznik == 2) SendSpi( pgm_read_byte(&amp;wysw&#91;2&#93;), pgm_read_byte(&amp;segment&#91;cy3&#93;) &amp; ~(1&lt;&lt;7) ) ;    //włączamy ósmy segment <br />        else if(licznik == 3) SendSpi( pgm_read_byte(&amp;wysw&#91;3&#93;), pgm_read_byte(&amp;segment&#91;cy4&#93;) );<br />        licznik++;<br />        if(licznik &gt; 3) licznik = 0;<br />}[/syntax]<br /><br />Jeśli kropka miałby być wyświetlana na dowolnym wyświetlaczu to trzeba by zrobić np. tak jak opisałem w tym temacie <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7744.html?hilit=Kropka%20na%20wy%C5%9Bwietlaczu#p87600" >topic7744.html?hilit=Kropka%20na%20wy%C5%9Bwietlaczu#p87600</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 20 sty 2016, o 20:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-20T19:27:36+01:00</updated>
<published>2016-01-20T19:27:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151217#p151217</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151217#p151217"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=151217#p151217"><![CDATA[
Poradziłem sobie z wyświetlaniem minusa<br />[syntax=c]cy1 = (subzero == 1 ? MINUS : NIC);[/syntax]<br /><br />...,pozostał temat wyświetlenia kropki na 3 wyśw.<br /><br />[syntax=c]cy3 = ((cel) % 10);[/syntax]<br /><br />pomocy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 20 sty 2016, o 19:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-17T12:57:28+01:00</updated>
<published>2016-01-17T12:57:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150833#p150833</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150833#p150833"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150833#p150833"><![CDATA[
Forumowicze, mam jeszcze jeden ostatni problem.....<br /><br />Po podłączeniu 1-Wire oraz wyświetlacza 7-seg przez 2 rejestry 74HC595 (jeden do segemntów,drugi anody przez tranzystory) oraz połączeniu dwóch programów, temperatura wyświetla się na 3 wyświetlaczach. Tyle, że na 1 pierwszym wyświetlaczu (tam gdzie powinien zapalać się minus, lub nic) pojawiają się krzaki. Problem mam też, z kropką na 3 wyświetlaczu. O ile przy połączeniu tranzystorów sterujących anodami wyświetlacza do pinów mikrokontrolera wystarczyło umieścić w przerwaniu taką linijkę<br />[syntax=c]else if (licznik==4) LED_DATA = (pgm_read_byte ( &amp;cyfry&#91;cy3&#93; ) &amp; ~(1&lt;&lt;PA7)) ;[/syntax]<br /> (PA7 to kropka), tak przy wysyłaniu przez SPI nie wiem jak wysłać te dodatkowe bity....<br /><br />Domyślam się natomiast, że problem z pierwszym wyświetlaczem może być tutaj:<br />[syntax=c]//wyświetlanie temperatury na 7-seg<br />void display_temp(uint8_t x) {<br /> cy1 = (subzero == 1 ? 21 : 22);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */<br /> cy2 = (cel &lt; 10 ? 22 : cel/10);  /* jeżeli temp&lt;10 stopni to puste miejsce (22), gdy inaczej dziesiątki temperatury */<br /> cy3 = ((cel) % 10);// + 10;         // jedności temperatury (cy2 z kropką)<br /> cy4 = (cel_fract_bits);          // część dziesiętna stopnia<br />}[/syntax]<br /><br />a konkretnie:<br />[syntax=c]cy1 = (subzero == 1 ? 21 : 22);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */[/syntax]<br /><br />Przyznaje się bez bicia, że taki sposób znalazłem gdzieś na forum, ale skoro do poprzednich ćwiczeń działało bezbłędnie, więc bałem się tego zapisu ruszać....<br /><br />Wrzucam jeszcze cały kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />//SPI<br />#define MOSI (1&lt;&lt;PB5)//A (SER IN)<br />#define SCK (1&lt;&lt;PB7)//SHIFT CLOCK (SC)<br />#define LT (1&lt;&lt;PB4)//LATCH CLOCK (LT)<br />//Zatrzask<br />#define LT_OFF PORTB |= LT<br />#define LT_ON PORTB &amp;= ~LT<br />//LED<br />#define LED1 (1&lt;&lt;PD7)<br />#define LED1_ON PORTD &amp;= ~LED1<br />#define LED1_OFF PORTD |= LED1<br />#define LED1_TOG PORTD ^= LED1<br />//Wygaszenie 7-seg<br />#define NIC 10<br />//definicje zmiennych globalny przechowujących  cyfry do wyświetlenia<br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br />//definicje funkcji<br />void InitSpi(void);<br />void SendSpi( uint8_t wysw , uint8_t segment );<br />//Tablica wyświetlaczy<br />const uint8_t wysw&#91;4&#93; PROGMEM = {<br />0x0E,// wysw 1<br />0x0D,// wysw 2<br />0x0B,// wysw 3<br />0x07,// wysw 4<br />};<br />//Tablica segmentów<br />const uint8_t segment&#91;15&#93; PROGMEM = {<br />0xC0,// 0<br />0xF9,// 1<br />0xA4,// 2<br />0xB0,// 3<br />0x99,// 4<br />0x92,// 5<br />0x82,// 6<br />0xF8,// 7<br />0x80,// 8<br />0x90,// 9<br />0xFF,//NIC<br />0x7F//kropka<br />};<br />//definicja wyświetlania temperatury<br />void display_temp(uint8_t x);<br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main( void ) {<br /><br />//PortD jako wyjście<br />DDRD |=LED1;<br />//Wygaszenie LED<br />LED1_OFF;<br />//Wyświetlenie znaków na 7-seg<br />cy1=NIC;<br />cy2=NIC;<br />cy3=NIC;<br />cy4=NIC;<br />//inicjalizacja SPI<br />InitSpi();<br />//Wygaszenie 7-seg<br />SendSpi( 0xFF , 0xFF );<br />//ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01); //tryb ctc<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00) ;//preskaler 1024<br />OCR0 = 3; //dodatkowy podział przez 38 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE0); //zezwolenie na przerwanie COMPARE MATCH<br />//ustawienie TIMER2<br />TCCR2 |= (1&lt;&lt;WGM21); //tryb ctc<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20) ;//preskaler 1024<br />OCR2 = 7; //dodatkowy podział przez 38 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE2); //zezwolenie na przerwanie COMPARE MATCH<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury<br /> * do wszystkich czujników na magistrali 1Wire<br /> * zakładając, że zasilane są w trybie NORMAL,<br /> * gdyby był to tryb Parasite, należałoby użyć<br /> * jako pierwszego prarametru DS18X20_POWER_PARASITE */<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />/* wyświetlamy temperaturę gdy czujnik wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />//else {<br />//lcd_locate(1,0);<br />//lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />//}<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />//else {<br />//lcd_locate(1,9);<br />//lcd_str(&quot; error &quot;);<br />//}<br /><br />//zezwolenie na przerwania<br />sei();<br /><br />//pętla główna<br />while(1)<br />{<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />LED1_TOG;<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) {<br /><br />uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />czujniki_cnt = search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />//lcd_locate(0,8);<br />//lcd_int( czujniki_cnt );// wyświetlamy ilość czujników na magistrali<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br />*  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br />*  to pokaż komunikat o błędzie<br />    */<br />if( 2 == (sekundy%3) ) {<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />                //else {<br />                //lcd_locate(1,0);<br />                //lcd_str(&quot; error &quot;);<br />                //}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />//else {<br />//lcd_locate(1,9);<br />//lcd_str(&quot; error &quot;);<br />}<br /><br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br /><br />}<br />}<br /><br />//wyświetlanie temperatury na 7-seg<br />void display_temp(uint8_t x) {<br /> cy1 = (subzero == 1 ? 21 : 22);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */<br /> cy2 = (cel &lt; 10 ? 22 : cel/10);  /* jeżeli temp&lt;10 stopni to puste miejsce (22), gdy inaczej dziesiątki temperatury */<br /> cy3 = ((cel) % 10);// + 10;         // jedności temperatury (cy2 z kropką)<br /> cy4 = (cel_fract_bits);          // część dziesiętna stopnia<br /><br />}<br />//Funkcja - wysyłanie do rejestrów<br />void SendSpi( uint8_t segment , uint8_t wysw ) {<br />    SPDR = segment;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />    SPDR = wysw;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />LT_OFF;<br /><br />LT_ON;<br />}<br />//Funkcja - inicjalizacja SPI<br />void InitSpi(void) {<br />DDRB |= MOSI|SCK|LT; // piny SPI jako wyjścia<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR); // włącz SPI i ustaw Master<br />SPSR |= (1&lt;&lt;SPI2X); // fosc/2<br />}<br />//Timer0<br />ISR(TIMER0_COMP_vect){<br /><br />static uint8_t licznik = 0;<br /><br />if(licznik == 0) SendSpi(pgm_read_byte(&amp;wysw&#91;0&#93;),(pgm_read_byte(&amp;segment&#91;cy1&#93;)));<br />else if(licznik == 1) SendSpi(pgm_read_byte(&amp;wysw&#91;1&#93;),(pgm_read_byte(&amp;segment&#91;cy2&#93;)));<br />else if(licznik == 2) SendSpi(pgm_read_byte(&amp;wysw&#91;2&#93;),(pgm_read_byte(&amp;segment&#91;cy3&#93;)));<br />else if(licznik == 3) SendSpi(pgm_read_byte(&amp;wysw&#91;3&#93;),(pgm_read_byte(&amp;segment&#91;cy4&#93;)));<br />licznik++;<br />if(licznik &gt; 3) licznik = 0;<br />}<br />//Timer2<br />ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Pomoże ktoś??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 17 sty 2016, o 12:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-16T00:55:56+01:00</updated>
<published>2016-01-16T00:55:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150733#p150733</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150733#p150733"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150733#p150733"><![CDATA[
W tablicy segment[] ostatnia komórka ma wartość 0xff. Wystarczy tą wartość wysłać na piny segmentów żeby je zgasić. <br />Wpisz wartość 10 do zmiennych cy1-cy4 jeśli chcesz wszystkie wygasić. Wtedy w przerwaniu wartość 0xff zostanie wysłana na piny segmentów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 16 sty 2016, o 00:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-15T22:50:53+01:00</updated>
<published>2016-01-15T22:50:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150730#p150730</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150730#p150730"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150730#p150730"><![CDATA[
Żeby nie zakładać nowego tematy, napiszę tutaj.<br /><br />Stworzyłem sobie wyświetlacz 7seg za pomocą rejestrów przesuwnych 74hc595. Wyświetla pięknie wszystkie cyferki. Nie mogę natomiast poradzić sobie z wygaszeniem wyświetlacza....próbowałem na różne sposoby i nie wiem.<br /><br />Dodam, że jeżeli zakomentuje przerwanie i wyślę komendę <br />[syntax=c]SendSpi( 0xFF , 0xFF );[/syntax] <br />, to wyświetlacz gaśnie. <br /><br />Pomoże ktoś?? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Pozdrawiam.<br /><br />Wrzucam kod<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//hardware SPI<br />#define MOSI (1&lt;&lt;PB5)//A (SER IN)<br />#define SCK (1&lt;&lt;PB7)//SHIFT CLOCK (SC)<br />#define LT (1&lt;&lt;PB4)//LATCH CLOCK (LT)<br /><br />#define LT_OFF PORTB |= LT<br />#define LT_ON PORTB &amp;= ~LT<br /><br />#define LED1 (1&lt;&lt;PD7)<br />#define LED1_ON PORTD &amp;= ~LED1<br />#define LED1_OFF PORTD |= LED1<br />#define LED1_TOG PORTD ^= LED1<br /><br />//definicje zmiennych globalny przechowujących  cyfry do wyświetlenia<br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br /><br />void InitSpi(void);<br />void SendSpi( uint8_t wysw , uint8_t segment );<br /><br />const uint8_t wysw&#91;4&#93; PROGMEM = {<br />0x0E,// wysw 1<br />0x0D,// wysw 2<br />0x0B,// wysw 3<br />0x07,// wysw 4<br />};<br />const uint8_t segment&#91;15&#93; PROGMEM = {<br />0xC0,// 0<br />0xF9,// 1<br />0xA4,// 2<br />0xB0,// 3<br />0x99,// 4<br />0x92,// 5<br />0x82,// 6<br />0xF8,// 7<br />0x80,// 8<br />0x90,// 9<br />0xFF,//NIC<br />};<br /><br />int main( void ) {<br /><br />//PortD jako wyjście<br />DDRD |=LED1;<br />//Wygaszenie LED<br />LED1_OFF;<br /><br />cy1=1;<br />cy2=2;<br />cy3=3;<br />cy4=4;<br /><br />InitSpi();<br /><br />SendSpi( 0xFF , 0xFF );  // gasimy diody LED<br /><br />TCCR0 |= (1&lt;&lt;WGM01); //tryb ctc<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00) ;//preskaler 1024<br />OCR0 = 3; //dodatkowy podział przez 38 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE0); //zezwolenie na przerwanie COMPARE MATCH<br />sei();<br /><br />while(1)<br />{<br /> LED1_ON;<br />}<br />}<br />void SendSpi( uint8_t segment , uint8_t wysw ) {<br />    SPDR = segment;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br />    SPDR = wysw;<br />    while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />LT_OFF;<br /><br />LT_ON;<br />}<br /><br />void InitSpi(void) {<br />DDRB |= MOSI|SCK|LT; // piny SPI jako wyjścia<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR); // włącz SPI i ustaw Master<br />SPSR |= (1&lt;&lt;SPI2X); // fosc/2<br />}<br /><br />ISR(TIMER0_COMP_vect){<br /><br />static uint8_t licznik = 0;<br /><br />if(licznik == 0) SendSpi(pgm_read_byte(&amp;wysw&#91;0&#93;),(pgm_read_byte(&amp;segment&#91;cy1&#93;)));<br />else if(licznik == 1) SendSpi(pgm_read_byte(&amp;wysw&#91;1&#93;),(pgm_read_byte(&amp;segment&#91;cy2&#93;)));<br />else if(licznik == 2) SendSpi(pgm_read_byte(&amp;wysw&#91;2&#93;),(pgm_read_byte(&amp;segment&#91;cy3&#93;)));<br />else if(licznik == 3) SendSpi(pgm_read_byte(&amp;wysw&#91;3&#93;),(pgm_read_byte(&amp;segment&#91;cy4&#93;)));<br />licznik++;<br />if(licznik &gt; 3) licznik = 0;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 15 sty 2016, o 22:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-10T13:24:39+01:00</updated>
<published>2016-01-10T13:24:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150167#p150167</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150167#p150167"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150167#p150167"><![CDATA[
<div class="quotetitle">kicajek napisał(a):</div><div class="quotecontent"><br />Witam<br />&quot;Twoja&quot; sekunda trwa 0.82s czasu ziemskiego.<br /><br />Pozdr.<br /></div><br /><br /><br />Według MkAvrCalculator Timer2 - 1Mhz - 100Hz - tryb CTC Prescaler 1024 - OCR2 = 8<br /><br /><br />!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />DZIAŁA......coś mnie tknęło, żeby zmienić pin odpowiadający za czujniki na inny niż port gdzie podłączone są anody wyświetlaczy i zadziałało......<br /><br />Czyli wychodzi, że coś nie tak z maskowaniem portu Anod....chyba, że były jakieś erraty nowsze (mam BB wyd IIpopr i uzup)???<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 48 minutach ]</span></strong><br /><br />Mam jeszcze jeden mały problem.<br /><br />cy1 = (subzero == 1 ? 21 : 22);  /* jeżli subzero==1 wyświetla znak minus (21) (temp. ujemna), gdy inaczej puste miejsce (22) */<br />cy2 = (cel &lt; 10 ? 22 : cel/10);  /* jeżeli temp&lt;10 stopni to puste miejsce (22), gdy inaczej dziesiątki temperatury */<br />cy3 = ((cel) % 10) + 10;         // jedności temperatury (cy2 z kropką)<br />cy4 = (cel_fract_bits);          // część dziesiętna stopnia<br />[/syntax]<br /><br />Pierwsza i trzecia cyfra pokazują dobrze. Problem jest z drugą (pewnie coś nie tak z kropką)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 10 sty 2016, o 13:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-10T11:05:55+01:00</updated>
<published>2016-01-10T11:05:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150147#p150147</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150147#p150147"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150147#p150147"><![CDATA[
[quote=&quot;rskup&quot;]Czy także error pojawia się przy starcie programu, czyli przed włączeniem przerwań i wejściem do pętli while (1)?<br /><br />Po starcie programu temperatura wyświetla się i po chwili pojawiają się errory...<br /><br />To dlaczego samodzielnie program śmiga dla wartości OCR2=9, a połączone razem już nie....gdzie ten błąd?<br /><br /><br />Podłączyłem LEDa i ładnie mruga co 1 sekundę.....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 10 sty 2016, o 11:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2016-01-09T22:29:15+01:00</updated>
<published>2016-01-09T22:29:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150119#p150119</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150119#p150119"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150119#p150119"><![CDATA[
Witam<br />&quot;Twoja&quot; sekunda trwa 0.82s czasu ziemskiego.<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 9 sty 2016, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-01-09T21:20:05+01:00</updated>
<published>2016-01-09T21:20:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150111#p150111</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150111#p150111"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150111#p150111"><![CDATA[
Czy także error pojawia się przy starcie programu, czyli przed włączeniem przerwań i wejściem do pętli while (1)?<br /><br />-- <br />Pozdrawiam,<br />Robert<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Mnie bardziej zastanawia dlaczego kolega ma wartości do wyświetlacza zapisane w pamięci FLASH przez co w przerwaniu od multipleksowania trzeba korzystać z funkcji pgm_read() - nie warto oszczędzać tych 10 bajtów pamięci RAM kosztem takiego czegoś. Nawet sprawdziłem w BB i jest tam z ramu pobierane.<br /></div><br />Korzystanie z pamięci flash jest wykonywane jedną instrukcją asemblera LPM, więc nie jest wcale znacznie dłuższe od korzystania z RAMu. Aby mieć to w RAMie to i tak musi znaleźć się w flashu i dodatkowo być załadowane potem do RAMu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 9 sty 2016, o 21:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2016-01-09T20:01:57+01:00</updated>
<published>2016-01-09T20:01:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150098#p150098</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150098#p150098"/>
<title type="html"><![CDATA[Re: 1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150098#p150098"><![CDATA[
Po [syntax=c]if(s1_flag) {[/syntax] wstaw sobie miganie diodą i zobacz jak szybko miga<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 9 sty 2016, o 20:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Swoszaki]]></name></author>
<updated>2016-01-09T19:38:06+01:00</updated>
<published>2016-01-09T19:38:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150089#p150089</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150089#p150089"/>
<title type="html"><![CDATA[1 Wire + SEG]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14137&amp;p=150089#p150089"><![CDATA[
Mam taki problem. W ramach ćwiczeń chciałem sobie wyświetlić temperaturę z czujnika ds18b20 jednocześnie na Wyśw Segmentowym oraz LCD.(dodam, że oddzielnie oba programy działają jak należy - dowolnie wybrane cyferki na Seg sie zapalają i 1-wire pięknie pokazuje temeperaturę. <br /><br />Na początek chciałem, żeby na Seg zapalała się cyfra a temp pokazywała na LCD - wyświetleniem temp na SEG zajmę się później....<br /><br />Żeby nie obciążać procedury przerwania, rozdzieliłem sobie dwie biblioteki , do dwóch timerów (0,2).<br />Wyświetlacz działa, na czujnikach errory...Domyślam się, że coś tam się dzieję nie tak z czasem pobrania temperatury i pewnie jest to jakiś prosty błąd, ale może za długo nad tym siedzę i nie widzę gdzie.<br /><br />[syntax=c]//program do obsługi wyświetlacza 7-segment.<br /><br />#include &lt;avr/io.h&gt; //dołączenie głównego systemowego pliku nagłówkoego<br />#include &lt;avr/interrupt.h&gt; //dołączenie pliku nagłówkowego do obsługi przerwań<br />#include &quot;d_led.h&quot; //dołączenie pliku nagłówkowego (obsługa LED)<br />#include &lt;util/delay.h&gt;/*właczenie przerw czasowych delay*/<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br /><br />// definicja tablicy zawierajšcej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;15&#93; PROGMEM = {<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />~(SEG_B|SEG_C),// 1<br />~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0xFF// NIC (puste miejsce)<br />};<br /><br />void display_temp(uint8_t x);<br /><br />uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;/* licznik sekund 0-59 */<br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main (void)<br />{<br />DDRB |= (1&lt;&lt;PB7);// ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />PORTB |= (1&lt;&lt;PB7);// załączamy podświetlenie LCD - stan wysoki<br /><br />d_led_init(); //inicjalizacja wyświetlacza multipleksowanego<br />//liczba do wyświetlenia to : 123<br />cy1=0;<br />cy2=1;<br />cy3=2;<br />cy4=3;<br /><br /> //ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01); //tryb ctc<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00) ;//preskaler 1024<br />OCR0 = 3; //dodatkowy podział przez 3 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE0); //zezwolenie na przerwanie COMPARE MATCH<br /><br /> //ustawienie TIMER2<br />TCCR2 |= (1&lt;&lt;WGM21); //tryb ctc<br />TCCR2 |= (1&lt;&lt;CS22) | (1&lt;&lt;CS21) | (1&lt;&lt;CS20) ;//preskaler 1024<br />OCR2 = 8; // dodatkowy podział przez 8 - przepełnienie<br />TIMSK |= (1&lt;&lt;OCIE2); //zezwolenie na przerwanie COMPARE MATCH<br />lcd_init();/* inicjalizacja LCD */<br /><br />/* sprawdzamy ile czujników DS18xxx widocznych jest na magistrali */<br />czujniki_cnt = search_sensors();<br /><br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury<br /> * do wszystkich czujników na magistrali 1Wire<br /> * zakładając, że zasilane są w trybie NORMAL,<br /> * gdyby był to tryb Parasite, należałoby użyć<br /> * jako pierwszego prarametru DS18X20_POWER_PARASITE */<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />/* wyświetlamy temperaturę gdy czujnik wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />/* dokonujemy odczytu temperatury z pierwszego czujnika o ile został wykryty */<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<br />}<br /><br /><br />sei(); //włączenie globalnego zezwolenia na przerwania<br /><br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;  T1       T2&quot;)); /* wyświetl napisy w zerowej linii LCD */<br />//**********pętla główna programu********<br />while(1)<br />{<br />if(s1_flag) {/* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />if( 0 == (sekundy%3) ) {<br /><br />uint8_t *cl=(uint8_t*)gSensorIDs;// pobieramy wskaźnik do tablicy adresów czujników<br />for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />czujniki_cnt = search_sensors();// ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />lcd_locate(0,8);<br />lcd_int( czujniki_cnt );// wyświetlamy ilość czujników na magistrali<br />}<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />if( 1 == (sekundy%3) ) DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />/* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br /> *  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br /> *  to pokaż komunikat o błędzie<br /> */<br />if( 2 == (sekundy%3) ) {<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;0&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);<br />}<br /><br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;1&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(9);<br />else {<br />lcd_locate(1,9);<br />lcd_str(&quot; error &quot;);<br />}<br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br /><br />}<br />}<br /><br />/* wyświetlanie temperatury na pozycji X w drugiej linii LCD */<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br /><br />ISR(TIMER0_COMP_vect)<br />{<br /><br />static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0);// wygaszenie wszystkich wyświetlaczy<br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wysw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wysw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wysw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wysw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// cykliczne przełączanie kolejnej anody w każdym przerwaniu<br /><br /><br />licznik &lt;&lt;=1; // operacja cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br />if (licznik &gt;8) licznik = 1; //jeśli licznik większy niż 8 , to ustaw na 1<br />}<br /><br />ISR(TIMER2_COMP_vect)<br />{<br />static uint8_t cnt=0;/* statyczna zmienna cnt do odliczania setnych ms */<br /><br />if(++cnt&gt;99) {/* gdy licznik ms &gt; 99 (minęła 1 sekunda) */<br />s1_flag=1;/* ustaw flagę tyknięcia sekundy */<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59) sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Procesor Atmega32 Wewn 1Mhz (OCR0 i OCR2 skonfigurowane dla 200 i 100 Hz - samodzielnie działają dobrze)<br /><br />Pomożecie ?:)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3892">Swoszaki</a> — 9 sty 2016, o 19:38</p><hr />
]]></content>
</entry>
</feed>