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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-07-30T11:22:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=60&amp;t=21056&amp;mode</id>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-07-30T11:22:03+01:00</updated>
<published>2018-07-30T11:22:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210259#p210259</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210259#p210259"/>
<title type="html"><![CDATA[Re: Program SQP-I2Cscan w wersji konsolowej napisany w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210259#p210259"><![CDATA[
<div class="quotetitle">kalani napisał(a):</div><div class="quotecontent"><br />Do kompletu brakuje tylko skanowania General Call.<br /></div>Tylko zwrócona przez to informacja nic nie wnosi w kwestii rozpoznawania urządzeń. A i tak skanujemy wszystkie adresy, więc dowiemy się czy są urządzenia i w dodatku jakie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br />Ale jak kto chce, to co za problem dodać jako osobną funkcję lub przed pętlą skanująca adresy? <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><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> — 30 lip 2018, o 11:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2018-07-29T21:01:59+01:00</updated>
<published>2018-07-29T21:01:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210253#p210253</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210253#p210253"/>
<title type="html"><![CDATA[Re: Program SQP-I2Cscan w wersji konsolowej napisany w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210253#p210253"><![CDATA[
Świetna robota Robert! Dziękuję!<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 29 lip 2018, o 21:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-07-29T17:05:58+01:00</updated>
<published>2018-07-29T17:05:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210249#p210249</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210249#p210249"/>
<title type="html"><![CDATA[Re: Program SQP-I2Cscan w wersji konsolowej napisany w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210249#p210249"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Panie - panie! takie &quot;kwiatki&quot; to się wrzuca do DIY <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  bo to fajna inspiracja dla innych<br /></div>Jakie DIY, to tylko seria odpowiednio ułożonych bitów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<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> — 29 lip 2018, o 17:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2018-07-29T17:04:07+01:00</updated>
<published>2018-07-29T17:04:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210248#p210248</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210248#p210248"/>
<title type="html"><![CDATA[Re: Program SQP-I2Cscan w wersji konsolowej napisany w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210248#p210248"><![CDATA[
Panie - panie! takie &quot;kwiatki&quot; to się wrzuca do DIY <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo to fajna inspiracja dla innych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 lip 2018, o 17:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2018-07-29T17:02:38+01:00</updated>
<published>2018-07-29T17:02:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210246#p210246</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210246#p210246"/>
<title type="html"><![CDATA[Program SQP-I2Cscan w wersji konsolowej napisany w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21056&amp;p=210246#p210246"><![CDATA[
W wątku z opisem dotyczącym programu SQP-I2Cscan napisanym w C# pojawiły się głosy, by tą wersje programu także opisać, więc poznęcam się nad Wami i to zrobię <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" />.<br /><br />Drugim programem, który powstał ramach Mirkowego konkursu (i dla Was na szczęście ostatnim, dzięki czemu więcej nie będę opisywał <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />) dotyczącego API dla ATB-USBasp 4.2 to program SQP-I2Cscan. Tak, tak, dla zmyłki to program o tej samej nazwie co wcześniej opisywana wersja z GUI <a href="https://forum.atnel.pl/topic21023.html"  class="postlink">https://forum.atnel.pl/topic21023.html</a>, ale tym razem jest to wersja konsolowa, czyli bez GUI, napisana w C. Wykorzystuje on natywną bibliotekę libusb. Wymagane pliki są do pobrania ze strony <a href="https://sourceforge.net/projects/libusb/"  class="postlink">https://sourceforge.net/projects/libusb/</a> (dołączone są też do archiwum projektu).<br /><br />Jest to prosty program, realizujący tylko jedną praktyczną funkcję - skanuje magistralę I2C wykorzystując ATB-USBasp 4.2 (plus jeden bonus, o którym na końcu opisu). Wynik skanowania I2C prezentowany jest tekstowo podając adresy znalezionych urządzeń w formacie dziesiętnym i szesnastkowym zarówno w konwencjach adresów 7-bitowego i 8-bitowego.<br /><br /><img src="https://obrazkiforum.atnel.pl/3427/dbad6a6cc955d6c4e4b7ae1005108127.png" alt="Obrazek" /><br /><br />Dzięki temu, że biblioteka libusb dostępna jest zarówno dla Windows jak i Linux, aplikacja poprawnie kompilującej się, bez jakichkolwiek przeróbek, zarówno pod Windows jak i pod Linux.<br />Oczywiście należy pamiętać aby w Makefile dodać odpowiednie podlinkowanie plików nagłówkowych oraz bibliotecznych libusb.<br /><br />Cały kod udostępniam na licencja GNU GPL v. 3.0, czyli dostępny jest kod źródłowy z pełnymi prawami do samodzielnej modyfikacji i rozpowszechniania. <br />Kod programu znajduje się w wątku konkursowym <a href="https://forum.atnel.pl/topic20920.html#p209345"  class="postlink">https://forum.atnel.pl/topic20920.html#p209345</a>. Jest on w tym samym archiwum co wersja w C# z GUI, ale w katalogu o nazwie <em>SQP-I2Cscan (Console)</em>.<br />Dla lubiących narzędzia do wersjonowania, to ostateczną wersję wrzuciłem też do publicznego repozytorium <a href="https://bitbucket.org/rskup/sqp-i2cscan/"  class="postlink">https://bitbucket.org/rskup/sqp-i2cscan/</a>.<br /><br />Program pod Windows pisany był w darmowym przyjemnym i lekkim narzędziu Dev-C++, a w archiwum, dla chcących je szybko otworzyć, dorzucone są od razu pliki projektu z tego narzedzia (SQP-I2Cscan.dev).<br /><br />Po tym wstępie przejdźmy do szczegółów programu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Projekt składa się z funkcji umieszczonych w trzech grupach plików:<br />- main.c / main.h - funkcje związane z uruchamianiem / kończeniem programu, sprawdzaniem parametrów wejściowych i wywołaniem głównych funkcji programu<br />- usbasp.c / usbasp.h - funkcje realizujące logikę działania programu związane z komunikacją z ATB-USBasp<br />- usb.c / usb.h - funkcje odpowiadające za komunikację po USB (korzystające z biblioteki libusb)<br /><br /><br />usbasp.c to główny trzon tego programu. Mamy w nim trzy podstawowe funkcje (o czwartej później <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ):<br />1. Pierwsza funkcja setI2CBitrate(), służy do ustawiania prędkości na szynie I2C. W której na początku wypełniamy odpowiednio dane w strukturze TusbControlPacket, która wygląda następująco:<br />[syntax=c]struct TusbControlPacket {<br />unsigned charbmRequestType;// the request type field for the setup packet<br />unsigned charbRequest;// the request field for the setup packet<br />unsigned shortwValue;// the value field for the setup packet<br />unsigned shortwIndex;// the index field for the setup packet<br />unsigned char*data;// a suitably-sized data buffer for either input or output (depending on direction bits within bmRequestType)<br />unsigned shortwLength;// the length field for the setup packet. The data buffer should be at least this size<br />};[/syntax]<br />Oczywiście przypisujemy do pól w strukturze TusbControlPacket wartości zgodnie z informacjami podanymi w dokumentacji dla API ATB-USBasp, a następnie wywołujemy funkcję wysłania danych poprzez funkcje usb:<br />[syntax=c]char setI2CBitrate ( unsigned short bitrate )<br />{<br />struct TusbControlPacket controlPacket;<br />char buffer&#91;ATB_USPASP_MAX_BUFFER_SIZE&#93;;<br /><br />controlPacket.bmRequestType = 0xC0;// read from USB device<br />controlPacket.bRequest = USBASP_FUNC_I2C_BITRATE;// ATB-USBasp API command<br />controlPacket.wValue = bitrate;// I2C bitrate<br />controlPacket.wIndex = 0;// not used<br />controlPacket.data = buffer;// buffer<br />controlPacket.wLength = ATB_USPASP_MAX_BUFFER_SIZE;// buffer size<br /><br />return usbSendControlData(controlPacket);<br />}[/syntax]<br /><br />2. Druga funkcja checkI2CDevice() sprawdza obecność urządzenia na szynie I2C o wskazanym adresie. Także tutaj należy wypełnić strukturę TusbControlPacket zgodnie z API ATB-USBasp i wywołać funkcję usbSendControlData(). Przy sprawdzaniu obecności urządzenia dostajemy odpowiedź w formie tekstu OK lub ERROR, dlatego po wysłaniu danych sprawdzamy jeszcze co dostaliśmy w odpowiedzi i zgodnie z tym zwracamy przy kończeniu funkcji odpowiednią wartość (ERROR / SUCCESS / DEVICE_NO_FOUND):<br />[syntax=c]char checkI2CDevice ( unsigned char address )<br />{<br />struct TusbControlPacket controlPacket;<br />char buffer&#91;ATB_USPASP_MAX_BUFFER_SIZE&#93;;<br /><br />controlPacket.bmRequestType = 0xC0;// read from USB device<br />controlPacket.bRequest = USBASP_I2C_SLA_CHECK;// ATB-USBasp API command<br />controlPacket.wValue = address;// I2C address<br />controlPacket.wIndex = 0;// not used<br />controlPacket.data = buffer;// buffer<br />controlPacket.wLength = ATB_USPASP_MAX_BUFFER_SIZE;// buffer size<br /><br />if (usbSendControlData(controlPacket) != SUCCESS)<br />{<br />return ERROR;<br />}<br />else<br />{<br />if ((controlPacket.data&#91;0&#93; == 'O') &amp;&amp; (controlPacket.data&#91;1&#93; == 'K')) return SUCCESS;<br />else return DEVICE_NO_FOUND;<br />}<br />}[/syntax]<br /><br />3. Trzecia funkcja scanI2C(), jest funkcją realizującą skanowanie na I2C urządzeń o kolejnych adresach (korzystając z wcześniej opisanej funkcji checkI2CDevice()). Skanowanie wykonywane jest to w pętli dla kolejnych adresów od adresu początkowego I2C_7BIT_ADDRESS_MIN do adresu I2C_7BIT_ADDRESS_MAX (obie wartości zdefiniowane są w pliku usbasp.h).<br />We wszystkich bibliotekach i poradnikach Mirka, także w API ATB-USBasp stosowany jest adres w notacji 8 bitowej (wartość łącznie z bitem R/W na najmłodszej pozycji), dlatego przy skanowaniu nie wysyłamy kolejnych wartości, tylko z przeskokiem co dwa.<br />Ale ja, na przekór <img src="https://forum.atnel.pl/images/smilies/icon_twisted.gif" alt=":twisted:" title="Szalony" />, lubię stosować notację 7-bitową, i taką używam w programie. Dlatego wartości zakresów adresów do skanowania zdefiniowane w stałych są 7 bitowe (I2C_7BIT_ADDRESS_MIN / I2C_7BIT_ADDRESS_MAX) a wartość wysyłana poprzez API jest przesunięta o jeden bit w lewo:<br />[syntax=c]checkI2CDevice(i &lt;&lt; 1)[/syntax]<br />Zgodnie ze specyfikacją I2C, nie wszystkie adresy przeznaczone są dla normalnych urządzeń. Dlatego nie skanujemy całego zakresu a tylko jego część. Początek i koniec jest zdefiniowany we wspominanych wcześniej stałych I2C_7BIT_ADDRESS_MIN (najmniejszy adres) oraz I2C_7BIT_ADDRESS_MAX (największy adres).<br />Gdy wywoływana funkcja checkI2CDevice() zwróci nam SUCCESS, co jest wynikiem odpowiedzi OK przez API ATB-USBasp, oznacza to że zostało wykryte urządzenie o tym adresie. Wypisujemy wtedy na ekranie informacje o tym adresie w postaci szesnastkowej oraz dziesiętnej zarówno w notacji 7-bitowej jak i 8-bitowej.<br />[syntax=c]char scanI2C ( void )<br />{<br />unsigned char i;<br />unsigned char count = 0;<br /><br />printf(&quot;Searching I2C devices ...\n&quot;);<br />fflush(stdout);<br />for (i = I2C_7BIT_ADDRESS_MIN; i &lt;= I2C_7BIT_ADDRESS_MAX; i++)<br />{<br />switch (checkI2CDevice(i &lt;&lt; 1))<br />{<br />case ERROR:<br />printf(&quot;Communication with ATB-USBasp failed.\n&quot;);<br />return ERROR;<br />case SUCCESS:<br />count++;<br />printf(&quot;\t%2d. Found I2C device: \t7-bit address: 0x%02X (%d) \t8-bit address: 0x%02X (%d)\n&quot;, count, i, i, i &lt;&lt; 1, i &lt;&lt; 1);<br />break;<br />}<br />if (receivedTermSignal) return ERROR;<br />}<br />if (count == 0) printf(&quot;\tNo I2C devices found\n&quot;);<br />return SUCCESS;<br />}[/syntax]<br /><br /><br />W pliku usb.c mamy funkcje związane z komunikacją po USB. A dokładnie to są to tylko 3 funkcje:<br />1. otwarcie urządzenia funkcją openUSB(), gdzie następuje otwarcie urządzenia korzystając z wartości VID i PID zdefiniowanych dla USBasp:<br />[syntax=c]struct libusb_device_handle *devh = NULL;<br />libusb_context *ctx = NULL;<br /><br />char openUSB(void)<br />{<br />int result;<br /><br />if ((result = libusb_init(&amp;ctx)) &lt; 0)<br />{<br />return ERROR;<br />}<br />else<br />{<br />devh = libusb_open_device_with_vid_pid(ctx, ATBUSBasp_VID, ATBUSBasp_PID);<br />if (devh != NULL)<br />{<br />return SUCCESS;<br />}<br />else<br />{<br />closeUSB();<br />return ERROR;<br />}<br />}<br />}[/syntax]<br /><br />2. wysłanie danych kanałem kontrolnym usbSendControlData(), gdzie następuje fizyczne wysłanie danych poprzez wywołanie funkcji libusb_control_transfer() z biblioteki libusb z odpowiednimi otrzymanymi jako argumenty danymi:<br />[syntax=c]char usbSendControlData(struct TusbControlPacket controlPacket)<br />{<br />int result;<br /><br />if ((result = libusb_control_transfer(<br />devh,<br />controlPacket.bmRequestType,<br />controlPacket.bRequest,<br />controlPacket.wValue,<br />controlPacket.wIndex,<br />controlPacket.data,<br />controlPacket.wLength,<br />USB_TRANSFER_TIMEOUT_MS)) &gt;= 0)<br />{<br />return SUCCESS;<br />}<br />else<br />{<br />return ERROR;<br />}<br />}[/syntax]<br />3. fukncji której nie mogło zabraknąć, czyli zamknięcie naszego urządzenia:<br />[syntax=c]void closeUSB(void)<br />{<br />libusb_close(devh);<br />libusb_exit(ctx);<br />}[/syntax]<br /><br /><br />Ostatnim plikiem z kodem programu jest plik main.c. Funkcja main() zasadniczo (bo o pewnych dodatkach za chwilę) ma proste działanie:<br />- wykonać otwarcie urządzenia ATB-USBasp, używając wcześniej wspominanej funkcji openUSB()<br />- sprawdzić czy podany został parametr przy wywołaniu a jak tak i jest prawidłową wartością, to ustawić zgodnie z nim prędkość na szynie I2C, korzystając z wcześniej opisanej funkcji setI2CBitrate()<br />- wywołać skanowanie szyny I2C poprzez także wcześniej opisywaną funkcję scanI2C()<br />- zamknąć połączenie z urządzeniem USB poprzez funkcję closeUSB()<br /><br />I to cała logika skanowania I2C <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. Prawda, że proste?<br /><br />To teraz jeszcze napiszę o dwóch elementach znajdujących się w kodzie, która mogą przeglądającym lekko go zaciemniać:<br /><br />1. Jako, że program ma działać poprawnie po skompilowaniu zarówno pod Windows jak i Linux, zostały dodane pewne elementy wymagane w systemie Linux.<br />W Windows naciśnięcie CTRL-C zabija automatycznie program. W Linux zdefiniowane są sygnały jakie wysyłane są do programu. Dlatego dodane zostało przechwytywanie sygnału SIGINT i SIGTERM<br />[syntax=c]volatile char receivedTermSignal = 0;<br /><br />#ifndef WIN32<br />struct sigaction termSignalAction;<br /><br />memset(&amp;termSignalAction, 0, sizeof(termSignalAction));<br />termSignalAction.sa_handler = &amp;termSignalApplication;<br />if (sigaction(SIGTERM, &amp;termSignalAction, NULL) &lt; 0)<br />{<br />printf(&quot;Creating SIGTERM failed. Application terminated.\n&quot;);<br />return ERROR;<br />}<br />if (sigaction(SIGINT, &amp;termSignalAction, NULL) &lt; 0)<br />{<br />printf(&quot;Creating SIGINT failed. Application terminated.\n&quot;);<br />return ERROR;<br />}<br />#endif[/syntax]<br />Otrzymanie tych sygnałów powoduje, oprócz wypisania komunikatów, ustawienie zmiennej globalnej receivedTermSignal. Zmienna ta jest sprawdzana w pętali skanowania i jej ustawienie powoduje przerwanie skanowania.<br />[syntax=c]void termSignalApplication(int sig)<br />{<br />receivedTermSignal = 1;<br />switch(sig)<br />{<br />case SIGINT:<br />printf(&quot;\nReceived signal SIGINT, closing ...\n&quot;);<br />break;<br />case SIGTERM:<br />printf(&quot;\nReceived signal SIGTERM, closing ...\n&quot;);<br />break;<br />}<br />}[/syntax]<br /><br /><br />2. Drugim elementem jest dodatek w kodzie zmieniający całkowicie jego działanie. Jest to część, która wcześniej została specjalnie ominięta w opisie zawartych w plikach funkcji.<br />Jeżeli przeglądaliście kod to w funkcji main() zauważyliście, że wywołanie sprawdzanie parametru wejściowego i skanowanie I2C zawarte jest w dyrektywie:<br />[syntax=c]#else<br />...<br />#endif[/syntax]<br />To właśnie ten dodatek, który możemy włączyć poprzez zdefiniowanie wartości TOGGLE_I2C_PINS powoduje wyłączenie skanowania a włączenie w czasie kompilacji wywołania funkcji toggleI2CPins():<br />[syntax=c]#ifdef TOGGLE_I2C_PINS<br />if (toggleI2CPins() != SUCCESS) printf(&quot;Communication with ATB-USBasp failed.\n&quot;);<br />#else<br />...[/syntax]<br /><br />Co więc robi ta funkcja?<br />Zamiast programu skanującego szynę I2C dostajemy program zmieniającymi cyklicznie wartości na wyjściach dedykowanych dla I2C: SDA i SCL - po podłączeniu diod mamy cykliczne ich miganie.<br />Funkcja na początku przełącza tryb ATB-USBasp w tzw. tryb bit bang a potem w pętli ustawia i kasuje odpowiednio wyjścia SDA i SCL aż do momentu przerwania tego przez nas (klawiszem CTRL-C):<br />[syntax=c]char toggleI2CPins ( void )<br />{<br />struct TusbControlPacket controlPacket;<br />char buffer&#91;ATB_USPASP_MAX_BUFFER_SIZE&#93;;<br />char state = 1;<br /><br />controlPacket.bmRequestType = 0x40;// write to USB device<br />controlPacket.bRequest = USBASP_I2C_BITBANG_ON;// ATB-USBasp API command<br />controlPacket.wValue = 0;// not used<br />controlPacket.wIndex = 0;// not used<br />controlPacket.wLength = 0;// not used<br />controlPacket.data = buffer;// buffer<br />controlPacket.wLength = ATB_USPASP_MAX_BUFFER_SIZE;// buffer size<br /><br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />printf(&quot;Toggling pins ...  - -&quot;);<br />fflush(stdout);<br />while (1)<br />{<br />switch (state)<br />{<br />case 1:<br />controlPacket.bRequest = USBASP_I2C_SDA_LO;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />controlPacket.bRequest = USBASP_I2C_SCL_HI;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />break;<br /><br />case 2:<br />controlPacket.bRequest = USBASP_I2C_SDA_HI;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />controlPacket.bRequest = USBASP_I2C_SCL_LO;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />break;<br /><br />case 3:<br />controlPacket.bRequest = USBASP_I2C_SDA_HI;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />controlPacket.bRequest = USBASP_I2C_SCL_HI;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />break;<br /><br />default:<br />controlPacket.bRequest = USBASP_I2C_SDA_LO;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />controlPacket.bRequest = USBASP_I2C_SCL_LO;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />state = 0;<br />}<br />printf(&quot;\b\b\b%c %c&quot;, state &amp; 0x01 ? '1' : '0', state &amp; 0x02 ? '1' : '0');<br />fflush(stdout);<br />state++;<br />usleep(500000);<br />if (receivedTermSignal) break;// break when user request<br />}<br />controlPacket.bRequest = USBASP_I2C_BITBANG_OFF;// new ATB-USBasp API command<br />if (usbSendControlData(controlPacket) != SUCCESS) return ERROR;// send Control Packet<br />return SUCCESS;<br />}[/syntax]<br /><br />Aby wywołać kompilację programu w wersji <em>SQP-TogglePins</em> musimy zdefiniować wartość TOGGLE_I2C_PINS, co możemy zrobić na jeden z trzech sposobów:<br />- w kodzie poprzez dodanie #define TOGGLE_I2C_PINS<br />- w pliku Makefile poprzez dodanie -DTOGGLE_I2C_PINS<br />- odpowiednio w środowisku w zmiennych kompilacji, dla Dev-C++ wygląda to tak:<br /><a href="https://obrazkiforum.atnel.pl/3427/e85a7f617e19a4da92329e5b06d79985.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3427/e85a7f617e19a4da92329e5b06d79985.PNG" alt="Obrazek" /></a><br /><br />Dzięki parametrowi -D w Makefile możemy zrobić kompilację od razu obu wersji programu, jak to się dzieje przy użyciu załączonego Makefile.<br /><br />I to byłoby na tyle. Jak macie pytania i niejasności, to piszcie. Jak nie, to także piszcie, ale swoje kody i testujcie działanie ATB-USBasp &gt;= 4.2 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<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> — 29 lip 2018, o 17:02</p><hr />
]]></content>
</entry>
</feed>