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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-03-26T08:56:58+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=6481&amp;mode</id>
<entry>
<author><name><![CDATA[schizwania]]></name></author>
<updated>2014-03-26T08:56:58+01:00</updated>
<published>2014-03-26T08:56:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75827#p75827</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75827#p75827"/>
<title type="html"><![CDATA[Re: True bypass looper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75827#p75827"><![CDATA[
Dla lepszego oglądu zamieszczam pliki, styki enkodera zwierane do masy:<br />Co do schematu to nie mam rozrysowanego (zrobię go w wolnej chwili)<br />generalnie nic nadzwyczajnego: cały PORTD podłączony do 8 diod LED,<br />PORTC podłączony do segmentów wyświetlacza, PORTA linie 4,5,6,7 anody wyswietlacza<br />i enkoder na PORTB piny 0,1 - obracanie, pin 2 - klawisz.  <br /><br />main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;mux.h&quot;<br />#include &quot;MK_ENCODER/mk_encoder.h&quot;<br /><br /><br />//wlasne funkcje do zarejestrowania<br />void my_encoder( int8_t dir, int8_t w );<br />void enc_switch( void );<br /><br />uint8_t speed;// rozdzielczosc  zliczania enkodera<br />volatile uint32_t wynik;// wartosc zliczana przez enkoder<br />volatile uint8_t bank;//zmienna testowa<br /><br />    int main(void)<br />    {<br />       encoder_init(1);//init encoder<br />       register_enc_callback( my_encoder );<br />       register_sw_callback( enc_switch );<br />       mux_init();//init multiplexowania<br />       rel_init();//init port z relays<br /><br />       sei();//globalne zezwolenie na przerwania<br /><br />       //inicjlizacja testowa wyswietlacza  wartosciami<br />       cyfra&#91;0&#93;.val = P;<br />       cyfra&#91;0&#93;.blink = FALSE;<br />       cyfra&#91;0&#93;.delay = 50;<br />       cyfra&#91;0&#93;.dp = TRUE;<br />       cyfra&#91;1&#93;.val = 0;<br />       cyfra&#91;1&#93;.blink = FALSE;<br />       cyfra&#91;1&#93;.delay = 200;<br />       cyfra&#91;2&#93;.delay = 150;<br />       cyfra&#91;2&#93;.blink = FALSE;<br />       //cyfra&#91;2&#93;.val = 1;<br />       cyfra&#91;2&#93;.power = TRUE;<br />       cyfra&#91;2&#93;.dp = TRUE;<br />       cyfra&#91;2&#93;.dp_delay = 200;<br />       cyfra&#91;2&#93;.dp_blink = FALSE;<br />       cyfra&#91;3&#93;.blink = TRUE;<br />       cyfra&#91;3&#93;.delay = 30;<br />       cyfra&#91;3&#93;.val = 4;<br /><br />       //petla gloowna programu<br />       while (1)<br />       {<br />       ENCODER_EVENT( speed );<br />       }//koniec petli glownej<br />    }//koniex funkcji main()<br /><br /><br />    void my_encoder( int8_t dir, int8_t w )<br />    {<br /><br />    //cyfra&#91;1&#93;.val = w;<br />    if(dir==-1)<br />    {<br />    cyfra&#91;0&#93;.val = P;<br />    cyfra&#91;2&#93;.val = bank;<br />    if(bank &gt;= 9)<br />    {<br />    bank =0;<br />    }<br />    bank += 1;<br />    }<br />    else<br />    {<br />    cyfra&#91;0&#93;.val = L;<br />    bank -= 1;<br />    cyfra&#91;2&#93;.val = bank;<br />    if(bank == 0)<br />    {<br />    bank =10;<br />    }<br />    }<br />    }<br /><br />    void enc_switch( void )<br />    {<br />    REL_PORT ^= REL4;<br />    }[/syntax]<br /><br />mux.h<br />[syntax=c]#ifndef MUX_H_<br />#define MUX_H_<br /><br />//makra dla wyświetlacza 7 segmentowego<br />#define LED_PORT PORTC<br />#define DIG_PORT PORTA<br />#define LED_DIR DDRC<br />#define DIG_DIR DDRA<br />//definicje pinow klawiszy: kierunek, port<br />#define KEYS_DIR  DDRB<br />#define KEYS_PORT PORTB<br /><br />#define KEY_PIN4    (1&lt;&lt;PB4)<br />#define KEY_DOWN4  !(PINB &amp; KEY_PIN4)<br />#define KEY_PIN5    (1&lt;&lt;PB5)<br />#define KEY_DOWN5  !(PINB &amp; KEY_PIN5)<br />#define KEY_PIN6    (1&lt;&lt;PB6)<br />#define KEY_DOWN6  !(PINB &amp; KEY_PIN6)<br />#define KEY_PIN7    (1&lt;&lt;PB7)<br />#define KEY_DOWN7  !(PINB &amp; KEY_PIN7)<br />//definicja RELAYS<br />#define REL_PORT PORTD<br />#define REL_DIR  DDRD<br />#define REL1 (1&lt;&lt;0)<br />#define REL2 (1&lt;&lt;1)<br />#define REL3 (1&lt;&lt;2)<br />#define REL4 (1&lt;&lt;3)<br />#define REL5 (1&lt;&lt;4)<br />#define REL6 (1&lt;&lt;5)<br />#define REL7 (1&lt;&lt;6)<br />#define REL8 (1&lt;&lt;7)<br />//definicja segmentow wyswietlacza<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 SEG_DP (1&lt;&lt;7)<br />//definicja makr katod wyswietlacza<br />#define DIG0 (1&lt;&lt;4)<br />#define DIG1 (1&lt;&lt;5)<br />#define DIG2 (1&lt;&lt;6)<br />#define DIG3 (1&lt;&lt;7)<br />//definicja makr znakow<br />#define E   10<br />#define d   11<br />#define U   12<br />#define P   13<br />#define A   14<br />#define H   15<br />#define L   16<br />#define b   17<br />#define o   18<br /><br />//bool<br />#define TRUE 1<br />#define FALSE 0<br />//typ złożony do sterowania cyframi<br />typedef struct<br />{<br />   volatile uint8_t power;    //TRUE or FALSE<br />   volatile uint8_t val;      //value to display<br />   volatile uint8_t blink;    //TRUE or FALSE<br />   volatile uint8_t delay;    //blink delay. 200 = 1 second<br />   volatile uint8_t dp;       //TRUE or FALSE<br />   volatile uint8_t dp_delay; //200 = 1 second<br />   volatile uint8_t dp_blink; //TRUE or FALSE - czy punkt ma migac<br />} Tdigit;<br /><br />extern Tdigit cyfra&#91;4&#93;;<br /><br />//deklaracje funkcji bibliotecznych<br />void mux_init(void);<br />void relays_init(void);<br /><br />#endif /* MUX_H_ */[/syntax]<br /><br />mux.c<br />[syntax=c]#include&lt;avr/io.h&gt;<br />#include&lt;avr/interrupt.h&gt;<br />#include&lt;avr/pgmspace.h&gt;<br />#include&quot;mux.h&quot;<br /><br />#define TIM_DIV F_CPU/1024/200<br /><br />Tdigit cyfra&#91;4&#93;;<br /><br />const uint8_t tab&#91;&#93; PROGMEM =<br />{<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),          //0<br />      (uint8_t) ~(SEG_B|SEG_C),                                  //1<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),                //2<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C|SEG_D |SEG_G),               //3<br />      (uint8_t) ~(SEG_B|SEG_C|SEG_F|SEG_G),                      //4<br />      (uint8_t) ~(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),                //5<br />      (uint8_t) ~(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),          //6<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C),                            //7<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),    //8<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),          //9<br />      (uint8_t) ~(SEG_A|SEG_D|SEG_E|SEG_F|SEG_G),                //litera E<br />      (uint8_t) ~(SEG_B|SEG_C|SEG_D|SEG_E|SEG_G),                //litera d<br />      (uint8_t) ~(SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),                //litera U<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_E|SEG_F|SEG_G),             //litera P<br />      (uint8_t) ~(SEG_A|SEG_B|SEG_C|SEG_E|SEG_F|SEG_G),         //litera A<br />      (uint8_t) ~(SEG_B|SEG_C|SEG_E|SEG_F|SEG_G),             //litera H<br />      (uint8_t) ~(SEG_D|SEG_E|SEG_F),                         //litera L<br />      (uint8_t) ~(SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),             //litera b<br />      (uint8_t) ~(SEG_C|SEG_D|SEG_E|SEG_G)                       //litera o<br />};<br /><br />    void mux_init(void)<br />    {<br />            //inicjalizacja  Timer0<br />            OCR0 = TIM_DIV;<br />            TCCR0 |= (1 &lt;&lt; WGM01) | (1 &lt;&lt; CS02) | (1 &lt;&lt; CS00);<br />            TIMSK |= (1 &lt;&lt; OCIE0);<br />            //pinologia<br />            LED_DIR  |= (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP);<br />            LED_PORT |= (SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G | SEG_DP);<br />            DIG_DIR  |= (DIG0 | DIG1 | DIG2 | DIG3);<br />            DIG_PORT |= (DIG0 | DIG1 | DIG2 | DIG3);<br /><br />            //inicjalizacja wyswietlacza zerami<br />            for (uint8_t i = 0; i &lt; 4; i++)<br />            {<br />                    cyfra&#91;i&#93;.power = TRUE;<br />                    cyfra&#91;i&#93;.val = 0;<br />                    cyfra&#91;i&#93;.blink = FALSE;<br />                    cyfra&#91;i&#93;.delay = 0;<br />                    cyfra&#91;i&#93;.dp = FALSE;<br />            }<br />    }<br />    //inicjalizacja portu dla relays<br />    void relays_init(void)<br />    {<br />    REL_DIR  |= REL1|REL2|REL3|REL4|REL5|REL6|REL7|REL8;//port jako wyjscie<br />    REL_PORT |= REL1|REL2|REL3|REL4|REL5|REL6|REL7|REL8;//stan wysoki<br />    }<br />    //przerwanie od przepelnienia Timer'a 0<br />    ISR(TIMER0_COMP_vect)<br />    {<br />            static uint8_t cnt, flag_reg = 0b00011111, timer&#91;5&#93;;<br />            static uint8_t cnt_digit;//zmienna pomocnicza - multiplexowanie<br /><br />            //timery programowe<br />            if (timer&#91;0&#93;) timer&#91;0&#93;--;<br />            if (timer&#91;1&#93;) timer&#91;1&#93;--;<br />            if (timer&#91;2&#93;) timer&#91;2&#93;--;<br />            if (timer&#91;3&#93;) timer&#91;3&#93;--;<br />            if (timer&#91;4&#93;) timer&#91;4&#93;--;//timer dla decimal point na trzecim znaku<br />            //blok timerow programowych<br />            if (!timer&#91;0&#93;)<br />            {<br />                    flag_reg ^= (1 &lt;&lt; 0);<br />                    timer&#91;0&#93; = cyfra&#91;0&#93;.delay;<br />            }<br />            if (!timer&#91;1&#93;)<br />            {<br />                    flag_reg ^= (1 &lt;&lt; 1);<br />                    timer&#91;1&#93; = cyfra&#91;1&#93;.delay;<br />            }<br />            if (!timer&#91;2&#93;)<br />            {<br />                    flag_reg ^= (1 &lt;&lt; 2);<br />                    timer&#91;2&#93; = cyfra&#91;2&#93;.delay;<br />            }<br />            if (!timer&#91;3&#93;)<br />            {<br />                    flag_reg ^= (1 &lt;&lt; 3);<br />                    timer&#91;3&#93; = cyfra&#91;3&#93;.delay;<br />            }<br />            //timer pod miganie decimal point na trzeciej cyfrze<br />            if (!timer&#91;4&#93;)<br />            {<br />            if(cyfra&#91;2&#93;.dp_blink)<br />            {<br />            flag_reg ^= (1 &lt;&lt; 4);<br />            }<br />                    timer&#91;4&#93; = cyfra&#91;2&#93;.dp_delay;<br />            }<br /><br />            if (cyfra&#91;cnt&#93;.blink == FALSE) flag_reg |= (1 &lt;&lt; cnt);<br /><br />            //multiplex<br />            DIG_PORT |= (DIG0 | DIG1 | DIG2 | DIG3);<br /><br />            if ((cyfra&#91;cnt&#93;.power == TRUE) &amp;&amp; (flag_reg &amp; (1 &lt;&lt; cnt)))<br />            {<br />                    LED_PORT = pgm_read_byte(&amp;tab&#91;cyfra&#91;cnt&#93;.val&#93;);<br />                    if((cyfra&#91;2&#93;.dp == TRUE) &amp;&amp; (flag_reg &amp; (1 &lt;&lt; 4)) &amp;&amp; cnt==2)<br />                    LED_PORT &amp;= ~SEG_DP;<br />            }<br />            else<br />            {<br />                    LED_PORT = 255;<br />            }<br />            //sterowanie zmienna odpowiedzialna za zalaczanie danej katody<br />            switch (cnt)<br />            {<br />              case 0: cnt_digit=7;<br />              break;<br />              case 1: cnt_digit=6;<br />              break;<br />              case 2: cnt_digit=5;<br />              break;<br />              case 3: cnt_digit=4;<br />              break;<br />            }<br />            //multiplexowanie<br />            DIG_PORT = (DIG_PORT &amp; ~(DIG0|DIG1|DIG2|DIG3))|(~(1&lt;&lt;cnt_digit) &amp; 0xf0);<br />            if (++cnt &gt; 3) cnt = 0;<br />    }[/syntax]<br /><br />mk_encoder.h<br />[syntax=c]#ifndef MK_ENCODER_H_<br />#define MK_ENCODER_H_<br /><br />// definicja pinów enkodera<br />#define ENC_PH_A (1&lt;&lt;PB0)<br />#define ENC_PH_B (1&lt;&lt;PB1)<br />#define ENC_PORT B<br /><br />// definicja pinu przycisku enkodera<br />#define ENC_SW(1&lt;&lt;PB2)<br />#define ENC_SWPORTB<br /><br />//-----------------------------------<br /><br />// wybór timera 0 lub 2<br />#define TIMER2<br />//-----------------------------------<br /><br /><br />#define PHASE_A         (PIN(ENC_PORT) &amp; ENC_PH_A)<br />#define PHASE_B         (PIN(ENC_PORT) &amp; ENC_PH_B)<br /><br />#if TIMER == 0<br />#define ENCODER_vect TIMER0_COMP_vect<br />#endif<br /><br />#if TIMER == 2<br />#define ENCODER_vect TIMER2_COMP_vect<br />#endif<br /><br /><br />// Makra upraszczajace dostep do portów<br />// *** PORT<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) SPIN(x)<br />#define SPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br /><br />void register_enc_callback( void (*callback)( int8_t dir, int8_t cnt ) );<br />void register_sw_callback( void (*callback)( void ) );<br />void encoder_init( uint8_t on_off );<br />void ENCODER_EVENT( int8_t res );<br /><br />#endif /* MK_ENCODER_H_ */[/syntax]<br /><br />mk_encoder.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/atomic.h&gt;<br /><br />#include &quot;mk_encoder.h&quot;<br /><br /><br />volatile int8_t ed;<br />volatile int8_t enc_cnt;<br />volatile uint8_t enc_flag;<br /><br />const int8_t table&#91;16&#93; PROGMEM = {0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0};<br /><br />// obsluga enkodera<br />void (*enc_callback)( int8_t dir, int8_t cnt );<br /><br />void register_enc_callback( void (*callback)( int8_t dir, int8_t cnt ) ) {<br />enc_callback = callback;<br />}<br /><br />// obsluga klawisza<br />void (*sw_callback)( void );<br /><br />void register_sw_callback( void (*callback)( void ) ) {<br />sw_callback = callback;<br />}<br />//init enkodera<br />void encoder_init( uint8_t on_off ) {<br /><br />if( !on_off ) {<br />#if TIMER == 0<br />TCCR0 &amp;= ~((1&lt;&lt;CS01)|(1&lt;&lt;CS00));        // stop timer0<br />TIMSK &amp;= ~(1&lt;&lt;OCIE0);// disable interrupt<br />#endif<br /><br />#if TIMER == 2<br />TCCR2 &amp;= ~(1&lt;&lt;CS22);        // stop timer2<br />TIMSK &amp;= ~(1&lt;&lt;OCIE2);// disable interrupt<br />#endif<br />return;<br />}<br /><br />PIN(ENC_PORT)  &amp;= ~(ENC_PH_A|ENC_PH_B);<br />PORT(ENC_PORT) |= ENC_PH_A|ENC_PH_B;<br /><br />PIN(ENC_SWPORT) &amp;= ~ENC_SW;<br />PORT(ENC_SWPORT) |= ENC_SW;<br /><br /><br />#if TIMER == 0<br />TCCR0 = (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0 |= (1&lt;&lt;CS01)|(1&lt;&lt;CS00);         // prescaler 64<br />OCR0 = (uint8_t)(F_CPU / 64 / 1000 );           // 1ms  --&gt; poprawka do VIDEO<br />TIMSK |= (1&lt;&lt;OCIE0);<br />#endif<br /><br />#if TIMER == 2<br />TCCR2 = (1&lt;&lt;WGM21);// tryb CTC<br />TCCR2 |= (1&lt;&lt;CS22);        // prescaler 64<br />OCR2 = (uint8_t)(F_CPU / 64 / 1000 );           // 1ms --&gt; poprawka do VIDEO<br />TIMSK |= (1&lt;&lt;OCIE2);<br />#endif<br /><br />}<br /><br />void ENCODER_EVENT( int8_t res ) {<br />uint8_t sreg;<br />int8_t ecnt;<br />static uint8_t key_lock;<br /><br />// obs³uga zdarzeia enkodera<br />if( enc_callback &amp;&amp; enc_flag  ) {<br /><br />sreg = SREG;<br />cli();<br />ecnt = ed&gt;&gt;2; ed &amp;= 3;<br />SREG = sreg;// sei()<br />if(ecnt&gt;1) ecnt=1;<br />if(ecnt&lt;-1) ecnt=-1;<br /><br />if(!res) res=1;<br /><br />if(ecnt) enc_callback( ecnt*-1, ecnt*res );<br /><br />enc_flag=0;<br />}<br /><br />// obsluga zdarzenia przycisku<br />if( sw_callback ) {<br />if( !key_lock &amp;&amp; !(PIN(ENC_SWPORT) &amp; ENC_SW) ) {<br />key_lock=1;<br /><br />// reakcja na wciniêcie klawisza<br />sw_callback();<br />}<br />else if( key_lock &amp;&amp; (PIN(ENC_SWPORT) &amp; ENC_SW ) ) {<br />if( !++key_lock ) {<br />// ewentualnie reakcja na zwolnienie klawisza ;)<br />//sw_callback();<br />}<br />}<br />}<br /><br />}<br /><br />// Przerwanie timera co 1 ms<br />ISR( ENCODER_vect , ISR_NOBLOCK ) {<br /><br />    static int8_t last;<br />    static int8_t last_ed;<br /><br />    last = (last &lt;&lt; 2)  &amp; 0x0F;<br />    if (PHASE_A) last |=2;<br />    if (PHASE_B) last |=1;<br />    ed += pgm_read_byte( &amp;table&#91;last&#93; );<br /><br />    if( last_ed != ed ) enc_flag=1;<br /><br />    last_ed=ed;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1761">schizwania</a> — 26 mar 2014, o 08:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2014-03-25T21:35:51+01:00</updated>
<published>2014-03-25T21:35:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75769#p75769</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75769#p75769"/>
<title type="html"><![CDATA[Re: True bypass looper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75769#p75769"><![CDATA[
Witam<br />Trudno się odnieść do takiego schematu i takiego programu jaki przedstawiłeś na tut. forum.<br />Z całym szacunkiem, ale spróbuj postawić się na miejscu czytającego Twój post i zapominając co Ty wiesz na temat tego urządzenia z samego schematu i programu rozszyfrować o co tu chodzi.<br />Schemat - moduły z płytki startowej, program - #define i ustawienie portu.<br />Jeśli to nie jest &quot;wersja komercyjna&quot; to może zamieść chociaż więcej kodu i schemat z &quot;podpiętym&quot; uC.<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 25 mar 2014, o 21:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[schizwania]]></name></author>
<updated>2014-03-24T23:09:51+01:00</updated>
<published>2014-03-24T23:09:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75652#p75652</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75652#p75652"/>
<title type="html"><![CDATA[True bypass looper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6481&amp;p=75652#p75652"><![CDATA[
Zabieram się od jakiegoś czasu za budowę urządzenia który znakomicie się przydaje w systemie każdego gitarzysty  - jest to True bypass Looper. Pod enigmatyczną nazwą kryje się ciekawa idea manipulowania torem audio (łańcuch efektów) na bazie presetów zapisywanych w pamięci oraz zmiana trybu pracy wzmacniacza gitarowego. Inspiracją  była strona: <a href="http://www.aresaudio.com/picolooper2.html"  class="postlink">Aresaudio</a>. Jestem na etapie  &quot;składania&quot; do kupy oprogramowania. <br />Do projektu pozwoliłem sobie zaadoptować pomysł kolegi Antystatycznego na wyświetlacz 7segmentowy oraz <a href="http://mirekk36.blogspot.com/2013/04/encoder-avr-callbackow-ciag-dalszy-cz2.html"  class="postlink">bibliotekę Mirka pod enkoder.</a> Pojawił się mały problem którego nie potrafię rozgryźć. Podczas pracy enkodera (obracanie) zostaje &quot;wyzwolona&quot; obsługa przycisku (którego nie wciskam) - na filmie <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> sygnalizowana przez przypadkowo zapalaną zieloną diodę. Generalnie PORTD (port ledów/przekaźników)  ustawiłem jako wyjście, ustawiłem stan niski na PORCIE (zgaszenie diod):<br />[syntax=c]#define REL_PORT PORTD<br />#define REL_DIR  DDRD<br />#define REL1 (1&lt;&lt;0)<br />#define REL2 (1&lt;&lt;1)<br />#define REL3 (1&lt;&lt;2)<br />#define REL4 (1&lt;&lt;3)<br />#define REL5 (1&lt;&lt;4)<br />#define REL6 (1&lt;&lt;5)<br />#define REL7 (1&lt;&lt;6)<br />#define REL8 (1&lt;&lt;7)[/syntax]<br />inicjalizacja:<br />[syntax=c]void relays_init(void)<br />    {<br />    REL_DIR  |= REL1|REL2|REL3|REL4|REL5|REL6|REL7|REL8;//port jako wyjscie<br />    REL_PORT |= REL1|REL2|REL3|REL4|REL5|REL6|REL7|REL8;//stan wysoki<br />    }[/syntax]<br /><br /> a funkcja obsługi klawisza enkodera  wygląda tak:<br />[syntax=c]void enc_switch( void )<br />    {<br />    REL_PORT ^= REL4;<br />    }[/syntax]<br />taktowanie procesora to 16Mhz. Nie ma zwarć i innych kiksów na płytce, układ enkodera jak na <a href="http://mirley.firlej.org/files/PTAVR_Schemat6.gif"  class="postlink">schemacie</a> Ktoś ma jakąś wskazówkę bo lekko &quot;zgłupłem&quot; <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> .W sumie to moje pierwsze kroczki w programowaniu uC coś może przeoczyłem  ? Oczywiście przy naciskaniu klawisza enkodera dioda zmienia swój stan poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1761">schizwania</a> — 24 mar 2014, o 23:09</p><hr />
]]></content>
</entry>
</feed>