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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-04-25T18:44:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2944&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-25T18:44:52+01:00</updated>
<published>2013-04-25T18:44:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35234#p35234</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35234#p35234"/>
<title type="html"><![CDATA[Re: Modyfikacja 03Multi_LED z &quot;niebieskiej&quot; książki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35234#p35234"><![CDATA[
W d_led.h:<br />[syntax=c]#define DOT 14 //numer w tablicy znaków cyfry we flash<br />extern uint8_t kropka; //przechowuje stan kropek[/syntax]<br />zmiana w d_led.c<br />[syntax=c]uint8_t kropka;<br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;&#93; PROGMEM = {<br />                ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),         // 0<br />                ~(SEG_B|SEG_C),                                                                 // 1<br />                ~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),                               // 2<br />                ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),                               // 3<br />                ~(SEG_B|SEG_C|SEG_F|SEG_G),                                     // 4<br />                ~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),                               // 5<br />                ~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),         // 6<br />                ~(SEG_A|SEG_B|SEG_C|SEG_F),                                     // 7<br />                ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),   // 8<br />                ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),         // 9<br />                ~(SEG_G),                                                                               //10 -<br />                ~(SEG_A|SEG_B|SEG_F|SEG_G),                                     //11 st.<br />                ~(SEG_A|SEG_D|SEG_E|SEG_F),                                     //12 C<br />                0xFF,      //13 NIC (puste miejsce)<br />                ~(SEG_DP)      //14 kropka<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 &amp; 0xF0);// wygaszenie wszystkich wyświetlaczy<br /><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 />if(kropka &amp; licznik) LED_DATA &amp;= pgm_read_byte( &amp;cyfry&#91;DOT&#93; ); //gdy odpowiedni bit zmiennej kropka ustawiony to zapal segment <br />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// 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 />Program testowy main.c<br />[syntax=c]#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 />#if 0<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 />#endif<br />kropka = (1&lt;&lt;3);//zapal<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br /><br />#if 0<br />DDRA |= (1&lt;&lt;PA5);<br />while(1)<br />{<br />PORTA ^= (1&lt;&lt;PA5);<br />_delay_ms(1000);<br />}<br />#endif<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(100);<br />kropka ^=(1&lt;&lt;3);//po 4 cyfsze<br />kropka ^=(1&lt;&lt;2);//po 3 cyfsze<br />//if(licznik&gt;9999) licznik=0;<br />if(!licznik) licznik=6000;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 kwi 2013, o 18:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adasas]]></name></author>
<updated>2013-04-25T17:41:39+01:00</updated>
<published>2013-04-25T17:41:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35220#p35220</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35220#p35220"/>
<title type="html"><![CDATA[Modyfikacja 03Multi_LED z &quot;niebieskiej&quot; książki]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2944&amp;p=35220#p35220"><![CDATA[
Ja najprościej wstawić kropkę po 3 cyfrze na wyświetlaczu 7-segmentowym w przykładzie z licznikiem z &quot;niebieskiej&quot; książki? Czy &quot;przerabiać&quot; plik d_led.h i d_led.c czy da się to zrobić w pliku main.c?<br />Jedyne, co na razie mi wyszło to wstawienie jej na &quot;siłę&quot; w multipleksowaniu wyświetlacza. <br />Z tym że świeci ona od samego początku inicjacji wyświetlacza, a chciałbym, żeby wyświetlała się dopiero w momencie odliczania.<br />Plik d_led.h:<br />[syntax=c]#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 w wielu różnych plikach programu<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 />#defineLED_DATA_DIR DDRA// rejestr kierunku portu katod wyświetlaczy<br />#define ANODY_PORT PORTB// port z podłączonymi anodami- 4 bity najmłodsze<br />#define ANODY_DIR DDRB// rejestr kierunku portu anod wyświetlaczy<br />#define CA1 (1&lt;&lt;PB0)// CA1 oznacza bit nr.0 portu D<br />#define CA2 (1&lt;&lt;PB1)// CA2 oznacza bit nr.1 portu D<br />#define CA3 (1&lt;&lt;PB2)// CA3 oznacza bit nr.2 portu D<br />#define CA4 (1&lt;&lt;PB3)// CA4 oznacza bit nr.3 portu D<br />// definicje bitów dla poszczególnych segmentów LED<br />#define SEG_A (1&lt;&lt;0)<br />#define SEG_B (1&lt;&lt;1)<br />#define SEG_C (1&lt;&lt;2)<br />#define SEG_D (1&lt;&lt;3)<br />#define SEG_E (1&lt;&lt;4)<br />#define SEG_F (1&lt;&lt;5)<br />#define SEG_G (1&lt;&lt;6)<br />#define kropka (1&lt;&lt;PA7)<br />#define kropka_on PORTA &amp;= ~kropka;<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 />void d_led_init(void);<br />#endif// koniec _d_led_h[/syntax]<br />Plik D_led.c:<br />[syntax=c]//d_led.c<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 />#include &lt;util/delay.h&gt;<br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego w nim znajdują się potrzebne tu m.in. definicje preprocesora<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 />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />uint8_t cyfry&#91;15&#93; PROGMEM = {<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />~(SEG_B|SEG_C),// 1<br />~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />~(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />~(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />~(SEG_G),//10 -<br />~(SEG_A|SEG_B|SEG_F|SEG_G),//11 st.<br />~(SEG_A|SEG_D|SEG_E|SEG_F),//12 C<br />0xFF//13 NIC (puste miejsce)<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 />// ustawienie TIMER0<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0 = 4;// dodatkowy podział przez xx (rej. przepełnienia)<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie CompareMatch<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 />ANODY_PORT = (ANODY_PORT &amp; 0xF0);// wygaszenie wszystkich wyświetlaczy<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) <br />{<br />LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );// gdy zapalony wyśw.3 podaj stan zmiennej c3<br />kropka_on;<br />}<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 />ANODY_PORT = (ANODY_PORT &amp; 0xF0) | (~licznik &amp; 0x0F);// cykliczne przełączanie kolejnej anody w każdym przerwaniu<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 />Plik main.c:<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 &lt;avr/interrupt.h&gt;<br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego (obsługa LED)<br />int main(void)<br />{<br />sei();<br />d_led_init();   // inicjalizacja wyświetlacza multipleksowanego<br />cy1=8;//sprawdzenie wyświetlacza<br />cy2=8;<br />cy3=8;<br />cy4=8;<br />_delay_ms(1000);<br />uint16_t licznik=6000;<br />uint8_t d1,d2,d3,d4;<br />//**********************  pętla główna<br />while(1)<br />{<br />licznik--;<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) licznik=6000;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=866">adasas</a> — 25 kwi 2013, o 17:41</p><hr />
]]></content>
</entry>
</feed>