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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-12-09T16:43:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4541&amp;mode</id>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-12-09T16:43:37+01:00</updated>
<published>2013-12-09T16:43:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60298#p60298</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60298#p60298"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60298#p60298"><![CDATA[
Widzę, że trochę ci się pomyliły timery programowe z timerami sprzętowymi. W projekcie używasz jednego timera sprzętowego (Timer2) w trybie CTC. Ten timer służy do generowania przerwania co 10ms. Przerwanie tego timera jest wykorzystane do działania timerów programowych. W tym projekcie akurat Timer1 i Timer2. Timer1 i Timer2 to są zwykłe zmienne globalne.<br />Nic nie stoi na przeszkodzie aby tych timerów było więcej i miały zupełnie inne nazwy np. Timer8, Timer_led_tog. <br />Tak więc do migania diodą nie musisz konfigurować kolejnego timera sprzętowego tylko stworzyć kolejny timer programowy np. pTimer_led.<br />Poza tym zastąpienie [syntax=c]_delay_ms(250);[/syntax]<br />czymś takim  [syntax=c]pTimer_led = 50;[/syntax] nie zadziała.<br /><br />To trzeba zapisać trochę inaczej np. tak:[syntax=c]if(POWERING_UP)                                         //jesli wzmacniacz sie uruchamia<br />{<br />if(!pTimer_led)<br />{<br />                 RED_TOG;                                        //zmieniaj stan LED<br />                 pTimer_led = 25;                      //co 250 ms<br />}    <br />          if(POWER_IS_ON) RED_ON;         //jesli wzmacniacz uruchomiony zgas LED<br />}[/syntax]<br /><br />Oczywiście w przerwaniu od Timera2 sprzętowego) trzeba dodać mechanizm nowego timera programowego:<br />[syntax=c]//*** przerwanie Timer2 Compare Match<br />    ISR(TIMER2_COMP_vect) {<br />     <br />     uint16_t n;<br />     <br />     n = pTimer1;  /* 100Hz Timer1 */<br />     if (n) pTimer1 = --n;<br />     <br />     n = pTimer2;  /* 100Hz Timer2 */<br />     if (n) pTimer2 = --n;<br />     <br />     n = pTimer_led;  /* 100Hz Timer1 */<br />     if (n) pTimer_led = --n;<br />    }[/syntax]<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &lt;util/delay.h&gt;<br />     <br />    //definicje pinu dla blokowania mostka H i diody LED stand-by<br />    #define STBY (1&lt;&lt;PC5)<br />    #define STBY_ON PORTC &amp;= ~STBY<br />    #define STBY_OFF PORTC |= STBY<br />    #define STBY_TOG PORTC ^= STBY<br />     <br />    //definicje portow przekaznika zasilania i softstartu<br />    #define PREL    (1&lt;&lt;PB0)<br />    #define PREL_OFF PORTB &amp;= ~PREL<br />    #define PREL_ON PORTB |= PREL<br />     <br />    #define SREL    (1&lt;&lt;PD7)<br />    #define SREL_OFF PORTD  &amp;= ~SREL<br />    #define SREL_ON PORTD   |= SREL<br />     <br />     <br />    //definicje pinów dla selektora wejsc<br />    #define CH1 (1&lt;PD0)             //pin przekaźnika 1<br />    #define CH2 (1&lt;&lt;PD1)    //pin przekaźnika 2<br />    #define CH3 (1&lt;&lt;PD2)    //pin przekaźnika 3<br />    #define CH4 (1&lt;&lt;PD3)    //pin przekaźnika 4<br />     <br />    //definicje dla mostka h do sterowania głososcia.<br />     <br />    #define UP PC4                  //wyjscie dla mostka H<br />    #define DN PC3                  //wyjscie dla mostka H<br />     <br />    //definicje klawiszy<br />    #define KEY1 (1&lt;&lt;PC1)   //klawisz on-off i wyboru wejcia selektora<br />    #define VOLDN (1&lt;&lt;PC0)  //klawisz ciszej<br />    #define VOLUP (1&lt;&lt;PC2)  //klawisz glosniej<br />     <br />    //makra sprawdzające stan przycisków glonosci<br />    #define DOWN_VOLUP !(PINC &amp; VOLUP)      //głoniej<br />    #define DOWN_VOLDN !(PINC &amp; VOLDN)      //ciszej<br />     <br />    //dfinicja zmian glosnosci<br />    #define GLOSNIEJ PORTC &amp;= ~(1&lt;&lt;UP); PORTC |=(1&lt;&lt;DN);<br />    #define CISZEJ PORTC |= (1&lt;&lt;UP); PORTC &amp;= ~(1&lt;&lt;DN);<br />    #define STOP PORTC |= (1&lt;&lt;UP); PORTC |= (1&lt;&lt;DN);<br />     <br />    //definicje dla podwietlania pokrętła kolor czerwony<br />    #define RED (1&lt;&lt;PB1)<br />    #define RED_ON PORTB &amp;= ~RED<br />    #define RED_OFF PORTB |= RED<br />    #define RED_TOG PORTB ^= RED<br />     <br />     <br />    //definicje dla stanu zasilania wzmacniacza<br />    #define POWERING_UP (PINB &amp; PREL)<br />    #define POWER_IS_ON (PIND &amp; SREL)<br />     <br />    //deklaracje funkcji<br />    uint8_t klawisz_glosniej(void);<br />    uint8_t klawisz_ciszej(void);<br />     <br />     <br />    uint8_t flaga;<br />     <br />     <br />    typedef struct {<br />     volatile uint8_t *KPIN;<br />     <br />     uint8_t key_mask;<br />     uint8_t wait_time_s;<br />     void (*kfun1)(void);<br />     void (*kfun2)(void);<br />     <br />     uint8_t klock;<br />     uint8_t flag;<br />    } TBUTTON;<br />     <br />    // timery programowe<br />    volatile uint16_t pTimer1, pTimer2, pTimer_led;<br />     <br />     <br />    //funkcje sterownika (on / off)<br />    void pwr_off(void)<br />    {<br />            RED_ON;<br />            STBY_ON;<br />            PREL_OFF;<br />            SREL_OFF;<br />            flaga= 0;<br />    }<br />     <br />    void pwr_on(void)<br />    {<br />            STBY_OFF;<br />            PREL_ON;<br />            RED_OFF;<br />            flaga = 1;<br />            Timer2 = 230;<br />    }<br />     <br />    // funkcja obsługi pojedynczych klawiszy<br />    void key_press( TBUTTON * btn );<br />     <br />    TBUTTON button; // definicja KLAWISZA<br />     <br />    //------------------------------------------------------------------<br />    int main(void) {<br />     <br />            _delay_ms(100); //<br />     <br />            DDRC |= STBY;   //kierunek portu jako wyjscie<br />            DDRB |= PREL;   //kierunek portu jako wyjscie<br />            DDRD |= SREL;   //kierunek portu jako wyjscie<br />            STBY_ON;                //zapala diode standby i blokuje mostek H<br />     <br />            DDRB |= RED;<br />            PORTB &amp;= ~RED;<br />     <br />            PREL_OFF;               //domyslnie wylacza przekaznik zasilania glownego<br />            SREL_OFF;               //domyslnie wylacza przekaznik softstartu<br />     <br />            DDRC |= (1&lt;&lt;UP) | (1&lt;&lt;DN);      //porty wyjciowe dla pinów mostka H<br />            PORTC |= (1&lt;&lt;UP)|(1&lt;&lt;DN);       //wylaczenie portow dla mostka H<br />     <br />            PORTC |= KEY1;                          //klawisz ON/OFF/SELECT<br />     <br />            DDRC &amp;= ~(VOLUP | VOLDN);       //porty klawiszy jako wejscie<br />            PORTC |= VOLUP | VOLDN;         //podciagniecie klawiszy do VCC<br />     <br />            DDRD |= CH1|CH2|CH3|CH4;        //porty jako wyjscie<br />            PORTD |= CH1|CH2|CH3|CH4;       //wylaczenie portow czyli podciagniecie do VCC<br />     <br />     <br />     <br />     <br />     <br />     <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  = 70;   // przerwanie porównania co około 10ms (100Hz)<br />     TIMSK  = (1&lt;&lt;OCIE2); //odblokowanie przerwania Compare Match<br />     <br />     button.KPIN = &amp;PINC;<br />     button.key_mask = KEY1;<br />     button.wait_time_s = 1;<br />     button.kfun1 = pwr_off;<br />     button.kfun2 = pwr_on;<br />     <br />     <br />     <br />     <br />     <br />     sei();<br />     <br />    while(1){<br />     <br />            if(POWERING_UP)                                         //jesli wzmacniacz sie uruchamia<br />                    {<br />if(!pTimer_led)<br />{<br />                            RED_TOG;                                        //zmieniaj stan LED<br />                            pTimer_led = 25;                      //co 250 ms<br />}    <br />                            if(POWER_IS_ON) RED_ON;         //jesli wzmacniacz uruchomiony zgas LED<br />                    }<br />     <br />     <br />             if(  klawisz_glosniej()  )             //jeśli klawisz wciśnięty<br />                                            {<br />                                             GLOSNIEJ;                      //wykonaj funkcje GLOSNIEJ<br />                                             _delay_ms(10);<br />                                             STOP;                          //po 10 ms zatrzymaj<br />                                            }<br />                                    {<br />                                    if(klawisz_ciszej()     )       //jeśli klawisz wciśnięty<br />                                            {<br />                                            CISZEJ;                         //wykonaj funkcje CISZEJ<br />                                            _delay_ms(10);<br />                                            STOP;                           //po 10 ms zatrzymaj<br />                                            }<br />     <br />                                    }<br />     <br />                    key_press( &amp;button );<br />     <br />                    if(flaga)<br />                    {<br />                            if(!pTimer2)<br />                            {<br />                                    flaga = 0;<br />                                    SREL_ON;<br />                       }<br />                    }<br />     <br />             }<br />     <br />    }<br />     <br />     <br />     <br />     <br />    // definicje funkcji glosnosci<br />    uint8_t klawisz_glosniej(void)<br />    {<br />            if( DOWN_VOLUP )                                        //klawisz wciśnięty ?<br />            {<br />                    if( DOWN_VOLUP ) return 1;      // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />            }<br />     <br />            return 0;                                                       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br />     <br />     <br />    uint8_t klawisz_ciszej(void)<br />            {<br />                    if( DOWN_VOLDN )                                // klawisz wciśnięty ?<br />                    {<br />                            if(DOWN_VOLDN ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />                    }<br />     <br />            return 0;                                                       // jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />    }<br />     <br />    //------------------------------superdebounce----------------------------<br />     <br />     <br />    void key_press( TBUTTON * 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 />            {<br />                    btn-&gt;klock=1;<br />                    btn-&gt;flag=1;<br />                    pTimer1 = (btn-&gt;wait_time_s*1000)/10;<br />            }<br />     <br />            else if( btn-&gt;klock &amp;&amp; key_press )<br />            {<br />                    (btn-&gt;klock)++;<br />                    if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                    {<br />                                    // reakcja na krotkie wciniecie klawisza - reakcja po zwolnieniu przycisku<br />                            if(btn-&gt;kfun2) btn-&gt;kfun2();<br />                            pTimer1=0;<br />                            btn-&gt;flag=0;<br />                    }<br />     <br />            } else if( btn-&gt;flag &amp;&amp; !pTimer1 )<br />            {<br />              // reakcja na dłuższe wcisniecie klawisza<br />              if(btn-&gt;kfun1) btn-&gt;kfun1();<br />              btn-&gt;flag=0;<br />            }<br />     <br />     <br />    }<br />     <br />     <br />    //*** przerwanie Timer2 Compare Match<br />    ISR(TIMER2_COMP_vect) {<br />     <br />     uint16_t n;<br />     <br />     n = pTimer1;  /* 100Hz Timer1 */<br />     if (n) pTimer1 = --n;<br />     <br />     n = pTimer2;  /* 100Hz Timer2 */<br />     if (n) pTimer2 = --n;<br />     <br />     n = pTimer_led;  /* 100Hz Timer1 */<br />     if (n) pTimer_led = --n;<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 9 gru 2013, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-12-09T16:29:01+01:00</updated>
<published>2013-12-09T16:29:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60295#p60295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60295#p60295"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60295#p60295"><![CDATA[
Ogolnie te warunki mi działają, chodziło mi raczej o timerowe miganie LED niz za pomoca delaya. Pisalem o tym na poczatku poprzedniego postu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Wysłane z mojego LG-E610 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2013, o 16:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mikandrzej]]></name></author>
<updated>2013-12-09T09:19:44+01:00</updated>
<published>2013-12-09T09:19:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60216#p60216</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60216#p60216"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60216#p60216"><![CDATA[
Zauważ, ze sprawdzasz stan przekaznika podlaczonego do PB0. W tej funkcji if(POWERING UP).<br />Czy ten przekaźnik od zasilania głównego się wyłącza po uruchomieniu wzmacniacza? Jezeli jest od zasilania to pewnie nie, a w tym momencie masz opoznienie w tej petli 250ms no i Ci sie program zapetla.<br /><br />Jezeli to jest wlasnie problem, to powinienes napisac to w ten sposob<br />If(POWERING_UP &amp;&amp; !POWER_IS_ON)<br /><br />Poza tym nie wiem dlaczego masz w srodku RED_ON, a w konentarzu &quot;zgas led&quot;??<br />Lepiej zrobic to w osobnych if-ach.<br /><br />Pozdrawiam M.<br /><br />Wysłane z mojego GT-I9500 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=431">mikandrzej</a> — 9 gru 2013, o 09:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-12-09T01:11:30+01:00</updated>
<published>2013-12-09T01:11:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60209#p60209</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60209#p60209"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=60209#p60209"><![CDATA[
Panowie, mam kolejne pytanie i proszę o pomoc. Jeśli chciałbym migać LEDem w części kodu poprzez timer a nie koci delay <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> to czy muszę konfigurować Timer1 żeby nie zakłócić pracy Timer2? Timer 2 jest wykorzystywany tylko do opóźniania załączania jednego przekaźnika.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2013-11-10<br /> *       Autor: hopek<br /> *       ATmega8: F_CPU = 8MHz<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//definicje pinu dla blokowania mostka H i diody LED stand-by<br />#define STBY (1&lt;&lt;PC5)<br />#define STBY_ON PORTC &amp;= ~STBY<br />#define STBY_OFF PORTC |= STBY<br />#define STBY_TOG PORTC ^= STBY<br /><br />//definicje portow przekaznika zasilania i softstartu<br />#define PREL (1&lt;&lt;PB0)<br />#define PREL_OFF PORTB &amp;= ~PREL<br />#define PREL_ON PORTB |= PREL<br /><br />#define SREL(1&lt;&lt;PD7)<br />#define SREL_OFF PORTD &amp;= ~SREL<br />#define SREL_ON PORTD|= SREL<br /><br /><br />//definicje pinów dla selektora wejsc<br />#define CH1 (1&lt;PD0)//pin przekaźnika 1<br />#define CH2 (1&lt;&lt;PD1)//pin przekaźnika 2<br />#define CH3 (1&lt;&lt;PD2)//pin przekaźnika 3<br />#define CH4 (1&lt;&lt;PD3)//pin przekaźnika 4<br /><br />//definicje dla mostka h do sterowania głososcia.<br /><br />#define UP PC4//wyjscie dla mostka H<br />#define DN PC3//wyjscie dla mostka H<br /><br />//definicje klawiszy<br />#define KEY1 (1&lt;&lt;PC1)//klawisz on-off i wyboru wejcia selektora<br />#define VOLDN (1&lt;&lt;PC0)//klawisz ciszej<br />#define VOLUP (1&lt;&lt;PC2)//klawisz glosniej<br /><br />//makra sprawdzające stan przycisków glonosci<br />#define DOWN_VOLUP !(PINC &amp; VOLUP)//głoniej<br />#define DOWN_VOLDN !(PINC &amp; VOLDN)//ciszej<br /><br />//dfinicja zmian glosnosci<br />#define GLOSNIEJ PORTC &amp;= ~(1&lt;&lt;UP); PORTC |=(1&lt;&lt;DN);<br />#define CISZEJ PORTC |= (1&lt;&lt;UP); PORTC &amp;= ~(1&lt;&lt;DN);<br />#define STOP PORTC |= (1&lt;&lt;UP); PORTC |= (1&lt;&lt;DN);<br /><br />//definicje dla podwietlania pokrętła kolor czerwony<br />#define RED (1&lt;&lt;PB1)<br />#define RED_ON PORTB &amp;= ~RED<br />#define RED_OFF PORTB |= RED<br />#define RED_TOG PORTB ^= RED<br /><br /><br />//definicje dla stanu zasilania wzmacniacza<br />#define POWERING_UP (PINB &amp; PREL)<br />#define POWER_IS_ON (PIND &amp; SREL)<br /><br />//deklaracje funkcji<br />uint8_t klawisz_glosniej(void);<br />uint8_t klawisz_ciszej(void);<br /><br /><br />uint8_t flaga;<br /><br /><br />typedef struct {<br /> volatile uint8_t *KPIN;<br /><br /> uint8_t key_mask;<br /> uint8_t wait_time_s;<br /> void (*kfun1)(void);<br /> void (*kfun2)(void);<br /><br /> uint8_t klock;<br /> uint8_t flag;<br />} TBUTTON;<br /><br />// timery programowe<br />volatile uint16_t Timer1, Timer2;<br /><br /><br />//funkcje sterownika (on / off)<br />void pwr_off(void)<br />{<br />RED_ON;<br />STBY_ON;<br />PREL_OFF;<br />SREL_OFF;<br />flaga= 0;<br />}<br /><br />void pwr_on(void)<br />{<br />STBY_OFF;<br />PREL_ON;<br />RED_OFF;<br />flaga = 1;<br />Timer2 = 230;<br />}<br /><br />// funkcja obsługi pojedynczych klawiszy<br />void key_press( TBUTTON * btn );<br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />//------------------------------------------------------------------<br />int main(void) {<br /><br />_delay_ms(100);//<br /><br />DDRC |= STBY;//kierunek portu jako wyjscie<br />DDRB |= PREL;//kierunek portu jako wyjscie<br />DDRD |= SREL;//kierunek portu jako wyjscie<br />STBY_ON;//zapala diode standby i blokuje mostek H<br /><br />DDRB |= RED;<br />PORTB &amp;= ~RED;<br /><br />PREL_OFF;//domyslnie wylacza przekaznik zasilania glownego<br />SREL_OFF;//domyslnie wylacza przekaznik softstartu<br /><br />DDRC |= (1&lt;&lt;UP) | (1&lt;&lt;DN);//porty wyjciowe dla pinów mostka H<br />PORTC |= (1&lt;&lt;UP)|(1&lt;&lt;DN);//wylaczenie portow dla mostka H<br /><br />PORTC |= KEY1;//klawisz ON/OFF/SELECT<br /><br />DDRC &amp;= ~(VOLUP | VOLDN);//porty klawiszy jako wejscie<br />PORTC |= VOLUP | VOLDN;//podciagniecie klawiszy do VCC<br /><br />DDRD |= CH1|CH2|CH3|CH4;//porty jako wyjscie<br />PORTD |= CH1|CH2|CH3|CH4;//wylaczenie portow czyli podciagniecie do VCC<br /><br /><br /><br /><br /><br /><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  = 70;   // przerwanie porównania co około 10ms (100Hz)<br /> TIMSK  = (1&lt;&lt;OCIE2); //odblokowanie przerwania Compare Match<br /><br /> button.KPIN = &amp;PINC;<br /> button.key_mask = KEY1;<br /> button.wait_time_s = 1;<br /> button.kfun1 = pwr_off;<br /> button.kfun2 = pwr_on;<br /><br /><br /><br /><br /><br /> sei();<br /><br />while(1){<br /><br />if(POWERING_UP)//jesli wzmacniacz sie uruchamia<br />{<br />RED_TOG;//zmieniaj stan LED<br />_delay_ms(250);//co 250 ms<br />if(POWER_IS_ON) RED_ON;//jesli wzmacniacz uruchomiony zgas LED<br />}<br /><br /><br /> if(  klawisz_glosniej()  )  //jeśli klawisz wciśnięty<br />  {<br />   GLOSNIEJ;//wykonaj funkcje GLOSNIEJ<br />   _delay_ms(10);<br />   STOP;//po 10 ms zatrzymaj<br />  }<br />  {<br />  if(klawisz_ciszej())//jeśli klawisz wciśnięty<br />  {<br />  CISZEJ;//wykonaj funkcje CISZEJ<br />  _delay_ms(10);<br />  STOP;//po 10 ms zatrzymaj<br />  }<br /><br />  }<br /><br />  key_press( &amp;button );<br /><br /> if(flaga)<br /> {<br /> if(!Timer2)<br />         {<br />                 flaga = 0;<br />                 SREL_ON;<br />    }<br /> }<br /><br /> }<br /><br />}<br /><br /><br /><br /><br />// definicje funkcji glosnosci<br />uint8_t klawisz_glosniej(void)<br />{<br />if( DOWN_VOLUP )//klawisz wciśnięty ?<br />{<br />if( DOWN_VOLUP ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br /><br />uint8_t klawisz_ciszej(void)<br />{<br />if( DOWN_VOLDN )// klawisz wciśnięty ?<br />{<br />if(DOWN_VOLDN ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />//------------------------------superdebounce----------------------------<br /><br /><br />void key_press( TBUTTON * 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 />        {<br />                btn-&gt;klock=1;<br />                btn-&gt;flag=1;<br />                Timer1 = (btn-&gt;wait_time_s*1000)/10;<br />        }<br /><br />        else if( btn-&gt;klock &amp;&amp; key_press )<br />        {<br />                (btn-&gt;klock)++;<br />                if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />                {<br />                // reakcja na krotkie wciniecie klawisza - reakcja po zwolnieniu przycisku<br />                        if(btn-&gt;kfun2) btn-&gt;kfun2();<br />                        Timer1=0;<br />                        btn-&gt;flag=0;<br />                }<br /><br />        } else if( btn-&gt;flag &amp;&amp; !Timer1 )<br />        {<br />          // reakcja na dłuższe wcisniecie klawisza<br />          if(btn-&gt;kfun1) btn-&gt;kfun1();<br />          btn-&gt;flag=0;<br />        }<br /><br /><br />}<br /><br /><br />//*** przerwanie Timer2 Compare Match<br />ISR(TIMER2_COMP_vect) {<br /><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 />}[/syntax]<br /><br />Ma to działać w ten sposób że dopóki wzmacniacz się nie uruchomi (dopóki oba przekaźniki nie będą włączone) to pokrętło z rury plexi ma migać na czerwono<br />Tutaj zrobiłem to za pomocą delaya, działa jak chcę, ale psuje mi to cały debounce <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />[syntax=c]sei();<br /><br />while(1){<br /><br />if(POWERING_UP)//jesli wzmacniacz sie uruchamia<br />{<br />RED_TOG;//zmieniaj stan LED<br />_delay_ms(250);//co 250 ms<br />if(POWER_IS_ON) RED_ON;//jesli wzmacniacz uruchomiony zgas LED<br />}[/syntax]<br />zmieniałem zamiast [syntax=c]_delay_ms(200);[/syntax] na [syntax=c]Timer2= 50;[/syntax]<br /><br />Ale niestety LED nie miga tylko przygasa delikatnie i część programu odpowiedzialna za załączenie wzmacniacza przestaje działać, tzn zapala się tylko jedna dioda od zasilania...<br /><br /><br />Może to zobrazuję:<br />Delay<br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=GD_ldH_6YY8" >https://www.youtube.com/watch?v=GD_ldH_6YY8</a><!-- m --><br /><br />Timer <br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=vfsNwe7nUXo" >https://www.youtube.com/watch?v=vfsNwe7nUXo</a><!-- m --><br />Gdzie jest błąd i jak to napisać żeby było dobrze?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2013, o 01:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-12T23:33:14+01:00</updated>
<published>2013-11-12T23:33:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56628#p56628</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56628#p56628"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56628#p56628"><![CDATA[
I Chwała Ci za to. Amen <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jutro się jeszcze pobawię, ale dziś już mi wystarczy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Jutro znowu do pracy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Dziękuję serdecznie <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=1692">hopek</a> — 12 lis 2013, o 23:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-11-12T23:26:14+01:00</updated>
<published>2013-11-12T23:26:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56627#p56627</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56627#p56627"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56627#p56627"><![CDATA[
No zapomniałem dodać że zmieniłem klock z 8 bitowej na 16 bitową. <br />Moja funkca key_press ma odwrotnie przypisane funkcje kfun1 i kfun2 niż twoja. Ale to szczegół. Najważniejsze że już działa <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=204">jacekk232</a> — 12 lis 2013, o 23:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-12T23:11:19+01:00</updated>
<published>2013-11-12T23:11:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56624#p56624</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56624#p56624"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56624#p56624"><![CDATA[
Działało tak jakby odwrotnie, tzn włączało długim a wyłączało po krótkim kliknięciu, ale zamieniłem miejscami kfun1 z kfun2, oraz zmieniłem zmienną klock na 16 bitową i smiga <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=1692">hopek</a> — 12 lis 2013, o 23:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-11-12T22:50:36+01:00</updated>
<published>2013-11-12T22:50:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56621#p56621</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56621#p56621"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56621#p56621"><![CDATA[
No w moim poprzednim poście masz funkcję do obsługi klawisza. Jest trochę zmodyfikowana. Reakcja na krótkie wciśnięcie następuje po zwolnieniu przycisku więc jeśli dłużej przytrzymasz przycisk to nastąpi reakcja na długie wciśnięcie a na krótkie już nie. <br />Więc zależnie od długości wciśnięcia klawisza zostanie wywołana tylko jedna funkcja albo pwr_on albo pwr_off.<br /><br />Kod tej funkcji z mojego postu po prostu podmień z tym co masz w programie i usuń [syntax=c]flaga = 0;[/syntax] z funkcji pwr_off i powinno działać dobrze.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 lis 2013, o 22:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-12T22:24:10+01:00</updated>
<published>2013-11-12T22:24:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56613#p56613</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56613#p56613"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56613#p56613"><![CDATA[
Rozumiem o co chodzi... Jeśli wcisnę przycisk i przytrzymam to załączy mi jeden przekaźnik i zaraz go wyłączy. Nie wiem czy wypada mi tak pytać &quot;jak to mam zrobić&quot; bo w sumie superdebounce - to moje pierwsze starcie. Ale podejrzewam że zwykłymi if-ami da się to zrobić <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=1692">hopek</a> — 12 lis 2013, o 22:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-11-12T20:55:10+01:00</updated>
<published>2013-11-12T20:55:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56592#p56592</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56592#p56592"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56592#p56592"><![CDATA[
No tak włącza się bo tak działa obsługa klawisza. Zauważ, że pwr_on zaczyna działać po krótkim wciśnięciu klawisza. A powinna po zwolnieniu. Jak wciskasz klawisz dłużej to najpierw wywoływana jest obsługa krótkiego wciśnięcia a potem obsługa długiego wciśnięcia. Więc jak chcesz wywołać funkcję pwr_off to najpierw wywołana jest funkcja pwr_on.<br />Jak na moje to funkcja obsługi klawisz powinna być przerobiona aby obsługa krótkiego wciśnięcia następowała po zwolnieniu klawisza a nie po wciśnięciu.<br /><br />Spróbuj wypróbować lekko zmodyfikowaną funkcję do obsługi klawisza<br />[syntax=c]void key_press( TBUTTON * 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 />{<br />btn-&gt;klock=50000;<br />btn-&gt;flag=1;<br />Timer1 = (btn-&gt;wait_time_s*1000)/10;<br />}<br />else if( btn-&gt;klock &amp;&amp; key_press )<br />{<br />(btn-&gt;klock)++;<br />if( !btn-&gt;klock &amp;&amp; btn-&gt;flag )<br />{<br />// reakcja na krótkie wcinięcie klawisza - reakcja po zwolnieniu przycisku<br />if(btn-&gt;kfun1) btn-&gt;kfun1();<br />Timer1=0;<br />btn-&gt;flag=0;<br />}<br />} else if( btn-&gt;flag &amp;&amp; !Timer1 )<br />{<br />  // reakcja na dłuższe wciniecie klawisza<br />  if(btn-&gt;kfun2) btn-&gt;kfun2();<br />  btn-&gt;flag=0;<br />}<br />}[/syntax]<br />Funkcja ogólnie działa tak samo z ta różnicą, że reakcja na krótkie wciśnięcie następuje po zwolnieniu klawisza.<br />W tym przypadku powinno działać bez zerowania flagi w funkcji pwr_off.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 12 lis 2013, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-12T20:39:56+01:00</updated>
<published>2013-11-12T20:39:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56584#p56584</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56584#p56584"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56584#p56584"><![CDATA[
Witam i bardzo dziękuje za pomoc. Po wpisaniu zmiennej z postu powyżej Eclipse zaczął się oburzać że zmienna niezadeklarowana itp, ale to był mój błąd ponieważ wpisywałem zmienną nie w tym miejscu co trzeba. Dopiero po chwili doszedłem do tego że musi być ona zadeklarowana na samym początku, zaraz po zdefiniowanych pinach i portach.<br /><strong>jacekk232</strong> po Twoich zmianach przekaźnik softstartu załączał się nie tylko po włączeniu zasilania głównego, ale po wyłączeniu również, ale dodałem tylko w funkcji pwr_off [syntax=c]flaga = 0;[/syntax] i działa jak należy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Człowiek uczy się na błędach ale i tak jeszcze raz dziękuję za pomoc, bez niej by się nie obeszło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Klikam dalej, może uda mi się skończyć sterownik w tym roku  <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 12 lis 2013, o 20:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-11-11T23:32:06+01:00</updated>
<published>2013-11-11T23:32:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56445#p56445</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56445#p56445"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56445#p56445"><![CDATA[
Flaga (nazwa może być dowolna) to jest normalna zmienna globalna. Przed main wpisz po prostu [syntax=c]uint8_t flaga;[/syntax]<br />A działać to ma tak: po wejściu do funkcji pwr_on ustawiamy zmienną flaga i nakręcamy timer programowy. Timer zaczyna liczyć od tej wartości do zera. W pętli głównej sprawdzamy czy zmienna flaga jest ustawiona. Jeśli tak to sprawdzamy czy timer doliczył do zera. Jeśli tak to załączamy przekaźnik i zerujemy zmienną flaga po to żeby w następnym obiegu pętli nie sprawdzać już czy timer ma wartość zero. Bez tej zmiennej program po wejściu do pętli głównej od razu załączył by przekaźnik. Bo zmienna Timer2, po starcie programu, ma wartość zero.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 lis 2013, o 23:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-11T22:57:39+01:00</updated>
<published>2013-11-11T22:57:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56432#p56432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56432#p56432"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56432#p56432"><![CDATA[
Ok tylko nie rozumiem trochę gdzie mam zdefiniować tą flagę, wybaczcie że pytam o takie takie rzeczy... Chciałbym prosić o wytłumaczenie co i jak, może to mi trochę rozjaśni sytuację.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 11 lis 2013, o 22:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2013-11-11T21:57:23+01:00</updated>
<published>2013-11-11T21:57:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56425#p56425</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56425#p56425"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56425#p56425"><![CDATA[
Może zrób tak:<br />[syntax=c]void pwr_on(void) <br />{<br />STBY_OFF;<br />PREL_ON;<br />flaga = 1;<br />Timer2 = 300;<br /> <br />}[/syntax]<br /><br />A w pętli głównej:<br />[syntax=c]if(flaga)<br />{<br />if(!Timer2)<br />{<br />flaga = 0;<br />SREL_ON;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 11 lis 2013, o 21:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-11-11T21:18:27+01:00</updated>
<published>2013-11-11T21:18:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56420#p56420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56420#p56420"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=56420#p56420"><![CDATA[
Witam Ponownie, prowadzę kolejne zmagania z moim sterownikiem, tym razem poszedłem za radą i zastosowałem opcję SuperDebounce z poradnika Pana Mirka ze względu na wyeliminowanie kocich delay-ów:). <br /><br />KOD:[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2013-11-10<br /> *       Autor: hopek<br /> *       ATmega8: F_CPU = 8MHz<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//definicje pinu dla blokowania mostka H i diody LED stand-by<br />#define STBY (1&lt;&lt;PC5)<br />#define STBY_ON PORTC &amp;= ~STBY<br />#define STBY_OFF PORTC |= STBY<br />#define STBY_TOG PORTC ^= STBY<br /><br />//definicje portow przekaznika zasilania i softstartu<br />#define PREL (1&lt;&lt;PB0)<br />#define PREL_ON PORTB &amp;= ~PREL<br />#define PREL_OFF PORTB |= PREL<br /><br />#define SREL(1&lt;&lt;PD7)<br />#define SREL_ON PORTD &amp;= ~SREL<br />#define SREL_OFF PORTD|= SREL<br /><br /><br />//definicje pinów dla selektora wejsc<br />#define CH1 (1&lt;PD0)//pin przekaźnika 1<br />#define CH2 (1&lt;&lt;PD1)//pin przekaźnika 2<br />#define CH3 (1&lt;&lt;PD2)//pin przekaźnika 3<br />#define CH4 (1&lt;&lt;PD3)//pin przekaźnika 4<br /><br />//definicje klawiszy<br />#define KEY1 (1&lt;&lt;PC1)//przycisk on-off i wyboru wejcia selektora<br />#define KEY2 (1&lt;&lt;PC2)//przycisk glosniej<br />#define KEY3 (1&lt;&lt;PC0)// przycisk ciszej<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 />} TBUTTON;<br /><br />// timery programowe<br />volatile uint16_t Timer1, Timer2;<br /><br />// zadelkarowane funkcje sterownika<br />void pwr_off(void) {<br />STBY_ON;<br />PREL_OFF;<br />SREL_OFF;<br />}<br /><br />void pwr_on(void) {<br />STBY_OFF;<br />PREL_ON;<br /><br /><br />}<br /><br />// funkcja obsługi pojedynczych klawiszy<br />void key_press( TBUTTON * btn );<br /><br /><br />TBUTTON button; // definicja KLAWISZA<br /><br />//------------------------------------------------------------------<br />int main(void) {<br /><br />DDRC |= STBY;//kierunek portu jako wyjscie<br />DDRB |= PREL;//kierunek portu jako wyjscie<br />DDRD |= SREL;//kierunek portu jako wyjscie<br />STBY_ON;//zapala diode standby i blokuje mostek H<br />PREL_OFF;//domyslnie wylacza przekaznik zasilania glownego<br />SREL_OFF;//domyslnie wylacza przekaznik softstartu<br /><br />PORTC |= KEY1;<br />PORTC |= KEY2;<br />PORTC |= KEY3;<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  = 70;   // przerwanie porównania co 10ms (100Hz)<br /> TIMSK  = (1&lt;&lt;OCIE2); // Odblokowanie przerwania CompareMatch<br /><br /> button.KPIN = &amp;PINC;<br /> button.key_mask = KEY1;<br /> button.wait_time_s = 1;<br /> button.kfun1 = pwr_off;<br /> button.kfun2 = pwr_on;<br /><br /><br /> sei();<br /><br /> while(1) {<br /> key_press( &amp;button );<br /><br />  }<br /><br />}<br /><br />//------------------------------------------------------------------<br /><br /><br />void key_press( TBUTTON * 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 />// reakcja na PRESS krótkie wcinięcie klawisza<br />  if(btn-&gt;kfun2) btn-&gt;kfun2();<br />  btn-&gt;flag=1;<br />  Timer1 = (btn-&gt;wait_time_s*1000)/10;<br /><br /> }<br /> else if( btn-&gt;klock &amp;&amp; key_press ) {<br />  (btn-&gt;klock)++;<br />  if( !btn-&gt;klock ) {<br />   Timer1=0;<br />   btn-&gt;flag=0;<br />  }<br /> } else if( btn-&gt;flag &amp;&amp; !Timer1 ) {<br /> // reakcja na dłuższe wcinięcie klawisza<br />  if(btn-&gt;kfun1) btn-&gt;kfun1();<br />  btn-&gt;flag=0;<br /><br /> }<br />}<br /><br />//*** przerwanie Timer2 Compare Match<br />ISR(TIMER2_COMP_vect) {<br /><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 />}[/syntax]<br /><br />Krótki opis kodu:<br />Krótki klik KEY1 włącza przekaźnik zasilania głównego podpięty pod PB0 przez tranzystor i gasi diodę LED sygnalizującą tryb stand-by.<br />Długi klik wyłącza zasilanie ze zwłoką około 1 sekundy - czyli powraca do stanu stand-by.<br />Chciałbym jednak żeby po włączeniu przekaźnika zasilania czyli po podaniu stanu niskiego na PB0 pojawiał się również stan niski na PD7 ale z opóźnieniem około 2 sekundy.<br />Tu mam problem, bo nie chce robić tego za pomocą _delay_ms() bo to mi rujnuje cały program ;/<br /><br />Próbowałem kombinować z<br />[syntax=c]while(1) {<br />if (!Timer2){<br />Timer2= 300;<br />SREL_ON;[/syntax] w pętli głównej ale niestety poległem <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> <br />W jaki sposób mógłbym to zrobić, czy ktoś może mnie nakierować?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 11 lis 2013, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-10-22T22:54:21+01:00</updated>
<published>2013-10-22T22:54:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53990#p53990</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53990#p53990"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53990#p53990"><![CDATA[
nienajlepszy sposób to jest zawsze taki, który NIE DZIAŁA. A ten który działa jest w porządku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... co najwyżej z czasem w miarę potrzeb oczywiście można go optymalizować <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=54">mirekk36</a> — 22 paź 2013, o 22:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-10-22T22:11:58+01:00</updated>
<published>2013-10-22T22:11:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53988#p53988</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53988#p53988"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53988#p53988"><![CDATA[
Hmm w sumie przesuwanie bitu w prawo z &quot;loopem&quot; zrobiłem tak:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 21-10-2013<br /> *      Author: Hopek<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define LED1 (1&lt;&lt;PC5)<br />#define LED2 (1&lt;&lt;PC4)<br />#define LED3 (1&lt;&lt;PC3)<br />#define LED4 (1&lt;&lt;PC2)<br />#define BCK(1&lt;&lt;PC1)<br />#define KEY1 (1&lt;&lt;PD1)<br /><br />int main(void)<br />{<br />//kierunki diodek jako wyjscie<br />DDRC |= LED1|LED2|LED3|LED4|BCK;<br /><br /><br />//wstawienie stanu wysokiego na pin PC5<br />PORTC |= LED1;<br /><br />DDRD &amp;= ~KEY1;<br />PORTD |= KEY1;<br /><br /><br />while(1)<br />  {<br />//jesli klawisz wcisniety<br />if(!(PIND &amp; KEY1))<br />{<br /><br />//przesun o jeden bit w prawo<br />    PORTC &gt;&gt;= 1;<br /><br />    //oczekiwanie na ustanie drgan stykow<br />    _delay_ms(20);<br /><br />    //oczekiwanie na zwolnienie przycisku<br />    while(!(PIND &amp; KEY1)) {}<br />    _delay_ms(20);<br /><br />    //jesli stan wysoki na BCK przesun 4 bity w lewo<br />    if(PINC &amp; BCK)<br /><br />    PORTC &lt;&lt;= 4;<br /><br /><br />}<br /><br /> }<br />}[/syntax]<br /><br />Nie jest to może najlepszy sposób, ale w moim przypadku działa <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=1692">hopek</a> — 22 paź 2013, o 22:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-10-20T22:43:47+01:00</updated>
<published>2013-10-20T22:43:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53824#p53824</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53824#p53824"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53824#p53824"><![CDATA[
<div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />A co z &quot;softwarowym rejestrem przesuwnym&quot;?<br /></div><br /><br />hmmm a czytał pan o przesunięciach bitowych ??? w bluebooku ? czy coś umknęło ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> bo softwarowe rejestry przesuwne to masz pan na pęczki, na kilogramy na hektolitry <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> .... ilo, chcesz, bitowy ? 8-, 16- czy może 32-bitowy ? w którą stronę chcesz przesuwać ? w prawą ? w lewą ?<br /><br />chcesz aby były cykliczne tzn zapętlone ? <br /><br />zobacz np tutaj:<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/ror-rolowanie-bitow-wersja-wojskowa.html" >http://mirekk36.blogspot.com/2012/10/ro ... skowa.html</a><!-- m --><br /><br />akurat do tego to nie musisz być hej do przodu - zrobisz to od razu, od ręki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />stwórz sobie zmienną ilu tam bitową chcesz a potem ją przesuwaj ile wlezie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i masz rejestr przesuwny <br /><br />chyba że chodzi ci o coś innego<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br /><div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />Jest taki żart &quot;Jak się nazywa firma niecierpliwego? W Gorącej Wodzie Company&quot;<br /></div><br /><br /><img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /> dobre dobre - nawet nie słyszałem tego<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 paź 2013, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-10-20T21:38:25+01:00</updated>
<published>2013-10-20T21:38:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53812#p53812</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53812#p53812"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53812#p53812"><![CDATA[
Jest taki żart &quot;Jak się nazywa firma niecierpliwego?  W Gorącej Wodzie Company&quot;... coś w tym jest <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> Ale Panie Mirku dziękuję za rady i obiecuję poczytać, popróbować. A co z &quot;softwarowym rejestrem przesuwnym&quot;? To mnie najbardziej zastanawia... Ale żeby nie być takim hop-siup to narazie dam sobie z tym spokój <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=1692">hopek</a> — 20 paź 2013, o 21:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-10-20T21:28:02+01:00</updated>
<published>2013-10-20T21:28:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53806#p53806</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53806#p53806"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53806#p53806"><![CDATA[
<div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />dlatego zabiorę się do dokończenia lekturki<br /></div><br /><br />wiem wiem, że rączki świerzbią żeby już .... tym bardziej że fajny projekcik i już tyle działa - gratulacje - ale to tylko pokazuje że szybko w miarę idzie ci nauka ...<br /><br />a w międzyczasie na szybko jak nie wytrzymujesz to mówię - zobacz na blogu fajną i tzw &quot;NIEBLOKUJĄCĄ&quot; obsługę klawiszy ok?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 paź 2013, o 21:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-10-20T21:26:06+01:00</updated>
<published>2013-10-20T21:26:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53805#p53805</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53805#p53805"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53805#p53805"><![CDATA[
Obiecuję doczytam <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Z tymi delayami to sam zdążyłem zauważyć że nieraz to wydłuża znacznie obsługę dlatego zabiorę się do dokończenia lekturki <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=1692">hopek</a> — 20 paź 2013, o 21:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-10-20T21:19:26+01:00</updated>
<published>2013-10-20T21:19:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53802#p53802</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53802#p53802"/>
<title type="html"><![CDATA[Re: Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53802#p53802"><![CDATA[
No widzisz - (a już dzisiaj to komuś pisałem na tym forum) .... kłopot w tym że się zatrzymałeś w czytaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... a warto przynajmniej raz przeczytać ją w całości - tak JEDEN RAZ, bo wtedy byś wiedział że taka obsługa klawiszy to tylko dydaktyka i pierwsze zetknięcie - czego na co dzień nawet nie warto zbyt często stosować nie mówiąc już o innych ciekawych technikach programowania które omawiam dalej i do których potem byś dążył i miał smaka żeby to zrozumieć bo i możliwości daje to większe<br /><br />ale na spokojnie i prostszymi metodami już można dużo zrobić - posiłkuj się jednak poradnikami z mojego bloga i zobacz akurat nomen omen jest tam fajny poradnik o obsłudze klawiszy ale już takiej porządnej choć jeszcze nie tak zaawansowanej jak pod koniec książki. To jednak z tym można już duuuuuużo zrobić <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html" >http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html</a><!-- m --><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />To chyba nie będzie trudne i myślę, że za pomocą _delay_ms(2000) da radę to zrobić.<br /></div><br /><br />tak i pomyśl co się będzie działo z twoim programem jak mu przywalisz takim delayem po plecach <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... a co w tym czasie z realizacją innych zadań, które chcesz prawie w tym samym czasie robić ?<br /><br />a uwierz mi że można nie dość że bez kocich delayów to jeszcze wiele rzeczy w jednym czasie i to wcale nie jest wiedza jakaś z kosmosu tylko dla nie wiadomo jakich speców<br /><br />masz taki rozdział w bluebooku<br /><br />&quot;wstęp do stystemów czasu rzeczywistego&quot;<br /><br />samo przeczytanie go na sucho , zobaczenie co tam będziemy wyprawiać w ćwiczeniu i rzuceniem okiem na kod że to nie jakiś mega JEŻ - a już będzie łatwiej myśleć <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=54">mirekk36</a> — 20 paź 2013, o 21:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2013-10-20T21:07:05+01:00</updated>
<published>2013-10-20T21:07:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53800#p53800</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53800#p53800"/>
<title type="html"><![CDATA[Sterownik Wzmacniacza Atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4541&amp;p=53800#p53800"><![CDATA[
Witam Wszystkich. Mam na imię Michał, chciałbym dokończyć programować procka (atmega8) do mojego wzmacniacza i jest to mój pierwszy post na forum <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Posiadam programator od Pana Mirka i niebieską książkę. Na wstępie napiszę że nie doczytałem jej do końca i postanowiłem trochę popisać, przetestować kilka rzeczy z książki które były mi potrzebne do napisania programu, który o dziwo działa prawie jak chciałem.<br /><br />Założenia początkowe były takie:<br /><br />- Włącz, wyłącz (długie wciśnięcie), zmiana wejścia za pomocą przekaźników (krótki klik) i to wszystko jednego przycisku - prawie zrealizowane, nie wiem jak zrobić przerzucanie wejść sygnału najlepiej bez użycia dodatkowych scalaków. Chciałbym to zrealizować za pomocą softu najlepiej włącz/wyłącz z opóźnieniem 1s, po włączeniu krótkie wciśnięcie zmienia wejście na następne. Do tej pory napisałem kod który podczas krótkiego kliku włącza wzmacniacz i uaktywnia regulację głośności dopiero po włączeniu. Przyciski zwierają do masy.<br />- Sterowanie głośnością za pomocą potencjometru z silnikiem DC. Wykorzystuję tu mostek H L293DNE który po podaniu stanu wysokiego na nogę 1 (1,2 EN) blokuje możliwość sterowania (to co opisałem wyżej). Od tej nogi mam również podłączoną przez rezystor diodę LED która sygnalizuje wyłączenie wzmacniacza - zrobione, działa.<br /><br />Dodatkowo chciałbym zrealizować bardzo prosty soft start który składał by się z 2 przekaźników i sterowany byłby z atmegi. Jeden przekaźnik zamyka obwód zasilania po stronie pierwotnej przez rezystory mocy a drugi przekaźnik zwierałby te rezystory po czasie 2 sekund. To chyba nie będzie trudne i myślę, że za pomocą _delay_ms(2000) da radę to zrobić.<br /><br />Chciałbym prosić o opinię - poradę jak to wszystko zrealizować jak najprostszą metodą, co można zrobić szybciej, prościej i co zrobiłem źle  <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /> <br /><br />Poniżej kod:<br /><br />[syntax=c]/* sterownik wzmacniacza audio<br /> * main.c<br /> *<br /> *  Created on: 20-09-2013<br /> *      Autor: hopek<br /> *      MCU= atmega8<br /> *      Clock= 8M<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />//definicje pinów portów<br /><br />#define PWR (1&lt;&lt;PC5)//diody LED on/off (ten pin jest tez uzywany do blokowania mostka H)<br />#define UP PC4//pin zmiany głosnosci dla mostka H<br />#define DN PC3//pin zmiany głosnosci dla mostka H<br />#define CH1 (1&lt;PD0)//pin przekaźnika 1<br />#define CH2 (1&lt;&lt;PD1)//pin przekaźnika 2<br />#define CH3 (1&lt;&lt;PD2)//pin przekaźnika 3<br />#define CH4 (1&lt;&lt;PD3)//pin przekaźnika 4<br />#define K_SELON (1&lt;&lt;PC0)//klawisz select/on<br />#define K_VOLUP (1&lt;&lt;PC1)//klawisz głosniej<br />#define K_VOLDN (1&lt;&lt;PC2)//klawisz ciszej<br /><br />//makra sprawdzające stan przycisków głonosci<br />#define KEY_DOWN_K_VOLUP !(PINC &amp; K_VOLUP)//głoniej<br />#define KEY_DOWN_K_VOLDN !(PINC &amp; K_VOLDN)//ciszej<br />#define KEY_DOWN_K_SELON !(PINC &amp; K_SELON)//wlaczanie wylaczanie / selektor<br /><br /><br />//dfinicja zmian głosnosci<br /><br />#define GLOSNIEJ PORTC &amp;= ~(1&lt;&lt;UP); PORTC |=(1&lt;&lt;DN);<br />#define CISZEJ PORTC |= (1&lt;&lt;UP); PORTC &amp;= ~(1&lt;&lt;DN);<br />#define STOP PORTC |= (1&lt;&lt;UP); PORTC |= (1&lt;&lt;DN);<br /><br />//definicja zmiany stanu pinu PWR czyli zasilanie on/off<br />#define PWR_TOG PORTC ^= PWR;<br /><br />//definicje selektora wejsc<br />#define IN1 PORTD = 0b00000001;<br />#define IN2 PORTD = 0b00000010;<br />#define IN3 PORTD = 0b00000100;<br />#define IN4 PORTD = 0b00001000;<br /><br /><br />uint8_t klawisz_glosniej(void);<br />uint8_t klawisz_ciszej(void);<br />uint8_t key_lock;<br /><br /><br /><br /><br />int main(void)<br />{<br />DDRD |= 0b00001111;//ustawienie pinów przekaźników jako wyjsciowe<br />PORTD |= 0b00000000;//zerowanie pinów<br />DDRC |= (1&lt;&lt;UP) | (1&lt;&lt;DN) | (PWR);//porty jako wyjscie<br />PORTC |= (1&lt;&lt;UP) | (1&lt;&lt;DN) | ~(PWR);//wylaczenie portow<br />DDRC &amp;= ~(K_SELON | K_VOLUP | K_VOLDN);//porty jako wejscie<br />PORTC |= K_SELON | K_VOLUP | K_VOLDN;//podciagniecie klawiszy do VCC<br /><br /><br /><br /><br />while(1)<br />{<br /><br />  if( !key_lock &amp;&amp; !(PINC &amp; K_SELON ) )<br />    {<br />  if ( !key_lock &amp;&amp; !(PINC &amp; K_SELON ) )<br />  key_lock= 1;<br /><br /><br />   // reakcja na wcinięcie przycisku<br />   PORTC ^= PWR;<br />  }<br />    else if( key_lock &amp;&amp; (PINC &amp; K_SELON ) ) key_lock=0;<br /><br /><br />if(  klawisz_glosniej()  )  //jeśli klawisz wciśnięty<br />{<br /> GLOSNIEJ;//wykonaj definicje GLOSNIEJ<br /> _delay_ms(10);<br /> STOP;//po 10 ms zatrzymaj<br />}<br />{<br />if(  klawisz_ciszej()  )  //jeśli klawisz wciśnięty<br />{<br />CISZEJ;//wykonaj definicje CISZEJ<br />_delay_ms(10);<br />STOP;//po 10 ms zatrzymaj<br />}<br />{<br /><br />}<br /><br /><br /><br />}<br /><br /><br />}<br /><br />}<br /><br />//******************************************************** koniec main()<br /><br />// definicje funkcji<br />uint8_t klawisz_glosniej(void)<br />{<br />if( KEY_DOWN_K_VOLUP )//klawisz wciśnięty ?<br />{<br />if( KEY_DOWN_K_VOLUP ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br /><br />uint8_t klawisz_ciszej(void)<br />{<br />if( KEY_DOWN_K_VOLDN )// klawisz wciśnięty ?<br />{<br />if( KEY_DOWN_K_VOLDN ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 20 paź 2013, o 21:07</p><hr />
]]></content>
</entry>
</feed>