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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2018-02-03T16:26:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=20145&amp;mode</id>
<entry>
<author><name><![CDATA[doman89]]></name></author>
<updated>2018-02-03T16:26:37+01:00</updated>
<published>2018-02-03T16:26:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=20145&amp;p=203243#p203243</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=20145&amp;p=203243#p203243"/>
<title type="html"><![CDATA[Biblioteka do wyświetlacza multipleksowanego LED]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=20145&amp;p=203243#p203243"><![CDATA[
Witam,<br /><br />Powrót mój po dłuuuugim czasie, mam nadzieję, że na stałe bo pomimo chronicznego braku czasu, staram się codziennie coś powtarzać z dawnej wiedzy. W ramach powtórki napisałem bibliotekę (jeżeli nie słowo na wyrost z podstawowym tematem) do wyświetlacza multipleksowanego LED, a, że na powrót do programowania jestem zaopatrzony w ATB rev: 1.05a to właśnie pod ten sprzęt ja napisałem. Testowo działa, może kiedyś ją rozszerzę o większą funkcjonalność, lecz na razie zaspokaja moje potrzeby w układzie.<br /><br />Bibliotekę pomimo prostego tematu napisałem z ukierunkowaniem Mirka na uniwersalność - czyli napisane raz, teraz tylko korzystaj <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Z czasem postaram się dać ambitniejsze projekty/kody, lecz wrócić po 3 letniej przerwie nie jest łatwo, a w domu naprawdę po pracy mam nie wiele czasu.<br /><br />Liczę na wszelką konstruktywną krytykę.<br /><br />LED_Matrix.h<br />[syntax=c]//-----------------------------------------------------------------------------------------------------------<br />// *** Obsługa wyświetlacza multipleksowanego ***<br />//<br />// - obsługa 4 segmentów<br />// - zalecana częstotliwość 4MHz - 20MHz<br />// - wykorzystuje TIMER2 - dla lepszej przenośności - Tryb CTC<br />// - katody zapalamy stanem niskim,<br />// - anody zapalamy stanem niskim,<br />// - automatyczna konfiguracja zajęcia młodszej lub starszej części bitu portu,<br />// - idealna biblioteka do wykorzystania z zestawem uruchomieniowym ATB firmy ATNEL<br />//<br />// Pliki : LED_Matrix.c , LED_Matrix.h<br />// Mikrokontrolery : Atmel AVR<br />// Kompilator : avr-gcc<br />// Źródło : http://pasjaprogramowanie.blogspot.com<br />// Data : luty 2018<br />// Autor : Mateusz Domański<br />//----------------------------------------------------------------------------------------------------------<br /><br /><br />#ifndef LED_MATRIX_H_<br />#define LED_MATRIX_H_<br /><br />//makra ulatwiajace dostep do portow wg M.Kardasia<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br />#define PIN(x) SPIN(x)<br />#define SPIN(x) (PIN##x)<br /><br />//konfiguracja taktowania procesora<br />#define Hz_CPU 11059200UL<br /><br />//konfiguracja podlaczen anod wyswietlacza<br />#define PORT_ANODY C<br />#define ANODA_1_PIN 7<br />#define ANODA_2_PIN 6<br />#define ANODA_3_PIN 5<br />#define ANODA_4_PIN 4<br /><br />//konfiguracja podlaczen katod wyswietlacza<br />#define PORT_KATODY B<br />#define SEG_A 0<br />#define SEG_B 1<br />#define SEG_C 2<br />#define SEG_D 3<br />#define SEG_E 4<br />#define SEG_F 5<br />#define SEG_G 6<br />#define SEG_H 7<br /><br />//cyfry do wykorzystania przez użytkownika w programie odpowiadające segmentom<br />extern volatile uint8_t cyfra1; //Anoda4<br />extern volatile uint8_t cyfra2; //Anoda3<br />extern volatile uint8_t cyfra3; //Anoda2<br />extern volatile uint8_t cyfra4; //Anoda1<br /><br />void init_led_mux_display( void ); // inicjalizacja wyswietlacza multipleksowanego LED<br /><br />#endif /* LED_MATRIX_H_ */[/syntax]<br /><br />LED_Matrix.c <br />[syntax=c]//-----------------------------------------------------------------------------------------------------------<br />// *** Obsługa wyświetlacza multipleksowanego ***<br />//<br />// - obsługa 4 segmentów<br />// - zalecana częstotliwość 4MHz - 20MHz<br />// - wykorzystuje TIMER2 - dla lepszej przenośności - Tryb CTC<br />// - katody zapalamy stanem niskim,<br />// - anody zapalamy stanem niskim,<br />// - konfiguracja zajęcia młodszej lub starszej części bitu portu,<br />// - idealna biblioteka do wykorzystania z zestawem uruchomieniowym ATB firmy ATNEL<br />//<br />// Pliki : LED_Matrix.c , LED_Matrix.h<br />// Mikrokontrolery : Atmel AVR<br />// Kompilator : avr-gcc<br />// Źródło : http://pasjaprogramowanie.blogspot.com<br />// Data : luty 2018<br />// Autor : Mateusz Domański<br />//----------------------------------------------------------------------------------------------------------<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;LED_Matrix.h&quot;<br /><br />volatile uint8_t cyfra1;<br />volatile uint8_t cyfra2;<br />volatile uint8_t cyfra3;<br />volatile uint8_t cyfra4;<br /><br />void init_led_mux_display( void )<br />{<br />DDR(PORT_ANODY) |= (1&lt;&lt;ANODA_1_PIN) | (1&lt;&lt;ANODA_2_PIN) | (1&lt;&lt;ANODA_3_PIN) | (1&lt;&lt;ANODA_4_PIN); //konfiguracja Anod jako wyjscia<br />PORT(PORT_ANODY) |= (1&lt;&lt;ANODA_1_PIN) | (1&lt;&lt;ANODA_2_PIN) | (1&lt;&lt;ANODA_3_PIN) | (1&lt;&lt;ANODA_4_PIN); //wygaszany wyswietlacze stanem niskim<br />DDR(PORT_KATODY) |= (1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G); //konfiguracja katody jako wyjscia<br />PORT(PORT_KATODY) |= (1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G); //wygaszenie katod<br /><br />//Konfiguracja Timera na potrzeby multipleksowania 200Hz<br />TCCR2 |= (1&lt;&lt;WGM21); //Tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS22); //Preskaler 1024<br />OCR2 = ((Hz_CPU / (1024UL * 200)) - 1); //Ustawienie przepelnienia <br />TIMSK |= (1&lt;&lt;OCIE2); //Wlaczenie przerwan compare match<br /><br />}<br /><br />const uint8_t znaki_wyswietlacza&#91;16&#93; PROGMEM =<br />{<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F)), //0<br />~((1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C)),//1<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_G) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_D)), //2<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_G)), //3<br />~((1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //4<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D)), //5<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //6<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C)), //7<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //8<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //9<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //A<br />~((1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //b<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F)), //C<br />~((1&lt;&lt;SEG_B) | (1&lt;&lt;SEG_C) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_G)), //d<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_D) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //E<br />~((1&lt;&lt;SEG_A) | (1&lt;&lt;SEG_E) | (1&lt;&lt;SEG_F) | (1&lt;&lt;SEG_G)), //F<br />};<br /><br /><br />ISR(TIMER2_COMP_vect)<br />{<br /><br />#if ANODA_4_PIN &gt; 3<br /><br />static uint8_t x = 16;<br /><br />PORT(PORT_ANODY) = (PORT(PORT_ANODY) | 0xF0);<br /><br />if( x == 16 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra1&#93;);<br />else if( x == 32 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra2&#93;);<br />else if( x == 64 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra3&#93;);<br />else if( x == 128 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra4&#93;);<br /><br />PORT(PORT_ANODY) = (PORT(PORT_ANODY) &amp; 0x0F) | (~x &amp; 0xF0);<br /><br />x &lt;&lt;= 1;<br />if(!x) x = 16;<br /><br />#else<br /><br />static uint8_t x = 1;<br /><br />PORT(PORT_ANODY) = (PORT(PORT_ANODY) | 0x0F);<br /><br />if( x == 1 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra1&#93;);<br />else if( x == 2 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra2&#93;);<br />else if( x == 4 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra3&#93;);<br />else if( x == 8 ) PORT(PORT_KATODY) = pgm_read_byte(&amp;znaki_wyswietlacza&#91;cyfra4&#93;);<br /><br />PORT(PORT_ANODY) = (PORT(PORT_ANODY) &amp; 0xF0) | (~x &amp; 0x0F);<br /><br />x &lt;&lt;= 1;<br />if( x &gt; 8) x = 1;<br /><br />#endif<br />}[/syntax]<br /><br />Strona w opisie bibliotek nie jest aktualna, będzie czas to też zacznę tam wrzucać co nieco ;P<br /><br />Pozdrawiam,<br />doman89<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3271">doman89</a> — 3 lut 2018, o 16:26</p><hr />
]]></content>
</entry>
</feed>