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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-26T09:38:35+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=8263&amp;mode</id>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-08-26T09:38:35+01:00</updated>
<published>2014-08-26T09:38:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92914#p92914</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92914#p92914"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92914#p92914"><![CDATA[
Jestem za tym by jednak pokazać co kolega mokrowski miał na myśli <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, bo dla mnie nie które wypowiedzi brzmią jak zaklęcia voodoo.<br />Tj. Mam na myśli, że Mirek mimo wszystko podaje to bardziej strawnie. Ciężko na początku drogi jeszcze ogarniać te wszystkie modularyzacje.<br />Sam jestem jak najbardziej za czytelnym kodem i trzymaniem się standardów, niestety czasem trzeba pochylić się nad maluczkimi (np. mną, bom tempy niczym gerlach z zastawy babci).<p>Statystyki: Napisane przez Gość — 26 sie 2014, o 09:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[repro]]></name></author>
<updated>2014-08-26T08:38:24+01:00</updated>
<published>2014-08-26T08:38:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92907#p92907</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92907#p92907"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92907#p92907"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Rzeczywiście napisałeś że Atmega162, przepraszam umknąło mi....<br /><br />Nie rozumiem intencji init_leds() gdzie LED_PORT jest zerowany a później ,,tłuczesz&quot; 0xFF na port w przerwaniu... O co tu chodzi?<br />Kto czyta tę zmienną k którą tak pracowicie inkrementujesz i zerujesz w przerwaniu?<br /><br />Proszę podziel kod na oddzielne pliki gdzie klawiatura będzie miała plik *.c *.h a wyświetlacze segmentowe oddzielne. Wtedy będzie widać intencje... <br />NIestety jestem ,,upierdliwcem&quot; co do elegancji kodu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Ma  być coś w stylu init_led_port(), init_led_timer(), init_key_port(), init_key_timer(). A w main.c tylko użycie... Już część masz ale reszta przemieszana. <br />Do oddzielnych plików i wiele się wyjaśni.<br /><br />Rozumiem że chcesz sprawdzić czy działa timer2? Jeśli tak i ma zamrugać diodą/diodami to zmień kod na:<br />[syntax=c]ISR(TIMER2_COMP_vect)<br />{<br />        /* LED_PORT = 0xFF; */<br />        k++;<br />        if(k==100)<br />        {<br />                LED_PORT ^=0xFF;<br />                k = 0;<br />        }<br />}[/syntax]<br />wtedy będziesz wiedział czy przerwania timer2 pracują.<br /></div><br />Cześć. <br />Skupiłeś na elemencie kodu, który nie działał, a 0xFF umieściłem po to by sprawdzić, czy w ogóle następuje procedura przerwania. Inicjalizacja diod jest śmieszna, ale chciałem przećwiczyć ten element poprzez funkcję, która nie zwraca wartości. Dobrze zwrócić uwagę na nazwy zmiennych, funkcji, tak jak to pokazałeś w swoim komentarzu. Masz rację odnośnie elegancji kodu, gdyż taki kod czyta się dużo łatwiej i analizuje. Obiecuję, że postaram się nad tym popracować. Zmienna k miała służyć do zliczania ilości przerwań i na jej podstawie wyliczyć, jakąś przerwę czasową. Na pewno jej użyję, ale póki, co skupiam się na wykorzystaniu sprzętowych zasobów mikroprocka i sprawdzam, czy blokuje to program. Ot tak, jak dziecko sprawdza, czy płomień parzy  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Odnośnie tego błędu, byłem pewny, że wpisałem OCIE2, a tymczasem.... <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br />Dziękuję za wszystko.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=613">repro</a> — 26 sie 2014, o 08:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-25T18:37:43+01:00</updated>
<published>2014-08-25T18:37:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92847#p92847</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92847#p92847"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92847#p92847"><![CDATA[
<div class="quotetitle">repro napisał(a):</div><div class="quotecontent"><br />[syntax=c]//utawienia timera0<br />        TCCR0 |= (1&lt;&lt;WGM01);<br />        TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />        OCR0 = 78;<br />        TIMSK |= (1&lt;&lt;OCIE0);[/syntax]<br /></div><br /><div class="quotetitle">repro napisał(a):</div><div class="quotecontent"><br />[syntax=c]////////timer2///////////////<br />        TCCR2 |= (1&lt;&lt;WGM21); //tryb CTC<br />        TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22); //preskaler 1024<br />        OCR2 = 156; //100Hz,10ms<br />        TIMSK |= (1&lt;&lt;TOIE2); //zezwolenie na CTC[/syntax]<br /></div><br />W drugim przypadku masz TOIE2.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 sie 2014, o 18:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[repro]]></name></author>
<updated>2014-08-25T12:56:39+01:00</updated>
<published>2014-08-25T12:56:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92802#p92802</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92802#p92802"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92802#p92802"><![CDATA[
Atmega 162. Wspomniane w pierwszym poście <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=613">repro</a> — 25 sie 2014, o 12:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[repro]]></name></author>
<updated>2014-08-25T11:27:41+01:00</updated>
<published>2014-08-25T11:27:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92788#p92788</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92788#p92788"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92788#p92788"><![CDATA[
Dziękuję za uwagi. <br />Głupia gafa o której zapomniałem. Rzeczywiście nazwy nie mogą się rozpoczynać od cyfr. Chciałem obsłużyć 2 timery <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Oczywiście można zrobić tak, jak napisałeś, ale chcę korzystać z dwóch timerów.. W przyszłości będę chciał obsługiwać kilka rzeczy &quot;na raz&quot;, tzn. licznik na 7seg, animacja na diodach,za pomocą microswitch zmiana animacji itd. Coś się jeszcze znajdzie. Po waszych poprawkach wszystko działa, jak powinno i bez błędów. Jak będzie z tym drugim timerem?  Dlaczego nie zlicza?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=613">repro</a> — 25 sie 2014, o 11:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[perlon]]></name></author>
<updated>2014-08-25T07:57:20+01:00</updated>
<published>2014-08-25T07:57:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92773#p92773</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92773#p92773"/>
<title type="html"><![CDATA[Re: Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92773#p92773"><![CDATA[
Na mój gust inkludowanie plików nagłówkowych standardowych bibliotek we własnych plikach nagłówkowych to zła praktyka.<br />Po kiego grzyba ci <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;[/syntax]<br />w pliku 7SEG.h ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=382">perlon</a> — 25 sie 2014, o 07:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[repro]]></name></author>
<updated>2014-08-25T01:44:22+01:00</updated>
<published>2014-08-25T01:44:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92768#p92768</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92768#p92768"/>
<title type="html"><![CDATA[Obsługa dwóch timerów]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8263&amp;p=92768#p92768"><![CDATA[
Witam ponownie,<br />chciałbym używać dwóch timerów w &quot;locie&quot;. Jeden do multipleksowania, a drugi do obsługi klawiatury matrycowej 4x4 i w międzyczasie puścić animację na drabince diodowej. Drugi timer nie chce mi działać. Myślałem, że można obsługiwać dwa timery TIMER0 i TIMER2. <br />Plik <strong>7seg.c</strong> z obsługą Timera0<br />[syntax=c]/*<br /> * PB0 = A<br /> * PB1 = B<br /> * PB2 = C<br /> * PB3 = D<br /> * PB4 = E<br /> * PB5 = F<br /> * PB6 = G<br /> *<br /> *<br /> * PD2 = LED1<br /> * PD3 = LED2<br /> * PD4 = LED3<br /> * PD5 = LED4<br /> *<br /> * OCR = 78 // 200MHz dla preskalera 1024<br /> *<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include &quot;7seg.h&quot;<br /><br /><br />//definicja zmiennych globalnych<br /><br />volatile uint8_t cy1;<br />volatile uint8_t cy2;<br />volatile uint8_t cy3;<br />volatile uint8_t cy4;<br /><br />uint8_t cyfry&#91;15&#93; = {<br /><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_G | SEG_F ),//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//10<br /><br />};<br /><br /><br /><br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF; // wszystkie portu B jako wyjscia(katody)<br />LED_DATA = 0xFF; // wygaszenie wszystkihc katod - stan wysoki<br />// 4 piny portu D jako wyjscia(anody)<br />ANODY_DIR |= CD1 | CD2 | CD3 | CD4;<br />// wygaszenie wszystkich wyswietlaczy<br />ANODY_PORT |= CD1 | CD2 | CD3 | CD4;<br /><br />//utawienia timera0<br /><br />TCCR0 |= (1&lt;&lt;WGM01);<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);<br />OCR0 = 78;<br />TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />// ============== PROCEDURA OBSŁUGI PRZERWANIA - COMPARE MATCH =====<br /><br />ISR(TIMER0_COMP_vect)<br />{<br />//zmienna do przelaczania kolejno anod wyswietlacza<br />static uint8_t licznik = 4;<br />// cykliczne przelaczanie w kazdym przerwaniu<br />// anoud kazdego wyswietlacza ( wartosc negowana, aby krazylo zero )<br />ANODY_PORT = (ANODY_PORT | MASKA_ANODY);<br /><br />//gdy zapalony wysw 1 podaj stan zmiennej c4<br />if( licznik == 4 ) LED_DATA = cyfry&#91;cy4&#93;;<br />// gdy zapalony wysw 2 podaj stan zmiennej c3<br />else if( licznik == 8 ) LED_DATA = cyfry&#91;cy3&#93;;<br />// gdy zapalony wysw 3 podaj stan zmiennej c2<br />else if( licznik == 16 ) LED_DATA = cyfry&#91;cy2&#93;;<br />// gdy zapalony wysw 4 podaj stan zmiennej c1<br />else if( licznik == 32 ) LED_DATA = cyfry&#91;cy1&#93;;<br /><br />ANODY_PORT = (ANODY_PORT &amp; ~MASKA_ANODY) | (~licznik &amp; MASKA_ANODY);<br /><br /><br />//operacje cyklicznego przesuwania bity zapalaacego anody w zmiennej licznik<br />licznik &lt;&lt;= 1; // przesuniecie zawartosci bitow licznika o 1 w lewo<br />if( licznik &gt; 32 ) licznik = 4; // jesli licznik wiekszy niz 8 to ustaw na 1<br />}[/syntax]<br />Plik nagłówkowy <strong>7seg.h</strong><br />[syntax=c]/*<br /> * 7seg.h<br /> *<br /><br /> */<br />//#ifndef 7SEG_H_ <br />//#define 7SEG_H_ <br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define LED_DATA PORTB<br />#define LED_DATA_DIR DDRB<br /><br />#define ANODY_PORT PORTD<br />#define ANODY_DIR DDRD<br /><br />#defineCD1(1&lt;&lt;PD2)<br />#define CD2(1&lt;&lt;PD3)<br />#define CD3(1&lt;&lt;PD4)<br />#define CD4(1&lt;&lt;PD5)<br /><br />#define MASKA_ANODY ( CD1 | CD2 | CD3 | CD4 )<br /><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 NIC 10<br /><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 />void d_led_init(void);<br /><br />//#endif /* 7SEG_H_ */[/syntax]<br />Jak odkomentuję:<br />[syntax=c]#ifndef 7SEG_H_ <br />#define 7SEG_H_ <br />....<br />#endif /* 7SEG_H_ */[/syntax]<br />To mam taką akcję i pierwszy raz coś takiego mi się zdarzyło.<br /><img src="http://i.imgur.com/OtjhokZ.jpg" alt="Obrazek" /><br />Dlatego zakomentowałem i problem znikł.<br />Plik <strong>main.c</strong><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/delay.h&gt;<br />#include &quot;7seg.h&quot;<br /><br />///deklaracje klawiszy<br />#define KEY_PIN PINC<br />#define KEY_PORT PORTC<br />#define KEY_DIR DDRC<br /><br />#define SW1 (1&lt;&lt;PC7)<br />#define SW2 (1&lt;&lt;PC6)<br />#define SW3 (1&lt;&lt;PC5)<br />#define SW4 (1&lt;&lt;PC4)<br />///////////////////////////////<br /><br />//diody<br />#define LED_PORT PORTA<br />#define LED_DDRDDRA<br /><br />void init_keys();<br />void init_leds();<br />uint8_t key_press(uint8_t key);<br /><br />volatile uint8_t k = 0;<br /><br />int main()<br />{<br />/*inicjalizacja*/<br />d_led_init();<br />init_keys();<br />init_leds();<br />////////timer2///////////////<br />TCCR2 |= (1&lt;&lt;WGM21); //tryb CTC<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22); //preskaler 1024<br />OCR2 = 156; //100Hz,10ms<br />TIMSK |= (1&lt;&lt;TOIE2); //zezwolenie na CTC<br /><br /><br /><br />//testowa inicjalizacja liczb na wyswietlaczu led<br /><br />cy1=NIC;   //2 c,g<br />cy2=NIC;<br />cy3=NIC;<br />cy4=NIC;<br /><br />sei(); //zezwolenie na globalne przerwania<br /><br />_delay_ms(1000);<br /><br /><br />/***petla glowna programu***/<br /><br />while(1)<br />{<br />cy1,cy2 = NIC;<br />//liczenie do 99 i rest, i - jednosci, j - dziesiatki<br />for( uint8_t i = 1, j=0; ;i++)<br />{<br /><br />if(i &gt; 9)<br />{<br />i = 0;<br />j++;<br />cy2 = j;<br /><br />if(j &gt; 9)<br />{<br />j = 0;<br />break;<br />}<br />}<br /><br />cy1 = i;<br />_delay_ms(200);<br />}<br /><br />}<br /><br />}<br /><br /><br />void init_keys()<br />{<br />///inicjalizacja klawiszy<br />KEY_DIR &amp;= ~( SW1 | SW2 | SW3 | SW4 );<br />KEY_PORT |= SW1 | SW2 | SW3 | SW4;<br /><br />}<br /><br />void init_leds()<br />{<br />LED_DDR = 0xFF;<br />LED_PORT = 0;<br />}<br /><br />uint8_t key_press(uint8_t key)<br />{<br />if( !( key &amp; KEY_PIN))<br />{<br />_delay_ms(80);<br />if( !( key &amp; KEY_PIN ) )<br />{<br />return 1;<br />}<br />}<br />return 0;<br />}<br />ISR(TIMER2_COMP_vect)<br />{<br />LED_PORT = 0xFF;<br />k++;<br />if(k==100)<br />{<br />k = 0;<br />}<br />}[/syntax]<br />Przerwanie Timer2 nie następuje. Gdzie popełniam błąd, albo co mi umyka?<br />uC: Atmega162, 16MHz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=613">repro</a> — 25 sie 2014, o 01:44</p><hr />
]]></content>
</entry>
</feed>