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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-19T19:37:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=7335&amp;mode</id>
<entry>
<author><name><![CDATA[ReaBooK]]></name></author>
<updated>2014-06-19T19:37:44+01:00</updated>
<published>2014-06-19T19:37:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=85076#p85076</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=85076#p85076"/>
<title type="html"><![CDATA[Re: Niewytłumaczalne zacinanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=85076#p85076"><![CDATA[
Pozwolę sobie napisać nowy post.<br /><br />Pogrzebałem coś w kodzie, pozamieniałem ATmegi i wszystko zaczęło się ruszać. Odczytywanie temperatury z dwóch czujników, wilgotności, jasności, a to wszystko okraszone wysyłaniem tych informacji przez Bluetooth'a. Dodaję zdjęcia z mojego lamerskiego polutowania płytki. Zostało mi jeszcze zrobić gniazdko na moduł BT i będzie gotowe <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/2939/203bdaa5d0f8488000f92b52040aeada.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2939/203bdaa5d0f8488000f92b52040aeada.JPG" alt="Obrazek" /></a><a href="http://forum.atnel.pl/_obrazki/o/2939/8bff3b4f2a09794a3910e0b067a82e3d.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2939/8bff3b4f2a09794a3910e0b067a82e3d.JPG" alt="Obrazek" /></a><a href="http://forum.atnel.pl/_obrazki/o/2939/08d7eee88cfed9150e3f5e48da5ec8e7.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/2939/08d7eee88cfed9150e3f5e48da5ec8e7.JPG" alt="Obrazek" /></a><br /><br />Ach no tak, zapomniałem jeszcze kondensatorki dolutować do kwarcu ;_;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2939">ReaBooK</a> — 19 cze 2014, o 19:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ReaBooK]]></name></author>
<updated>2014-06-08T06:47:55+01:00</updated>
<published>2014-06-08T06:47:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83681#p83681</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83681#p83681"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83681#p83681"><![CDATA[
Ograniczyłem kod i... działa. No już nie wiem o co chodzi tej ATMedze.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 07-06-2014<br /> *      Author: ReaBooK<br /> */<br /><br /><br />/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-13<br /> *       Autor: Mirosław Kardaś<br /> */<br /><br /><br />#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;PCD8544/pcd8544.h&quot;<br />#include &quot;PCD8544/bmp.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<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 temp1;<br />uint8_t temp1_fract;<br /><br />uint8_t temp2;<br />uint8_t temp2_fract;<br /><br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />DDRD |= (1&lt;&lt;PD7);// ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />PORTD |= (1&lt;&lt;PD7);<br /><br />/* ustawienie TIMER0 dla F_CPU=16MHz */<br />TCCR0A |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0A = 154;/* dodatkowy podział przez 155 (rej. przepełnienia) */<br />TIMSK0 |= (1&lt;&lt;OCIE0A);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br /><br />PCD_Ini();  // inicjacja LCD<br /><br />PCD_Contr(0xA6);  // kontrast<br />PCD_Clr();<br />PCD_Img(waitImage);  // bitmapa<br />PCD_Upd();<br />_delay_ms(1000);<br /><br />PCD_Clr();<br /><br />PCD_GotoXYFont(1,1);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;STCJA POGODOWA&quot;));<br /><br />PCD_SBar ( 0, 11, 1, 84, 1);<br />PCD_SBar ( 0, 13, 1, 84, 1); // kreseczki<br />PCD_SBar ( 0, 15, 1, 84, 1);<br /><br />PCD_Upd();<br /><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 /><br />USART_Init( __UBRR);<br />sei();/* włączamy globalne przerwania */<br /><br /><br />/* pętla nieskończona */<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 == 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(1);<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 /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}<br /><br />/* wyświetlanie temperatury na pozycji X w drugiej linii LCD */<br />void display_temp(uint8_t x) {<br /><br />if(x==1) {<br />temp1 = cel;<br />temp1_fract = cel_fract_bits;<br /><br />uart_puts(&quot;Temp wew.: &quot;);<br />uart_putint(temp1, 10);<br />uart_puts(&quot;.&quot;);<br />uart_putint(temp1_fract, 10);<br /><br />uart_puts(&quot;Temp zew.: &quot;);<br />uart_putint(temp2, 10);<br />uart_puts(&quot;.&quot;);<br />uart_putint(temp2_fract, 10);<br /><br />}<br /><br />if(x==9) {<br />temp2 = cel;<br />temp2_fract = cel_fract_bits;<br /><br /><br />}<br /><br />PCD_GotoXYFont(1,3);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp wew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />char bufor&#91;5&#93;;<br />PCD_Str( FONT_1X, itoa(temp1, bufor, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp1_fract, bufor, 10) );<br /><br />PCD_GotoXYFont(1,4);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp zew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />char bufor2&#91;5&#93;;<br />PCD_Str( FONT_1X, itoa(temp2, bufor2, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp2_fract, bufor2, 10) );<br /><br /><br /><br />//wyswietlenie reszty informacji - aktualnie tylko imitacja<br />PCD_GotoXYFont(1,5);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Wilgotnosc:65%&quot;));<br /><br />PCD_GotoXYFont(1,6);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:   768&quot;));<br /><br /><br />PCD_Upd();<br /><br /><br /><br /><br /><br /><br />}<br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMPA_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 />PORTD ^= (1&lt;&lt;PD7);<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59)<br />sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Sprawdzałem wcześniej pierwotny kod i wszystko zatrzymywało się dopiero przy sprawdzeniu czy dana rzecz została jest wysłana (sprawdzanie stanu rejestru w pętli while). Wydaje mi się to nieco dziwne.<br /><br />[offtop] Chciałbym się jeszcze przy okazji dopytać, czy można dostosować bibliotekę do AVR'a na podstawie jakiejś predefiniowanej wartości jak z F_CPU?[/offtop]<br /><br />/***********************************************/<br /><br />EDIT:<br />Skrobnąłem taki kod:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 07-06-2014<br /> *      Author: ReaBooK<br /> */<br /><br /><br />/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-13<br /> *       Autor: Mirosław Kardaś<br /> */<br /><br /><br />#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;PCD8544/pcd8544.h&quot;<br />#include &quot;PCD8544/bmp.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<br /><br />#define REF_VCC (1&lt;&lt;REFS0)<br /><br />void display_temp(uint8_t x);<br />uint16_t pomiar( uint8_t kanal );<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 temp1;<br />uint8_t temp1_fract;<br /><br />uint8_t temp2;<br />uint8_t temp2_fract;<br /><br />uint8_t wilg = 56;<br /><br />uint16_t wynik;<br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />ADCSRA = (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2);<br /><br />ADMUX  |=  REF_VCC;<br /><br />/* ustawienie TIMER0 dla F_CPU=16MHz */<br />TCCR0A |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0A = 154;/* dodatkowy podział przez 155 (rej. przepełnienia) */<br />TIMSK0 |= (1&lt;&lt;OCIE0A);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br /><br />PCD_Ini();  // inicjacja LCD<br /><br />PCD_Contr(0xA6);  // kontrast<br />PCD_Clr();<br />PCD_Img(waitImage);  // bitmapa<br />PCD_Upd();<br /><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 /><br />USART_Init( __UBRR);<br /><br />PCD_Clr();<br /><br />PCD_GotoXYFont(1,1);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;STCJA POGODOWA&quot;));<br /><br />PCD_SBar ( 0, 11, 1, 84, 1);<br />PCD_SBar ( 0, 13, 1, 84, 1); // kreseczki<br />PCD_SBar ( 0, 15, 1, 84, 1);<br /><br />PCD_Upd();<br /><br />sei();/* włączamy globalne przerwania */<br /><br /><br />/* pętla nieskończona */<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 == 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(1);<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 /><br />}<br /><br />/* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />s1_flag=0;<br />} /* koniec sprawdzania flagi */<br />} /* koniec pętli nieskończonej */<br />}<br /><br />/* wyświetlanie temperatury na pozycji X w drugiej linii LCD */<br />void display_temp(uint8_t x) {<br /><br />if(x==1) {<br />wynik = pomiar(PC5);<br />temp1 = cel;<br />temp1_fract = cel_fract_bits;<br /><br />uart_puts(&quot;Temp wew.: &quot;);<br />uart_putint(temp1, 10);<br />uart_puts(&quot;.&quot;);                        // wysylanie temp1<br />uart_putint(temp1_fract, 10);<br />uart_puts(&quot;\u00B0C&quot;);<br /><br />uart_putc( 0x0d ); // CR<br />uart_putc( 0x0a ); // LF<br /><br />uart_puts(&quot;Temp zew.: &quot;);<br />uart_putint(temp2, 10);<br />uart_puts(&quot;.&quot;);                       // wysylanie temp2<br />uart_putint(temp2_fract, 10);<br />uart_puts(&quot;\u00B0C&quot;);<br /><br />uart_putc( 0x0d ); // CR<br />uart_putc( 0x0a ); // LF<br /><br />uart_puts(&quot;Jasnosc: &quot;);<br />uart_putint(wynik, 10);               // wysylanie pomiaru z adc<br />uart_puts(&quot;/1023&quot;);<br /><br />uart_putc( 0x0d ); // CR<br />uart_putc( 0x0a ); // LF<br /><br />uart_puts(&quot;Wilgotnosc: &quot;);<br />uart_putint(wilg, 10);                // atrapa wysyłania wilgotnosci<br />uart_puts(&quot;%&quot;);<br /><br />uart_putc( 0x0d ); // CR<br />uart_putc( 0x0a ); // LF<br />uart_putc( 0x0a ); // LF<br /><br />}<br /><br />if(x==9) {<br />temp2 = cel;<br />temp2_fract = cel_fract_bits;<br /><br />}<br /><br />PCD_GotoXYFont(1,3);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp wew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />char bufor&#91;5&#93;;<br />PCD_Str( FONT_1X, itoa(temp1, bufor, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp1_fract, bufor, 10) );<br /><br /><br /><br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp zew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />PCD_Str( FONT_1X, itoa(temp2, bufor, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp2_fract, bufor, 10) );<br /><br /><br /><br />//wyswietlenie wilgotnosci - aktualnie tylko imitacja<br />PCD_GotoXYFont(1,5);<br /><br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Wilgotnosc:&quot;));<br />PCD_Str( FONT_1X, itoa(wilg, bufor, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;%&quot;));<br /><br /><br /><br />PCD_GotoXYFont(1,6);<br /><br />if(wynik &lt; 10)<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:     &quot;));<br />else {<br />if(wynik &lt; 100)<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:    &quot;));<br />else {// zabiegi, aby liczba byla przy krawedzi ekranu<br />if(wynik &lt; 1000)<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:   &quot;));<br />else<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:  &quot;));<br />}<br />}<br /><br />PCD_Str( FONT_1X, itoa(wynik, bufor, 10) );<br /><br />PCD_Upd();<br /><br /><br />}<br /><br /><br />uint16_t pomiar( uint8_t kanal ){<br /><br />ADMUX = (ADMUX &amp; 0b11111000) | kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while( ADCSRA &amp; (1&lt;&lt;ADSC) );<br />return ADCW;<br /><br />}<br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMPA_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 />PORTD ^= (1&lt;&lt;PD7);<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59)<br />sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Działa, ale tylko bezpośrednio po wgraniu kodu. Każdy restart lub wyłączenie zasilania powoduje zacinanie się kodu na głównej pętli, przerwanie, które ustawia s1_flag na 1, juz się nie wykonuje.<br />Nie wiem jak to racjonalnie wytłumaczyć, jak zawsze u mnie działa magia i zjawiska paranormalne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2939">ReaBooK</a> — 8 cze 2014, o 06:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-06-07T20:42:09+01:00</updated>
<published>2014-06-07T20:42:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83666#p83666</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83666#p83666"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83666#p83666"><![CDATA[
Przy obsłudze 1-Wire przerwania są na chwilę wyłączane. Nie sądzę, aby to był problem. Przygotuj jakiś prosty plik main z obsługą 1-Wire i usart, ale bez wyświetlacza PCD8544 to będzie można sprawdzić taki kod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 cze 2014, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ReaBooK]]></name></author>
<updated>2014-06-07T20:12:15+01:00</updated>
<published>2014-06-07T20:12:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83657#p83657</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83657#p83657"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83657#p83657"><![CDATA[
Hmm...<br />Linijkę mam zakomentowaną, a UART samodzielnie działa na innym programie. <br />Wyrzuciłem obsługę wyświetlacza, a wtedy też UART już nie działa. Czyżby to 1Wire i UART nie mogły się zakolegować?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2939">ReaBooK</a> — 7 cze 2014, o 20:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-06-07T20:02:10+01:00</updated>
<published>2014-06-07T20:02:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83656#p83656</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83656#p83656"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83656#p83656"><![CDATA[
Jak to wszystko to trop mi się urwał (myślałem, że może coś nie tak z nazwami przerwań). Możesz zrobić jeszcze 2 rzeczy.<br />1. Sprawdź czy tą linię masz &quot;zakomentowaną&quot; w pliku mkuart.h:<br />[syntax=c]// definicje na potrzeby RS485<br />//#define UART_DE_PORT PORTD[/syntax]<br />2. Uruchom tylko uart.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 cze 2014, o 20:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ReaBooK]]></name></author>
<updated>2014-06-07T19:45:52+01:00</updated>
<published>2014-06-07T19:45:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83652#p83652</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83652#p83652"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83652#p83652"><![CDATA[
[syntax=c]../main.c: In function 'display_temp':<br />../main.c:178:2: warning: pointer targets in passing argument 2 of 'PCD_Str' differ in signedness &#91;-Wpointer-sign&#93;<br />../PCD8544/pcd8544.h:76:6: note: expected 'byte *' but argument is of type 'char *'<br />../main.c:180:2: warning: pointer targets in passing argument 2 of 'PCD_Str' differ in signedness &#91;-Wpointer-sign&#93;<br />../PCD8544/pcd8544.h:76:6: note: expected 'byte *' but argument is of type 'char *'<br />../main.c:187:2: warning: pointer targets in passing argument 2 of 'PCD_Str' differ in signedness &#91;-Wpointer-sign&#93;<br />../PCD8544/pcd8544.h:76:6: note: expected 'byte *' but argument is of type 'char *'<br />../main.c:189:2: warning: pointer targets in passing argument 2 of 'PCD_Str' differ in signedness &#91;-Wpointer-sign&#93;<br />../PCD8544/pcd8544.h:76:6: note: expected 'byte *' but argument is of type 'char *'[/syntax]<br /><br />Wyrzuca te warningi, ale wyświetlanie działa ;_; Miałem zabrać się za to, ale jakoś nie miałem weny, żeby majstrować przy tym.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2939">ReaBooK</a> — 7 cze 2014, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-06-07T19:43:42+01:00</updated>
<published>2014-06-07T19:43:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83651#p83651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83651#p83651"/>
<title type="html"><![CDATA[Re: Konflikt bibliotek? SPI (PCD8544) - UART]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83651#p83651"><![CDATA[
Zrób Clean projektu potem Build i wrzuć tutaj ostrzeżenia z konsoli.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 cze 2014, o 19:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ReaBooK]]></name></author>
<updated>2014-06-09T19:07:13+01:00</updated>
<published>2014-06-07T19:32:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83647#p83647</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83647#p83647"/>
<title type="html"><![CDATA[Niewytłumaczalne zacinanie się programu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7335&amp;p=83647#p83647"><![CDATA[
Cześć, <br />tym razem zmagam się ze zrobieniem małej stacji pogodowej opartej na DS'ach18b20, wyświetlaczu PCD8544, fotorezystorze(sprawdzanie jasności, niezaimplementowane jeszcze) i DHT-11 (także jeszcze nie zrobione), a to wszystko okraszone wysyłaniem danych po UART'cie. Procesor jaki wybrałem to ATMega328P, a wyświetlacz jest od Nokii 5110.<br />Korzystam z bibliotek p. Mirka do UART'a odpowiednio przerobionej  z BB i SunRivera do wyświetlacza: <a href="http://forum.atnel.pl/topic2115.html"  class="postlink">http://forum.atnel.pl/topic2115.html</a><br />Podstawą programu jest projekt termometru 1Wire z BB także. <br /><br />Problem jest taki, że po dodaniu jakiegokolwiek polecenia procesor się zatrzymuje (w miejscu dodania), przerwanie, tykające sobie w tle, także. Nie dotyczy to oczywiście inicjalizacji, bo ona chyba jakoś idzie. Bez używania UART'a całe wyświetlanie działa poprawnie i nie mam co do tego zastrzeżeń. O co więc może tutaj chodzić?<br /><br />Wstawiam kod: <br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2010-09-13<br /> *       Autor: Mirosław Kardaś<br /> */<br /><br /><br />#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 />#include &quot;PCD8544/pcd8544.h&quot;<br />#include &quot;PCD8544/bmp.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<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 temp1;<br />uint8_t temp1_fract;<br /><br />uint8_t temp2;<br />uint8_t temp2_fract;<br /><br /><br />uint8_t subzero, cel, cel_fract_bits;<br /><br />int main(void) {<br /><br />DDRD |= (1&lt;&lt;PD7);// ustawiamy kierunek linii podświetlenia LCD jako WYJŚCIE<br />PORTD |= (1&lt;&lt;PD7);<br /><br />/* ustawienie TIMER0 dla F_CPU=16MHz */<br />TCCR0A |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);/* preskaler = 1024 */<br />OCR0A = 154;/* dodatkowy podział przez 155 (rej. przepełnienia) */<br />TIMSK0 |= (1&lt;&lt;OCIE0A);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane z częstotliwością ok 10ms (100 razy na sekundę) */<br />/* do naszych celów nie musi być to bardzo dokładne 10ms */<br /><br /><br />PCD_Ini();  // inicjacja LCD<br /><br />PCD_Contr(0xA6);  // kontrast<br /> PCD_Clr();<br />PCD_Img(waitImage);  // bitmapa<br /> PCD_Upd();<br />_delay_ms(1000);<br /><br />PCD_Clr();<br /><br />    PCD_GotoXYFont(1,1);<br />    PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;STCJA POGODOWA&quot;));<br /><br />    PCD_SBar ( 0, 11, 1, 84, 1);<br />    PCD_SBar ( 0, 13, 1, 84, 1); // kreseczki<br />    PCD_SBar ( 0, 15, 1, 84, 1);<br /><br />    PCD_Upd();<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(1);<br />else {<br />PCD_GotoXYFont(1,3);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp wew.: ERR&quot;));<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 />PCD_GotoXYFont(1,4);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp zew.: ERR&quot;));<br />}<br />USART_Init( __UBRR);<br />sei();/* włączamy globalne przerwania */<br /><br />//lcd_locate(0,0);<br />//lcd_str_P(PSTR(&quot;  T1       T2&quot;)); /* wyświetl napisy w zerowej linii LCD */<br /><br />/* pętla nieskończona */<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(1);<br />else {<br />PCD_GotoXYFont(1,3);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp wew.: ERR&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 />PCD_GotoXYFont(1,4);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp zew.: ERR&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 />} /* koniec pętli nieskończonej */<br />}<br /><br />/* wyświetlanie temperatury na pozycji X w drugiej linii LCD */<br />void display_temp(uint8_t x) {<br /><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 /><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 />if(x==1) {<br /><br />temp1 = cel;<br />temp1_fract = cel_fract_bits;<br /><br />//przypisanie temperatury z pierwszego DS'a<br /><br />}<br /><br />if(x==9) {<br /><br /><br />temp2 = cel;<br />temp2_fract = cel_fract_bits;<br /><br />//przypisanie temperatury z drugiego DS'a<br /><br />}<br /><br />PCD_GotoXYFont(1,3);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp wew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />char bufor&#91;5&#93;;<br />PCD_Str( FONT_1X, itoa(temp1, bufor, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp1_fract, bufor, 10) );<br /><br />PCD_GotoXYFont(1,4);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Temp zew.:&quot;));<br /><br />//zamiana temperatury na stringa<br />char bufor2&#91;5&#93;;<br />PCD_Str( FONT_1X, itoa(temp2, bufor2, 10) );<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;.&quot;));<br />PCD_Str( FONT_1X, itoa(temp2_fract, bufor2, 10) );<br /><br /><br /><br />//wyswietlenie reszty informacji - aktualnie tylko imitacja<br />PCD_GotoXYFont(1,5);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Wilgotnosc:65%&quot;));<br /><br />PCD_GotoXYFont(1,6);<br />PCD_FStr(FONT_1X,(unsigned char*)PSTR(&quot;Jasnosc:   768&quot;));<br /><br /><br />PCD_Upd();<br /><br />uart_puts(&quot;Temp wew.: &quot;);<br />//uart_putint(temp1, 10);<br />//uart_puts(&quot;.&quot;);<br />//uart_putint(temp1_fract, 10);<br /><br /><br />}<br /><br /><br />/* ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH */<br />/* pełni funkcję timera programowego wyznaczającego podstawę czasu = 1s */<br />ISR(TIMER0_COMPA_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 />PORTD ^= (1&lt;&lt;PD7); // miganie dioda sluzace do sprawdzenia dzialania przerwania<br />sekundy++;/* zwiększ licznik sekund */<br />if(sekundy&gt;59)<br />sekundy=0; /* jeśli ilość sekund &gt; 59 - wyzeruj */<br />cnt=0;/* wyzeru licznik setnych ms */<br />}<br />}[/syntax]<br /><br />Będę wdzięczny za udzieloną mi pomoc.<br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2939">ReaBooK</a> — 7 cze 2014, o 19:32</p><hr />
]]></content>
</entry>
</feed>