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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-03-21T21:45:02+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22057&amp;mode</id>
<entry>
<author><name><![CDATA[11jacekj]]></name></author>
<updated>2019-03-21T21:45:02+01:00</updated>
<published>2019-03-21T21:45:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217527#p217527</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217527#p217527"/>
<title type="html"><![CDATA[Re: Zegar się zatrzymuje się przy pracy z wyświetlaczem LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217527#p217527"><![CDATA[
Raczej nie o maskowanie chodzi. Po przełączeniu anod na piny portu B i zmianie tego w kodzie programu efekt jest dokładnie ten sam (oczywiście usunąłem obsługę wyświetlacza LCD).<br />Trochę pokombinowałem z Timerem który odpowiada z multipleksowanie wyświetlacza. I widzę że jeżeli zmniejszam wartość OCR czyli zwiększam częstotliwość multipleksowania to zegar się nie zawiesza, przynajmniej do tej pory ponad 10 min od ostatniego restartu zegara. Mógł by ktoś mi powiedzieć o co z tym chodzi?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12856">11jacekj</a> — 21 mar 2019, o 21:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mczarny]]></name></author>
<updated>2019-03-11T15:26:46+01:00</updated>
<published>2019-03-11T15:26:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217264#p217264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217264#p217264"/>
<title type="html"><![CDATA[Re: Zegar się zatrzymuje się przy pracy z wyświetlaczem LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217264#p217264"><![CDATA[
Zdefiniowałeś anody na porcie C. Na tym samym porcie masz szynę I2C więc powinieneś zakładać maskę na PC0-PC3 w czasie przemiatania anod wyświetlacza<br />[syntax=c]#define A1 (1&lt;&lt;PC4)                             <br />#define A2 (1&lt;&lt;PC5)                            <br />#define A3 (1&lt;&lt;PC6)                            <br />#define A4 (1&lt;&lt;PC7)                             <br /><br />#define MASKA_ANODY ( A1 | A2 | A3 | A4 )       // maska do wygaszania[/syntax]<br />a w przerwaniu<br />[syntax=c]ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (licznik &amp; MASKA_ANODY); // przełączanie anod[/syntax]<br />W <span style="color: #0000BF"><strong>BB</strong></span> masz to opisane dokładnie pod koniec rozdziału o multipleksowaniu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4651">mczarny</a> — 11 mar 2019, o 15:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[11jacekj]]></name></author>
<updated>2019-03-11T14:35:03+01:00</updated>
<published>2019-03-11T14:35:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217261#p217261</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217261#p217261"/>
<title type="html"><![CDATA[Re: Zegar się zatrzymuje się przy pracy z wyświetlaczem LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217261#p217261"><![CDATA[
Próbuję na atmedze32 bo tylko taki mam teraz. Anody mam włączone w PC4..PC7, katody zajmują cały port PA. W pliku multipleks.h tak to zdefiniowałem.<br />[syntax=c]//////////////////////////////definicja portów anod////////////////////////////////////////////////<br />#define ANODY_DIR DDRC<br />#define ANODY_PORT PORTC<br /> <br />/////////////////////////////definicja pinów anod//////////////////////////////////////////////////<br />#define ANODA1 (1&lt;&lt;PC4)<br />#define ANODA2 (1&lt;&lt;PC5)<br />#define ANODA3 (1&lt;&lt;PC6)<br />#define ANODA4 (1&lt;&lt;PC7)<br /> <br />//////////////////////////////////definicja portów segmentów///////////////////////////////////////<br />#define SEGMENTY_DIR DDRA<br />#define SEGMENTY_PORT PORTA<br /> <br />/////////////////////definicja pinów segmentów/////////////////////////////////////////////////////<br />#define SEG_A 1&lt;&lt;PA0<br />#define SEG_B 1&lt;&lt;PA1<br />#define SEG_C 1&lt;&lt;PA2<br />#define SEG_D 1&lt;&lt;PA3<br />#define SEG_E 1&lt;&lt;PA4<br />#define SEG_F 1&lt;&lt;PA5<br />#define SEG_G 1&lt;&lt;PA6<br />#define SEG_DP 1&lt;&lt;PA7[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12856">11jacekj</a> — 11 mar 2019, o 14:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2019-03-11T12:21:49+01:00</updated>
<published>2019-03-11T12:21:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217252#p217252</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217252#p217252"/>
<title type="html"><![CDATA[Re: Zegar się zatrzymuje się przy pracy z wyświetlaczem LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217252#p217252"><![CDATA[
A na jakim procku operujesz, gdzie jest podpięty LCD?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 11 mar 2019, o 12:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[11jacekj]]></name></author>
<updated>2019-03-10T21:20:22+01:00</updated>
<published>2019-03-10T21:20:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217240#p217240</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217240#p217240"/>
<title type="html"><![CDATA[Zegar się zatrzymuje się przy pracy z wyświetlaczem LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22057&amp;p=217240#p217240"><![CDATA[
Jako RTC użyłem modułu takiego jak na zdjęciu z układem DS1307. W pierwszej wersji działał tylko na wyświetlaczu LCD z biblioteką Mirka. Biblioteka I2C też ściągnąłem od Mirka tylko dostosowałem do DS1307. Dołożyłem do tego wyświetlacz LED (ze wspólną anodą). Obsługę wyświetlacza LED napisałem całkiem sam, po tym jak poczytałam BB i trochę w necie. Do puki nie było wyświetlacza LED i kodu z nim związanego zegar działał jak należy. Po tym jak dodałem LED zegar działa przez kilka, kilkanaście, kilkadziesiąt sekund, czasami kilka minut, różnie i się zatrzymuje, obydwa wyświetlacze pokazują ten sam czas. Po usunięcie z pliku main.c funkcji  led_init zegar działa poprawnie, wyświetlacz LED oczywiście nic nie pokazuje. Dodaję kod programu w wersji w której LCD pokazuje datę i godzinę na wyświetlaczu LED zwiększa się liczba od 0 do 9999, następnie liczba się zeruje i tak w kółko powinno być. Efekt zatrzymywania zegarka jest taki sam jak wtedy gdy na wyświetlaczu LED była godzina. Proszę naprowadźcie mnie gdzie zrobiłem błąd.<br /><a href="https://obrazkiforum.atnel.pl/12856/a20fb27c72db87c318d0b94ef0e96d76.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/12856/a20fb27c72db87c318d0b94ef0e96d76.jpg" alt="Obrazek" /></a><br />main.c<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;LCD/lcd44780.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MULTIPLEKS/multipleks.h&quot;<br /><br />#define DS1307_ADDR 0xD0<br /><br />volatile uint8_t int0_flag=1;// flaga zmieniana w przerwaniu i sprawdzana w pętli głównej<br /><br />volatile int anoda;<br />volatile uint16_t cnt, liczba;<br />volatile uint8_t tys, set, dzi, jed;<br /><br />const uint8_t cyfry&#91;12&#93; PROGMEM = {<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),                // 0 0x3F<br />        (uint8_t)~(SEG_B|SEG_C),                                        // 1 0x06<br />        (uint8_t)~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),                      // 2<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),                      // 3<br />        (uint8_t)~(SEG_B|SEG_C|SEG_F|SEG_G),                            // 4<br />        (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),                      // 5<br />        (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),                // 6<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_F),                            // 7<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),          // 8<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),                // 9<br />(uint8_t)~(SEG_DP),//10<br />    0xFF                                                                // NIC<br />};<br /><br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec);<br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd);<br /><br /><br />int main(void) {<br /><br />/***********************************PODŚWIETLENIE****************************************<br /><br />DDRA |= (1&lt;&lt;PA7);<br />PORTA |= (1&lt;&lt;PA7); // podświetlenie wyświetlacza LCD<br /><br />****************************************************************************************/<br /><br />liczba = 0;<br /><br />led_init();<br /><br />sei();<br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01);// wyzwalanie zboczem opadającym<br />GICR |= (1&lt;&lt;INT0);// odblokowanie przerwania<br />PORTD |= (1&lt;&lt;PD2);// podciągnięcie pinu INT0 do VCC<br /><br /><br /><br /><br />// definiujemy sobie dla polepszenia czytelności programu typ wyliczeniowy<br />// wskazujący nam później na odpowiednie indeksy w tablicy (buforze)<br />enum {ss, mm, hh, dt, dd, mie, rr};<br /><br />//Dni tygodnia<br /><br />static uint8_t bufor&#91;7&#93;;// rezerwacja bufora 3 bajty<br />volatile uint8_t sekundy, minuty, godziny, dzient, dni, miesiace, rok;<br /><br />char *dzien&#91;&#93;={&quot;&quot;, &quot;NIE,&quot;, &quot;PON,&quot;, &quot;WTO,&quot;, &quot;SRO,&quot;, &quot;CZW,&quot;, &quot;PIA,&quot;, &quot;SOB,&quot;};<br />char *miesiac&#91;&#93;={&quot;&quot;, &quot;STY&quot;, &quot;LUT&quot;, &quot;MAR&quot;, &quot;KWI&quot;, &quot;MAJ&quot;, &quot;CZE&quot;, &quot;LIP&quot;, &quot;SIE&quot;, &quot;WRZ&quot;, &quot;PAZ&quot;, &quot;LIS&quot;, &quot;GRU&quot;};<br /><br />lcd_init();<br /><br />i2cSetBitrate(100);<br /><br />// Ustawianie czasu na godzinę: 18:34:27<br /><br />bufor&#91;0&#93; = dec2bcd(0);// sekundy<br />bufor&#91;1&#93; = dec2bcd(0);// minuty<br />bufor&#91;2&#93; = dec2bcd(0);// godziny<br />bufor&#91;3&#93; = dec2bcd(1);// dzień tygodnia<br />bufor&#91;4&#93; = dec2bcd(10);// dni<br />bufor&#91;5&#93; = dec2bcd(3);// miesiące<br />bufor&#91;6&#93; = dec2bcd(19);// lata<br /><br />// zapis 7 bajtów z bufora pod adres 0x00 w pamięci RAM naszego RTC<br />TWI_write_buf( DS1307_ADDR, 0x00, 7, bufor );<br /><br /><br /><br />/****************************************ORYGINALNA FUNKCJA*********************************************<br />***********************FUNKCJA ZE STRONY https://forum.atnel.pl/topic9874.html**************************<br /><br /><br />* //Inicjalizacja DS1307<br />    void DS1307_init( void ){<br />            uint8_t ctrl = 0x10; //Rejstr kontrolny, ustawiamy cześtotliwośc oscylatora etc. (u nas 1Hz)<br />            TWI_write_buf( DS1307_ADDR, 0x07, 1, &amp;ctrl );  //Adres DS1307 0xD0<br />            uint8_t CH = 0; //ustawienie bitu 7 w rejstrze o adresie 0x00 na 0 odblokowuje oscylator<br />            TWI_write_buf(DS1307_ADDR, 0, 1, &amp;CH);<br />    }<br /><br />TWI_write_buf(DS1307_ADDR, 0, 1, &amp;CH);<br />*/<br /><br />while(1) {<br /><br />if ( int0_flag ) {<br />//odczyt 3 bajtów do bufora od adresu 0x00 z pamięci RAM naszego RTC<br />TWI_read_buf( DS1307_ADDR, 0x00, 7, bufor );<br /><br />sekundy = bcd2dec( bufor&#91;ss&#93;  );//&amp;0x7f<br />minuty = bcd2dec( bufor&#91;mm&#93;   );<br />godziny = bcd2dec( bufor&#91;hh&#93;  );<br />dzient = bcd2dec( bufor&#91;dt&#93; );<br />dni = bcd2dec( bufor&#91;dd&#93; );<br />miesiace = bcd2dec( bufor&#91;mie&#93; );<br />rok = bcd2dec( bufor&#91;rr&#93; );<br /><br /><br />//WYŚWIETLANIE DNI TYGODNIA<br /><br />lcd_str(dzien&#91;dzient&#93;);<br /><br />// wyświetlenie czasu na LCD<br /><br />lcd_locate(1,8);<br />if( godziny &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(godziny);<br />lcd_str(&quot;:&quot;);<br />if( minuty &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(minuty);<br />lcd_str(&quot;:&quot;);<br />if( sekundy &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(sekundy);<br /><br /><br />//WYŚWIETLANIE DATY<br /><br />lcd_locate(0,5);<br />if (dni &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(dni);<br />lcd_str(&quot; &quot;);<br />//if (miesiace &lt; 10 ) lcd_str(&quot;&quot;);<br />lcd_str(miesiac&#91;miesiace&#93;);<br />lcd_str(&quot; &quot;);<br />if (rok &lt; 10) lcd_str(&quot;0&quot;);<br />lcd_str(&quot;20&quot;);<br />lcd_int(rok);<br /><br /><br /><br />///////////////////////OBLICZENIE CYFR DLA LED///////////////////<br />/*tys = (minuty/10);<br />set = (minuty - (tys*10));<br />dzi = sekundy/10;<br />jed = (sekundy -(dzi*10));<br />*/<br /><br /><br />if(cnt==10){//liczba - szybkość zwiększania wyświetlanej liczby<br />liczba++;<br />cnt=0;<br />if(liczba&gt;9999) liczba=0;<br />}<br /><br />//////////////////////////////////zamiana liczby na pojedyncze cyfry///////////////////////////////<br />tys = (liczba/1000);<br />set = (liczba - (tys*1000))/100;<br />dzi = (liczba - (tys*1000)-(set*100))/10;<br />jed = (liczba - (tys*1000)-(set*100)-(dzi*10));<br />}<br />}<br />}<br /><br /><br />// procedura obsługi przerwania INT 0<br />ISR( INT0_vect ) {<br />int0_flag = 1;<br />}<br /><br /><br /><br />///////////////////////////////PRZERWANIE DLA MULIPLRKSOWANIA LED//////////////////////////////////////<br /><br />ISR(TIMER2_COMP_vect){<br /><br />if(anoda&gt;3){<br />anoda=0;<br />}<br /><br />/****************************************CYFRA1*****************************************/<br />if (anoda==0){<br /><br />//SEGMENTY_PORT |= 0xFF;//wygaszanie katod<br />ANODY_PORT |= ANODA4;//wygaszenie anody4<br />ANODY_PORT &amp;= ~ANODA1;//zapalenie anody<br />SEGMENTY_PORT = pgm_read_byte (&amp;cyfry&#91;tys&#93;);//zapalenie katod<br />//PORTD &amp;= ~(1&lt;&lt;PD7);//zapalenie kropki po pierwszym znaku<br />}<br /><br />/****************************************CYFRA2*****************************************/<br />if (anoda==1){<br /><br />//SEGMENTY_PORT |= 0xFF;//wygaszanie katod<br />ANODY_PORT |= ANODA1;//wygaszenie anody<br />ANODY_PORT &amp;= ~ANODA2;//zapalenie anody<br />SEGMENTY_PORT = pgm_read_byte (&amp;cyfry&#91;set&#93;);//zapalenie katod<br /><br />}<br /><br />/****************************************CYFRA3*****************************************/<br />if (anoda==2){<br /><br />//SEGMENTY_PORT |= 0xFF;//wygaszanie katod<br />ANODY_PORT |= ANODA2;//wygaszenie anody<br />ANODY_PORT &amp;= ~ANODA3;//zapalenie anody<br />SEGMENTY_PORT = pgm_read_byte (&amp;cyfry&#91;dzi&#93;);<br /><br />}<br /><br /><br />/****************************************CYFRA4*****************************************/<br />if (anoda==3){<br /><br />//SEGMENTY_PORT |= 0xFF;//wygaszanie katod<br />ANODY_PORT |= ANODA3;//wygaszenie anody<br />ANODY_PORT &amp;= ~ANODA4;//zapalenie anody<br />SEGMENTY_PORT = pgm_read_byte (&amp;cyfry&#91;jed&#93;);//zapalenie katod<br /><br />}<br />/******************************KONIEC MULTIPLEKSOWANIA**********************************/<br /><br />anoda++;<br />cnt++;<br />}<br /><br />//////////////////////KONEC PRZERWANIA DLA MULTIPLEKSOWANIA LED//////////////////////////<br /><br /><br /><br />// konwersja liczby dziesiętnej na BCD<br />uint8_t dec2bcd(uint8_t dec) {<br />return ((dec / 10)&lt;&lt;4) | (dec % 10);<br />}<br /><br />// konwersja liczby BCD na dziesiętną<br />uint8_t bcd2dec(uint8_t bcd) {<br />    return ((((bcd) &gt;&gt; 4) &amp; 0x0F) * 10) + ((bcd) &amp; 0x0F);<br />}[/syntax]<br />multipleks.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;multipleks.h&quot;<br />/*<br />const uint8_t cyfry&#91;11&#93; = {<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),                // 0<br />        (uint8_t)~(SEG_B|SEG_C),                                                                                // 1<br />        (uint8_t)~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),                                              // 2<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),                                              // 3<br />        (uint8_t)~(SEG_B|SEG_C|SEG_F|SEG_G),                                                    // 4<br />        (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),                                              // 5<br />        (uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),                                // 6<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_F),                                                    // 7<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),                  // 8<br />        (uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),                                // 9<br />    0xFF                                                                                    // NIC (puste miejsce)<br />};<br />*/<br /><br />void led_init(void){<br /><br />///////////////////////////////////////////////////konfiguracja anod///////////////////////////////<br /><br />DDRC |= (ANODA1|ANODA2|ANODA3|ANODA4); //piny PB1..PB4 wyjścia 0x1E<br />PORTC |= (ANODA1|ANODA2|ANODA3|ANODA4);//ustawienie stanu wysokiego na anodach(wygaszenie wyświetlacza)<br /><br />//////////////////////////////////////////////////konfiguracja katod///////////////////////////////<br />DDRA |= 0xFF;//piny katod ustawione jako wyjścia<br />PORTA |= 0xFF;//piny katod wyzerowane (segmenty wygaszone)<br /><br />////////////////////////inicjalizacja przerwania///////////////////////////////////////////////////<br />TCCR2 |= (1&lt;&lt;WGM21);//Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22);//preskaler 1024<br />OCR2 = 20;//wartość przepełnienia<br />TIMSK |= (1&lt;&lt;OCIE2);//zezwolenie na przerwanie ComtareeMatch<br /><br />}<br />////////////////////////koniec funkcji led_init////////////////////////////////////////////////////<br /><br />////////////////////////////dekodowanie liczby do wyświetlenia////////////////////////////////////[/syntax]<br />multipleks.h<br />[syntax=c]#ifndef MULTIPLEKS_H_<br />#define MULTIPLEKS_H_<br /><br />//////////////////////////////definicja portów anod////////////////////////////////////////////////<br />#define ANODY_DIR DDRC<br />#define ANODY_PORT PORTC<br /><br />/////////////////////////////definicja pinów anod//////////////////////////////////////////////////<br />#define ANODA1 (1&lt;&lt;PC4)<br />#define ANODA2 (1&lt;&lt;PC5)<br />#define ANODA3 (1&lt;&lt;PC6)<br />#define ANODA4 (1&lt;&lt;PC7)<br /><br />//////////////////////////////////definicja portów segmentów///////////////////////////////////////<br />#define SEGMENTY_DIR DDRA<br />#define SEGMENTY_PORT PORTA<br /><br />/////////////////////definicja pinów segmentów/////////////////////////////////////////////////////<br />#define SEG_A 1&lt;&lt;PA0<br />#define SEG_B 1&lt;&lt;PA1<br />#define SEG_C 1&lt;&lt;PA2<br />#define SEG_D 1&lt;&lt;PA3<br />#define SEG_E 1&lt;&lt;PA4<br />#define SEG_F 1&lt;&lt;PA5<br />#define SEG_G 1&lt;&lt;PA6<br />#define SEG_DP 1&lt;&lt;PA7<br /><br />#define NIC 10<br /><br />//szybkość multipleksowania<br />#define pre0 (1&lt;&lt;CS20)<br />#define pre8 (1&lt;&lt;CS21)<br />#define pre32 (1&lt;&lt;CS20)|(1&lt;&lt;CS21)<br />#define pre64 (1&lt;&lt;CS22)<br />#define pre128 (1&lt;&lt;CS20)|(1&lt;&lt;CS22)<br />#define pre256 (1&lt;&lt;CS21)|(1&lt;&lt;CS22)<br />#define pre1024 (1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22)<br /><br /><br />/////////////////////////////////////przycisk//////////////////////////////////////////////////////<br />//#define przycisk 1&lt;&lt;PC3<br /><br />//////////////////////////////////////funkcje//////////////////////////////////////////////////////<br />void led_init(void);<br /><br />#endif /* MULTIPLEKS_H_ */[/syntax]<br /><br />i2c.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />#include &quot;i2c_twi.h&quot;<br /><br />void i2cSetBitrate(uint16_t bitrateKHz) {<br />uint8_t bitrate_div;<br /><br />bitrate_div = ((F_CPU/1000l)/bitrateKHz);<br />if(bitrate_div &gt;= 16)<br />bitrate_div = (bitrate_div-16)/2;<br /><br />TWBR = bitrate_div;<br />}<br /><br />void TWI_start(void) {<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTA);<br />while (!(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />void TWI_stop(void) {<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO);<br />while ( !(TWCR&amp;(1&lt;&lt;TWSTO)));<br />}<br /><br />void TWI_write(uint8_t bajt) {<br />TWDR = bajt;<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while ( !(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />uint8_t TWI_read(uint8_t ack) {<br />TWCR = (1&lt;&lt;TWINT)|(ack&lt;&lt;TWEA)|(1&lt;&lt;TWEN);<br />while ( !(TWCR &amp; (1&lt;&lt;TWINT)));<br />return TWDR;<br />}<br /><br /><br /><br />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf ) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />while (len--) TWI_write(*buf++);<br />TWI_stop();<br />}<br /><br /><br /><br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf) {<br /><br />TWI_start();<br />TWI_write(SLA);<br />TWI_write(adr);<br />TWI_start();<br />TWI_write(SLA + 1);<br />while (len--) *buf++ = TWI_read( len ? ACK : NACK );<br />TWI_stop();<br />}[/syntax]<br />i2c.h<br />[syntax=c]#ifndef I2C_TWI_H_<br />#define I2C_TWI_H_<br /><br />#define ACK 1<br />#define NACK 0<br /><br /><br /><br />// funkcje<br /><br />void i2cSetBitrate(uint16_t bitrateKHz);<br /><br />void TWI_start(void);<br />void TWI_stop(void);<br />void TWI_write(uint8_t bajt);<br />uint8_t TWI_read(uint8_t ack);<br /><br />void TWI_write_buf( uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf );<br />void TWI_read_buf(uint8_t SLA, uint8_t adr, uint8_t len, uint8_t *buf);<br /><br />#endif /* I2C_TWI_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12856">11jacekj</a> — 10 mar 2019, o 21:20</p><hr />
]]></content>
</entry>
</feed>