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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-04-01T20:49:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2485&amp;mode</id>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-04-01T20:49:06+01:00</updated>
<published>2013-04-01T20:49:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32696#p32696</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32696#p32696"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32696#p32696"><![CDATA[
Właśnie szukam rozwiązania podobnego do PCF8583 pracującego jako clock ale mającego możliwość generowania przerwania na wyjściu z częstotliwością 100Hz a nie 1Hz.<br />Wiem, że mogę go wykorzystać w innym trybie, ale w takim przypadku potrzebowałbym 2 takich układów.<br />A poniżej krótki opis, który rozjaśni do czego to potrzebuję. <br />Chciałbym wykonać układ, który mierzy czas z dokładnością do 1/100 sek. Poza tym po zatrzymaniu pomiaru zapisuje datę, godzinę (hh:mm) zakończenia pomiaru oraz dokładny zmierzony czas. (taki stoper logger). Może osoby bardziej doświadczone podpowiedzą jak to można inaczej wykonać, jakieś wskazówki?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=842">strzelec</a> — 1 kwi 2013, o 20:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-01T19:45:34+01:00</updated>
<published>2013-04-01T19:45:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32685#p32685</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32685#p32685"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32685#p32685"><![CDATA[
No dowolny układ RTC - dowolny - pierwszy z brzegu - jest ich przecież całe mrowie i na dowolne magistrale  chociażby PCF8583 itp .... czy o coś innego ci chodziło ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 kwi 2013, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-04-01T15:06:36+01:00</updated>
<published>2013-04-01T15:06:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32664#p32664</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32664#p32664"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=32664#p32664"><![CDATA[
Niestety tryb asynchroniczny z kwarcem 32,768 nie umożliwia dokładnego generowania przerwania co 10 ms. Błędy są jak na moje potrzeby zbyt duże - chyba, ze coś źle liczę. Poniżej kod na którym &quot;testowałem&quot; Timer2 async.   <br /><br />[syntax=c]<br />void RTCInit(void)<br />{<br />    //Wyłączenie przerwania od Timer2<br />    TIMSK  &amp;= ~(1&lt;&lt;TOIE2);<br />    //Włączenie trybu asynchronicznego<br />    ASSR  = (1&lt;&lt;AS2);<br />    //ustawienie wartosci początkowej licznika<br />    TCNT2=0;<br />    //ustawienie preskalera na 128<br />    TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS00);<br />    //oczekiwanie na aktualizację rejestrów<br />    while (!(ASSR &amp; ((1&lt;&lt;TCN2UB)|(1&lt;&lt;TCR2UB))));<br />    //wyzerowanie flagi prerwania<br />    TIFR  |= (1&lt;&lt;TOV2);<br />    //zezwolenie na przerwanie od Timer2<br />    TIMSK  |= (1&lt;&lt;TOIE2);<br />}<br />[/syntax]<br /><br />Skłaniam się jednak do jakiegoś sprzętowego rozwiązania, które umożliwia generowanie przerwania z częstotliwością 100Hz no i przy okazji może ma jakieś RTC. Możecie coś polecić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=842">strzelec</a> — 1 kwi 2013, o 15:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-03-10T15:59:56+01:00</updated>
<published>2013-03-10T15:59:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30287#p30287</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30287#p30287"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30287#p30287"><![CDATA[
Przeglądnąłem notę ATmega32 - Timer2 i faktycznie tryb asynchroniczny wygląda obiecująco na moje potrzeby. <br />RTC chciałem wykorzystać ze względu na to, że w projekcie będę potrzebował jeszcze czasu i daty więc i tak będzie.<br />Może jeszcze jakieś propozycje?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=842">strzelec</a> — 10 mar 2013, o 15:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-03-10T14:12:48+01:00</updated>
<published>2013-03-10T14:12:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30264#p30264</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30264#p30264"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=30264#p30264"><![CDATA[
Poniżej filmik z wygranej bitwy z MAX7219. <br />Założenia do &quot;projektu&quot; były takie: wykonać stoper zliczający z dokładnością do 1/100 sek. <br />Wykorzystać 4 nieblokujące klawisze z następującymi funkcjami:<br />klawisz 1 - krótkie naciśnięcie start/stop odliczania czasu, długie naciśnięcie reset stopera<br />klawisz 2 - krótkie naciśnięcie &quot;zatrzymanie&quot; na wyświetlaczu czasu bieżącego, w tle cały czas trwało odliczanie czasu, ponowne naciśnięcie wznowienie wyświetlania czasu<br />klawisz 3 - krótkie naciśnięcie zmniejszenie intensywności świecenia wyświetlacza, długie naciśnięcie ustawienie intensywności na minimum (na filmie pokazane również odliczanie przy minimalnej intensywności) <br />klawisz 4 - krótkie naciśnięcie zwiększenie intensywności świecenia wyświetlacza, długie naciśnięcie ustawienie intensywności na maksimum<br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Obsługa klawiszy zaczerpnięta z bloga Mirka. A reszta z noty katalogowej MAX7219 i ATmega32.<br />Poniżej kody. Obsługa SPI jest w max7219.c bo nie chciałem już tworzyć oddzielnej biblioteki.<br /><br />main.c<br />[syntax=c]/*<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;MAX7219/max7219.h&quot;<br />#include &quot;MICROSWITCH/microswitch.h&quot;<br /><br /><br />#define KEY1 (1&lt;&lt;PC7)<br />#define KEY2 (1&lt;&lt;PC6)<br />#define KEY3 (1&lt;&lt;PC5)<br />#define KEY4 (1&lt;&lt;PC4)<br /><br />#define START 1<br />#define HOLD2<br /><br />button_t key1, key2, key3, key4;  // definicja KLAWISZY<br /><br />volatile uint8_t ssek=0, sek=0, stopwatch_flag=0, stopwatch_status=0;   //deklaracja zmiennych dla stopera<br /><br />void timer0_init();<br />void intensity_up();<br />void intensity_max();<br />void intensity_down();<br />void intensity_min();<br />void stopwatch_start_stop();<br />void stopwatch_reset();<br />void stopwatch_hold();<br /><br />int main(void)<br />{<br /><br />DDRC &amp;= ~(KEY1 | KEY2 | KEY3 | KEY4); // ustwienie kierunku pinów jako wejscia<br />PORTC |= KEY1 | KEY2 | KEY3 | KEY4;  // podciągnieecie linii klawiszy do VCC<br /><br />key_init(&amp;key1, &amp;PINC, KEY1, 1, intensity_up, intensity_max);<br />key_init(&amp;key2, &amp;PINC, KEY2, 1, intensity_down, intensity_min);<br />key_init(&amp;key3, &amp;PINC, KEY3, 1, stopwatch_start_stop, stopwatch_reset);<br />key_init(&amp;key4, &amp;PINC, KEY4, 1, stopwatch_hold, 0);<br /><br />spi_init(); // inicjalizacja SPI<br />max7219_init();// inicjalizacja MAX7219;<br />timer0_init();// inicjalizacja timera<br /><br />sei();// zezwolenie na globalne przerwania<br /><br />while(1) {<br />key_press( &amp;key1 );  // obsługa klawiszy<br />key_press( &amp;key2 );<br />key_press( &amp;key3 );<br />key_press( &amp;key4 );<br /><br />// obsługa wyswietlania cyfr za pomocą MAX7219<br />if (stopwatch_flag) { // jezeli wystapiła zmiana czasi i potrzeba aktualizacji wyswietlaczy<br />if (!(stopwatch_status &amp; HOLD)) { // jeżeli wcinięty HOLD nie wysyłaj danych do MAX7219<br />max7219_send(MAX7219_DIGIT0, ssek % 10);<br />max7219_send(MAX7219_DIGIT1, ssek / 10);<br />max7219_send(MAX7219_DIGIT2, ((sek % 10) | MAX7219_DP));<br />max7219_send(MAX7219_DIGIT3, sek /10);<br />}<br />stopwatch_flag = 0; // zerowanie flagi aktualizacji wywietlaczy<br />}<br /><br />}<br />}<br /><br />void timer0_init(void)<br />{<br />TCCR0 |= (1&lt;&lt;WGM01);// TIMER0 tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);  // ustawienie preskalera<br />OCR0 = 0x6B;  // dodatkowy podzial<br />TIMSK |= (1&lt;&lt;OCIE0); // zezwolenie na przrwanie<br />}<br /><br />ISR (TIMER0_COMP_vect)<br />{<br />uint16_t n;<br /><br />n = key_timer;  /* 100Hz key_timer - obsługa klawiszy*/<br />if (n) key_timer = --n;<br /><br />stopwatch_flag=1; // ustawienie flagi aktualizacji danych na wywietlaczu<br /><br />if (stopwatch_status &amp; START) { // jezeli stoper pracuje zwiększ czas<br />ssek++;<br />if (ssek&gt;60) {<br />ssek=0;<br />sek++;<br />if (sek&gt;60) {<br />sek = 0;<br />}<br />}<br />}<br />}<br /><br />// własne funkcje obslugi klawiszy<br />void intensity_up(void) { // zwiekszenie intensywnoci swiecenia wyswietlaczy<br />if (max7219_set_intensity&lt;15) {<br />max7219_set_intensity++;<br />max7219_send(MAX7219_INTENSITY, max7219_set_intensity);<br />}<br />}<br /><br />void intensity_max(void) { // ustawienie maksymalnej intensywnoci swiecenia wyswietlaczy<br />max7219_set_intensity = 15;<br />max7219_send(MAX7219_INTENSITY, max7219_set_intensity);<br />}<br /><br />void intensity_down(void) { // zmniejszenie intensywnoci wiecenia wyswietlaczy<br />if (max7219_set_intensity&gt;0) {<br />max7219_set_intensity--;<br />max7219_send(MAX7219_INTENSITY, max7219_set_intensity);<br />}<br />}<br /><br />void intensity_min(void) { // ustawienie minimalnej intensywnoci swiecenia wyswietlaczy<br />max7219_set_intensity = 0;<br />max7219_send(MAX7219_INTENSITY, max7219_set_intensity);<br />}<br /><br />void stopwatch_start_stop(void) {  // start / stop odliczania czasu<br />stopwatch_status ^= START;<br />}<br /><br />void stopwatch_reset(void) { // resetowanie stopera<br />stopwatch_status &amp;= ~( START | HOLD);<br />ssek=0;<br />sek=0;<br />}<br /><br />void stopwatch_hold(void) { // zatrzymanie danych na wyswietlaczu, w tle odliczanie czasu<br />stopwatch_status ^= HOLD;<br />}<br />[/syntax]<br /><br />max7219.h<br />[syntax=c]/*<br /> * max7219.h<br /> * Plik nagłówkowy biblioteki<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br />#ifndef MAX7219_H_<br />#define MAX7219_H_<br /><br />// okreslenie liczby wywietlaczy 7seg. sterowanych przy pomocy układu<br />#define MAX7219_USE_DIGIT4<br /><br />// -------------------------------------------------------------<br />//            adresy rejestrów układu MAX7219<br />// -------------------------------------------------------------<br />#define MAX7219_NOOP0x00// rejestr używany przy kaskadowym połączeniu układów MAX7219 ze wspólną linią CS<br />#define MAX7219_DIGIT00x01// DIGIT 0..7 - rejestry danych kolejnych wyswietlaczy 7seg LED<br />#define MAX7219_DIGIT10x02<br />#define MAX7219_DIGIT20x03<br />#define MAX7219_DIGIT30x04<br />#define MAX7219_DIGIT40x05<br />#define MAX7219_DIGIT50x06<br />#define MAX7219_DIGIT60x07<br />#define MAX7219_DIGIT70x08<br />#define MAX7219_DECODE_MODE0x09 // bity 0..7 opisują sposób dekodowania danych z rejestrów DIGIT0..7 (0 - standard dla 7-seg, 1 - BCD)<br />#define MAX7219_INTENSITY0x0A// regulacja intensywnoci swiecenia wyswietlaczy<br />#define MAX7219_SCAN_LIMIT0x0B// okrelenie liczby sterowanych układem wyswitlaczy (bity 0..2) - 0x00 - tylko 1 wys., 0x07 - wszystkie 8 wysw.<br />#define MAX7219_SHUTDOWN0x0C// tryb pracy wyswietlacza (0 - shutdown, 1 - normal)<br />#define MAX7219_DISPLAY_TEST0x0F// test wyswietlacza (załączenie wszystkich segmentów)<br /><br />// -------------------------------------------------------------<br />//                        komendy sterujące<br />// -------------------------------------------------------------<br />#define MAX7219_SHUTDOWN_MODE0<br />#define MAX7219_NORMAL_OPPERATION1<br /><br />// -------------------------------------------------------------<br />//     ustawienie sposobu dekodowania danych na wywietlacz<br />//<br />// 0 na bicie reprezentującym wywietlacz - zwykłe kodowanie jak dla 7seg.<br />// 1 na bicie reprezentującym wywietlacz - kodowanie BCD<br />//<br />// -------------------------------------------------------------<br />#define MAX7219_USE_BCD_DECODE0b11111111<br /><br />//  ustawienie 7 bitu - włączenie znaku &quot;kropka&quot;.<br />#define MAX7219_DP (1&lt;&lt;7)<br /><br />extern uint8_t max7219_set_intensity;<br /><br />// definicja funkcji<br />void spi_init();<br />void max7219_init();<br />void max7219_send(uint8_t, uint8_t);<br /><br />#endif /* MAX7219_H_ */<br />[/syntax]<br /><br />max7219.c<br />[syntax=c]/*<br /> * max7219.c<br /> * Biblioteka<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &quot;max7219.h&quot;<br /><br />#define MOSI PB5<br />#define SCK PB7<br />#define CS PB4<br /><br />uint8_t max7219_set_intensity = 15;  // początkowa intensywnoć swiecenia wywietlaczy;<br /><br />// inicjalizacja sprzetowego SPI<br />void spi_init(void)<br />{<br />DDRB |= (1&lt;&lt;MOSI) | (1&lt;&lt;SCK) | (1&lt;&lt;CS); // ustawienie kierunku portu B<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR); // SPE - włączenie sprzętowego SPI, MSTR - układ master<br />SPSR |= (1&lt;&lt;SPI2X); // podwojenie predkosci SPI (taktowanie Fosc/2)<br />}<br /><br />// wysłanie 2 bajtów do układu MAX7219<br />// 1 bajt (adr) - adres rejestru do którego będą pisane dane<br />// 2 bajt (data) - dane do zapisania<br />void max7219_send(uint8_t adr, uint8_t data)<br />{<br />PORTB &amp;= ~(1&lt;&lt;CS);// ustawienie stanu niskiego na linii CS<br /><br />SPDR = adr; // bajt do wysłania do SPI data register<br />while (!(SPSR &amp; (1&lt;&lt;SPIF))); // oczekiwanie na koniec przesyłania danych, sprawdzenie flagi SPIF - pierwszy odczyt po przesłanu danych kasuje flagę<br />SPDR = data;// bajt do wysłania do SPI data register<br />while (!(SPSR &amp; (1&lt;&lt;SPIF))); // oczekiwanie na koniec przesyłania danych,<br /><br />PORTB |= (1&lt;&lt;CS);// ustawienie stanu wysokiego na linii CS (zatrzasnięcie danych w układzie zboczem narastajacym)<br />}<br /><br /><br />// inicjalizacja układu MAX7219<br />void max7219_init(void)<br />{<br />max7219_send(MAX7219_SCAN_LIMIT, (MAX7219_USE_DIGIT-1));  // liczba obsługiwanych wywietlaczy<br />max7219_send(MAX7219_INTENSITY, max7219_set_intensity);// maksymalna jasnosc<br /><br />#if MAX7219_USE_BCD_DECODE == 0// ustawienie trybu wyswietlania dla poszczególnych wyswietlaczy<br />max7219_send(MAX7219_DECODE_MODE, 0);<br />#else<br />max7219_send(MAX7219_DECODE_MODE, MAX7219_USE_BCD_DECODE);<br />#endif<br /><br />max7219_send(MAX7219_SHUTDOWN, MAX7219_NORMAL_OPPERATION);// włączenie układu (normal operation)<br />}<br />[/syntax]<br /><br />microswitch.h<br />[syntax=c]/*<br /> * microswitch.h<br /> *<br /> *  Created on: 09-03-2013<br /> *      Author: Grzegorz Strzelec<br /> */<br /><br />#ifndef MICROSWITCH_H_<br />#define MICROSWITCH_H_<br /><br />extern volatile uint16_t key_timer;<br /><br />typedef struct {<br /> volatile uint8_t *KPIN;<br /> uint8_t key_mask;<br /> uint8_t wait_time_s;<br /> void (*kfun1)(void);<br /> void (*kfun2)(void);<br /> uint8_t klock;<br /> uint8_t flag;<br />} button_t;<br /><br />void key_init( button_t * btn,<br />volatile uint8_t *KPIN,<br />uint8_t key_mask,<br />uint8_t wait_time,<br />void (*push_proc)(void),<br />void (*push2_proc)(void) );<br />void key_press(button_t * btn);<br /><br /><br />#endif /* MICROSWITCH_H_ */<br />[/syntax]<br /><br />microswitch.c<br />[syntax=c]/*<br /> * microswitch.c<br /> *<br /> *  Created on: 09-03-2013<br /> *      Author: Grzegorz Strzelec<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;microswitch.h&quot;<br /><br />// timery programowy<br />volatile uint16_t key_timer;<br /><br />void key_init( button_t * btn, volatile uint8_t * KPIN, uint8_t key_mask, uint8_t wait_time, void (*push_proc)(void), void (*push2_proc)(void) ) {<br />btn-&gt;KPIN = KPIN;<br />btn-&gt;key_mask = key_mask;<br />btn-&gt;wait_time_s = wait_time;<br />btn-&gt;kfun1 = push_proc;<br />btn-&gt;kfun2 = push2_proc;<br />}<br /><br /><br />void key_press( button_t * btn ) {<br /><br />register uint8_t key_press = (*btn-&gt;KPIN &amp; btn-&gt;key_mask);<br /><br />if( !btn-&gt;klock &amp;&amp; !key_press ) {<br />btn-&gt;klock=1;<br /><br />if(btn-&gt;kfun1) btn-&gt;kfun1();<br /><br />btn-&gt;flag=1;<br />key_timer = (btn-&gt;wait_time_s*1000)/10;<br /><br />}<br />else<br />if( btn-&gt;klock &amp;&amp; key_press ) {<br />(btn-&gt;klock)++;<br /><br />if( !btn-&gt;klock ) {<br />key_timer=0;<br />btn-&gt;flag=0;<br />}<br />} else<br />if( btn-&gt;flag &amp;&amp; !key_timer ) {<br />if(btn-&gt;kfun2) btn-&gt;kfun2();<br />btn-&gt;flag=0;<br />}<br />}<br />[/syntax]<br /><br />A teraz jeszcze pytanie.<br />Co radzicie do dokładnego odmierzania czasu? Chodzi o to, ze chciałbym wykonać układ mierzący czas z dokładnością właśnie do 1/100 sek ale pomiary muszą być dokładne. Chodzi o odmierzanie czasu biegu. Wyzwolenie i zatrzymanie tego pomiaru to inna sprawa, obecnie chodzi mi tylko o odmierzenie czasu. Myślałem nad jakimś rtc umożliwiającym generowanie co 10 ms przerwania (chyba jest to stabilniejsze niż zwykły timer w mikrokontrolerze) co o tym sądzicie? A może jakieś inne podpowiedzi? <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=842">strzelec</a> — 10 mar 2013, o 14:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-03-04T00:09:08+01:00</updated>
<published>2013-03-04T00:09:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29772#p29772</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29772#p29772"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29772#p29772"><![CDATA[
Ok, właśnie tak kombinuję tylko wydawało mi się, że lepiej z przerwania wysyłać zależnie od czasu od 1 do 4 cyfr (zawsze to mniej niż w pętli głównej za każdym razem 4) ale teraz widzę, że można inaczej zmienne zorganizować i czasowo wyjdzie na to samo a kod się znacznie uprości.<br />SCK SPI ustawiłem na Fosc/2 więc faktycznie 1 bit to tylko 2 takty zegara i nie było problemów nawet z przesłaniem wszystkich wyświetlaczy w przerwaniu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=842">strzelec</a> — 4 mar 2013, o 00:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-03-03T23:56:04+01:00</updated>
<published>2013-03-03T23:56:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29770#p29770</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29770#p29770"/>
<title type="html"><![CDATA[Re: MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29770#p29770"><![CDATA[
przesyłanie po SPI jest tak szybkie że generalnie nie powinno tu sprawiać kłopotu, jednak pomyśl sobie - ten program można drastycznie uprościć.<br /><br />1. w przerwaniu zliczaj TYLKO czas - i tak to już robisz<br />2. do 1/100 sek - ustawiaj jakąś flagę - spi_send_flag na JEDEN<br />3. w pętli głównej programu gdy ta flaga jest = 1 to ją zerujesz i jednocześnie wysyłasz po kolei wszystkie cyfry.<br /><br />wtedy przerwanie jest w ogóle nie obciążone a program ładnie przejrzyście napisany w sposób nieblokujący<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 mar 2013, o 23:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[strzelec]]></name></author>
<updated>2013-03-03T22:56:39+01:00</updated>
<published>2013-03-03T22:56:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29769#p29769</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29769#p29769"/>
<title type="html"><![CDATA[MAX7219 Stoper (obsługa przerwania)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2485&amp;p=29769#p29769"><![CDATA[
Przerabiając SPI z &quot;niebieskiej książki&quot; postanowiłem przetestować je na układzie MAX7219. <br />Założenie było takie, że wykonam stoper liczący z dokładnością do 1/100 sek.<br />Generalnie wszystko udało się ładnie wykonać, poniżej kod źródłowy ale mam &quot;mieszane uczucia&quot; czy umieszczanie w obsłudze przerwania wyświetlania w ten sposób jest prawidłowe, czy jednak wyprowadzać to do pętli głównej?<br /><br />[syntax=c]/*<br /> * max7219.h<br /> * Plik nagłówkowy biblioteki<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br />#ifndef MAX7219_H_<br />#define MAX7219_H_<br /><br />// okreslenie liczby wywietlaczy 7seg. sterowanych przy pomocy układu<br />#define MAX7219_USE_DIGIT4<br /><br />// -------------------------------------------------------------<br />//            adresy rejestrów układu MAX7219<br />// -------------------------------------------------------------<br />#define MAX7219_NOOP0x00// rejestr używany przy kaskadowym połączeniu układów MAX7219 ze wspólną linią CS<br />#define MAX7219_DIGIT00x01// DIGIT 0..7 - rejestry danych kolejnych wyswietlaczy 7seg LED<br />#define MAX7219_DIGIT10x02<br />#define MAX7219_DIGIT20x03<br />#define MAX7219_DIGIT30x04<br />#define MAX7219_DIGIT40x05<br />#define MAX7219_DIGIT50x06<br />#define MAX7219_DIGIT60x07<br />#define MAX7219_DIGIT70x08<br />#define MAX7219_DECODE_MODE0x09 // bity 0..7 opisują sposób dekodowania danych z rejestrów DIGIT0..7 (0 - standard dla 7-seg, 1 - BCD)<br />#define MAX7219_INTENSITY0x0A// regulacja intensywnoci swiecenia wyswietlaczy<br />#define MAX7219_SCAN_LIMIT0x0B// okrelenie liczby sterowanych układem wyswitlaczy (bity 0..2) - 0x00 - tylko 1 wys., 0x07 - wszystkie 8 wysw.<br />#define MAX7219_SHUTDOWN0x0C// tryb pracy wyswietlacza (0 - shutdown, 1 - normal)<br />#define MAX7219_DISPLAY_TEST0x0F// test wyswietlacza (załączenie wszystkich segmentów)<br /><br />// -------------------------------------------------------------<br />//                        komendy sterujące<br />// -------------------------------------------------------------<br />#define MAX7219_SHUTDOWN_MODE0<br />#define MAX7219_NORMAL_OPPERATION1<br /><br />// -------------------------------------------------------------<br />//     ustawienie sposobu dekodowania danych na wywietlacz<br />//<br />// 0 na bicie reprezentującym wywietlacz - zwykłe kodowanie jak dla 7seg.<br />// 1 na bicie reprezentującym wywietlacz - kodowanie BCD<br />//<br />// -------------------------------------------------------------<br />#define MAX7219_USE_BCD_DECODE0b11111111<br /><br />//  ustawienie 7 bitu - włączenie znaku &quot;kropka&quot;.<br />#define MAX7219_DP (1&lt;&lt;7);<br /><br />// definicja funkcji<br />void spi_init();<br />void max7219_init();<br />void max7219_clear();<br />void max7219_send(uint8_t, uint8_t);<br /><br />#endif /* MAX7219_H_ */[/syntax]<br /><br />[syntax=c]/*<br /> * max7219.c<br /> * Biblioteka<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br /><br />#include &lt;avr/io.h&gt;<br />#include &quot;max7219.h&quot;<br /><br />#define MOSI PB5<br />#define SCK PB7<br />#define CS PB4<br /><br />// inicjalizacja sprzetowego SPI<br />void spi_init(void)<br />{<br />DDRB |= (1&lt;&lt;MOSI) | (1&lt;&lt;SCK) | (1&lt;&lt;CS); // ustawienie kierunku portu B<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR); // SPE - włączenie sprzętowego SPI, MSTR - układ master<br />SPSR |= (1&lt;&lt;SPI2X); // podwojenie predkosci SPI (taktowanie Fosc/2)<br />}<br /><br />// wysłanie 2 bajtów do układu MAX7219<br />// 1 bajt (adr) - adres rejestru do którego będą pisane dane<br />// 2 bajt (data) - dane do zapisania<br />void max7219_send(uint8_t adr, uint8_t data)<br />{<br />PORTB &amp;= ~(1&lt;&lt;CS);// ustawienie stanu niskiego na linii CS<br /><br />SPDR = adr; // bajt do wysłania do SPI data register<br />while (!(SPSR &amp; (1&lt;&lt;SPIF))); // oczekiwanie na koniec przesyłania danych, sprawdzenie flagi SPIF - pierwszy odczyt po przesłanu danych kasuje flagę<br />SPDR = data;// bajt do wysłania do SPI data register<br />while (!(SPSR &amp; (1&lt;&lt;SPIF))); // oczekiwanie na koniec przesyłania danych,<br /><br />PORTB |= (1&lt;&lt;CS);// ustawienie stanu wysokiego na linii CS (zatrzanięcie danych w układzie zboczem narastajacym)<br />}<br /><br /><br />// inicjalizacja układu MAX7219<br />void max7219_init(void)<br />{<br />max7219_send(MAX7219_SCAN_LIMIT, (MAX7219_USE_DIGIT-1));  // liczba obsługiwanych wywietlaczy<br />max7219_send(MAX7219_INTENSITY, 0x0F);// maksymalna jasnosc<br /><br />#if MAX7219_USE_BCD_DECODE == 0// ustawienie trybu wyswietlania dla poszczególnych wyswietlaczy<br />max7219_send(MAX7219_DECODE_MODE, 0);<br />#else<br />max7219_send(MAX7219_DECODE_MODE, MAX7219_USE_BCD_DECODE);<br />#endif<br /><br />max7219_send(MAX7219_SHUTDOWN, MAX7219_NORMAL_OPPERATION);// włączenie układu (normal operation)<br />}<br /><br /><br />// czyszczenie zawartosci wszystkich wyswietlaczy LED<br />void max7219_clear(void)<br />{<br />uint8_t i=MAX7219_USE_DIGIT;<br />while (i) {<br />#if MAX7219_USE_BCD_DECODE == 0<br />max7219_send(i,0);<br />#else<br />if ((MAX7219_USE_BCD_DECODE &amp; (1&lt;&lt;i))) {<br />max7219_send(i,0xF);<br />} else {<br />max7219_send(i,0);<br />}<br />i--;<br />#endif<br />}<br />}[/syntax]<br /><br />[syntax=c]/*<br /> * Obsługa sterownika wyswietlaczy LED 7seg wsp. katoda MAX7219<br /> *<br /> * - sterowanie: SPI<br /> * - mozliwosc kaskadowego łączenia układów<br /> *<br /> *  Pliki:max7219.h, max7219.c<br /> *  Autor:Grzegorz Strzelec<br /> *  Data:02.03.2013<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;MAX7219/max7219.h&quot;<br /><br /><br />volatile uint8_t ssek0=0, ssek1=0, sek0=0, sek1=0;   //deklaracja zmiennych dla stopera<br /><br />void timer0_init();<br /><br />int main(void)<br />{<br />spi_init(); // inicjalizacja SPI<br />max7219_init();// inicjalizacja MAX7219;<br />max7219_clear();// wygaszenie wszystkich wyswietlaczy LED<br />timer0_init();// inicjalizacja timera<br />sei();// zezwolenie na globalne przerwania<br />while(1);<br />}<br /><br />void timer0_init(void)<br />{<br />TCCR0 |= (1&lt;&lt;WGM01);// TIMER0 tryb CTC<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);  // ustawienie preskalera<br />OCR0 = 0x6B;<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />ISR (TIMER0_COMP_vect)<br />{<br />ssek0++;<br />if (ssek0&lt;10){<br />max7219_send(MAX7219_DIGIT0, ssek0);<br />} else {<br />ssek0=0;<br />ssek1++;<br />max7219_send(MAX7219_DIGIT0, 0);<br />if (ssek1&lt;10){<br />max7219_send(MAX7219_DIGIT1, ssek1);<br />} else {<br />ssek1=0;<br />sek0++;<br />max7219_send(MAX7219_DIGIT1, 0);<br />if (sek0&lt;10){<br />max7219_send(MAX7219_DIGIT2, sek0);<br />} else {<br />sek0=0;<br />sek1++;<br />max7219_send(MAX7219_DIGIT2, 0);<br />if (sek1&lt;6) {<br />max7219_send(MAX7219_DIGIT3, sek1);<br />} else {<br />sek1=0;<br />max7219_send(MAX7219_DIGIT3, 0);<br />}<br />}<br />}<br />}<br /><br />}<br />[/syntax]<br /><br />No i jeszcze jedna sprawa, czy da się w C przeciążyć funkcję czy tylko w C++? <br />Chciałbym mieć w bibliotece np. kilka funkcji init z różnymi argumentami (np ilością układów MAX połączonych kaskadowo).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=842">strzelec</a> — 3 mar 2013, o 22:56</p><hr />
]]></content>
</entry>
</feed>