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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-08-05T20:50:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18953&amp;mode</id>
<entry>
<author><name><![CDATA[rafalb]]></name></author>
<updated>2017-08-05T20:50:33+01:00</updated>
<published>2017-08-05T20:50:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193105#p193105</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193105#p193105"/>
<title type="html"><![CDATA[Re: Timer programowy -  jak to z tym jest?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193105#p193105"><![CDATA[
Chłopaki, wielkie dzięki! Tak długo szukałem, kminiłem i znaleźć sensu tego kodu nie mogłem. Już się przegrzewałem dzisiaj w tym upale... choć lepiej, że ja a nie ATmega.<br /><br />Jeszcze raz bardzo dziękuję!<br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17569">rafalb</a> — 5 sie 2017, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janusz17]]></name></author>
<updated>2017-08-05T15:17:21+01:00</updated>
<published>2017-08-05T15:17:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193088#p193088</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193088#p193088"/>
<title type="html"><![CDATA[Re: Timer programowy -  jak to z tym jest?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193088#p193088"><![CDATA[
Masz zdefiniowane LED_DATA jako PORTC i potem w pętli głównej co 1 ms wpisujesz do tego portu nową wartość za pomocą prostego przypisania =. Czyli wpisujesz praktycznie za każdym razem na pozycji PC0 wartość 0. Aby wyzerować tylko te bity , które odpowiadają konkretnej cyfrze powinieneś użyć operatora &amp;. Czyli np:<br />[syntax=c]LED_DATA &amp;= digits&#91;1&#93;;[/syntax]<br />Wtedy nie zmieni się pozycja PC0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1226">janusz17</a> — 5 sie 2017, o 15:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2017-08-05T15:14:22+01:00</updated>
<published>2017-08-05T15:14:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193087#p193087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193087#p193087"/>
<title type="html"><![CDATA[Re: Timer programowy -  jak to z tym jest?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193087#p193087"><![CDATA[
Segmenty wyświetlacza i LED3 masz na tym samym porcie. Wysyłając dane na wyświetlacz nadpisujesz stan pinu PC0, na którym masz LED3.<br /><br />Przenieś LED3  na pin innego portu albo użyj maskowania wysyłając dane na wyświetlacz tak aby zmieniać stan pinów PC1-PC7 nie ruszając pinu PC0.<br />Spróbuj tak<br />[syntax=c]LED_DATA = (LED_DATA &amp; 0x01) | (digits&#91;1&#93; &amp; 0xF7);[/syntax]<br />W pierwszym nawiasie zerowane są piny PC1-PC7. PC1 zostaje bez zmian.<br />W drugim nawiasie w wartości odczytanej z tablicy wyzerowany zostaje najmłodszy bit.<br />Potem te dwie wartości np. 0b00000001 | 0b11111110 są sumowane i wysyłane na PORTC. W wyniku sumowania na PORTC trafi wartość 0b11111111.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 5 sie 2017, o 15:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rafalb]]></name></author>
<updated>2017-08-05T13:21:58+01:00</updated>
<published>2017-08-05T13:21:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193085#p193085</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193085#p193085"/>
<title type="html"><![CDATA[Timer programowy -  jak to z tym jest?]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18953&amp;p=193085#p193085"><![CDATA[
Witajcie,<br /><br />Zabrałem się za pisanie kodu do obsługi wyświetlacza 7-segmentowego z pomocą rejestru 74HC595. Bardzo fajnie mi to działa. W programie chcę a nawet chyba muszę zastosować timery programowe, gdyż chcę mieć jeszcze obsługę klawiszy, np z pomocą tej strony: <a href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html"  class="postlink">http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-zwoka-czasowa-cd3.html</a><br /><br />Zmianę wyświetlacza realizuję już za pomocą timera 1. Za pomocą timera 2 chciałbym zmieniać stan zwykłej diody LED co 1 sekundę. Jeżeli &quot;uruchomię&quot; w programie dwa timery na raz wyświetlacz działa poprawnie, dioda natomiast migocze bardzo szybko, że ciężko zauważyć. Jeżeli &quot;uruchomię&quot; tylko jeden kawałek kodu np. dla timera 2 z diodą, dioda miga jak powinna. <br /><br />Proszę mi powiedzieć, w którym miejscu nie rozumiem zasady działania timerów programowych? Bo tak najpewniej jest. Kod poniżej.<br /><br />[syntax=c]/*<br /> * main.c<br /> *       ATmega32: F_CPU = 8 MHz<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define LED3 (1&lt;&lt;PC0)<br /><br />#define SEG_A (1&lt;&lt;PC1)<br />#define SEG_B (1&lt;&lt;PC2)<br />#define SEG_C (1&lt;&lt;PC4)<br />#define SEG_D (1&lt;&lt;PC6)<br />#define SEG_E (1&lt;&lt;PC5)<br />#define SEG_F (1&lt;&lt;PC3)<br />#define SEG_G (1&lt;&lt;PC7)<br />uint8_t content&#91;3&#93;;<br /><br />const uint8_t digits&#91;15&#93; = {<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 />0xFF// nic<br />};<br /><br /><br />#define LED_DATAPORTC<br />#define LED_DATA_DIRDDRC<br /><br /><br />volatile uint8_t pos_cnt = 2; // Liczba wyświetlaczy ( 1, 2 )<br />volatile static uint8_t led_cnt = 2; // Liczba wyświetlaczy LED<br /><br />// Ustawienia dla interfejsu SPI - 74HC595<br />#define MOSI PB5<br />#define SCK PB7<br />#define CS PB4<br /><br /><br />void d_led_init(void){<br />LED_DATA_DIR = 0xFF; // Piny portu D jako wyjścia<br />LED_DATA = 0x00;<br />}<br /><br />void InitSpi(void) {<br />DDRB |= (1&lt;&lt;MOSI) | (1&lt;&lt;SCK) | (1&lt;&lt;CS);<br />SPCR |= (1&lt;&lt;SPE) | (1&lt;&lt;MSTR) | (1&lt;&lt;SPR1);<br />}<br />void SendSpi(uint8_t bajt) {<br />SPDR = bajt;<br /><br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br /><br />PORTB |= (1&lt;&lt;CS);<br /><br />PORTB &amp;= ~(1&lt;&lt;CS);<br />}<br /><br />// timery programowe<br />volatile uint16_t Timer1, Timer2;<br /><br />//------------------------------------------------------------------<br />int main(void) {<br />d_led_init();<br />InitSpi();<br />SendSpi(0);<br /><br /> DDRC |= LED3;   // piny LED jako WYjścia<br /><br /> /* Timer2 – konfigurcajca silnika timerów programowych */<br /> TCCR2  |= (1&lt;&lt;WGM21);   // tryb pracy CTC<br /> TCCR2  |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20); // preskaler = 1024<br /> OCR2  = 77;   // przerwanie porównania co 10ms (100Hz)<br /> TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br /> volatile uint8_t position = 1; // Pozycja cyfry<br /> sei();<br />content&#91;1&#93; = 4;<br />content&#91;2&#93; = 7;<br /> while(1) {<br /><br />if (!Timer1) {<br />Timer1=1;<br /><br />if(position == led_cnt){ position = 1;pos_cnt &gt;&gt;=1; }<br />else if(position &lt; led_cnt){ position = 2; pos_cnt &lt;&lt;=1;}<br /><br />SendSpi(~pos_cnt); // Negacja - wspólna anoda LED (101 - 110)<br /><br />if(content&#91;position&#93; == 1){<br />LED_DATA = digits&#91;1&#93;;<br />}<br />if(content&#91;position&#93; == 2){<br />LED_DATA = digits&#91;2&#93;;<br />}<br />if(content&#91;position&#93; == 3){<br />LED_DATA = digits&#91;3&#93;;<br />}<br />if(content&#91;position&#93; == 4){<br />LED_DATA = digits&#91;4&#93;;<br />}<br />if(content&#91;position&#93; == 5){<br />LED_DATA = digits&#91;5&#93;;<br />}<br />if(content&#91;position&#93; == 6){<br />LED_DATA = digits&#91;6&#93;;<br />}<br />if(content&#91;position&#93; == 7){<br />LED_DATA = digits&#91;7&#93;;<br />}<br />if(content&#91;position&#93; == 8){<br />LED_DATA = digits&#91;8&#93;;<br />}<br />if(content&#91;position&#93; == 9){<br />LED_DATA = digits&#91;9&#93;;<br />}<br />if(content&#91;position&#93; == 0){<br />LED_DATA = digits&#91;0&#93;;<br />}<br />}<br /><br /><br /><br />  // przykładowy niezależny i nieblokujący proces<br />  if( !Timer2 ) {<br />   Timer2=100;<br />   PORTC ^= LED3;<br />  }<br /> }<br /><br />}<br />//------------------------------------------------------------------<br /><br /><br /><br />//*** przerwanie Timer2 CompareM<br />ISR(TIMER2_COMP_vect) {<br /> uint16_t n;<br /><br /> n = Timer1;  /* 100Hz Timer1 */<br /> if (n) Timer1 = --n;<br /> n = Timer2;  /* 100Hz Timer2 */<br /> if (n) Timer2 = --n;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17569">rafalb</a> — 5 sie 2017, o 13:21</p><hr />
]]></content>
</entry>
</feed>