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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-11-16T13:37:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=22657&amp;mode</id>
<entry>
<author><name><![CDATA[MirkoT]]></name></author>
<updated>2019-11-16T13:37:53+01:00</updated>
<published>2019-11-16T13:37:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223050#p223050</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223050#p223050"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223050#p223050"><![CDATA[
Przy kopiowaniu zabrakło Ci jakiegoś nawiasu klamrowego }<br />Taki przynajmniej masz komunikat. <br />Sprawdź sobie jeszcze raz skopiowany kod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=189">MirkoT</a> — 16 lis 2019, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bobuss88]]></name></author>
<updated>2019-11-15T23:42:58+01:00</updated>
<published>2019-11-15T23:42:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223046#p223046</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223046#p223046"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223046#p223046"><![CDATA[
23:42:27 **** Incremental Build of configuration Release for project zzzz ****<br />make all <br />'Building file: ../button.c'<br />'Invoking: AVR Compiler'<br />avr-gcc -Wall -Os -fpack-struct -fshort-enums -ffunction-sections -fdata-sections -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=attiny13 -DF_CPU=9600000UL -MMD -MP -MF&quot;button.d&quot; -MT&quot;button.o&quot; -c -o &quot;button.o&quot; &quot;../button.c&quot;<br />In file included from ../button.c:3:0:<br />../led.h:17:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef'<br />     typedef struct LedConfigSet {<br />     ^<br />In file included from ../button.c:4:0:<br />../button.h:8:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'typedef'<br />     typedef struct ButtonConfigSet {<br />     ^<br />../button.c:8:5: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'static'<br />     static void doFunction(Button * const me);<br />     ^<br />../button.c: In function 'rawState':<br />../button.c:12:31: error: 'ButtonConfigSet' has no member named 'port'<br />             return *me-&gt;config-&gt;port &amp; me-&gt;config-&gt;mask;<br />                               ^<br />../button.c:12:50: error: 'ButtonConfigSet' has no member named 'mask'<br />             return *me-&gt;config-&gt;port &amp; me-&gt;config-&gt;mask;<br />                                                  ^<br />../button.c: In function 'Button_init':<br />../button.c:22:13: warning: implicit declaration of function 'doFunction' [-Wimplicit-function-declaration]<br />             doFunction(me);<br />             ^<br />../button.c: At top level:<br />../button.c:47:10: warning: conflicting types for 'doFunction' [enabled by default]<br />     void doFunction(Button * const me)<br />          ^<br />../button.c:22:13: note: previous implicit declaration of 'doFunction' was here<br />             doFunction(me);<br />             ^<br />../button.c: In function 'doFunction':<br />../button.c:51:34: error: 'ButtonConfigSet' has no member named 'onFunction'<br />                     if(me-&gt;config-&gt;onFunction)<br />                                  ^<br />../button.c:52:41: error: 'ButtonConfigSet' has no member named 'onFunction'<br />                             (*me-&gt;config-&gt;onFunction)();<br />                                         ^<br />../button.c:56:34: error: 'ButtonConfigSet' has no member named 'offFunction'<br />                     if(me-&gt;config-&gt;offFunction)<br />                                  ^<br />../button.c:57:41: error: 'ButtonConfigSet' has no member named 'offFunction'<br />                             (*me-&gt;config-&gt;offFunction)();<br />                                         ^<br />../button.c: In function 'rawState':<br />../button.c:13:5: warning: control reaches end of non-void function [-Wreturn-type]<br />     }<br />     ^<br />make: *** [button.o] Błąd 1<br /><br />23:42:27 Build Finished (took 237ms)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17191">bobuss88</a> — 15 lis 2019, o 23:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tumu]]></name></author>
<updated>2019-11-14T22:50:27+01:00</updated>
<published>2019-11-14T22:50:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223036#p223036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223036#p223036"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223036#p223036"><![CDATA[
[syntax=c]/* button.h */<br /><br />#ifndef BUTTON_H_<br />#define BUTTON_H_<br /><br />#define DEBOUNCE_MS 10<br /><br />typedef struct ButtonConfigSet {<br />volatile uint8_t *port;<br />uint8_t mask;<br />void (*onFunction)(void);<br />void (*offFunction)(void);<br />} ButtonConfigSet;<br /><br />typedef struct Button {<br />uint16_t debounceTicks;<br />uint8_t state;<br />__flash const ButtonConfigSet *config;<br />} Button;<br /><br /><br />void Button_init(Button * const me, __flash const ButtonConfigSet *config);<br />void Button_service(Button * const me);<br /><br />#endif /* BUTTON_H_ */[/syntax]<br /><br />[syntax=c]/* button.c */<br /><br />#include &quot;led.h&quot;<br />#include &quot;button.h&quot;<br /><br />#define DEBOUNCE_TICKS ((unsigned long)TICKS_PER_SEC * DEBOUNCE_MS / 1000)<br /><br />static void doFunction(Button * const me);<br /><br />static inline uint8_t rawState(Button * const me)<br />{<br />return *me-&gt;config-&gt;port &amp; me-&gt;config-&gt;mask;<br />}<br /><br /><br />void Button_init(Button * const me, __flash const ButtonConfigSet *config)<br />{<br />me-&gt;config = config;<br />me-&gt;debounceTicks = DEBOUNCE_TICKS;<br />me-&gt;state = rawState(me);<br /><br />doFunction(me);<br />}<br /><br /><br />void Button_service(Button * const me)<br />{<br /><br />uint8_t tmp = rawState(me);<br /><br />if(tmp==me-&gt;state)<br />{<br />me-&gt;debounceTicks = DEBOUNCE_TICKS;<br />}<br />else<br />{<br />if(!me-&gt;debounceTicks || !--me-&gt;debounceTicks)<br />{<br />me-&gt;state = tmp;<br />doFunction(me);<br />}<br />}<br /><br />}<br /><br /><br />void doFunction(Button * const me)<br />{<br />if(!me-&gt;state) /* low depressed */<br />{<br />if(me-&gt;config-&gt;onFunction)<br />(*me-&gt;config-&gt;onFunction)();<br />}<br />else<br />{<br />if(me-&gt;config-&gt;offFunction)<br />(*me-&gt;config-&gt;offFunction)();<br />}<br />}[/syntax]<br /><br />[syntax=c]/* led.h */<br /><br />#ifndef LED_H_<br />#define LED_H_<br /><br />#include &lt;stdint.h&gt;<br />#include &quot;pwm.h&quot;<br /><br />#define TICKS_PER_SEC ((PWM_RESOLUTION)*(PWM_FREQUENCY))<br /><br />#define LED_FADE_TICKS(min,max,seconds) ((max-min)?(uint32_t)seconds*TICKS_PER_SEC/(max-min):0)<br />#define LED_ON_OFF_TICKS(seconds) ((uint32_t)seconds * TICKS_PER_SEC)<br /><br />#define FLASH_MEM __flash<br />//#define FLASH_MEM<br /><br />typedef struct LedConfigSet {<br />uint8_t min;<br />uint8_t max;<br />uint32_t fadeInTicks;<br />uint32_t onTicks;<br />uint32_t fadeOutTicks;<br />uint32_t offTicks;<br />} LedConfigSet;<br /><br /><br />struct Led;<br />typedef void Led_state(struct Led * const me);<br /><br />typedef struct Led {<br />Pwmsuper;/* superclass */<br />Led_state *state;<br />uint32_t currentCounter;<br />/* &quot;protected&quot; */<br />FLASH_MEM const LedConfigSet * config;<br />} Led;<br /><br />void Led_ctor(Led * const me, volatile uint8_t * port, uint8_t pinMsk, FLASH_MEM const LedConfigSet * config);<br />void Led_service(Led * const me);<br />void Led_setConfig(Led * const me, FLASH_MEM const LedConfigSet * config);<br /><br />#endif /* LED_H_ */[/syntax]<br /><br />[syntax=c]/* led.c */<br /><br />#include &quot;led.h&quot;<br /><br /><br />static void stateIdle(Led * const me);<br />static void stateFadeIn(Led * const me);<br />static void stateOn(Led * const me);<br />static void stateFadeOut(Led * const me);<br />static void stateOff(Led * const me);<br /><br /><br />void Led_ctor(Led * const me, volatile uint8_t * port, uint8_t pinMsk, FLASH_MEM const LedConfigSet * config)<br />{<br />Pwm_ctor(&amp;me-&gt;super, port, pinMsk);<br /><br />me-&gt;currentCounter = 0;<br />me-&gt;state = stateIdle;<br /><br />Led_setConfig(me, config);<br /><br />}<br /><br />void Led_service(Led * const me)<br />{<br />Pwm_service(&amp;me-&gt;super);<br /><br />if(!me-&gt;currentCounter || !--me-&gt;currentCounter)<br />{<br />(*me-&gt;state)(me);<br />}<br />}<br /><br />void Led_setConfig(Led * const me, FLASH_MEM const LedConfigSet * config)<br />{<br />me-&gt;config = config;<br />}<br /><br />/***************** local functions *******************8*/<br /><br />void stateIdle(Led * const me)<br />{<br />if(me-&gt;config-&gt;fadeInTicks)<br />{<br />stateOff(me);<br />}<br />}<br /><br />void stateFadeIn(Led * const me)<br />{<br /><br />if(++me-&gt;super.dutyTicks &gt;= me-&gt;config-&gt;max)<br />{<br />me-&gt;currentCounter = me-&gt;config-&gt;onTicks;<br />me-&gt;state = stateOn;<br />}<br />else<br />{<br />me-&gt;currentCounter = me-&gt;config-&gt;fadeInTicks;<br />}<br /><br />}<br /><br />void stateOn(Led * const me)<br />{<br />me-&gt;state = stateFadeOut;<br />}<br /><br />void stateFadeOut(Led * const me)<br />{<br />if(--me-&gt;super.dutyTicks &lt;= me-&gt;config-&gt;min)<br />{<br />me-&gt;currentCounter = me-&gt;config-&gt;offTicks;<br />me-&gt;state = stateOff;<br />}<br />else<br />{<br />me-&gt;currentCounter = me-&gt;config-&gt;fadeOutTicks;<br />}<br /><br />}<br /><br />void stateOff(Led * const me)<br />{<br />me-&gt;state = stateFadeIn;<br />}[/syntax]<br /><br />[syntax=c]/* pwm.h */<br /><br />#ifndef PWM_H_<br />#define PWM_H_<br /><br />#include &lt;stdint.h&gt;<br /><br />#define PWM_FREQUENCY100<br />#define PWM_RESOLUTION256//not to be changed<br /><br />/*<br /> * Transforms duty in 0-100 range into internal representation (0-255)<br /> */<br />#define DUTY_VALUE(duty) ((duty * (PWM_RESOLUTION-1)) / 100)<br /><br />typedef struct Pwm {<br />/* &quot;private&quot; */<br />volatile uint8_t *port;<br />uint8_t pinMask;<br />uint8_t currentDutyTicks;<br />/* &quot;protected&quot; */<br />uint8_t dutyTicks;<br />} Pwm;<br /><br />void Pwm_ctor(Pwm * const me, volatile uint8_t * port, uint8_t pinMsk);<br />void Pwm_setDuty(Pwm * const me, uint8_t duty);<br />uint8_t Pwm_getDuty(Pwm * const me);<br />void Pwm_service(Pwm * const me);<br />void Pwm_tick(void);<br /><br />#endif /* PWM_H_ */[/syntax]<br /><br />[syntax=c]/* pwm.c */<br /><br />#include &quot;pwm.h&quot;<br /><br />static uint8_t resCounter ;<br /><br />void Pwm_ctor(Pwm * const me, volatile uint8_t * port, uint8_t pinMsk)<br />{<br />me-&gt;port = port;<br />me-&gt;pinMask = pinMsk;<br />me-&gt;currentDutyTicks = me-&gt;dutyTicks = 0;<br />}<br /><br />/*<br /> * duty range 0-255<br /> */<br />void Pwm_setDuty(Pwm * const me, uint8_t duty)<br />{<br />me-&gt;dutyTicks = duty;<br />}<br /><br />uint8_t Pwm_getDuty(Pwm * const me)<br />{<br />return me-&gt;dutyTicks;<br />}<br /><br />void Pwm_service(Pwm * const me)<br />{<br />if(me-&gt;currentDutyTicks &amp;&amp; !--me-&gt;currentDutyTicks)<br />{<br />*me-&gt;port &amp;= ~me-&gt;pinMask;<br />}<br />if(!resCounter &amp;&amp; me-&gt;dutyTicks)<br />{<br />*me-&gt;port |= me-&gt;pinMask;<br />me-&gt;currentDutyTicks = me-&gt;dutyTicks;<br />}<br />}<br /><br />void Pwm_tick(void)<br />{<br />resCounter++;<br />}[/syntax]<br /><br />[syntax=c]/* timer.h */<br /><br />#ifndef TIMER_H_<br />#define TIMER_H_<br /><br />void Timer_init(void);<br /><br />#endif /* TIMER_H_ */[/syntax]<br /><br />[syntax=c]/* timer.c */<br /><br />#include &lt;avr/io.h&gt;<br />#include &quot;pwm.h&quot;<br /><br />#define TICKS_PER_SEC ((PWM_RESOLUTION)*(PWM_FREQUENCY))<br /><br />#define PRESKALER 8<br /><br />void Timer_init(void)<br />{<br />//Timer0 configuration, freq TICKS_PER_SEC Hz, COMP_A interrupt<br />TCCR0A = _BV(WGM01);<br />OCR0A = F_CPU/ PRESKALER/  TICKS_PER_SEC - 1;<br />TIMSK0 = _BV(OCIE0A);<br />TCCR0B = _BV(CS01);<br /><br />}[/syntax]<br /><br />[syntax=c]/* main.c */<br /><br />#include &quot;led.h&quot;<br />#include &quot;button.h&quot;<br />#include &quot;timer.h&quot;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define PIN_LED_00<br />#define PIN_LED_11<br /><br />#define PIN_BUTTON_03<br />#define PIN_BUTTON_14<br /><br />static void Pin_init(void);<br /><br />static void onFunction0(void);<br />static void offFunction0(void);<br />static void onFunction1(void);<br />static void offFunction1(void);<br /><br />static __flash const LedConfigSet config&#91;&#93; = {<br />{<br />0, 240, /* min, max */<br />LED_FADE_TICKS(0,240,60),/* fade in ticks */<br />LED_ON_OFF_TICKS(120), /* on ticks */<br />LED_FADE_TICKS(0,240,60),/* fade out ticks */<br />0 /* off ticks */<br />},<br />{<br />0, 240, /* min, max */<br />LED_FADE_TICKS(0,240,90),/* fade in ticks */<br />LED_ON_OFF_TICKS(120), /* on ticks */<br />LED_FADE_TICKS(0,240,90),/* fade out ticks */<br />0 /* off ticks */<br />},<br />{<br />0, 240, /* min, max */<br />LED_FADE_TICKS(0,240,60),/* fade in ticks */<br />0, /* on ticks */<br />LED_FADE_TICKS(0,240,40),/* fade out ticks */<br />0 /* off ticks */<br />},<br /><br /><br />{<br />0, 240, /* min, max */<br />LED_FADE_TICKS(0,240,90),/* fade in ticks */<br />0, /* on ticks */<br />LED_FADE_TICKS(0,240,50),/* fade out ticks */<br />0 /* off ticks */<br />}<br />};<br /><br />static Led led0;<br />static Led led1;<br /><br /><br />static __flash const ButtonConfigSet buttonConfig&#91;&#93; = {<br />{<br />&amp;PINB,/* volatile uint8_t *port; */<br />(1&lt;&lt;PIN_BUTTON_0),/* uint8_t mask; */<br />onFunction0,/* void (*onFunction)(void); */<br />offFunction0/* void (*offFunction)(void); */<br />},<br />{<br />&amp;PINB,/* volatile uint8_t *port; */<br />(1&lt;&lt;PIN_BUTTON_1),/* uint8_t mask; */<br />onFunction1,/* void (*onFunction)(void); */<br />offFunction1/* void (*offFunction)(void); */<br />}<br />};<br /><br />static Button button0;<br />static Button button1;<br /><br />__attribute__((OS_main))<br />int main()<br />{<br />Timer_init();<br />Pin_init();<br /><br />Led_ctor(&amp;led0, &amp;PORTB, (1&lt;&lt;PIN_LED_0), &amp;config&#91;0&#93;);<br />Button_init(&amp;button0, &amp;buttonConfig&#91;0&#93;);<br /><br />Led_ctor(&amp;led1, &amp;PORTB, (1&lt;&lt;PIN_LED_1), &amp;config&#91;1&#93;);<br />Button_init(&amp;button1, &amp;buttonConfig&#91;1&#93;);<br /><br /><br />sei();<br /><br />for(;;)<br />{<br />}<br /><br />return 0;<br />}<br /><br />void Pin_init(void)<br />{<br />DDRB |= (1&lt;&lt;PIN_LED_0) | (1&lt;&lt;PIN_LED_1);<br />PORTB |= (1&lt;&lt;PIN_BUTTON_0) | (1&lt;&lt;PIN_BUTTON_1);<br />}<br /><br />ISR(TIM0_COMPA_vect,ISR_NAKED)<br />{<br />Led_service(&amp;led0);<br />Led_service(&amp;led1);<br />Pwm_tick();<br />Button_service(&amp;button0);<br />Button_service(&amp;button1);<br />reti();<br />}<br /><br /><br />void onFunction0(void)<br />{<br />Led_setConfig(&amp;led0, &amp;config&#91;0&#93;);<br />}<br />void offFunction0(void)<br />{<br />Led_setConfig(&amp;led0, &amp;config&#91;1&#93;);<br />}<br />void onFunction1(void)<br />{<br />Led_setConfig(&amp;led1, &amp;config&#91;2&#93;);<br />}<br />void offFunction1(void)<br />{<br />Led_setConfig(&amp;led1, &amp;config&#91;3&#93;);<br />}[/syntax]<br /><br />[syntax=bash]Device: attiny13<br /><br />Program:     898 bytes (87.7% Full)<br />(.text + .data + .bootloader)<br /><br />Data:         37 bytes (57.8% Full)<br />(.data + .bss + .noinit)[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20602">tumu</a> — 14 lis 2019, o 22:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tumu]]></name></author>
<updated>2019-11-11T22:42:56+01:00</updated>
<published>2019-11-11T22:42:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223002#p223002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223002#p223002"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=223002#p223002"><![CDATA[
Having both instance of class outside implementation file and fully opaque pointer requires dynamic allocation which is to be avoided. Furthermore, I think that to implement inheritance subclass has to know all about superclass.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20602">tumu</a> — 11 lis 2019, o 22:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bobuss88]]></name></author>
<updated>2019-11-11T13:37:16+01:00</updated>
<published>2019-11-11T13:37:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222983#p222983</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222983#p222983"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222983#p222983"><![CDATA[
Czy szkic programu jest obecnie poprawny?<br /><br />[syntax=cpp]/*<br />    &#93; * main.c<br />     */<br />        //ZM3 PB3 stan niski  - przełącznik czasu Kanału 1 -pozycja 60s- 60s/120s/60s<br />        //ZM3 PB3 stan wysoki - przełącznik czasu Kanału 1 -pozycja 90s- 90s/120s/90s<br />        //ZM4 PB4 stan niski  - przełącznik czasu Kanału 2 -pozycja  A - 60s/40s<br />        //ZM4 PB4 stan wysoki - przełącznik czasu Kanału 2 -pozycja  B - 90s/50s<br />        #include &lt;avr/io.h&gt;<br />        #include &lt;avr/interrupt.h&gt;<br />        #include &lt;util/delay.h&gt;<br />     <br />        #define ZM3 (1&lt;&lt;PB3)<br />        #define ZM4 (1&lt;&lt;PB4)<br />     <br />        volatile uint8_t pwm1, pwm2;<br />        uint16_t i;<br />        uint16_t j;<br />     <br />        int main(void) {<br />                TCCR0B |= (1&lt;&lt;CS00);<br />                TIMSK0 |= (1&lt;&lt;TOIE0);<br />     <br />                DDRB |= (1&lt;&lt;PB0)|(1&lt;&lt;PB1);<br />                PORTB |= ZM3|ZM4;   // podciągamy linie klawiszy do VCC<br />     <br />                sei();<br />     <br />     <br />                while(1)        //pętla główna programu<br />                {<br />                        //kanał 1 PWM<br />                        i++;<br />                        if ( i&lt; 240 )                           //dla i&lt;240<br />                                {<br />                                pwm1++; //rozjaśnianie<br />                                }<br />                        else if ( j&lt;(240+480) ) //dla i&lt;720 i i&gt;=240<br />                                {<br />                                //nic nie rób, bez zmian<br />                                }<br />                        else if ( i&lt;(240+480+240) )//dla i&lt;960 i i&gt;=720<br />                                {<br />                                pwm1--;//gaszenie<br />                                }<br />                        else            //dla i&gt;=960<br />                                {//koniec cyklu<br />                                //powracvamy do stanu początkowego<br />                                i=0;<br />                                pwm1=0;<br />                                }<br />     <br />                //kanał 2 PWM<br />                        j++;<br />                        if ( j&lt; (90*4) )                                //dla j&lt;360<br />                                {<br />                                pwm2++; //rozjaśnianie, tu jest potrzebny jeszcze dodatkowy warunek<br />                                }<br />                        else if ( j&lt;(90*4+50*4) )       //dla j&lt;560 i j&gt;=360<br />                                {<br />                                pwm1--;//gaszenie, jw dodatkowy warunek<br />                                }<br />                        else            //dla j&gt;=560<br />                                {//koniec cyklu<br />                                //powracamy do stanu początkowego<br />                                j=0;<br />                                pwm2=0;<br />                                }<br />     <br />                         _delay_ms(240);<br /><br />                   if((PINB &amp; (1&lt;&lt;PB3))<br />            {<br />                    pwm1_time1=60*4;<br />                    pwm1_time2=120*4+60*4;<br />                    pwm1_time3=60*4+120*4+60*4;<br />            }<br />            else<br />                    {<br />                    pwm1_time1=90*4;<br />                    pwm1_time2=120*4+90*4;<br />                    pwm1_time3=90*4+120*4+90*4;<br />            }<br /><br />                }<br /><br />GeSHi[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17191">bobuss88</a> — 11 lis 2019, o 13:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2019-11-11T11:30:21+01:00</updated>
<published>2019-11-11T11:30:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222978#p222978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222978#p222978"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222978#p222978"><![CDATA[
@Alef2, tak, mniej więcej o to chodzi. Wypadało by tylko uzależnić kroki rozjaśnianie/ściemnianie od czasu aby te kroki w zadanym czasie odliczyło. Można to zrobić na kilka sposobów. Timer programowy jest wygodny nawet jak przerwan do niczego innego nie wykorzystujemy <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=1922">SylwekK</a> — 11 lis 2019, o 11:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Alef2]]></name></author>
<updated>2019-11-11T10:57:28+01:00</updated>
<published>2019-11-11T10:57:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222976#p222976</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222976#p222976"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222976#p222976"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />najprościej byłoby chyba rozwiązać z użyciem switch-case<br /></div>Kolega ma na myśli coś takiego:[syntax=c]i++;<br /> switch (krok) <br />{<br />  case 1: <br />{<br />pwm1++;<br />if(i== 240)krok=2;<br />}<br />    break;<br />   <br />case 2:<br />{<br />if(i== 720)krok=3;<br />}<br />    break;<br /><br />case 3:<br />{<br />pwm1--;<br />if(i== 960)krok=1;<br />}<br />   <br />default: <br />{<br />krok=1;<br />}<br />     break;<br /> }[/syntax]<br /><div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />bez timera programowego się raczej nie obejdzie<br /></div><br />nie jestem przekonany czy w TYM konkretnym przypadku jest to niezbędne, choć jeżeli program ma być rozbudowywany to warto<br />lub też jeżeli czasy są krytyczne<div class="quotetitle">bobuss88 napisał(a):</div><div class="quotecontent"><br />zmianę czasów poprzez przełączniki na portach PB3 i PB4:<br /></div><br />a jaki to problem<br />ponieważ zmieniasz tylko czasy i tylko w zależności od stanu wejścia, to wystarczy stałe w warunkach zamienić na zmienne, których wartość będzie zależeć od stanu wejścia, np tak:<br />[syntax=c]if((PINB &amp; (1&lt;&lt;PB3))<br />{<br />pwm1_time1=60*4;<br />pwm1_time2=120*4+60*4;<br />pwm1_time3=60*4+120*4+60*4;<br />}<br />else<br />{<br />pwm1_time1=90*4;<br />pwm1_time2=120*4+90*4;<br />pwm1_time3=90*4+120*4+90*4;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14998">Alef2</a> — 11 lis 2019, o 10:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bobuss88]]></name></author>
<updated>2019-11-11T00:38:49+01:00</updated>
<published>2019-11-11T00:38:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222973#p222973</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222973#p222973"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222973#p222973"><![CDATA[
Dziękuję za zainteresowanie postem.<br />Potrzebowałbym jednak jeszcze zmianę czasów poprzez przełączniki na portach PB3 i PB4:<br /><br />PB3 stan niski  - przełącznik czasu Kanału 1 -płynne rozjaśnianie 0-240 przez czas 60 sekund, ciągłe świecenie przez czas 120 sekund, płynne wyłączenie przez czas 60 sekund.<br /><br />PB3 stan wysoki - przełącznik czasu Kanału 1 -płynne rozjaśnianie 0-240 przez czas 90 sekund, ciągłe świecenie przez czas 120 sekund, płynne wyłączenie przez czas 90 sekund.<br /><br />PB4 stan niski  - przełącznik czasu Kanału 2 -Rozjaśnianie 0-240 przez czas 60 sekund, gaszenie przez czas 40 sekund.<br /><br />PB4 stan wysoki - przełącznik czasu Kanału 2 -Rozjaśnianie 0-240 przez czas 90 sekund, gaszenie przez czas 50 sekund.<br /><br />Oczywiście jak wyżej wspomniałem oba kanały pwm muszą pracować równolegle.<br /><br />[syntax=cpp]/*<br />&#93; * main.c<br /> */<br />    //ZM3 PB3 stan niski  - przełącznik czasu Kanału 1 -pozycja 60s- 60s/120s/60s<br />    //ZM3 PB3 stan wysoki - przełącznik czasu Kanału 1 -pozycja 90s- 90s/120s/90s<br />    //ZM4 PB4 stan niski  - przełącznik czasu Kanału 2 -pozycja  A - 60s/40s<br />    //ZM4 PB4 stan wysoki - przełącznik czasu Kanału 2 -pozycja  B - 90s/50s<br />    #include &lt;avr/io.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &lt;util/delay.h&gt;<br /><br />    #define ZM3 (1&lt;&lt;PB3)<br />    #define ZM4 (1&lt;&lt;PB4)<br /><br />    volatile uint8_t pwm1, pwm2;<br />    uint16_t i;<br />    uint16_t j;<br /><br />    int main(void) {<br />            TCCR0B |= (1&lt;&lt;CS00);<br />            TIMSK0 |= (1&lt;&lt;TOIE0);<br /><br />            DDRB |= (1&lt;&lt;PB0)|(1&lt;&lt;PB1);<br />            PORTB |= ZM3|ZM4;   // podciągamy linie klawiszy do VCC<br /><br />            sei();<br /><br /><br />            while(1)        //pętla główna programu<br />            {<br />                    //kanał 1 PWM<br />                    i++;<br />                    if ( i&lt; 240 )                           //dla i&lt;240<br />                            {<br />                            pwm1++; //rozjaśnianie<br />                            }<br />                    else if ( j&lt;(240+480) ) //dla i&lt;720 i i&gt;=240<br />                            {<br />                            //nic nie rób, bez zmian<br />                            }<br />                    else if ( i&lt;(240+480+240) )//dla i&lt;960 i i&gt;=720<br />                            {<br />                            pwm1--;//gaszenie<br />                            }<br />                    else            //dla i&gt;=960<br />                            {//koniec cyklu<br />                            //powracvamy do stanu początkowego<br />                            i=0;<br />                            pwm1=0;<br />                            }<br /><br />            //kanał 2 PWM<br />                    j++;<br />                    if ( j&lt; (90*4) )                                //dla j&lt;360<br />                            {<br />                            pwm2++; //rozjaśnianie, tu jest potrzebny jeszcze dodatkowy warunek<br />                            }<br />                    else if ( j&lt;(90*4+50*4) )       //dla j&lt;560 i j&gt;=360<br />                            {<br />                            pwm1--;//gaszenie, jw dodatkowy warunek<br />                            }<br />                    else            //dla j&gt;=560<br />                            {//koniec cyklu<br />                            //powracamy do stanu początkowego<br />                            j=0;<br />                            pwm2=0;<br />                            }<br /><br />                     _delay_ms(240);<br />            }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17191">bobuss88</a> — 11 lis 2019, o 00:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tumu]]></name></author>
<updated>2019-11-10T13:38:39+01:00</updated>
<published>2019-11-10T13:38:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222954#p222954</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222954#p222954"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222954#p222954"><![CDATA[
[syntax=c]/* main.c */<br />#include &quot;led.h&quot;<br />#include &quot;timer.h&quot;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />Led led0;<br />Led led1;<br /><br />int main()<br />{<br />Timer_init();<br /><br />Led_ctor(&amp;led0, &amp;PORTB, (1&lt;&lt;3));<br />Led_setMinMax(&amp;led0, (0*100/255), (240*100/255));<br />Led_setFadeIn(&amp;led0, 60);<br />Led_setFadeOut(&amp;led0, 60);<br />Led_setOn(&amp;led0, 120);<br /><br />Led_ctor(&amp;led1, &amp;PORTB, (1&lt;&lt;5));<br />Led_setMinMax(&amp;led1, (0*100/255), (240*100/255));<br />Led_setFadeIn(&amp;led1, 90);<br />Led_setFadeOut(&amp;led1, 50);<br /><br /><br />sei();<br /><br />for(;;)<br />{<br />}<br /><br />return 0;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />Led_service(&amp;led0);<br />Led_service(&amp;led1);<br />}[/syntax]<br /><br />[syntax=c]/* pwm.h */<br />#ifndef PWM_H_<br />#define PWM_H_<br /><br />#include &lt;stdint.h&gt;<br /><br />#define PWM_RESOLUTION256//not to be changed<br /><br />typedef struct Pwm {<br />volatile uint8_t *port;<br />uint8_t pinMask;<br />uint8_t currentDutyTicks;<br />uint8_t newDutyTicks;<br />} Pwm;<br /><br />void Pwm_ctor(Pwm * const me, volatile uint8_t * port, uint8_t pinMsk);<br />void Pwm_setDuty(Pwm * const me, uint8_t duty);<br />void Pwm_service(Pwm * const me);<br /><br />#endif /* PWM_H_ */[/syntax]<br /><br />[syntax=c]/* pwm.c */<br /><br />#include &quot;pwm.h&quot;<br /><br />static uint8_t resCounter;<br /><br />void Pwm_ctor(Pwm * const me, volatile uint8_t * port, uint8_t pinMsk)<br />{<br />me-&gt;port = port;<br />me-&gt;pinMask = pinMsk;<br />me-&gt;currentDutyTicks = me-&gt;newDutyTicks = 0;<br />}<br /><br />void Pwm_setDuty(Pwm * const me, uint8_t duty)<br />{<br />me-&gt;newDutyTicks = (duty * PWM_RESOLUTION) / 100;<br />}<br /><br />void Pwm_service(Pwm * const me)<br />{<br />if(!++resCounter)<br />{<br />*me-&gt;port |= me-&gt;pinMask;<br />me-&gt;currentDutyTicks = me-&gt;newDutyTicks;<br />}<br />else if(me-&gt;currentDutyTicks &amp;&amp; !--me-&gt;currentDutyTicks)<br />{<br />*me-&gt;port &amp;= ~me-&gt;pinMask;<br />}<br />}[/syntax]<br /><br />[syntax=c]/* led.h */<br /><br />#ifndef LED_H_<br />#define LED_H_<br /><br />#include &lt;stdint.h&gt;<br />#include &quot;pwm.h&quot;<br /><br />#define TICKS_PER_SEC (255*100)<br /><br />struct Led;<br />typedef void Led_state(struct Led * const me);<br /><br />typedef struct Led {<br />Pwmsuper;/* superclass */<br />uint8_t min;<br />uint8_t max;<br />uint8_t currentBrightness;<br />uint16_t fadeInTicks;<br />uint32_t onTicks;<br />uint16_t fadeOutTicks;<br />uint32_t offTicks;<br />uint32_t currentCounter;<br />Led_state *state;<br />} Led;<br /><br />void Led_ctor(Led * const me, volatile uint8_t * port, uint8_t pinMsk);<br />void Led_service(Led * const me);<br />void Led_setMinMax(Led * const me, uint8_t min, uint8_t max);<br />void Led_setFadeIn(Led * const me, uint8_t seconds);<br />void Led_setOn(Led * const me, uint8_t seconds);<br />void Led_setFadeOut(Led * const me, uint8_t seconds);<br />void Led_setOff(Led * const me, uint8_t seconds);<br /><br />#endif /* LED_H_ */[/syntax]<br /><br />[syntax=c]/* led.c */<br /><br />#include &quot;led.h&quot;<br /><br /><br />static void stateInitial(Led * const me);<br />static void stateFadeIn(Led * const me);<br />static void stateOn(Led * const me);<br />static void stateFadeOut(Led * const me);<br />static void stateOff(Led * const me);<br /><br /><br />void Led_ctor(Led * const me, volatile uint8_t * port, uint8_t pinMsk)<br />{<br />Pwm_ctor(&amp;me-&gt;super, port, pinMsk);<br /><br />me-&gt;fadeInTicks =<br />me-&gt;fadeOutTicks =<br />me-&gt;onTicks =<br />me-&gt;offTicks =<br />me-&gt;max =<br />me-&gt;min =<br />me-&gt;currentBrightness = 0;<br />me-&gt;state = stateInitial;<br /><br />}<br /><br />void Led_service(Led * const me)<br />{<br />Pwm_service(&amp;me-&gt;super);<br /><br />if(!--me-&gt;currentCounter)<br />{<br />(*me-&gt;state)(me);<br />}<br />}<br /><br />void Led_setMinMax(Led * const me, uint8_t min, uint8_t max)<br />{<br />me-&gt;min = min;<br />me-&gt;max = max;<br />}<br /><br />void Led_setFadeIn(Led * const me, uint8_t seconds)<br />{<br />me-&gt;fadeInTicks = seconds * TICKS_PER_SEC / (me-&gt;max - me-&gt;min);<br />}<br />void Led_setOn(Led * const me, uint8_t seconds)<br />{<br />me-&gt;onTicks = seconds * TICKS_PER_SEC;<br />}<br />void Led_setFadeOut(Led * const me, uint8_t seconds)<br />{<br />me-&gt;fadeOutTicks = seconds * TICKS_PER_SEC / (me-&gt;max - me-&gt;min);<br />}<br />void Led_setOff(Led * const me, uint8_t seconds)<br />{<br />me-&gt;offTicks = seconds * TICKS_PER_SEC;<br />}<br /><br />/***************** local functions *******************8*/<br /><br />void stateInitial(Led * const me)<br />{<br />if(me-&gt;fadeInTicks)<br />{<br />stateOff(me);<br />}<br />}<br /><br />void stateFadeIn(Led * const me)<br />{<br />Pwm_setDuty(&amp;me-&gt;super, ++me-&gt;currentBrightness);<br />if(me-&gt;currentBrightness&gt;=me-&gt;max)<br />{<br />me-&gt;currentCounter = me-&gt;onTicks;<br />me-&gt;state = stateOn;<br />}<br /><br />}<br /><br />void stateOn(Led * const me)<br />{<br />me-&gt;currentCounter = me-&gt;fadeOutTicks;<br />me-&gt;state = stateFadeOut;<br />}<br /><br />void stateFadeOut(Led * const me)<br />{<br />Pwm_setDuty(&amp;me-&gt;super, --me-&gt;currentBrightness);<br />if(me-&gt;currentBrightness&lt;=me-&gt;min)<br />{<br />me-&gt;currentCounter = me-&gt;offTicks;<br />me-&gt;state = stateOff;<br />}<br /><br />}<br /><br />void stateOff(Led * const me)<br />{<br />me-&gt;currentCounter = me-&gt;fadeInTicks;<br />me-&gt;state = stateFadeIn;<br />}[/syntax]<br /><br />[syntax=c]/* timer.h */<br /><br />#ifndef TIMER_H_<br />#define TIMER_H_<br /><br />void Timer_init(void);<br /><br />#endif /* TIMER_H_ */[/syntax]<br /><br />[syntax=c]/* timer.c */<br /><br />void Timer_init(void)<br />{<br />//Timer0 configuration, freq TICKS_PER_SEC Hz, OVF interrupt<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20602">tumu</a> — 10 lis 2019, o 13:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2019-11-10T13:09:19+01:00</updated>
<published>2019-11-10T13:09:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222953#p222953</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222953#p222953"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222953#p222953"><![CDATA[
Twoje zadanie najprościej byłoby chyba rozwiązać z użyciem switch-case. Prosta maszyna stanów dla każdego z led pozwoli na łatwiejsze zarządzanie czasami świecenia. Oczywiście bez timera programowego się raczej nie obejdzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 10 lis 2019, o 13:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Alef2]]></name></author>
<updated>2019-11-10T10:33:02+01:00</updated>
<published>2019-11-10T10:33:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222945#p222945</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222945#p222945"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222945#p222945"><![CDATA[
Zaproponuję takie rozwiązanie<br />[syntax=c]while(1)//pętla główna programu<br />{<br />//kanał 1 PWM<br />i++;<br />if ( i&lt; 240 )//dla i&lt;240<br />{<br />pwm1++;//rozjaśnianie<br />}<br />else if ( j&lt;(240+480) )//dla i&lt;720 i i&gt;=240<br />{<br />//nic nie rób, bez zmian<br />}<br />else if ( i&lt;(240+480+240) )//dla i&lt;960 i i&gt;=720  <br />{<br />pwm1--;//gaszenie<br />} <br />else//dla i&gt;=960<br />{//koniec cyklu<br />//powracvamy do stanu początkowego<br />i=0;<br />pwm1=0;<br />}<br /><br />//kanał 2 PWM<br />j++;<br />if ( j&lt; (90*4) )//dla j&lt;360<br />{<br />pwm2++;//rozjaśnianie, tu jest potrzebny jeszcze dodatkowy warunek<br />}<br />else if ( j&lt;(90*4+50*4) )//dla j&lt;560 i j&gt;=360<br />{<br />pwm1--;//gaszenie, jw dodatkowy warunek<br />}<br />else//dla j&gt;=560<br />{//koniec cyklu<br />//powracamy do stanu początkowego<br />j=0;<br />pwm2=0;<br />}<br /><br /> _delay_ms(240);<br />}[/syntax]<br />Oczywiście i i j muszą być typu uint16_t, a dla drugiego kanału trzeba trochę pokombinować, by dopasować ściemnianie i rozjaśnianie do ilości kroków.<br />Czas obiegu pętli też nie jest idealny. Jeżeli ma być idealny, to można zastosować zamiast _delay_ms(240); while(jakas_zmienna) a w obsłudze przerwania dopisać zerowanie tej zmiennej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14998">Alef2</a> — 10 lis 2019, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-11-09T21:28:46+01:00</updated>
<published>2019-11-09T21:28:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222933#p222933</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222933#p222933"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222933#p222933"><![CDATA[
<div class="quotetitle">bobuss88 napisał(a):</div><div class="quotecontent"><br />Jednak niewiem jak się za to zabrać.<br /></div><br />Proponuję zacząć od książki <!-- m --><a class="postlink" href="https://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >https://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 lis 2019, o 21:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bobuss88]]></name></author>
<updated>2019-11-09T20:44:09+01:00</updated>
<published>2019-11-09T20:44:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222930#p222930</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222930#p222930"/>
<title type="html"><![CDATA[Re: Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222930#p222930"><![CDATA[
Doczytałem się o timerze programowym. Jednak niewiem jak się za to zabrać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17191">bobuss88</a> — 9 lis 2019, o 20:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bobuss88]]></name></author>
<updated>2019-11-08T21:47:51+01:00</updated>
<published>2019-11-08T21:47:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222916#p222916</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222916#p222916"/>
<title type="html"><![CDATA[Attiny13 + 2 PWM programowe + dwa zadania równoległe.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22657&amp;p=222916#p222916"><![CDATA[
Witam. Poszukuje sposobu na uruchomienie dwóch led w trybie PWM o różnych czasach działania.<br />Led1/PWM1/PB0 - płynne rozjaśnianie 0-240 w czasie 60 sekund, ciągłe świecenie przez czas 120 sekund, płynne gaszenie 240-0 przez czas 60 sekund (w pętli)<br />Natomiast równolegle chcę by Led2/PWM2/PB1 się płynnie rozjaśniało 0-240 przez czas 90 sekund , płynnie wyłączało przez czas 50 sekund (pętla).<br />Niestety nie wiem jak się za to zabrać.<br /><br />[syntax=cpp]/*<br />&#93; * main.c<br /> *<br /> *  <br /> *      Author: Marcin<br /> */<br /><br />    #include &lt;avr/io.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &lt;util/delay.h&gt;<br /><br />    volatile uint8_t PWM1, PWM2;<br />    uint8_t i;<br />    uint8_t j;<br /><br />    int main(void) {<br />            TCCR0B |= (1&lt;&lt;CS00);<br />            TIMSK0 |= (1&lt;&lt;TOIE0);<br /><br />            DDRB |= (1&lt;&lt;PB0)|(1&lt;&lt;PB1);<br /><br />            sei();<br />            while(1) {<br />                     for(i=0,j=0; i&lt;=240,j&lt;=240; i++,j++)<br />                    {<br /><br />                    PWM1=i;<br />                    PWM2=j;<br />                            _delay_ms(240);  //(60s) rozjasnianie  (240) KANAŁ1<br />                        }<br /><br />                        _delay_ms(120000);        //(120s) swiecenie ciagle  (120000) KANAŁ1<br /><br /><br />                     for(i=240,j=240; i&gt;0,j&gt;0; i--,j--)<br />                     {<br />                            PWM1=i;<br />                            PWM2=j;<br />                            _delay_ms(240);  //(60s) gaszenie  (240) KANAŁ1<br />                         }<br />                            PWM1=0;                                   // zgaszenie KANAŁ1<br />            }<br />                    }<br />    }<br />    //Licznik programowy do PWM<br />    ISR(TIM0_OVF_vect){<br />            static uint8_t licznik1;<br />            static uint8_t licznik2;<br />            if(licznik1 &lt; PWM1)PORTB |= (1&lt;&lt;PB0); else PORTB &amp;= ~(1&lt;&lt;PB0);<br />            if(licznik2 &lt; PWM2)PORTB |= (1&lt;&lt;PB1); else PORTB &amp;= ~(1&lt;&lt;PB1);<br />            licznik1++;<br />            licznik2++;<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17191">bobuss88</a> — 8 lis 2019, o 21:47</p><hr />
]]></content>
</entry>
</feed>