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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-12-19T19:25:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=21711&amp;mode</id>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2018-12-19T19:25:49+01:00</updated>
<published>2018-12-19T19:25:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214777#p214777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214777#p214777"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214777#p214777"><![CDATA[
To moja pomyłka. Ale p i k jest nie deklarowane w tablicy jeśli chcesz wyświetlać cyfry.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 19 gru 2018, o 19:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2018-12-19T19:10:51+01:00</updated>
<published>2018-12-19T19:10:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214775#p214775</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214775#p214775"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214775#p214775"><![CDATA[
To nie jest segment &quot;j&quot; tylko &quot;k&quot;<br />Środkowe segmenty &quot;g, h, j, l ,m ,n&quot; są na razie rezystory wy lutowane jak będzie poprawnie wyświetlało to wlutuje <br />każda cyfra się wyświetla + jeszcze coś np. &quot;DP&quot;, cyfra 4 z segmentem &quot;D&quot;<br /><br /><a href="https://obrazkiforum.atnel.pl/5527/5e9649c74431349174bc34395e68b825.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/5527/5e9649c74431349174bc34395e68b825.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 19 gru 2018, o 19:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wirnick]]></name></author>
<updated>2018-12-19T18:39:11+01:00</updated>
<published>2018-12-19T18:39:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214773#p214773</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214773#p214773"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214773#p214773"><![CDATA[
Tak się wtrącę! Problem jest w segmencie &quot;j&quot;, który nie jest zadeklarowany w tablicy znaków i jest sterowany z portu PF(po resecie ma wartość 0 - dlatego jest wyświetlany).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9272">Wirnick</a> — 19 gru 2018, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2018-12-19T17:55:40+01:00</updated>
<published>2018-12-19T17:55:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214770#p214770</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214770#p214770"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214770#p214770"><![CDATA[
Powoli do przodu. Przemiatanie już działa (na razie na 4 Anody)<br />ale jak wyświetlam cyfry z tablicy to zapalają się niepotrzebne segmenty katod dlatego ze 4 różne porty odwołują się do tego samego argumentu, więc jak to zapisać?<br /><br />[syntax=c]volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br /><br /><br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;15&#93; PROGMEM = {<br />(uint8_t)(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />(uint8_t)(SEG_B|SEG_C),// 1<br />(uint8_t)(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),    // 2<br />(uint8_t)(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),    // 3<br />(uint8_t)(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />(uint8_t)(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),    // 5<br />(uint8_t)(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />(uint8_t)(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />(uint8_t)(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),   // 8<br />(uint8_t)(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),    // 9<br />0x00            // NIC (puste miejsce)<br />};<br /><br /><br />// ****** definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym<br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF;   // wszystkie piny portu jako WYJŚCIA(katody)<br />LED_DATA1_DIR = 0xFF;<br />LED_DATA2_DIR = 0xFF;<br />LED_DATA3_DIR = 0xFF;<br />LED_DATA = 0x00;// wygaszenie wszystkich katod – stan wysoki<br />LED_DATA1 = 0x00;<br />LED_DATA2 = 0x00;// wygaszenie wszystkich katod – stan wysoki<br />LED_DATA3 = 0x00;<br /><br />ANODY_DIR  |= CA1 | CA2 | CA3 |CA4 ;// 4 piny portu A jako WYJŚCIA (anody wyświetlaczy)<br />ANODY_PORT |= CA1 | CA2 | CA3 |CA4 ;// wygaszenie wszystkich wyświetlaczy - anody<br /><br />// ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS01)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0 = 57;// dodatkowy podział (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie CompareMatch<br />}<br /><br /><br />// ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH<br /><br /><br />ISR(TIMER0_COMP_vect)<br />{<br /> static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /> ANODY_PORT = 0xff;<br /> PORTE &amp;= ~(licznik&lt;&lt;4);<br /><br /><br />if(licznik==1){<br /><br /><br />LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA1 = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA2 = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />        LED_DATA3 = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />}<br />else if(licznik==2){<br /><br />LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA1 = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA2 = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA3 = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />}<br />if(licznik==4){<br /><br />LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA1 = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA2 = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA3 = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />}<br />if(licznik==8){<br /><br />LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA1 = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA2 = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />LED_DATA3 = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />}<br /><br /><br /><br />licznik &lt;&lt;=1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if(licznik&gt;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br /><a href="https://obrazkiforum.atnel.pl/5527/bb32cccccebdd144568b0a17e6e28572.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/5527/bb32cccccebdd144568b0a17e6e28572.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 19 gru 2018, o 17:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2018-12-17T16:05:09+01:00</updated>
<published>2018-12-17T16:05:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214726#p214726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214726#p214726"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214726#p214726"><![CDATA[
Dużo tu roboty, trzeba wziąć kartkę i długopis, rozpisać wszystko co do czego jest i jak kolejno ma się wyświetlać tak żeby potem z kodem było łatwiej. Przerabiałem podobny temat, trzeba mu poświęcić trochę czasu.<br />Skoro na sztywno działało to w timerze też powinno, widocznie źle jest coś napisane. W tym przypadku metoda drobnych kroczków - napisz obsługę dla jednego - jeżeli jest gotowa to wtedy zrób dla kolejnego tak aby działały obydwa itd. <br /><br />Ja pisałem obsługę dla sześciu wyświetlaczy 7-segmentowych które były multipleksowane. Wkleję Ci kod, który może Ci trochę w jakiś sposób pomoże:<br /><br />definuję sobie nazwy dla katod aby móc się swobodnie posługiwać:<br />[syntax=c]#define CAT1 (1&lt;&lt;PB1) // <br />#define CAT3 (1&lt;&lt;PB3)<br />#define CAT5 (1&lt;&lt;PC2)<br /><br />#define CAT2 (1&lt;&lt;PB2) // <br />#define CAT4 (1&lt;&lt;PC1)<br />#define CAT6 (1&lt;&lt;PC3)[/syntax]<br /><br />Kolejność wynikała z układu połączeń - jest to teraz nieistotne. Chodziło o ułatwienie sobie sprawy.<br />Natomiast samo multipleksowanie w przerwaniu zakończyło się na czymś takim:<br />[syntax=c]static uint8_t wysw_on; //zmienna globalna <br />ISR (TIMER1_COMPA_vect) { //operacje wewnątrz przerwania<br /><br />if (wysw_on==1) { PORTB &amp;= ~(CAT1); PORTB |= (CAT3); PORTC |= (CAT5); PORTC |= (CAT4) | (CAT6); PORTB |= (CAT2); TUTAJ WYŚWIETLAM TO CO CHCĘ W JAKI SPOSÓB CHCĘ; } <br />else if (wysw_on==2) { PORTC &amp;= ~(CAT6);  PORTB |= (CAT1); PORTB |= (CAT3); PORTC |= (CAT5); PORTC |= (CAT4); PORTB |= (CAT2); TUTAJ WYŚWIETLAM TO CO CHCĘ W JAKI SPOSÓB CHCĘ; }<br /><br />         itd...<br /><br />wysw_on &lt;&lt;= 1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if (wysw_on&gt;32) wysw_on = 1;// jeśli licznik większy niż 32 to ustaw na 1<br />}[/syntax]<br /><br />Wyjaśnienie:<br />[syntax=c]PORTB &amp;= ~(CA1);[/syntax] - oznacza załączenie tej katody, reszta musi być wyłączona i dalej <br />[syntax=c]PORTC &amp;= ~(CA6);[/syntax] - teraz włącz tą katodę, reszta wyłączona<br />i tak aż do ostatniej katody.<br /><br />Także tutaj spora praca domowa do odrobienia dla Ciebie. Napisz sobie to dla jednej katody a potem sukcesywnie dodawaj następne i sprawdzaj.<br /><br />Co do tablicy wzorców, sam bym to zrobił raczej w taki sposób:<br />[syntax=c]uint16_t cyfry&#91;10&#93; = {bitowe_zero, bitowe_jeden, bitowe_dwa itd.. }; // dwubajtowa tablica a w środku wzorce od 0 do 9[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 17 gru 2018, o 16:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2018-12-17T14:28:28+01:00</updated>
<published>2018-12-17T14:28:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214723#p214723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214723#p214723"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214723#p214723"><![CDATA[
Uruchamiałem timer  na wyrywkowo wybranych pinach każdego portu i działa, stan wyjścia zmieniał się na wysoki co 1 sekundę.<br /><br />[syntax=c]#define LED PB7//LED systemowa na porcie PB7<br />#define timer_start 6//definicja początkowej wartości timera<br /><br />volatile uint8_t cnt=0;<br /><br />int main(void)<br />{<br /><br /> DDRB  |=  (1&lt;&lt;LED);<br /><br /> TIMSK |= (1&lt;&lt;TOIE0);           //Przerwanie overflow (przepełnienie timera)<br /> TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00); //preskaler 1024<br /> TCNT0 = timer_start;         //Początkowa wartość licznika<br /><br /> sei();//Globalne uruchomienie przerwań<br /><br /> while(1);<br /><br />}<br /><br />//Procedura obsługi przerwania od przepełnienia timera<br />ISR(TIMER0_OVF_vect)<br />{<br />  TCNT0 = timer_start;      //Początkowa wartość licznika<br /><br />  cnt++;     //zwiększa zmienną licznik<br />  if(cnt&gt;3)  //jeśli 4 przerwania (czyli ok 1 s)<br />  {<br /><br />    PORTB ^=(1&lt;&lt;LED);<br /><br />    cnt=0;<br />  }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 17 gru 2018, o 14:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2018-12-16T21:38:23+01:00</updated>
<published>2018-12-16T21:38:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214707#p214707</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214707#p214707"/>
<title type="html"><![CDATA[Re: Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214707#p214707"><![CDATA[
Sprawdź najpierw czy timer w ogóle działa - tzn. zrób taki podział żeby albo tylko migał diodą albo cokolwiek robił abyś miał pewność że timer żyje.<br /><br />Wyświetlaczy masz jak widzę 6, więc 200Hz będzie zdecydowanie za mało. 6x50Hz = 300 Hz. Proponuję zmienić na wyższe.<br /><br />W kodzie jest wysterowanie tylko czterech katod - nie będę się domyślał o co tam chodzi. W każdym bądź razie wygląda to jak żywcem skopiowane z książki i poddaję pod dużą wątpliwość działanie tego w tym przypadku. <br /><br />Także najpierw sprawdź czy timer działa a potem skup się na załączeniu i wyświetleniu jednej liczby na jednym wyświetlaczu. Ja rozgryziesz jeden to reszta pójdzie łatwiej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 16 gru 2018, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dmx1970]]></name></author>
<updated>2018-12-16T17:37:42+01:00</updated>
<published>2018-12-16T17:37:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214700#p214700</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214700#p214700"/>
<title type="html"><![CDATA[Multipleksowanie wyświetlacz 14-segmentowy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21711&amp;p=214700#p214700"><![CDATA[
Witam.<br /><br />Mam problem z wyświetlaniem na wyświetlaczach 14-segmentowych.<br />Posiadam 3x płytki (nie skończone jakieś dawne projekty z pracy) Pomyślałem ze wykorzystam je w przyszłości do zegara który będzie uruchamiał na zaprogramowany czas Analogowy piec Webasto (do ogrzewania garażu)<br />Płytka posiada:<br />Miktokontroler Atmega 64, kwarc zewnętrzny 12Mhz, 3 podwójne Wyświetlacze PDA54-11GWA, miejsce na DS1307 i baterie dla RTC, 3 przyciski i kilka We/Wy, dioda sygnalizacyjna.<br />Wyświetlacze ze wspólną Anodą, Sterowane &quot;0&quot; poprzez P-mosfety<br />Katody sterowane &quot;1&quot; poprzez ULN2803.<br />Problem (jak dla mnie) jest w tym ze anody mają różne porty (PE, PC) i katody też mają różne porty (PA, PC, PG, PF)<br />na początek wysterowałem na sztywno po kolei katody i anody żeby mieć pewność ze wszystko się zgadza i jest ok,<br />wykorzystując na początek tylko te 4 segmenty co w 7-segmentowym (segmenty abcdef+ połączony segment g) i wyświetlić licznik z ćwiczenia Multi_Led<br />Timer 0 ustawiony na 200hz no i niestety nic nie wyświetla, przygotowuje tablice wzorcową  16 bitową liczb i cyfr ale nie wiem czy dobrze to zapisuję chyba powinno być od prawej do lewej?<br />Wyświetlałem wcześniej  na wyświetlaczach 7-segmentowych ustawionych na całych portach na &quot;stykówce&quot; i nie było problemu.<br />Proszę o uwagi krytykę i wskazówkę, pomoc. To jest mój pierwszy Post..<br /><br /><br />dodam ze JTAG wyłączony na porcie F<br />i ATmega103 Compatibility mode też wyłączone.<br /><br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 6 gru 2018<br /> *      Author: Daniel<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br /><br />int main(void)<br />{<br />// ****** inicjalizacja *********<br />d_led_init();   // inicjalizacja wyświetlacza multipleksowanego<br /><br />// testowa inicjalizacja zmiennych oraz liczb mających się wyświetlać na wyrw. LED<br />cy1=NIC;<br />cy2=4;<br />cy3=1;<br />cy4=NIC;<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br /><br /><br />//DDRA |= (1&lt;&lt;PA5);<br />//while(1)<br />//{<br />//PORTA ^= (1&lt;&lt;PA5);<br />//_delay_ms(1000);<br />//}<br /><br />uint16_t licznik=6000;<br />uint8_t d1,d2,d3,d4;<br /><br />//**********************  pętla główna<br />while(1)<br />{<br />licznik--;<br /><br />d1=licznik/1000;<br />if(d1) cy1=d1; else cy1=NIC;<br />d2=(licznik-(d1*1000))/100;<br />if(d2) cy2=d2; else cy2=(licznik&gt;999)?0:NIC;<br />d3=(licznik-(d1*1000)-(d2*100))/10;<br />if(d3) cy3=d3; else cy3=(licznik&gt;99)?0:NIC;<br />d4=(licznik-(d1*1000)-(d2*100)-(d3*10));<br />cy4=d4;<br />_delay_ms(10);<br />//if(licznik&gt;9999) licznik=0;<br />if(!licznik) licznik=6000;<br />}<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * d_led.c<br /> *<br /> *  Created on: 6 gru 2018<br /> *      Author: Daniel<br /> */<br />#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;// dołączenie pl. nagłówkowego potrzebnego do obsł. przerwań<br />#include &lt;avr/pgmspace.h&gt;// dołączenie pl. nagłówkowego potrzebnego do odczytu<br />// danych zawartych w pamięci programu FLASH<br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego<br />// w nim znajdują się potrzebne tu m.in. definicje preprocesora<br /><br />// definicje zmiennych globalnych przechowujących cyfry do wyświetlania<br />// volatile – ponieważ będą wykorzystywane do odczytu i zapisu zarówno w przerwaniu i programie<br />// głównym. Trzeba więc wyłączyć optymalizację dostępu do nich. (zmienne ulotne)<br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br /><br /><br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;15&#93; PROGMEM = {<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />(uint8_t)~(SEG_B|SEG_C),// 1<br />(uint8_t)~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),    // 2<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),    // 3<br />(uint8_t)~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />(uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),    // 5<br />(uint8_t)~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),   // 8<br />(uint8_t)~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />0xFF              // NIC (puste miejsce)<br />};<br /><br /><br /><br />// ****** definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym<br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF;   // wszystkie piny portu C jako WYJŚCIA(katody)<br />LED_DATA = 0xFF;// wygaszenie wszystkich katod – stan wysoki<br />ANODY_DIR  |= CA1 | CA2 | CA3 | CA4;// 4 piny portu A jako WYJŚCIA (anody wyświetlaczy)<br />ANODY_PORT |= CA1 | CA2 | CA3 | CA4;// wygaszenie wszystkich wyświetlaczy - anody<br /><br />// ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS01)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0 = 57;// dodatkowy podział (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie CompareMatch<br />}<br /><br /><br />// ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH<br />ISR(TIMER0_COMP_vect)<br />{<br />static uint8_t licznik=1;// zmienna do przełączania kolejno anod wyrwietlacza<br /><br />ANODY_PORT = (ANODY_PORT | MASKA_ANODY);// wygaszenie wszystkich wyświetlaczy<br /><br />if(licznik==1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );// gdy zapalony wyśw.1 podaj stan zmiennej c1<br />else if(licznik==2) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );// gdy zapalony wyśw.2 podaj stan zmiennej c2<br />else if(licznik==4) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />else if(licznik==8) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );// gdy zapalony wyśw.4 podaj stan zmiennej c4<br /><br />ANODY_PORT = (ANODY_PORT &amp; MASKA_ANODY) | (~licznik &amp; ~MASKA_ANODY);// cykliczne przełączanie kolejnej anody w każdym przerwaniu<br /><br />// operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br />licznik &lt;&lt;= 1;// przesunięcie zawartości bitów licznika o 1 w lewo<br />if(licznik&gt;8) licznik = 1;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br />[syntax=c]/*<br /> *  Created on: 6 gru 2018<br /> *      Author: Daniel<br /> */<br /><br /><br />#ifndef _d_led_h// dyrektywy zabezpieczające przed wielokrotnym dołączaniem<br />#define _d_led_h// tego samego pliku nagłówkowego jeśli będzie dołączany<br />// w wielu różnych plikach programu<br /><br />// definicje portów i pinów wyświetlacza używanych dla ułatwienia w programie jako stałe preprocesora<br />#define LED_DATA PORTA// port z podłączonymi segmentami<br />#define LED_DATA1 PORTC<br />#define LED_DATA2 PORTF<br />#define LED_DATA3 PORTG<br />#defineLED_DATA_DIR DDRA// rejestr kierunku portu katod wyświetlaczy<br />#defineLED_DATA1_DIR DDRC<br />#defineLED_DATA2_DIR DDRF<br />#defineLED_DATA3_DIR DDRG<br />#define ANODY_PORT PORTE // port z podłączonymi anodami- 4 bity najmłodsze<br />#define ANODY_DIR DDRE    // rejestr kierunku portu anod wyświetlaczy<br /><br /><br />#define CA1 (1&lt;&lt;PE4)// CA1 oznacza bit nr.0 portu C<br />#define CA2(1&lt;&lt;PE5)// CA2 oznacza bit nr.1 portu C<br />#define CA3(1&lt;&lt;PE6)// CA3 oznacza bit nr.2 portu C<br />#define CA4(1&lt;&lt;PE7)// CA4 oznacza bit nr.3 portu C<br /><br />#define MASKA_ANODY (CA1|CA2|CA3|CA4)<br /><br />// definicje bitów dla poszczególnych segmentów LED<br />#define SEG_A  (1&lt;&lt;PC7)<br />#define SEG_B  (1&lt;&lt;PA5)<br />#define SEG_C  (1&lt;&lt;PA6)<br />#define SEG_D  (1&lt;&lt;PG2)<br />#define SEG_E  (1&lt;&lt;PA3)<br />#define SEG_F  (1&lt;&lt;PA4)<br />#define SEG_G  (1&lt;&lt;PF0) | (1&lt;&lt;PF2)<br />//#define SEG_G2 (1&lt;&lt;PF2)<br />#define SEG_DP (1&lt;&lt;PA7)<br /><br />#define NIC 10<br /><br />// same DEKLARACJE zmiennych globalnych na potrzeby wykorzystania ich w innych plikach projektu<br />// przydomek externpowoduje, iż te zmienne będą dostępne we wszystkich modułach, które dołączą plik<br />// d_led.h za pomocą dyrektywy #include<br />extern volatile uint8_t cy1;<br />extern volatile uint8_t cy2;<br />extern volatile uint8_t cy3;<br />extern volatile uint8_t cy4;<br /><br /><br /><br />void d_led_init(void);<br /><br />#endif// koniec _d_led_h[/syntax]<br /><br />czy tablica zapisana w ten sposób może być?<br /><br />[syntax=c]PDA54_11GWA<br /><br /><br />wzorce 16-bitowe<br /><br />        DP<br />  abcdefghjklmnp|<br />0b1111110010001000// 0 = (ABCDEFJN)<br />0b0110000010000000// 1 = (BCJ)<br />0b1101100001000100// 2 = (ABDEKP)<br />0b1111000001000100// 3 = (ABCDKP)<br />0b0110010001000100// 4 = (BCFKP)<br />0b1011010001000100// 5 = (ACDFKP)<br />0b1011110001000100// 6 = (ACDEFKP)<br />0b1110000000000000// 7 = (ABC)<br />0b1111110001000100// 8 = (ABCDEFKP)<br />0b1111010001000100// 9 = (ABCDFKP)<br /><br /><br />0b1110110001000100// A = (ABCEFKP)<br />0b1111000101010000// B = (ABCDHKM)<br />0b1001110000000000// C = (ADEF)<br />0b1001110000000100// E = (ADEFP)<br />0b1000110000000100// F = (AEFP)<br />0B1011110001000000// G = (ACDEFK)<br />0b0110110001000000// H = (BCEFPK)<br />0b1001000100010000// I = (ADHM)<br />0b0111100000000000// J = (BCDE)<br />0b0000110010100100// K = (EFJLP)<br />0b0001110000000000// L = (DEF)<br />0b0110111010000000// M = (BCEFGJ)<br />0b// N = (BCEFGL)<br />0b// O = (ABCDEF)<br />0b// P = (ABEFKP)<br />0b// Q = (ABCDEFL)<br />0b// R = (ABEFKPL)<br />0b// S = (<br />0b// T = (AHM)<br />0b// U = (BCDEF)<br />0b// V = (EFJN)<br />0b// W = (BCEFLN)<br />0b// X = (GJLN)<br />0b// Y = (GJM)<br />0b// Z = (ADJN)[/syntax]<br /><br /><a href="https://obrazkiforum.atnel.pl/5527/8b5e745d754e6a61c38360449a8511f5.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/5527/8b5e745d754e6a61c38360449a8511f5.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/5527/aeb0394ccf1ee03828c33d11f9439b98.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/5527/aeb0394ccf1ee03828c33d11f9439b98.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5527">dmx1970</a> — 16 gru 2018, o 17:37</p><hr />
]]></content>
</entry>
</feed>