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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-04-10T22:45:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17724&amp;mode</id>
<entry>
<author><name><![CDATA[jedrunia]]></name></author>
<updated>2018-04-10T22:45:35+01:00</updated>
<published>2018-04-10T22:45:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=206711#p206711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=206711#p206711"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=206711#p206711"><![CDATA[
Witajcie,<br /><br />Poniższa koncepcja działa dla wyświetlacza.<br /><br />Jeżeli mam wysłać 9 bitów a mam sprzętowo 8 bitów, to wysyłając kolejno 9 bajtów mam wysłane 8 tych 9-cio bitowych.<br />Nie trzeba się martwić o to, że jedno 9cio bitowe słowo jest zawsze w dwóch kolejnych transmisjach. <br /><br />Jedyne co jest ważne, to <br />- trzymać cały czas linię CS aktywną<br />- zakończyć transmisję po przesłaniu wielokrotności paczek po 9 bajtów.<br /><br />Jak brakuje danych do wysłania żeby zakończyć na wielokrotności 9 bajtów to podpowiadam, że mamy instrukcję NOP i można ich wstawić dowolnie dużo.<br /><br />Poniżej obrazek jak to wygląda w praktyce. Dekodowane jest 9 bitowe SPI.<br /><br />Andrzej<br /><br /><a href="https://obrazkiforum.atnel.pl/10010/7c79fc397c63e884313c8708aae1b082.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/10010/7c79fc397c63e884313c8708aae1b082.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10010">jedrunia</a> — 10 kwi 2018, o 22:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eventus]]></name></author>
<updated>2017-10-25T20:45:08+01:00</updated>
<published>2017-10-25T20:45:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197755#p197755</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197755#p197755"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197755#p197755"><![CDATA[
Eh... Niestety. Po transferze 8 bitów na linii MOSI jest dodatkowe zbocze po zboczu zatrzaskującym na SCK, czyli występuje pierwszy warunek transferu do sterownika. Klapnięcie linią CS nic już wtedy nie wnosi - czyli zostaje mix SW i HW.<br /><a href="https://obrazkiforum.atnel.pl/3988/7d3733306a91c6ddcb57e9bb0da03223.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/3988/7d3733306a91c6ddcb57e9bb0da03223.JPG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3988">eventus</a> — 25 paź 2017, o 20:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eventus]]></name></author>
<updated>2017-10-25T08:08:12+01:00</updated>
<published>2017-10-25T08:08:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197725#p197725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197725#p197725"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=197725#p197725"><![CDATA[
Wałkuję ten sam temat w kontekście sterownika do LCD od Nokii 1202. Sposób z AVR Freaks działa (mix HW SPI i bit-banging), ale zastanawiam się czy próbowaliście przesłać np. 2 bajty przez SPI w taki sposób:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &quot;spi.h&quot;<br /><br />unsigned char spi_init(void)<br />{<br />  DDRB = (1&lt;&lt;DDB3) | (1&lt;&lt;DDB5) | (1&lt;&lt;DDB0);<br />  SPCR = (1&lt;&lt;SPE) | (1&lt;&lt;MSTR) | (1&lt;&lt;SPR0);<br />}<br /><br />char spi_send(unsigned char hi_byte, unsigned char lo_byte)<br />{<br />  PORTB &amp;= ~ (1&lt;&lt;PB0);         // CS low<br />  SPDR = hi_byte;<br />    while (!(SPSR &amp; (1&lt;&lt;SPIF)));<br />  SPDR = lo_byte;<br />    while (!(SPSR &amp; (1&lt;&lt;SPIF)));<br />  PORTB |= (1&lt;&lt;PB0);           // CS high<br />  return SPDR;<br />}[/syntax]<br /><br />Najstarsze bity hi_byte zostaną przepchnięte i &quot;wylecą&quot; - zostanie tylko jeden bit określający DATA/COMMAND. Sterownik zinterpretuje tylko ten jeden bit i cały lo_byte. Machnięcie linią CS powinno zatrzasnąć te 9-bitów w rejestrze sterownika. Dobrze kombinuję?<br /><br />Poniżej fragment noty do STE2007, który sugerowałby taki mechanizm:<br /><br /><img src="https://obrazkiforum.atnel.pl/3988/6304be359f41dc00cc2a811e35c7e914.JPG" alt="Obrazek" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3988">eventus</a> — 25 paź 2017, o 08:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-03-05T21:52:26+01:00</updated>
<published>2017-03-05T21:52:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=184141#p184141</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=184141#p184141"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=184141#p184141"><![CDATA[
Po walce z asemblerem udało mi się stworzyć działający kod ale wyszło jakoś wolno. Za cienki w uszach widać jeszcze jestem.<br />Zmontowałem więc kod w c++ i nawet udało mi się osiągnąć coś koło 2Mhz zegara.<br />Może komuś się przyda <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />[syntax=cpp]#define LCD_DDR  DDRC<br />#define LCD_PORT PORTC<br />#define _CS PC0<br />#define _SDA PC1<br />#define _SCK PC2<br />#define LCD_CS (1&lt;&lt;_CS)<br />#define LCD_SDA (1&lt;&lt;_SDA)<br />#define LCD_SCK  (1&lt;&lt;_SCK)<br /><br />#define cbi(sfr,bit) (_SFR_BYTE(sfr) &amp;= ~_BV(bit))<br />#define sbi(sfr,bit) (_SFR_BYTE(sfr) |= _BV(bit))<br /><br />void Send_SPI9(uint8_t _isCmd, uint8_t _data) {<br />  LCD_PORT &amp;= ~(LCD_CS | LCD_SCK);<br />  //<br />  cbi(LCD_PORT, _SCK);<br />  if (_isCmd) cbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 128) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 64) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 32) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 16) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 8) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 4) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 2) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />  //<br />  LCD_PORT &amp;= ~(LCD_SCK | LCD_SDA);<br />  if (_data &amp; 1) sbi(LCD_PORT, _SDA);<br />  sbi(LCD_PORT, _SCK);<br />}[/syntax]<br />Tak to wygląda w analizatorze który niedawno mi dostarczono <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> (zajefajna rzecz, polecam)<br /><a href="https://obrazkiforum.atnel.pl/14189/084b2e949842d946069d91eb8769fda9.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/14189/084b2e949842d946069d91eb8769fda9.png" alt="Obrazek" /></a><br />Spróbuję w wolnej chwili powalczyć z kodem od Zealota.<br />Dzięki wszystkim za pomoc i zainteresowanie.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 5 mar 2017, o 21:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-28T10:08:15+01:00</updated>
<published>2017-02-28T10:08:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183749#p183749</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183749#p183749"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183749#p183749"><![CDATA[
Zabrałem się za napisanie tego w asm. Za przykład <br />Biorę wstawkę z poradnika o magic ledach.<br />Ale tam jest błąd chyba i zamiast jednego pinu <br />Zmienia sie cały port. Brak operacji or i and przed sts.<br />Aczkolwiek mogę się mylić bo dopiero raczkuje.<br />Jak ktoś się zna to niech mnie poprawi będę miał dodatkową wiedzę.<br />Zamówiłem dziś analizator stanów to będę mógł <br />sprawdzić tą wstawkę i dopracować kod czasowo.<br /><img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Wypociłem dziś taki kod:<br />[syntax=cpp]LCD_asm_send_data( uint8_t cmd, uint16_t *data, uint16_t datlen) {<br />  uint8_t cnt = 0, sdaLO = ~LCD_SDA, sckLO = ~LCD_CLK;<br />  uint8_t port = 0;<br />  port = (LCD_SDA | LCD_CLK | LCD_CS);<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_CS); //wyzerowanie CLK i CS<br />  asm volatile(<br />    &quot; cpi   %&#91;cmd&#93;,1                        \n\t&quot;      // sprawdzenie czy komenda<br />    &quot; brne  nocom%=                         \n\t&quot;      // jesli nie to skok<br />    &quot; and   %&#91;port&#93;, %&#91;sdaLO&#93;               \n\t&quot;      // wyzerowanie bitu data<br />    &quot; nocom%= :or    %&#91;port&#93;, %&#91;sdaHI&#93;      \n\t&quot;      // ustaw bit data na hi<br />    &quot; out   %&#91;lcd_port&#93;, %&#91;port&#93;            \n\t&quot;      // zaladuj do portu lcd<br />    &quot; or    %&#91;port&#93;, %&#91;sckHI&#93;               \n\t&quot;      // ustaw sck na hi<br />    &quot; out   %&#91;lcd_port&#93;, %&#91;port&#93;            \n\t&quot;      // zaladuj do portu lcd<br />&quot;mPTL%=:subi  %A5,1                         \n\t&quot;      // odejmij stala od zawartosci rejestru<br />    &quot; sbci  %B5,0                           \n\t&quot;      // Odejmij stała z przeniesieniem od zawartosci rejestru<br />    &quot; brcs  exit%=                          \n\t&quot;      // Skok względny jeśli flaga przeniesienia<br />                                                       // jest ustawiona (gdy C=1)<br />    &quot; ld    %&#91;databyte&#93;, X+                 \n\t&quot;      // Ładuj rejestr Rd pośrednio daną<br />                                                       // z pamięci SRAM znajdującą się pod<br />                                                       // adresem wskazanym przez rejestr<br />                                                       // indeksowy X z postinkrementacją<br />                                                       // rejestru X<br />    &quot; ldi   %&#91;cnt&#93;, 8                       \n\t&quot;      // Ładuj rejestr Rd bezpośrednio<br />                                                       // wartością stałej z zakresu 0...255<br />&quot;oPTL%=:and   %&#91;port&#93;, %&#91;sckLO&#93;             \n\t&quot;      // wyzerowanie sck<br />    &quot; out   %&#91;lcd_port&#93;, %&#91;port&#93;            \n\t&quot;      // zaladuj do portu lcd<br />    &quot; or   %&#91;port&#93;, %&#91;sdaHI&#93;                \n\t&quot;      // ustaw bit data na hi<br />    &quot; lsl   %&#91;databyte&#93;                     \n\t&quot;      // rotacja bitow w lewo<br />    &quot; brcs  nxtbit%=                        \n\t&quot;      // Skok względny jeśli flaga przeniesienia<br />                                                       // jest ustawiona (gdy C=1)<br />    &quot; and   %&#91;port&#93;, %&#91;sdaLO&#93;               \n\t&quot;      // wyzerowanie bitu data<br />    &quot; out   %&#91;lcd_port&#93;, %&#91;port&#93;            \n\t&quot;      // zaladuj do portu lcd<br />&quot;nxtbit%=:nop                               \n\t&quot;<br />    &quot; or    %&#91;port&#93;, %&#91;sckHI&#93;               \n\t&quot;      // ustaw sck na hi<br />    &quot; out   %&#91;lcd_port&#93;, %&#91;port&#93;            \n\t&quot;      // zaladuj do portu lcd<br />    &quot; dec   %&#91;cnt&#93;                          \n\t&quot;      // odejmij 1 od licznika<br />    &quot; breq  mPTL%=                          \n\t&quot;      // Skok względny jeśli równe (gdy Z=1)<br />    &quot; rjmp  oPTL%=                          \n\t&quot;      // Skok do petli<br />    &quot; exit%=:                               \n\t&quot;      // koniec<br />    : &#91;cnt&#93;&quot;=&amp;d&quot; (cnt),&#91;port&#93;&quot;=&amp;d&quot; (port), &#91;cmd&#93;&quot;=&amp;d&quot; (cmd)<br />    : &#91;databyte&#93;&quot;e&quot; (data), &#91;lcd_port&#93;&quot;I&quot; (_SFR_IO_ADDR(LCD_PORT)), &#91;datlen&#93;&quot;d&quot; (datlen),<br />      &#91;sdaHI&#93;&quot;d&quot; (LCD_SDA), &#91;sdaLO&#93;&quot;d&quot; (sdaLO),  &#91;sckHI&#93;&quot;d&quot; (LCD_CLK), &#91;sckLO&#93;&quot;d&quot; (sckLO)<br />  );<br />}[/syntax]<br />kompiluje się ,mikroprocesor pracuje ale na wyświetlaczu nic się nie dzieje.<br />Jakie błędy popełniłem?<br />Ps wyciąłem wszystkie &quot;nopy&quot; z kodu żeby był czytelniejszy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 28 lut 2017, o 10:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-25T09:36:22+01:00</updated>
<published>2017-02-25T09:36:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183518#p183518</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183518#p183518"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183518#p183518"><![CDATA[
Jeśli chodzi o komendy i ostatni fragment z dokumentacji wydaje mi się że to nic nie zmienia w implementacji pomysłu.<br />Jest tylko jedna różnica, najpierw należy &quot;wrzucić&quot; nadmiarowy, dziewiąty bit (C/D) oczywiście w zależności czy 0 czy 1 ustawić wyjście MOSI, pamiętając o wyłączeniu sprzętowego SPI na ten czas. Następnie włączyć SPI i podać 8 kolejnych bitów.<br /><br />[syntax=c]void send_9bit_command(uint8_t CD, uint8_t command) {<br />CS_LO;<br /><br />SPCR &amp;= ~(1&lt;&lt;SPE);// Wyłączmy SPI sprzętowe<br />if (CD)<br />MOSI_HI;<br />else<br />MOSI_LO;<br />CLK_HI;// Software'owe &quot;tyknięcie&quot; zegara<br />CLK_LO;// Inaczej &quot;zatrzaśnięcie&quot; 9 bitu w sterowniku wyświetlacza<br /><br />SPCR |= (1&lt;&lt;SPE);// Włączmy SPI sprzętowe<br />sw_hardware_SPI_write( command );//Wysyłamy resztę, 8 pozostałych bitów komendy<br /><br />CS_HI;<br />}[/syntax]<br /><br />Patrząc pobieżnie na ten sterownik i jego dokumentację wydaje się, ze sposób jego sterowania jest bardzo podobny do innych sterowników, nawet tych prostszych, jak popularne oledowe SSD1306.<br /><br /><br />Zajrzyj może na mirkowe poradniki o SSD1306. Przydałby Ci się również greenbook, bo tam był sposób programowania wyświetlaczy graficznych.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 25 lut 2017, o 09:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T21:26:30+01:00</updated>
<published>2017-02-24T21:26:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183505#p183505</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183505#p183505"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183505#p183505"><![CDATA[
O tym samym myślałem,ale komendy wykorzystują całe 9 bitów a i data tylko w przypadku kolorów wykorzystuje 3 x 6 (18 bit color) a inne też całe 9 bitów.<br />Więc samym zegarem tego nie przeskoczę. Myślę że może wstawka assemblerowa by lepiej zadziałała ale jeszcze jestem zbyt &quot;zielony&quot; w te klocki.<br /><a href="https://obrazkiforum.atnel.pl/14189/90ef1dedb5c6263b9395576fdb9bf0e3.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/14189/90ef1dedb5c6263b9395576fdb9bf0e3.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-24T20:43:33+01:00</updated>
<published>2017-02-24T20:43:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183502#p183502</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183502#p183502"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183502#p183502"><![CDATA[
<div class="quotetitle">radek3035 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent">Pomiędzy każdy bajt, wysłany sprzętowo, &quot;wrzucasz&quot; jedno &quot;tyknięcie&quot; zegara, po to by sterownik będący cały czas w CS = low, tylko &quot;odhaczył, ten 9 nic nie znaczący bit.<br /></div><br />bity idą od Msb czyli od D8 do D0, Pierwszy ustawiony na 'H' sygnalizuje że nadaję dane a na' L' że nadaję komendę. Nie da się go pominąć. Ustawiam CS na 'L'<br />Nadaję komendę a potem może być od zera do kilkudziesięciu danych nawet. Czyli pierwszy bit przesyłany na' L' i 8 bitów komendy potem bit danych 'H' i 8 bitów danych, bit 'H' i następne 8 bitów danych  i następne... itd.. ewentualnie następny stan 'L' i 8 bitów nowej komendy i 'H' i 8 bit danych...</div><br /><br />Hmm chyba nie zrozumieliśmy się <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Mi chodziło, że tę &quot;drugą stronę&quot; pomijamy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Najpierw idzie MSB, czyli znacznik komendy albo danych i to oczywiście zostawiamy i po kolei następne bity, aż dochodzi do dwóch ostatnich, które nie mają znaczenia, a ostatni z nich, czyli LSB &quot;nadajemy&quot; poprzez to dodatkowe, softwarowe &quot;tyknięcie&quot;.<br />Tutaj nie ma znaczenia czy L czy H bo sterownik to pomija.<br />Należy pamiętać, ze w HW SPI mozemy sobie ustawi czy LSB czy MSB ma iść pierwszy, oczywiście  w tym wypadku MSB (nie ustawiamy bitu DORD)<br />Zrobiłem dodatkowe testy, zmodyfikowałem kod:<br />[syntax=c]void send_colors(uint8_t r, uint8_t g, uint8_t b) {<br />CS_LO;<br /><br />sw_hardware_SPI_write( r&lt;&lt;1 );//8 bitów<br /><br />SPCR &amp;= ~(1&lt;&lt;SPE);// Wyłączmy SPI sprzętowe<br />SCK_HI;// 9 bit<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />SCK_LO;<br /><br />SPCR |= (1&lt;&lt;SPE);// Włączmy SPI sprzętowe<br />sw_hardware_SPI_write( g&lt;&lt;1 );//8 bitów<br /><br />SPCR &amp;= ~(1&lt;&lt;SPE);// Wyłączmy SPI sprzętowe<br />SCK_HI;// 9 bit<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />SCK_LO;<br /><br />SPCR |= (1&lt;&lt;SPE);// Włączmy SPI sprzętowe<br />sw_hardware_SPI_write( b&lt;&lt;1 );//8 bitow<br /><br />SPCR &amp;= ~(1&lt;&lt;SPE);// Wyłączmy SPI sprzętowe<br />SCK_HI;// 9 bit<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />asm(&quot;nop&quot;);<br />SCK_LO;<br /><br />SPCR |= (1&lt;&lt;SPE);// Włączmy SPI sprzętowe<br /><br /><br />CS_HI;<br />}[/syntax]<br />Okazuje się, że SPI musi być wyłączone, gdy chcemy sobie &quot;tyknąć&quot; softwarowo zegarem.<br />Wrzuciłem na atmege328p kod i z zrobiłem screeny z analizatora stanów:<br /><br /><a href="https://obrazkiforum.atnel.pl/16487/de3618f0a2029ea3a7622ef66d1422ea.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/de3618f0a2029ea3a7622ef66d1422ea.jpg" alt="Obrazek" /></a><br /><br /><a href="https://obrazkiforum.atnel.pl/16487/4f560150f7b39fbfd8b3eaf9a51edfba.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16487/4f560150f7b39fbfd8b3eaf9a51edfba.jpg" alt="Obrazek" /></a><br /><br />Popatrz jak ładnie widać te 9 tyknięcie, jest nieco węższe, ale można regulować instrukcją nop.<br />Drugi obrazek to już prędkość 4MHz, oczywiście samego zegara SPI.<br /><br />Oczywiście mogłem popełnić jakiś błąd myślowy, nie będę się upierał <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, ale na razie wychodzi mi, że to może działać.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">krish napisał(a):</div><div class="quotecontent"><br />&quot;Kto szuka ten błądzi&quot;?<br />W poście #8  z tego linku po drobnych przeróbkach masz kod, który powinien załatwić Twój problem (mix of bit-bang and hardware SPI):<br /><a href="http://www.avrfreaks.net/forum/9-bit-spi"  class="postlink">http://www.avrfreaks.net/forum/9-bit-spi</a><br /></div><br /><br />Hehe, wydaje się, że właśnie chyba o tym pisałem w tych moich &quot;wywodach&quot; <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=16487">Zealota</a> — 24 lut 2017, o 20:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krish]]></name></author>
<updated>2017-02-24T20:39:39+01:00</updated>
<published>2017-02-24T20:39:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183501#p183501</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183501#p183501"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183501#p183501"><![CDATA[
&quot;Kto szuka ten błądzi&quot;?<br />W poście #8  z tego linku po drobnych przeróbkach masz kod, który powinien załatwić Twój problem (mix of bit-bang and hardware SPI):<br /><a href="http://www.avrfreaks.net/forum/9-bit-spi"  class="postlink">http://www.avrfreaks.net/forum/9-bit-spi</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2273">krish</a> — 24 lut 2017, o 20:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T20:13:56+01:00</updated>
<published>2017-02-24T20:13:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183499#p183499</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183499#p183499"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183499#p183499"><![CDATA[
<div class="quotetitle">Zealota napisał(a):</div><div class="quotecontent"><br />Pomiędzy każdy bajt, wysłany sprzętowo, &quot;wrzucasz&quot; jedno &quot;tyknięcie&quot; zegara, po to by sterownik będący cały czas w CS = low, tylko &quot;odhaczył, ten 9 nic nie znaczący bit.<br /></div><br />bity idą od Msb czyli od D8 do D0, Pierwszy ustawiony na 'H' sygnalizuje że nadaję dane a na' L' że nadaję komendę. Nie da się go pominąć. Ustawiam CS na 'L'<br />Nadaję komendę a potem może być od zera do kilkudziesięciu danych nawet. Czyli pierwszy bit przesyłany na' L' i 8 bitów komendy potem bit danych 'H' i 8 bitów danych, bit 'H' i następne 8 bitów danych  i następne... itd.. ewentualnie następny stan 'L' i 8 bitów nowej komendy i 'H' i 8 bit danych...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 20:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-24T19:41:22+01:00</updated>
<published>2017-02-24T19:41:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183496#p183496</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183496#p183496"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183496#p183496"><![CDATA[
<div class="quotetitle">radek3035 napisał(a):</div><div class="quotecontent"><br />Napisałem sterownik dla SPFD54124. Działa ale chciałbym szybciej. No i tu jest 128x160 pixeli a myślę o większym troszkę i wtedy będzie jeszcze wolniej...<br /></div><br />Hmm a może taki &quot;chytry sposób:<br />Dzielisz paczki na 8 bitowe. Każdy 9 bit jest bez znaczenia. Chodzi mi oczywiście o LSB.<br />Tworzysz więc 3 bajty, które wysyłasz po SPI sprzętowym, gdzie MSB jest oczywiście pierwszym wysłanym &quot;bitem&quot; dla każdej bajtu..<br />Pomiędzy każdy bajt, wysłany sprzętowo, &quot;wrzucasz&quot; jedno &quot;tyknięcie&quot; zegara, po to by sterownik będący cały czas w CS = low, tylko &quot;odhaczył, ten 9 nic nie znaczący bit.<br />To 9 tyknięcie zegara należy dobrać czasowo tak by było zgodne z dokumentacją.<br />Prawdopodobnie wystarczy rzucić dwie komendy CLK_HI i CLK_LO, nawet bez dodatkowego opóźnienia i zbocze narastające  &quot;zaliczy&quot; ostatni bit.<br />Oczywiście bajty z konkretnymi danymi w słowach 8 bitowych należy poprzestawiać przesunięciem bitowym.<br /><br />[syntax=c]void hardware_SPI_write( uint8_t data ) {<br />SPDR = data;<br />while ( !( SPSR&amp;(1&lt;&lt;SPIF) ) );<br />}<br /><br /><br />void send_colors(uint8_t r, uint8_t g, uint8_t b) {<br />CS_LO;<br /><br />sw_hardware_SPI_write( r&lt;&lt;1 );//8 bitów<br />CLK_HI;// 9 bit<br />CLK_LO;<br />sw_hardware_SPI_write( g&lt;&lt;1 );//8 bitów<br />CLK_HI;// 9 bit<br />CLK_LO;<br />sw_hardware_SPI_write( b&lt;&lt;1 );//8 bitow<br />CLK_HI;// 9 bit<br />CLK_LO;<br />     <br />       CS_HI;<br />}[/syntax]<br /><br />Powyższy kod to taki niedoskonały zarys, ale mam nadzieję, że wiadomo o co chodzi.<br />Samo SPI w AVR po każdym wysłanym bajcie zatrzymuje zegar. <br />Dodatkowo należy oczywiście parametry dobrze ustawić CPOL, CPHA DORD i co tam jeszcze trzeba.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 24 lut 2017, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T19:30:13+01:00</updated>
<published>2017-02-24T19:30:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183495#p183495</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183495#p183495"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183495#p183495"><![CDATA[
<div class="quotetitle">MirkoT napisał(a):</div><div class="quotecontent"><br />To może powinieneś troszkę inaczej podejść do tej transmisji.<br />Zrobić sobie bufor obrazu w którym od razu na poszczególnych bitach <br />ustalasz co tam jest czyli dane przeplatasz tym bitem data. Wiem to <br />komplikuje obliczanie pozycji.<br />A potem jednym ciągiem wyrzucasz cały bufor na wyświetlacz korzystając <br />ze sprzętowego I2C czy TWI to już wsio ryba.<br /></div><br />Właśnie oglądam Magic Ledy p.Mirka i zaczynam mieć zarys pomysłu. Zajefajny poradnik i chyba sobie zafunduję książkę. <br />Natomiast bufor musiałby mieć 128*160*3 bajty to 61 440 bajtów..<br />Aczkolwiek można by wykorzystać Partial Area i buforować tylko potrzebny fragment.<br />Jeszcze raczkuję w C i AVR więc chętnie posłucham wszystkich którzy maja jakiś pomysł realizacji.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 19:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2017-02-24T19:02:58+01:00</updated>
<published>2017-02-24T19:02:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183494#p183494</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183494#p183494"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183494#p183494"><![CDATA[
To może powinieneś troszkę inaczej podejść do tej transmisji.<br />Zrobić sobie bufor obrazu w którym od razu na poszczególnych bitach <br />ustalasz co tam jest czyli dane przeplatasz tym bitem data. Wiem to <br />komplikuje obliczanie pozycji.<br />A potem jednym ciągiem wyrzucasz cały bufor na wyświetlacz korzystając <br />ze sprzętowego I2C czy TWI to już wsio ryba.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 24 lut 2017, o 19:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T18:36:49+01:00</updated>
<published>2017-02-24T18:36:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183491#p183491</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183491#p183491"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183491#p183491"><![CDATA[
Napisałem sterownik dla SPFD54124. Działa ale chciałbym szybciej. No i tu jest 128x160 pixeli a myślę o większym troszkę i wtedy będzie jeszcze wolniej...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 18:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-24T18:34:47+01:00</updated>
<published>2017-02-24T18:34:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183490#p183490</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183490#p183490"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183490#p183490"><![CDATA[
<div class="quotetitle">radek3035 napisał(a):</div><div class="quotecontent"><br />W datasheet jest napisane: 3-pin 9 bits Serial Peripheral Interface (SPI)<br />Nazwy nadałem sam. Tak jak Zealota napisał SDA - Serial Data etc.<br /><a href="https://obrazkiforum.atnel.pl/14189/a0741dd089e52a60c95275c36ae7c5c2.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/14189/a0741dd089e52a60c95275c36ae7c5c2.png" alt="Obrazek" /></a><br /></div><br /><br />Zdradź może o jaki sterownik LCD chodzi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 24 lut 2017, o 18:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T18:43:11+01:00</updated>
<published>2017-02-24T18:32:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183489#p183489</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183489#p183489"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183489#p183489"><![CDATA[
<div class="quotetitle">SP2LUB napisał(a):</div><div class="quotecontent"><br />Ok ja tam sie nie znam, ale w magistrali SPI widzę MOSI i MISO natomiast nazwy linii które podajesz są charakterystyczne dla I2C. Tak samo wyświetlacz LCD który chcesz sterować jest zrobiony pewnie dla magistrali I2C.<br />Jak mówię ja się nie znam i początkujący jestem, ale SPI to SPI a I2C to I2C po coś te nazwy wprowadzono i łatwiej się poroznmiewać używając takich określeń. Tym bardziej że Atmega ma rozwiązania sprzętowe zarówno dla SPI jak i I2C więc nic tylko odpalać i śmigać.<br /></div><br />Tutaj MOSI i MISO jest na linii DATA. Jest dwukierunkowa. Tak jak w I2C ale nie adresujesz układu tylko wybierasz poprzez LOW na CS.<br />9-ty bit transmisji ustala czy nadajesz komendę(LOW) czy dane(HIGH), tzn. następne 8 bitów<br />Jak widać a załączonym wcześniej obrazku z datasheet, piny również mają nazwy CSX, SCL i SDA...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 18:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SP2LUB]]></name></author>
<updated>2017-02-24T18:26:13+01:00</updated>
<published>2017-02-24T18:26:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183488#p183488</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183488#p183488"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183488#p183488"><![CDATA[
Ok ja tam sie nie znam, ale w magistrali SPI widzę MOSI i MISO natomiast nazwy linii które podajesz są charakterystyczne dla I2C. Tak samo wyświetlacz LCD który chcesz sterować jest zrobiony pewnie dla magistrali I2C.<br />Jak mówię ja się nie znam i początkujący jestem, ale SPI to SPI a I2C to I2C po coś te nazwy wprowadzono i łatwiej się poroznmiewać używając takich określeń. Tym bardziej że Atmega ma rozwiązania sprzętowe zarówno dla SPI jak i I2C więc nic tylko odpalać i śmigać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12998">SP2LUB</a> — 24 lut 2017, o 18:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T18:27:04+01:00</updated>
<published>2017-02-24T18:20:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183486#p183486</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183486#p183486"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183486#p183486"><![CDATA[
W datasheet jest napisane: 3-pin 9 bits Serial Peripheral Interface (SPI)<br />Nazwy nadałem sam. Tak jak Zealota napisał SDA - Serial Data etc.<br /><a href="https://obrazkiforum.atnel.pl/14189/a0741dd089e52a60c95275c36ae7c5c2.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/14189/a0741dd089e52a60c95275c36ae7c5c2.png" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 18:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-24T17:59:28+01:00</updated>
<published>2017-02-24T17:59:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183485#p183485</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183485#p183485"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183485#p183485"><![CDATA[
<div class="quotetitle">SP2LUB napisał(a):</div><div class="quotecontent"><br />Kolego a czy nie mylisz przypadkiem magistrali SPI z i2C? w Atmega masz śliczne i2c gotowe do śmigania.<br /></div><br />Myślę, że Kolega nic nie myli, ale dowiemy się gdy sam się wypowie:)<br />SDA - to Serial Data<br />CS - Chip Select<br />CLK - Clock<br /><br />SDA to prawdopodobnie zbieżność nazw z TWI.<br />A reszta nazw to klasyka dla transmisji szeregowej, w szerokim rozumieniu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 24 lut 2017, o 17:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SP2LUB]]></name></author>
<updated>2017-02-24T16:36:39+01:00</updated>
<published>2017-02-24T16:36:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183478#p183478</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183478#p183478"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183478#p183478"><![CDATA[
Kolego a czy nie mylisz przypadkiem magistrali SPI z i2C? w Atmega masz śliczne i2c gotowe do śmigania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12998">SP2LUB</a> — 24 lut 2017, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T15:50:10+01:00</updated>
<published>2017-02-24T15:50:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183475#p183475</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183475#p183475"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183475#p183475"><![CDATA[
Zrobiłem tak:<br />[syntax=c]void Send(boolean isCmd, uint8_t Data) {<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_CS); //wyzerowanie CLK i CS<br />  if (isCmd)LCD_PORT &amp;= ~LCD_SDA; //if CMD wyzerowanie DATA  (bit Comand/Data)<br />  LCD_PORT |= LCD_CLK; //ustawienie CLK na 1<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA); //wyzerowanie CLK i DATA<br />  if (Data &amp; 128)LCD_PORT |= LCD_SDA; //if DATA 1 Ustawienie 1 na DATA<br />  LCD_PORT |= LCD_CLK; //ustawienie CLK na 1<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 64)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 32)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 16)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 8)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 4)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 2)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);<br />  if (Data &amp; 1)LCD_PORT |= LCD_SDA;<br />  LCD_PORT |= LCD_CLK;<br />  //<br />  LCD_PORT |= (LCD_CLK | LCD_SDA | LCD_CS); //ustawienie portu na 1<br />}[/syntax]<br />Troszkę pomogło i jest ciut szybciej. Ale to jeszcze za mało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 15:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zealota]]></name></author>
<updated>2017-02-24T14:15:58+01:00</updated>
<published>2017-02-24T14:15:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183472#p183472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183472#p183472"/>
<title type="html"><![CDATA[Re: SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183472#p183472"><![CDATA[
<div class="quotetitle">radek3035 napisał(a):</div><div class="quotecontent"><br />Ewentualnie jak można inaczej zrealizować kod aby wysyłanie było bardziej &quot;sprzętowe&quot; lub szybsze?<br /></div><br /><br />Powinieneś zajrzeć do mirkowego poradnika na temat magic ledów, gdzie były opisywane, dodatkowe optymalizacje kodu dla transmisji szeregowych.<br />W skrócie musisz rozwinąć pętlę &quot;for&quot; do pojedynczych instrukcji, zyskasz wtedy na czasie, ale stracisz na objętości kodu w pamięci flash.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16487">Zealota</a> — 24 lut 2017, o 14:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radek3035]]></name></author>
<updated>2017-02-24T13:09:11+01:00</updated>
<published>2017-02-24T13:09:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183468#p183468</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183468#p183468"/>
<title type="html"><![CDATA[SPI 9 bit na AtMega]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17724&amp;p=183468#p183468"><![CDATA[
Witam wszystkich.<br />Jestem w trakcie &quot;robienia&quot; biblioteki do obsługi lcd. Wadą a zarazem i zaletą tego wyświetlacza jest 3-pinowa transmisja danych (CS,SDA,CLK)<br />AtMega posiada sprzętowy interfejs SPI ale 8-mio bitowy, a tutaj jest potrzebny jeszcze dziewiąty do opcji COMAND/DATA.<br />Moje programowe SPI wygląda tak:<br />[syntax=c]void Send_to_LCD(boolean isCmd, uint8_t Data) {<br />  LCD_PORT &amp;= ~(LCD_CLK | LCD_CS);                              //wyzerowanie CLK i CS<br />  if (isCmd)LCD_PORT &amp;= ~LCD_SDA;                                //jeśli CMD wyzerowanie SDA  (bit Comand/Data)<br />  LCD_PORT |= LCD_CLK;                                                 //ustawienie CLK na 1<br />  for (uint8_t x = 0; x &lt; 8; x++)  {<br />    LCD_PORT &amp;= ~(LCD_CLK | LCD_SDA);                        //wyzerowanie CLK i SDA<br />    if (Data &amp; 128)LCD_PORT |= LCD_SDA;                        //jeśli DATA = 1: Ustawienie 1 na SDA<br />    LCD_PORT |= LCD_CLK;                                              //ustawienie CLK na 1<br />    Data = Data &lt;&lt; 1;                                                     // przesuniecie bitow DATA<br />  }<br />  LCD_PORT |= (LCD_CLK | LCD_SDA | LCD_CS); //ustawienie portu na 1<br />}[/syntax]<br />Działa bezbłędnie ale chciałbym przyśpieszyć wysyłanie danych. <br />Czy można skonfigurować SPI sprzętowe aby dało się wysyłać dane w takim formacie jak w załączonym kodzie?<br />Ewentualnie jak można inaczej zrealizować kod aby wysyłanie było bardziej &quot;sprzętowe&quot; lub szybsze?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14189">radek3035</a> — 24 lut 2017, o 13:09</p><hr />
]]></content>
</entry>
</feed>