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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2022-06-05T23:33:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=21870&amp;mode</id>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2022-06-05T23:33:32+01:00</updated>
<published>2022-06-05T23:33:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=235589#p235589</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=235589#p235589"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=235589#p235589"><![CDATA[
Małe info. Zegarek działa bez problemu do dzisiaj. Nawet baterii nie zmieniałem jeszcze. Około rok temu podczas pracy samego zegarka przetwornica zasilacza  piszczała co było wyraźnie słyszalne. Po wymianie kondensatorów elektrolitycznych i przelutowaniu całości problem zniknął. Lecz nie od razu a dopiero po ok 2 dniach... Dodatkowo popsuł się sam laser - DVD nie czytało płyt, na szczęście udało mi się dorwać identyczny(co nie jest takie łatwe jeżeli chodzi o ten konkretnie model) i przerzucić cały napęd płyty. Lasery w tych urządzeniach niestety nie słyną z trwałości. Z oryginału nie idzie już niestety dostać.  W najbliższym czasie będę planował dorobić odcięcie zasilania elektroniki kiedy zegarek pracuje. Oczywiście info się pojawi   <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 5 cze 2022, o 23:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[cekin]]></name></author>
<updated>2019-10-24T09:53:50+01:00</updated>
<published>2019-10-24T09:53:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222647#p222647</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222647#p222647"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222647#p222647"><![CDATA[
Funkcja działa. Dzięki  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1711">cekin</a> — 24 paź 2019, o 09:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-10-23T22:29:28+01:00</updated>
<published>2019-10-23T22:29:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222642#p222642</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222642#p222642"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222642#p222642"><![CDATA[
Dobra wiadomość to taka ze masz identyczny moduł jak ja testowałem czyli 40-DVP520-FBC2X. Do wykorzystania są 3 klawisze na dużej płytce. Czwarty(mała płytka) idzie do dużego złącza z pominięciem sterownika VFD. Proponuje tez odzyskać długi przewód od małej płytki i dać go w miejsce tego krótkiego od zasilacza- zdecydowanie ułatwia to pracę  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Dokumentacje używałem ta :<br /><!-- m --><a class="postlink" href="http://www.datasheetcatalog.com/datasheets_pdf/H/T/1/6/HT16512.shtml" >http://www.datasheetcatalog.com/datashe ... 6512.shtml</a><!-- m --><br />W moim projekcie używałem programowego SPI. W przypadku sprzętowego należy chyba przewidzieć w układzie zworę na golpinach  w celu zwarcia MOSI z MISO. Nie można tego połączyć na stałe gdyż nie zaprogramuje się procesora... Pamiętaj ze DO i DI(piny 5 i 6) są zwarte razem i podciągnięte do VCC za pomocą rezystora 10K<br /><br />[syntax=c]uint8_t klawisz (void)// funkcja odczytu klawiszy z płytki wyświetlacza<br />{<br />   uint8_t licznik=0x01,data=0;<br />   CMD_1; // użycie lini STB<br />   CMD_0;<br />   SendVFDSpi(0b01000010); // wysłanie komendy odczytu rejestru patrz  str 8 dokumentacji<br />   PORT_DDR &amp;=~(1&lt;&lt;SDIN); //zmiana pinu z wyjścia na wejście //Zmiana w DDR nie PORT<br />licznik=0x01; // ponowne ustawienie licznika<br /><br />   while( licznik )//odliczanie 8 bitów w pêtli do odbioru<br />        {<br />        SCK_1;<br />        SCK_0;<br />        if( PORT_PIN  &amp; (1&lt;&lt;SDIN)) data |=1; //iloczyn bitowy celem sprawdzenia wartości bitu<br />        data&lt;&lt;=1;<br />        licznik&lt;&lt;=1; //przesunięcie licznika w lewo celem maskowania odpowiedniego bitu<br />       }<br />   PORT_DDR |= (1&lt;&lt;SDIN); // ustawienie pinu z powrotem na wyjście<br /> _delay_ms(150); //<br /> return (data);<br />  }<br /><br /><br />w kodzie programu używałem tego tak :<br />    switch( klawisz() ); // rezultat z wywołania funkcji klawisz do instrukcji switch<br />{<br />case 128: // pierwszy klawisz<br />{<br />       // tu kod np wejście w menu<br />         }<br />break;<br /><br />case 192: //dwa klawisze wciśnięte razem i wtedy np wyświetlacz on/off<br />{<br />                 //tu kod   np liczba minus<br />}<br />break;<br />case 64:    //drugi klawisz<br />{<br />         //tu kod<br />        }<br />case 32:  //trzeci klawisz np liczba plus<br />{<br />         // tu kod<br />}<br /><br />}[/syntax]<br />możliwe są oczywiście tez inne kombinacje klawiszy np 1 z 3 itd, należy tylko policzyć sobie jaką liczbę zwróci wtedy funkcja.<br />Mam nadzieje ze rozjaśniłem sytuacje. W tym konkretnym przypadku wszystkie interesujące nas dane (3 bity) są zawarte w pierwszym odczytywanym bajcie choć sterownik ma dużo większe możliwości i cała matryca zajmuje aż 3 bajty. Regulacja kontrastu tez działa tutaj kulawo i mimo ze ma aż 7 stopni to najlepiej regulować ze skokiem co 2 pozycje - inaczej nie zauważysz praktycznie  zmiany..<br />Podłączenie klawiszy :<br />Klawisz open/close pin       11(K1) sterownika VFD<br />Klawisz stop pin                12(K2)<br />Klawisz Play/Pause pin        13(K3)<br />drugi koniec jest na pinie     15 (S0/K0)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 23 paź 2019, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[cekin]]></name></author>
<updated>2019-10-23T11:12:44+01:00</updated>
<published>2019-10-23T11:12:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222625#p222625</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222625#p222625"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222625#p222625"><![CDATA[
Tak wygląda moduł, znalazłem go w sieci.<br /><a href="https://produto.mercadolivre.com.br/MLB-1025564758-placa-display-dvd-philips-dvp530bk-40-dvp520-fcb2x-_JM"  class="postlink">https://produto.mercadolivre.com.br/MLB-1025564758-placa-display-dvd-philips-dvp530bk-40-dvp520-fcb2x-_JM</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1711">cekin</a> — 23 paź 2019, o 11:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-10-22T22:15:41+01:00</updated>
<published>2019-10-22T22:15:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222622#p222622</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222622#p222622"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222622#p222622"><![CDATA[
W najbliższym czasie postaram się wrzucić kod + opis - wszytko mam na kompie stacjonarnym w sypialni a nie chce teraz  budzić zony. Będziesz musiał sprawdzić czy klawisze są podłączone identycznie jak w moim przypadku. Daj tez jakieś zdjęcia tego modułu bo w necie z tym slabo<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 22 paź 2019, o 22:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[cekin]]></name></author>
<updated>2019-10-21T12:37:22+01:00</updated>
<published>2019-10-21T12:37:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222596#p222596</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222596#p222596"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=222596#p222596"><![CDATA[
Witam, <br />Posiadam podobny moduł z DVD524/04, mieści się tam sterownik CS16312EN. Nie wiem jak dokonać odczytu z klawiatury...  <br /><div class="quotetitle">Elwood napisał(a):</div><div class="quotecontent"><br />Jeżeli ktoś jest zainteresowany to mogę też dodać funkcje odczytu klawiszy ze sterownika VFD.<br /></div><br />Jestem zainteresowany funkcja do odczytu z klawiatury <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=1711">cekin</a> — 21 paź 2019, o 12:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-04-09T21:57:35+01:00</updated>
<published>2019-04-09T21:57:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218079#p218079</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218079#p218079"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218079#p218079"><![CDATA[
<div class="quotetitle">Marhef napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Elwood napisał(a):</div><div class="quotecontent">z powodu jakiegoś dziwnego błędu nie moglem zastosować poligonów masy<br /></div>A w jaki sposób próbowałeś je dodać?<br />Ja już dawno nie pracuję w eagle'u, ale z tego, co pamiętam, należy narysować obrys poligonu, zmienić mu nazwę na GND i użyć przycisku do przerysowania połączeń (ratsnet?)</div><br />Jest tak jak piszesz. A ja wcześniej najpierw po kliknieciu w polygons nadawałem nazwe a potem dopiero rysowałem i uzywałem Ratsnet. Jak nadaje nazwę dopiero po narysowaniu to jest ok. Dzięki za pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 9 kwi 2019, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2019-04-08T07:33:13+01:00</updated>
<published>2019-04-08T07:33:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218014#p218014</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218014#p218014"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218014#p218014"><![CDATA[
<div class="quotetitle">Elwood napisał(a):</div><div class="quotecontent"><br />z powodu jakiegoś dziwnego błędu nie moglem zastosować poligonów masy<br /></div>A w jaki sposób próbowałeś je dodać?<br />Ja już dawno nie pracuję w eagle'u, ale z tego, co pamiętam, należy narysować obrys poligonu, zmienić mu nazwę na GND i użyć przycisku do przerysowania połączeń (ratsnet?)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 8 kwi 2019, o 07:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-04-07T21:45:55+01:00</updated>
<published>2019-04-07T21:45:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218010#p218010</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218010#p218010"/>
<title type="html"><![CDATA[Re: Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=218010#p218010"><![CDATA[
<a href="https://obrazkiforum.atnel.pl/2545/b2b4ad1b521c65853ef29ec7a7130ab5.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/b2b4ad1b521c65853ef29ec7a7130ab5.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/5fa0d4c1896cbadfdcb94ef71a83262b.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/5fa0d4c1896cbadfdcb94ef71a83262b.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/192ff115c60faed0f8acac6fa078c26e.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/192ff115c60faed0f8acac6fa078c26e.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/7a3832d5a2fdc8422c4ff490444a5e85.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/7a3832d5a2fdc8422c4ff490444a5e85.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/a38106590465416275227d16df26b5af.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/a38106590465416275227d16df26b5af.jpg" alt="Obrazek" /></a><br /><br />Przedstawiam &quot;ulepszona&quot; wersje w/w zegarka. Po obejrzeniu poradników pana Mirka zaprojektowałem w końcu  schemat elektryczny w eaglu i swoja pierwsza w życiu płytkę drukowana która następnie wykonałem metoda termo-transferu. Jak na pierwszy raz wyszła myślę całkiem dobrze- pomijając fakt ze z powodu jakiegoś dziwnego błędu nie moglem zastosować poligonów masy oraz sprawdziłem przy okazji mazak do obwodów drukowanych który zakupiłem gdzieś tak z 5 lat temu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  W kilku miejscach płytka została podtrawiona ale nie wiem czy to wina tego ze toner nie przylepił się do płytki(kontrast wydruku ustawiony był na max) czy tego ze leżała kilka godzin w wytrawiaczu. Pocynowałem ścieżki i przejrzałem całość pod lupa oraz sprawdziłem połączenia. Jest w porządku. W każdym razie pierwsze koty za ploty i nie będę musiał się już męczyć na płytkach uniwersalnych jak do tej pory tylko muszę dopracować technologie. Na ta chwile wiem ze trzeba na pewno na początku dawać większe pola miedzi niż zastosowałem oraz bardzo dokładnie nakładać powłokę mazakiem ochronnym. W każdym razie zdobyłem cenne doświadczenie przed kolejnym projektem.<br />Ze zmian elektrycznych  na ta chwile jest tylko inne przypisanie poszczególnych portów które wynikło podczas projektowania PCB. Z  RTC skasowałem tez  diodę led gdyż nie ma sensu aby świeciła w środku obudowy. Zredukowałem tez prędkość procesora do 4MGHz. Diodę prostownicza  obok układu RTC zlikwidowałem już wcześniej - te chińskie moduły maja błąd i bateria jest ładowana a nie powinna. Zapomniałem o tym napisać poprzednio. Bibliotekę do tego modułu RTC znalazłem na jakimś forum arduino. Proponuje na starcie  wywalić ze schematu modułu w ogóle pady z tej strony gdzie są 4 a do pinów VCC i masy w tym miejscu wlutować dodatkowy kondensator filtrujący zasilanie jak na foto. <br />Teraz muszę jeszcze zebrać się  w sobie i w końcu dłubnąć program gdyż po dodaniu na starcie procedury przewijającej cyfry 0-9 co 250ms zabrakło miejsca na kolejne rzeczy program zajmuje teraz 1982 bajty.<br />Do chwili modyfikacji jak i po niej zegarek działa bezproblemowo.<br />PS Pin nr 4 podstawki procesora jest wydłubany z podstawki, płytka nie ma dziury w tym miejscu  wiec zwarcia pomiędzy sygnałem Reset a PB3 nie ma jakby ktoś to zauważył <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 7 kwi 2019, o 21:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Elwood]]></name></author>
<updated>2019-01-13T19:12:54+01:00</updated>
<published>2019-01-13T19:12:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=215766#p215766</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=215766#p215766"/>
<title type="html"><![CDATA[Zegarek na bazie DVD PHILIPS DVP3042/12]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21870&amp;p=215766#p215766"><![CDATA[
<a href="https://obrazkiforum.atnel.pl/2545/3dc039baf338194bba209cb3dce31141.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/3dc039baf338194bba209cb3dce31141.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/6883f2d1d7be0caae4d35d4551fa2688.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/6883f2d1d7be0caae4d35d4551fa2688.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/c3434a4c501130325f829df2971a3f37.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/c3434a4c501130325f829df2971a3f37.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/e4e7f988b8181068c0201d9e1eb74d84.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/e4e7f988b8181068c0201d9e1eb74d84.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/0df7bd300927f4c1248eadc7dafde7af.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/0df7bd300927f4c1248eadc7dafde7af.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/513d289f82c4de2613b91f1068594572.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/513d289f82c4de2613b91f1068594572.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/911b9aaae0648015d3689d21a4d3b195.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/911b9aaae0648015d3689d21a4d3b195.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/2545/b9bedd57df8a81f56e0ec5bf79785ee4.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/2545/b9bedd57df8a81f56e0ec5bf79785ee4.jpg" alt="Obrazek" /></a><br /><br />Przedstawiam zegarek VFD na bazie DVD-Playera DVP3042/12  firmy Philips<br /><br />Od jakiegoś czasu w tzw dużym pokoju brakowało zonie zegarka. Dawno temu już zrobiłem zegar vfd  na PCB z podobnego  DVD ale problemem była obudowa a konkretnie brak pomysłu na nią. Jako ze tytułowy odtwarzacz lezy obok telewizora i zajmuje cenne miejsce to stwierdziłem ze pora aby w końcu miał okazje popracować i się przydać po kilku latach przerwy...<br />W projekcie użyłem kawałka płytki uniwersalnej oraz  wykorzystałem  ATTINY 26 który miałem oraz gotowy moduł zegara RTC kupiony na znanym serwisie aukcyjnym Dodatkowo w tylnej ściance zamontowałem gniazdko DB9 które służy do  podłączenia programatora aby za każdym razem nie otwierać obudowy gdyż program jest dość prymitywny i będzie poprawiony a  i może uda się dodać jakieś dodatkowe funkcje.<br />Program działa następująco - po podaniu zasilania odczytuje w przerwaniu co 1s czas z RTC i wysyła na wyświetlacz. Z każdym obiegiem pętli programowej  na  jej początku jest sprawdzane za pomocą funkcji &quot;klawisz&quot;  czy nie został któryś naciśnięty i kontrolowana jest zmienna o nazwie global która steruje praca całego zegara i jego poszczególnymi funkcjami. Umożliwia tez poprzez proste zwiększenie jej zakresu rozszerzenie menu i  dodanie innych funkcji wg potrzeb np przełączenie z trybu 24h na 12 AM/PM.<br /> Menu jest zbudowane na bazie 3 przycisków pochodzących z panelu dekodera Echostar 616 Polsatu . Podczas normalnej pracy wciśniecie 1 (ON/OFF) powoduje wejście do menu i wyświetlenie godziny 12:00:00 na wyświetlaczu. Pozostałe przyciski tj 2 (góra) oraz 3 (dół) pracują jako przyciski +/-  do ustawiania wartości godzin w zakresie 0-23. Po ustawieniu godzin wciskamy znowu przycisk 1 i ustawiamy analogicznie minuty w zakresie 0-59. Po trzecim wciśnięciu przycisku sekundy zostają ustawione na 0, analogicznie ustawiamy dni miesiące i rok a po kolejnym użyciu przycisku ON/OFF czas zostaje wpisany do RTC a  zegar zaczyna normalna prace.<br />Podczas normalnej pracy zegara przyciski 2 i 3 maja swoje dodatkowe funkcje -przycisk 2 wyświetla date na 5s, a  przycisk 3 miał regulować kontrast VFD ale o tym dalej. Wyświetlanie dwukropka na wyświetlaczu jest realizowane na podstawie tablicy zawierającej obraz segmentów do zapalenia. Pierwsze 10 cyfr jest bez dwukropka, kolejne 10  z dwukropkiem i jest używane w zależności od sekund (operacja modulo 2). W moim przypadku użyłem programowego SPI ze względu na attiny  i nie  mieszałem z wysyłaniem danych do sterownika VFD wiec w tym przypadku obrazy cyfr w tablicach maja zamienione starszy bajt z młodszym i najstarszy bit z najmłodszym a segmenty inna kolejność. Zajeło mi trochę czasu rozszyfrowanie tego wiec rozpisałem tylko cyfry. Kolejność jest podana na foto . Oczywiście nic nie stoi na przeszkodzie aby rozbudować tablice znaków  o wszelkie inne możliwe znaki. W moim przypadku ważny był jedynie(na ta chwile) aktualny czas i to aby zegarek nie dawał w nocy po oczach. Seryjne szkło które emituje białe światło doskonale spełnia swoja role. Po ciemku i tak jest doskonale czytelny nawet z kilku metrów Program napisany na podstawie BB , poradników pana Mirka oraz własnej inwencji .Funkcje do obsługi VFD napisałem na podstawie bibliotek  z forum Atnel ale w sumie wykorzystałem tylko podstawowe funkcje typu komenda/dana. Resztę opracowałem samodzielnie.<br />Jest to jeden z moich pierwszych programów w dodatku kleconych przez jakiś rok jak nie lepiej w dodatku  na raty  wiec zdaje sobie sprawę ze można(a nawet trzeba) to zoptymalizować bardziej. Na pewno do wyrzucenia są _delay_ms, poprawić można  tez na pewno funkcje klawisz i funkcje dwukropka - nie za pomocą 2 zestawów tablic znakowych. Program z wersji testowej zbudowany na zestawie uruchomieniowym powstał na atmega 16. Przepisałem go na attiny z drobnymi zmianami  i następnie zabrałem się za lutowanie płytki z UC,  i rtc, itd. <br />Podczas instalacji w docelowym miejscu pojawiły się kolejne 2 problemy. Pierwszy to jak poinformować nasz UC ze chcemy właczyć odtwarzacz - w tym momencie musimy przestać przecież wysyłać nasze dane na wyświetlacz. W pierwszym momencie planowałem uzyć przycisku STANDBY-ON  i przerwania mikrokontrolera do wykrycia faktu jego wciśnięcia. Niestety okazało się ze pomimo iż sygnał jest w złączu do którego  wpinamy to panuje na nim napięcie 2,5V (naciskając  go  zwieramy do masy) wiec nie wiem czy attiny zasilany 5V wykryłby to jako stan wysoki czy w ogóle jako zmianę stanu. <br />Drugi problem powiązany z pierwszym to fakt ze moduł wyświetlacza korzysta (w tym akurat przypadku i  w tym konkretnym modelu ) z napiec 3,3V , -24V  i +12V do zasilania sterownika VFD które potem najprawdopodobniej jest obniżane za pomocą diody Zenera do 5V. Do płytki VFD na panelu przednim nie dochodzi fizycznie napięcie 5V z zasilacza a płytka nie posiada żadnego wbudowanego stabilizatora. Tak wiec w trybie STANDBY kiedy zegarek ma pracować i pokazywać czas, napięcie 12V i pośrednio 5V jest odcinane przez elektronikę sterująca. 3.3V i -24V są obecne cały czas. Sprawa na szczęście okazała się prostsza niż myślałem - obok złącza znajduje się tranzystor typu 8550 oznaczony jako Q33 który to wystarczy usunąć i zewrzeć C z E - wtedy mamy już napięcie zasilające na sterownik VFD <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. Dodatkowo skoro ten tranzystor jest sterowany w momencie włączenia odtwarzacza to sygnał z jego bazy możemy wykorzystać do naszych celów <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Wprawdzie ma wartość około 9 V ale nie jest to problem- 6 szeregowo podłączonych diod prostowniczych załatwia sprawę i zbija do około 4,8V co już bez problemu można wykryć jako stan wysoki.<br />Zasilanie 5V pobrałem z wejścia układu scalonego  BE572L które idzie tam bezpośrednio ze złącza zasilacza. Może to mało eleganckie ale nie chciałem stosować dodatkowego stabilizatora  na swojej płytce, a pcb  odtwarzacza pomimo tego ze jest sporo wolnych miejsc gdzie można by się podłączyć praktycznie bezinwazyjnie to nigdzie  5 V nie występuje.<br />Zmuszony byłem również zastosować układ SN74HC245N - DVD jest zasilanie cały czas nawet w trybie STANDBY a ori sterownik po podpięciu AVR nie jest w stanie wysterować wyświetlacza. Dodatkowo na liniach sterujących utrzymuje stan wysoki z związku z czym musiałem dołożyć osobne przyciski z tyłu. Początkowo planowałem wykorzystać standardowe przyciski OPEN/CLOSE , PLAY/PAUSE oraz STOP. Niestety wymaga to odczytu danych ze sterownika co w w/w układzie połączeń jest niemożliwe. Można oczywiście przeanalizować PCB  i odciąć zasilanie głównego układu ale po kilku dniach walki z uruchomieniem wyświetlacza  z ori elektronika wolałem wywiercić kilka dziur z tyłu obudowy :] <br /><br />Teraz garść info odnośnie samych modułów VFD Philipsa.<br />Moduły z tych DVD maja niestety dziwne rozwiązane sterowanie po SPI - DO jest zwarte  z DI  i podciągniete do +5V. Tak jest w 2 egzemplarzach które mam i piszą w internecie ze w innych typach DVD jest  tak samo. Wymaga to specyficznej obsługi w porównaniu do zwykłego SPI.<br />Wyjścia do zasilania 4 szt LED są nie wykorzystane i zwarte ze sobą.<br />Podobnie nie wykorzystane i zwarte są porty od 3 dodatkowych przycisków.  Pierwszy z nich (K1) wisi w powietrzu.<br />Jedyna dostępna dodatkowa funkcja to matryca klawiszy wykorzystuje tylko lub aż 3 przyciski - dokumentacja podaje ze tablica ma rozmiar 3 bajtów ale na szczęście można odczytać tylko pierwszy bajt z danymi które nas interesują i resztę pominać - sterownik nie protestuje <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />W dokumentacji podany jest sposób włączenia tzw test mode. Niestety po jego uruchomieniu nic się nie dzieje - ktoś wie cokolwiek o tej dodatkowej opcji ?<br />Przy programowym SPI nie jest konieczne oczekiwanie czasu 1us pomiędzy rozkazem odczytu stanu klawiszy a samym odczytem. Dokumentacja zwraca na to szczególna uwagę.<br /> Model DVP 3042/12 jest bardziej &quot;ubogi&quot; niż  DVP 520/02 - w pierwszym zasilacz pracuje cały czas nawet jeżeli tylko jest podłączony do zasilania, w tym drugim cały zasilacz startuje dopiero po zwarciu odpowiednich pinów - coś jak zasilacz do PC. Dodatkowo w pierwszym elektronika jest sporo mniejsza  w stosunku do obudowy a zasilacz mniejszej mocy.<br />W moim przypadku (DVP 3042/12) zastosowany sterownik VFD  ET16312N data produkcji 48 tydzień 2005 roku nie reaguje na komendę zmiany jasności świecenia pomimo kilkunastu prób - zmiana czasu impulsu strobe, dodanie opóźnień itp. Na sterowniku CS16312N (DVP 520/02) data produkcji 33 tydzień 2006  który to według not katalogowych jest kompatybilny działa bez najmniejszego problemu. Na ET16312 kontrast jest ustawiony na maximum, reszta komend również działa. Może w wolnej chwili wymienię scalak odpowiedzialny za obsługę VFD. Pomimo kilkunastu prób nie udało się uruchomić tych funkcji.<br /><br />Koszty budowy trudno określić ponieważ oprócz nowego procesora kupionego parę lat temu zakupiłem tylko SN74HC245N za chyba 1,5zł, reszta elementów z demobilu a kawałek płytki został z jakiegoś wcześniejszego projektu. Płytka kosztowała cala około 5-7zł. Procesor taktowany 8MGHz. Na schemacie nie rysowałem kondensatorów filtrujących. Rezystor 45K jest potrzebny aby procesor nie głupiał przy włączaniu DVD do normalnego użytku- bez niego czasem VFD nic nie pokazywał. Data jest pokazywana z litera R na końcu<br />UWAGA :<br />Program do działania wymaga bibliotek do programowego i2c których tutaj nie publikowałem. Jeżeli ktoś jest zainteresowany to mogę też dodać funkcje odczytu klawiszy ze sterownika VFD.<br /><br /><br />[syntax=c]//* main.c<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 />#include &quot;i2c_soft/i2c_soft.h&quot;<br />#include &quot;PT6318/VFD.h&quot;<br /><br />#define DS3231_ADDR 0xD0 //208<br />#define KEY1 (1&lt;&lt;PB0)<br />#define KEY2 (1&lt;&lt;PB2) //zamienione klawisze w stosunku do pierwotnej wersji<br />#define KEY3 (1&lt;&lt;PB1)<br /><br />volatile uint8_t  KEYA, KEYB, KEYC ;   //ZMIENNE WCISMIECIA KLAWISZA<br />uint8_t key1_lock, key2_lock, key3_lock ;<br />volatile uint8_t global=0  ;<br />volatile uint8_t int0_flag ;<br /><br />typedef union<br /> {<br />uint8_t bytes&#91;7&#93;;<br />struct<br />{<br />uint8_t ss;<br />uint8_t mm;<br />uint8_t hh;<br />uint8_t dof;<br />uint8_t day;<br />uint8_t month;<br />uint8_t year;<br />} ;<br />  }TDATATIME ;<br /><br />  TDATATIME datatime;<br /><br /><br />void DS3231_get_datatime( TDATATIME* tmp);<br />void show_time_VFD(TDATATIME * dt);<br />void show_date_VFD(TDATATIME * dt);<br />void DS3231_init(void);<br />void ustaw12 ( TDATATIME* dt);<br />void godziny_set( TDATATIME* dt);<br />void minuty_set( TDATATIME* dt);<br />void dzien_set( TDATATIME* dt);<br />void miesiac_set( TDATATIME* dt);<br />void rok_set( TDATATIME* dt);<br />void funkcja1 (void) ;<br />void funkcja2 (void) ;<br />void funkcja3 (void) ;<br />void klawisz_wcisniety (uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void));<br />uint8_t dec2bcd(uint8_t dec) ;<br />uint8_t bcd2dec (uint8_t bcd) ;<br /><br />int main (void)<br />{<br />DDRA |=(1&lt;&lt;PA3); //ustawienie wyjscia i stanu niskiego do sterowania brama<br />DDRB &amp;= ~(KEY1 | KEY2 | KEY3);  //ustawinie wejscia na klawiszach<br />PORTB |=(KEY1 | KEY2 | KEY3);   //podciagniecie do VCC<br />i2c_init();//inicjalizacja programowego i2c<br />DS3231_init();<br />InitVFD_SPI();<br />InitVFD();<br />InitVFD();    // inicjalizacja samego VFD<br />MCUCR |=(1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);<br />VFD_CLS(); //czyszczenie VFD<br />while(1)<br /><br />{<br />klawisz_wcisniety (&amp;key1_lock, &amp;PINB, KEY1, funkcja1 ); // dodaje 1 do zmiennej KEYA<br />klawisz_wcisniety (&amp;key2_lock, &amp;PINB, KEY2, funkcja2 ); //dodaje 1 do zmiennej KEYB<br />klawisz_wcisniety (&amp;key3_lock, &amp;PINB, KEY3, funkcja3 ); //dodaje 1 do zmiennej KEYC<br /><br />    if(  !(PINA &amp; (1&lt;&lt;PA2)) )  //zalaczenie dvd<br />           {<br />       VFD_CLS(); //wyczyszczenie VFD przed wylaczeniem<br />       PORTA |=(1&lt;&lt;PA3); //aktywacja bramy sn74hc245n<br />           }<br />     else<br />           {<br />       PORTA &amp;=~(1&lt;&lt;PA3);<br />           InitVFD();//ponowna komunikacje z wyswietlaczem  i zainicjalizowac VFD<br />           }<br /><br />if (!global)   // global rowny 0 normalna praca zegarka odczyt<br />//i pokazanie daty oraz regulacja kontrastu<br />      {<br /><br />     if (global==0 &amp;&amp;(KEYB))<br />      {<br />    global=100;<br />       show_date_VFD(&amp;datatime) ; // klawisz b pokazuje date<br /><br />           _delay_ms(1000);<br />           _delay_ms(1000);<br />           _delay_ms(1000);<br />           _delay_ms(1000);<br />           _delay_ms(1000);<br />            KEYB=0;<br />            global=0;<br />      }<br /><br />//   if (global==0 &amp;&amp;(KEYC))<br />//  {<br />   //tutaj mozna dodac regulacje kontrastu lub wlacz/wylacz pomiedzy 22 a 6 rano<br />//   }<br /><br />    if  (GIFR &amp;(1&lt;&lt;INTF0) ) //normalna praca przerwanie z rtc co 1 s<br />     {<br />     VFD_CLS(); //sprawdzic czy konieczne<br />     DS3231_get_datatime(&amp;datatime);<br />     show_time_VFD(&amp;datatime);<br />     GIFR |= (1&lt;&lt;INTF0) ; // kasowanie flagi<br />    }<br />      }<br /> //tutaj zaczyna sie menu ustawien<br /> if ((KEYA==1) &amp;&amp; !(global)) //pierwsze nacisniecie klawisza przy global rowny 0<br />    {<br />global ++ ;<br />ustaw12(&amp;datatime);<br />KEYA = 0  ;<br /> }<br /> if (global==1)           // ustawiamy godziny<br />  {<br />  show_time_VFD(&amp;datatime);<br />  godziny_set( &amp;datatime);<br />  }<br /> if (KEYA)  // jezeli pierwszy klawisz wcisniety idziemy dalej<br />  {<br />  global++ ;<br />  KEYA = 0 ;<br />   }<br /> if (global==2)   // ustawiamy minuty<br />   {<br />   show_time_VFD(&amp;datatime);<br />   minuty_set(&amp;datatime);<br />      }<br /><br /> if (global==3)// ustawiamy dnia<br />      {<br />  show_date_VFD(&amp;datatime);<br />  dzien_set(&amp;datatime);<br />      }<br /><br />if (global==4)   // ustawiamy miesiac<br />      {<br />  show_date_VFD(&amp;datatime);<br />  miesiac_set(&amp;datatime);<br />      }<br /><br />if (global==5)<br />      // ustawiamy dwie ostanie cyfry roku<br />      {<br />  show_date_VFD(&amp;datatime);<br />  rok_set(&amp;datatime);<br />         }<br /><br /> if (global&gt;5)<br />   {<br />   // zerujemy global  i zmienne klawiszy<br />   KEYA = global = 0 ;  //dodatkowe zerowanie zajmuje 22 bajty<br />   I2C_write_buf( DS3231_ADDR , 0x00, 7,datatime.bytes);<br />    }<br />}<br />}//koniec while<br /><br /><br />void DS3231_init(void)<br />{<br />uint8_t ctrl = 0;<br />I2C_write_buf( DS3231_ADDR,0x0E, 1, &amp;ctrl );<br />}<br /><br />void DS3231_get_datatime( TDATATIME* dt)<br />{<br />uint8_t i ;<br />uint8_t buf&#91;7&#93; ;<br />I2C_read_buf( DS3231_ADDR, 0x00, 7, buf );<br />for (i=0; i&lt;7; i++) dt-&gt;bytes&#91;i&#93; =(buf&#91;i&#93;);<br />}<br /><br />void show_time_VFD(TDATATIME * dt)<br />{<br />uint8_t sekundy ;<br />sekundy =bcd2dec (dt-&gt;ss) ;<br />Segment(1);<br />SendCharVFD( (dt-&gt;hh)&gt;&gt;4);<br />if (sekundy %2 ==0 )<br />SendCharVFD( ((dt-&gt;hh)&amp; 0x0F)+10 );    //tutaj dwukropek<br />else<br />SendCharVFD( (dt-&gt;hh)&amp; 0x0F);<br />//jezeli sekundy sa parzyste to do liczby wysy³anej na wyswietlacz dodajemy 10<br />//i pobieramy wtdy z tablicy cyfre z wlaczonym dwukropkiem<br />SendCharVFD( (dt-&gt;mm)&gt;&gt;4);<br />if (sekundy %2 ==0 )<br />SendCharVFD( ((dt-&gt;mm)&amp; 0x0F)+10 );    //tutaj dwukropek<br />else<br />SendCharVFD( (dt-&gt;mm)&amp; 0x0F);<br />SendCharVFD( (dt-&gt;ss)&gt;&gt;4);<br />SendCharVFD( (dt-&gt;ss)&amp; 0x0F);<br />}<br /><br />void show_date_VFD(TDATATIME * dt)<br />{<br />Segment(0); //od segmentu 0<br />SendCharVFD( (dt-&gt;day)&gt;&gt;4);<br />SendCharVFD( (dt-&gt;day)&amp; 0x0F); //dzien<br /><br />SendCharVFD( (dt-&gt;month)&gt;&gt;4);  //miesiac<br />SendCharVFD( (dt-&gt;month)&amp; 0x0F);<br /><br />SendCharVFD( (dt-&gt;year)&gt;&gt;4);  //rok<br />SendCharVFD( (dt-&gt;year)&amp; 0x0F);<br />SendCharVFD( 20);<br />}<br /><br />void ustaw12 ( TDATATIME* dt)<br />{<br />    dt-&gt;bytes&#91;4&#93;= dt-&gt;bytes&#91;5&#93; =1 ; //dni i miesiace rowne 01<br />    dt-&gt;bytes&#91;6&#93;= (1&lt;&lt;4 |1&lt;&lt;3 |1&lt;&lt;0); //rok rowny 19 w bcd 0001 1001<br /><br />dt-&gt;bytes&#91;0&#93;= dt-&gt;bytes&#91;1&#93; =0 ; //minuty i sekundy równe 0<br />//dt-&gt;bytes&#91;2&#93; =(12); //godzina 12<br />dt-&gt;bytes&#91;2&#93; =(1&lt;&lt;4 | 1&lt;&lt;1); //godzina 12 w bcd 0001 0010<br /> show_time_VFD(&amp;datatime);<br />//chwilowo operujemy tylko na buforze, na koncu zapiszemy ca³osc<br />}<br /><br />void godziny_set( TDATATIME* dt)<br />{<br />uint8_t godziny ;<br />godziny =bcd2dec (dt-&gt;hh) ;<br />if  (KEYB)godziny ++ ; // zwiekszamy o 1<br />if (godziny &gt;23) godziny=0  ; //jezeli sa wieksze niz 23 zerujemy<br />if  (KEYC)godziny -- ; // zmniejszamy o 1<br />if (godziny==255) godziny = 23 ;<br />(dt-&gt;hh)= dec2bcd(godziny) ;<br />KEYC=KEYB = 0 ;<br />}<br /><br />void minuty_set( TDATATIME* dt)<br />{<br />uint8_t minuty  ;<br />minuty =bcd2dec (dt-&gt;mm) ;<br />if  (KEYB)minuty  ++ ; // zwiekszamy o 1<br />if (minuty &gt;59) minuty=0 ; //jezeli sa wieksze niz 59 zerujemy<br />if  (KEYC)minuty -- ; // zmniejszamy o 1<br />if (minuty==255) minuty = 59 ;// moze zrobic ze wieksze od 59 ?<br />(dt-&gt;mm)= dec2bcd(minuty ) ;<br />KEYC=KEYB = 0 ;<br />}<br /><br />void dzien_set( TDATATIME* dt)<br />{<br />    uint8_t dzien ;<br />dzien =bcd2dec (dt-&gt;day) ;<br />if  (KEYB)dzien ++ ; // zwiekszamy o 1<br />if (dzien &gt;31) dzien=0 ; //jezeli sa wieksze niz 31 zerujemy<br />if  (KEYC)dzien -- ; // zmniejszamy o 1<br />if (dzien==255) dzien = 31 ;//<br />(dt-&gt;day)= dec2bcd(dzien) ;<br />KEYC=KEYB = 0 ;<br />}<br /><br />void miesiac_set( TDATATIME* dt)<br />{<br />uint8_t miesiac ;<br />miesiac =bcd2dec (dt-&gt;month) ;<br />if  (KEYB)miesiac ++ ; // zwiekszamy o 1<br />if (miesiac &gt;12) miesiac=0  ; //jezeli sa wieksze niz 12 zerujemy<br />if  (KEYC)miesiac -- ; // zmniejszamy o 1<br />if (miesiac==255) miesiac = 12 ;//<br />(dt-&gt;month)= dec2bcd(miesiac) ;<br />KEYC=KEYB = 0 ;<br />}<br /><br />void rok_set( TDATATIME* dt)<br />{<br />uint8_t rok ;<br />rok =bcd2dec (dt-&gt;year) ;<br />if  (KEYB)rok ++ ; // zwiekszamy o 1<br />if (rok &gt;100) rok=19  ; //<br />if  (KEYC)rok -- ;<br />if (rok==255)  rok = 19 ;//<br /> (dt-&gt;year)= dec2bcd(rok) ;<br /> KEYC=KEYB=0 ;<br />}<br /><br />uint8_t dec2bcd(uint8_t dec)                 //dekodowanie BCD<br />{<br />return ((dec/10)&lt;&lt;4)|(dec%10);<br />}<br /><br />uint8_t bcd2dec (uint8_t bcd)                //kodowanie BCD<br />{<br />return ((((bcd)&gt;&gt;4) &amp; 0x0F)*10)+ ((bcd)&amp; 0x0F);<br />}<br /><br />void funkcja1 (void)      //fukcje dodaja 1 w przypadku wcisniecia klawisza<br />{<br />KEYA= 1;<br />}<br />void funkcja2 (void)<br />{<br />    KEYB ++;<br />}<br />void funkcja3 (void)<br />{<br />    KEYC++;<br />}<br /><br />void klawisz_wcisniety (uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void))<br />{<br />register uint8_t key_press = (*KPIN &amp; key_mask);<br />if (!*klock &amp;&amp; ! key_press)<br />{<br />*klock = 1;<br />if (kfun) kfun();<br />}<br />else if (*klock &amp;&amp; key_press) (*klock)++ ;<br />}[/syntax]<br /><br />[syntax=c]#ifndef VFD_H_<br />    #define VFD_H_<br /><br />    #define PORT_SPI PORTA<br />    #define PORT_PIN PINA<br />    #define PORT_DDR DDRA<br />    #define SDIN PA4<br />    #define SCLK PA6<br />    #define SSTB PA5<br />    #define CMD_0 PORT_SPI &amp;= ~(1&lt;&lt;SSTB)<br />    #define CMD_1 PORT_SPI |= (1&lt;&lt;SSTB)<br />    #define SCK_0 PORT_SPI &amp;= ~(1&lt;&lt;SCLK)<br />    #define SCK_1 PORT_SPI  |= (1&lt;&lt;SCLK)<br />    #define MOSI_0 PORT_SPI &amp;= ~(1&lt;&lt;SDIN)<br />    #define MOSI_1 PORT_SPI |= (1&lt;&lt;SDIN)<br /><br />     extern uint8_t moc;<br />     extern uint8_t segment;<br />     extern uint8_t HH,MM,SS;<br />     extern uint8_t moc_VFD ;<br /><br />    void InitVFD(void);                  //Inicjalizacja sterownika<br />    void InitVFD_SPI(void);<br />    void SendVFDSpi( uint8_t bajt );        // Wys³anie bajtu do sterownika<br />    void SendCharVFD( uint8_t znak );      //wys³anie znaku do wyswietlacza<br />                               //UWAGA! Funkcja od razu ustawia pierwszy znak<br />    void Kontrast(uint8_t moc_VFD); // ustawia jasnosc swiecenia vfd 0- 7<br />    //UWAGA nie dziala na kazdym sterowniku<br />    void VFD_CLS(void); // czysci wyswietlacz wygaszajac pola<br />    void Segment(uint8_t segment); //ustawia segment od którego ma wyswietlic<br />    void Send_czas (uint8_t HH,uint8_t MM,uint8_t SS) ;<br /><br />    #endif[/syntax]<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &lt;avr/pgmspace.h&gt;<br />    #include &lt;util/delay.h&gt;<br />    #include &quot;VFD.h&quot;<br /><br /><br />   uint8_t moc;<br />   uint8_t segment;<br />   uint8_t HH,MM,SS;<br />   uint8_t moc_VFD;<br />     <br />     <br />    volatile const uint16_t znaki_tab&#91;&#93; PROGMEM = {<br /><br />        0b0110010001000110,   //0 zero normalne<br />        //  0b0110110101010110,   //0 zero przekreslone w lewo<br />        0b0000000100100000,   //1<br />           0b1010010101000101,   //2<br />         // 0b0100010101000101,   //3 normalna<br />           0b0100010101001001,   //3 skosna<br />           0b1100000100000111,   //4<br />    0b1100010101000011,   //5<br />    0b1110010101000011,   //6<br />    0b0100000001000110,   //7<br />       0b1110010101000111,   //8<br />       0b1100010101000111,   //9<br />       //elementy z zapalonym dwukropkiem<br />        0b0110011001000110,   //0 zero normalne<br />        //  0b0110111101010110,   //0 zero przekreslone w lewo<br />        0b0000001100100000,   //1<br />           0b1010011101000101,   //2<br />         // 0b0100011101000101,   //3 normalna<br />           0b0100011101001001,   //3 skosna<br />           0b1100001100000111,   //4<br />    0b1100011101000011,   //5<br />    0b1110011101000011,   //6<br />    0b0100001001000110,   //7<br />       0b1110011101000111,   //8<br />       0b1100011101000111,   //9<br />       0b0000100101100101    //R 20<br />         //   0b0000000000000000,   //21  nic<br />          //  0b0000001000000000,    //22 dwukropek<br />           // 0b1000000101000111,    //23 symbol stopnia<br />          //  0b0010010001000010,     // 24 c<br />          //  0b0000000101100000,     // 25 T<br /><br /><br />    };<br /><br />    void InitVFD_SPI(void) { // Ustawienie kierunków portów dla SPI<br />    PORT_DDR |= (1&lt;&lt;SDIN)|(1&lt;&lt;SCLK)|(1&lt;&lt;SSTB);<br />    }<br />     <br />     <br />    void InitVFD(void) { //Inicjalizacja wywietlacza<br />            CMD_1; //sterownik traktuje jako komendê ka¿dy (tylko!) pierwszy bajt bo<br />     //      mrygniêciu lini¹ STB<br />            CMD_0;<br />           // SendVFDSpi(0b00001101); // Command1 - 14znaków, 14 segmentów<br />            SendVFDSpi(0b00000011);<br />            CMD_1;<br />            CMD_0;<br />         //   SendVFDSpi(0b01001000); //test mode<br />            SendVFDSpi(0b01000000); // Command2 - Normal mode, Inkrementacja adresu po<br />            //bajcie, obs³uga wyswietlacza<br />            CMD_1;<br />            CMD_0;<br /><br />           // SendVFDSpi(0b10001111); // Command4 - Display ON, PWM 14/16<br />            SendVFDSpi(0b10001011);<br />            CMD_1;//to dodane<br />            CMD_0;<br />    }<br />     <br />    void SendVFDSpi( uint8_t bajt ) {  //wysyla bajt do sterownika<br />            uint8_t licznik=0x01;<br />            SCK_0; //tykniêcie zegarem SPI<br />            while( licznik ) { //odliczanie 8 bitów w pêtli<br />                    if( bajt &amp; licznik ) MOSI_1; //iloczyn bitowy celem sprawdzenia wartoci bitu<br />                    else MOSI_0;<br />                    SCK_1;<br />                    SCK_0;<br />                    licznik&lt;&lt;=1; //przesuniêcie licznika w lewo<br />                    //(celem maskowania odpowiedniego bitu)<br />            }<br />    }<br /><br />    void SendCharVFD( uint8_t znak )  //wysy³a pojedynczy znak do wyswietlacza<br />    {<br />              SendVFDSpi(pgm_read_word(&amp;znaki_tab&#91;znak&#93;)&gt;&gt;8);<br />              //pobranie starszej czesci<br />             SendVFDSpi(pgm_read_byte(&amp;znaki_tab&#91;znak&#93;));<br />            //pobranie z tablicy z definicjami znakow mlodszej czesci<br /><br />    }<br />void Segment(uint8_t segment)<br />{<br />  CMD_1;<br />  CMD_0;<br />  SendVFDSpi((0b11000000) | (segment*2)); // 2 bajty na zegment<br />}<br /><br />void Kontrast(uint8_t moc_VFD)<br />{<br />    moc = moc_VFD;<br />    CMD_1;<br />    CMD_0;<br />    SendVFDSpi( (0b10001000)|(moc) ) ;<br />}<br />void VFD_CLS(void)<br />{<br />    CMD_1; //sterownik traktuje jako komendê ka¿dy (tylko!) pierwszy bajt bo nrygniêciu lini¹ STB<br />    CMD_0;<br />    SendVFDSpi(0b11000000); // wyslij dane od zerowego segmentu<br />     for (uint8_t i=0;i&lt;14;i++) SendVFDSpi(0); //14 razy 0<br />}<br /><br />void Send_czas (uint8_t HH,uint8_t MM,uint8_t SS)<br />{<br />//liczby dajemy odrazu w bcd<br />Segment(1); //zajmuje  8bajtów<br /><br />SendCharVFD( HH&gt;&gt;4);<br />SendCharVFD( HH &amp; 0x0F);<br /><br />SendCharVFD( MM&gt;&gt;4);<br />SendCharVFD(MM &amp; 0x0F );<br /><br />SendCharVFD( SS&gt;&gt;4);<br />SendCharVFD( SS &amp; 0x0F);<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2545">Elwood</a> — 13 sty 2019, o 19:12</p><hr />
]]></content>
</entry>
</feed>