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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-09-03T10:28:03+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=22534&amp;mode</id>
<entry>
<author><name><![CDATA[stanleygoldi]]></name></author>
<updated>2019-09-03T10:28:03+01:00</updated>
<published>2019-09-03T10:28:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221789#p221789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221789#p221789"/>
<title type="html"><![CDATA[Re: Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221789#p221789"><![CDATA[
Dzięki za uwagi, faktycznie można zrobić warunek == zamiast &gt;=. Timer1 jest wyłączony, ewentualnie użyje go do wysterowania taśmy RGB lub też jak sugerowałeś, ten SendSpi16 może by przerzucił właśnie do tego timer'a1 - tylko najlepiej co jaki czas aby te bajty dwa się wysyłały?<br />Co do projektu to 2 lata temu robiłem podobny i to na zewnętrznych scalakach do PWM'a, ale to jest projekt na studia więc chce pokazać że i na małych prockach da radę w miarę sensownie obsługiwać programowo PWM'a. <br /><br />Co do wyświetlacza to właśnie zmieniłem atmege 16 an 324 ponieważ tego ramu mi brakowało do buforowania. Wyświetlanie jest robione normalnie, nie w przerwaniu, pod menu podpięta jest funkcja:<br />[syntax=c]void ssd1306_display(void){<br />ssd1306_cmd(SSD1306_SETLOWCOLUMN | 0x0);<br />ssd1306_cmd(SSD1306_SETHIGHCOLUMN | 0x0);<br />ssd1306_cmd(SSD1306_SETSTARTLINE | 0x0);<br />TWI_write_buf(OLED_I2C_ADDRESS, 0x40, 1024, ssd1306_buf);<br />}[/syntax]<br /><br />Dla menu tworzyłem sobie np. nowe funkcje dla np. kasowania i wyświetlana kursora dawałem inną funkcję -&gt; ssd1306_refresh_pages, (chodziło poprawnie). Kolejny pomysł to aby np. przy ustawianiu pewnego parametru przy autorepeat, odświeżał się tylko dany page a nie cały wyświetlacz -&gt; wtedy już nie będzie zacinać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12774">stanleygoldi</a> — 3 wrz 2019, o 10:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Semi]]></name></author>
<updated>2019-09-03T06:59:23+01:00</updated>
<published>2019-09-03T06:59:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221784#p221784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221784#p221784"/>
<title type="html"><![CDATA[Re: Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221784#p221784"><![CDATA[
W przerwaniu od timera 2 w<br />[syntax=c]for (i = 0; i &lt; pwm_number_leds; i++) {<br />                if (cnt &gt;= pwm_tab&#91;i&#93;)[/syntax]<br />zmień &quot;&gt;=&quot; na &quot;==&quot;. Przerwanie będzie zajmować mniej czasu CPU. Czekanie w pętli na przerwaniu to zły pomysł<br />[syntax=c]SendSpi16(pwm_bits_for_send);[/syntax]<br />Wysyłaj na przerwaniach albo po jednym bajcie co drugie przerwanie.<br /><br />Niepokojące jest<div class="quotetitle">stanleygoldi napisał(a):</div><div class="quotecontent"><br />zmierzyłem że taki PWM zabiera mi około 35% czasu programu.<br /></div> <br />Dla jakiś hyper rozbudowanego program ok ale dla tak banalnego? Ile się da powinno być zrobione sprzętowo. Mega2560 ma 12 PWM. W praktyce pewnie będa konflikty i nie wszystkie da się wykorzystać ale jak nawet 8 PWM będzie sprzętowo to tylko drugie 8 będa znacznie obciążały CPU. Inna opcja zewnętrzny PWM np PCA9685 albo WS2811. Komunikacja do WS2911 obciąża znacznie AVR ale dane wysyłasz tylko gdy coś się zmienia.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Przerwanie od timera 1 nie pokazałeś. Tajemnica firmy?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 8 minutach ]</span></strong><br /><br />Co do wyświetlacza, to używany jest bufor i przerwania? Obstawiam, że nie więc użyj tego mechanizmu. Przy 128x64 potrzebny 1kB RAM, jak to dużo to zmień mikrokontroler na taki co ma więcej RAM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20851">Semi</a> — 3 wrz 2019, o 06:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[stanleygoldi]]></name></author>
<updated>2019-09-02T21:14:21+01:00</updated>
<published>2019-09-02T21:14:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221780#p221780</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221780#p221780"/>
<title type="html"><![CDATA[Re: Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221780#p221780"><![CDATA[
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 &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;EXPANDER/expander.h&quot;<br />#include &quot;PWM/pwm.h&quot;<br />#include &quot;PIR/pir.h&quot;<br />#include &quot;BUTTONS/buttons.h&quot;<br />#include &quot;LIGHT/light.h&quot;<br />#include &quot;OLED/oled_ssd1306.h&quot;<br />#include &quot;common.h&quot;<br />#include &quot;MENU_LIB/mk_menu_include.h&quot;<br /><br />int main(void)<br />{<br />    uint8_t ld = load_property_from_flash_if_eeprom_property_empty;<br />    InitReset();<br /><br />    if (!(KEY_RESET_PIN &amp; KEY_RESET)) copy_property_from_flash_to_ram_and_eeprom();<br /><br />    InitSpi();<br />    InitPir();<br />    InitKeys();<br />    InitTimerPWM();<br />    InitPWM();<br />    InitLight();<br />    InitTimer0();<br />    Init_Oled(SSD1306_SWITCHCAPVCC, REFRESH_MAX);<br /><br />//for test<br />    DDRB  |= (1&lt;&lt;PB0) ;<br />    PORTB |= (1&lt;&lt;PB0);<br />    <br />    sei();<br />    while(1){<br />    if(!timer1){<br />    PORTB ^=(1&lt;&lt;PB0);<br />    timer1 = 100;<br />    }<br />check_keys();<br />check_light();<br />    }<br />}[/syntax]<br /><br />pwm.c<br />[syntax=c]ISR (TIMER2_COMPA_vect) {<br />static uint8_t cnt, i, n1;<br />static uint16_t n2;<br /><br />n1=prog_timer_pwm_on;<br />if (n1)<br />prog_timer_pwm_on--;<br />n1=prog_timer_pwm_off;<br />if (n1)<br />prog_timer_pwm_off--;<br />n2=prog_timer_on;<br />if (n2)<br />prog_timer_on--;<br />n2=prog_timer_off;<br />if (n2)<br />prog_timer_off--;<br /><br />for (i = 0; i &lt; pwm_number_leds; i++) {<br />if (cnt &gt;= pwm_tab&#91;i&#93;)<br />pwm_bits_for_send &amp;= ~(1 &lt;&lt; i);<br />else<br />pwm_bits_for_send |= (1 &lt;&lt; i);<br />}<br /><br />SendSpi16(pwm_bits_for_send);<br /><br />cnt = (cnt + 1) &amp; 0b01111111;<br />}[/syntax]<br /><br />common.c<br />[syntax=c]void InitTimer0 (void){<br />TCCR0A |= (1 &lt;&lt; WGM01);//CTC<br />TCCR0B |= (1 &lt;&lt; CS00) | (1 &lt;&lt; CS02);//1024<br />OCR0A = 194;//TC0 Output Compare Register A<br />TIMSK0 |= (1 &lt;&lt; OCIE0A);        <br />}<br /><br />ISR (TIMER0_COMPA_vect){//1-click = 10ms<br />uint8_t n;<br /><br />n=timer_for_bt;<br />if(n) timer_for_bt--;<br /><br />n=timer1;<br />if(n) timer1--;<br /><br />n=timer2;<br />if(n) timer2--;<br />}[/syntax]<br /><br />Obecnie w Init_Oled (uint8_t vcc, uint8_t refresh) dodałem<br />[syntax=c]TWSR |= (1&lt;&lt;TWPS1); //16<br />i2cSetBitrate(333);[/syntax]<br />aby I2C zwolniło do około 100KHz -&gt; testując program, zacina się już tylko naprawdę &quot;czasem&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12774">stanleygoldi</a> — 2 wrz 2019, o 21:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2019-09-02T19:16:15+01:00</updated>
<published>2019-09-02T19:16:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221777#p221777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221777#p221777"/>
<title type="html"><![CDATA[Re: Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221777#p221777"><![CDATA[
<div class="quotetitle">Semi napisał(a):</div><div class="quotecontent"><br />Nie sądzę aby ktokolwiek potrafił pomóc widząc te dwa fragmenty kodów dotyczące tylko inicjalizacji peryferiów.<br /></div><br /><br />Trudno się z tym nie zgodzić, więc panie autorze - pokaż pan swój plik main.c albo jego istotne fragmenty - i co najważniejsze swoją procedurę obsługi przerwania tegoż timera<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 wrz 2019, o 19:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Semi]]></name></author>
<updated>2019-09-02T19:14:20+01:00</updated>
<published>2019-09-02T19:14:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221776#p221776</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221776#p221776"/>
<title type="html"><![CDATA[Re: Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221776#p221776"><![CDATA[
Nie sądzę aby ktokolwiek potrafił pomóc widząc te dwa fragmenty kodów dotyczące tylko inicjalizacji peryferiów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20851">Semi</a> — 2 wrz 2019, o 19:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[stanleygoldi]]></name></author>
<updated>2019-09-01T22:18:16+01:00</updated>
<published>2019-09-01T22:18:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221762#p221762</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221762#p221762"/>
<title type="html"><![CDATA[Zacina się OLED przy włączonym Timer2]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22534&amp;p=221762#p221762"><![CDATA[
Witam. <br />Atmega324 (20MHz), do niej podpięte kilka rzeczy jak np. czujki, przyciski, ekspandery, diody oraz oled ssd1306 na I2C. <br /><br />Problem:<br />jeśli nie za komentuję inicjalizacji Timera2 to OLED potrafi się &quot;przyciąć&quot; -&gt; cały procek się wiesza bo kontrolna dioda migająca w pętli głównej przestaje świecić. Np. mkMenu działa sobie super ale niestety jak połączymy to z repeat i np. ustawiam zmienną w menu od 0 do 7, to robiąc to powoli działa wszystko ok, ale jak przytrzymam przycisk to wystarczy 3 obiegi w koło (około 4sekundy to trwa) i procek zawiśnie. <br />Również wcześniej miałem kłopoty z funkcją mk_ssd1306_refresh_pages gdyż czasem powodowała że układ stron (pages na oled) się zmieniał i po restarcie np. page0 zaczynało się od page6. Przykład z animacją pojawiającą się z prawej i znikającą z lewej przy użyciu mk_ssd1306_refresh_pages, też nie działał (animacja potrafiła stanąć w pewnym miejscu).  Zaznaczę że po wyłączeniu Timera2 problem nie występował. <br /><br />Timer0 używam do programowych zwalniaczy (dioda, przyciski itp), Timer2 do wysterowania PWM dla 0-16 taśm led poprzez ekspandera (obecnie podpięte zwykłe diody przez tranzystory). Udało mi się uzyskać 50Hz dla 128PWM'a, metodą &quot;diodową&quot; zmierzyłem że taki PWM zabiera mi około 35% czasu programu.<br /><br />kilka fragmentów kodów<br /><br />[syntax=c]void InitTimerPWM(void) {<br />TCCR2A |= (1 &lt;&lt; WGM21);//CTC<br />TCCR2B |= (1 &lt;&lt; CS22) | (1 &lt;&lt; CS20);//128<br />OCR2A = 24;//TC2 Output Compare Register A<br />TIMSK2 |= (1 &lt;&lt; OCIE2A); //Timer/Counter2, Output Compare A Match Interrupt Enable<br />}[/syntax]<br /><br />[syntax=c]static void i2cSetBitrate(uint16_t bitrateKHz){  //przekazuję w wartość 400, zatem SCL freq~ 0,77MHz<br />uint8_t bitrate_div;<br /><br />bitrate_div = ((F_CPU/10001)/bitrateKHz);<br />if (bitrate_div&gt;=16)<br />bitrate_div = (bitrate_div-16)/2;<br /><br />TWBR = bitrate_div;<br />}<br /><br />static void TWI_start(void){<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTA);<br />while(!(TWCR&amp;(1&lt;&lt;TWINT)));<br />}<br /><br />static void TWI_stop(void){<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN)|(1&lt;&lt;TWSTO);<br />while((TWCR&amp;(1&lt;&lt;TWSTO)));<br />}<br /><br />static void TWI_write(uint8_t bajt){<br />TWDR = bajt;<br />TWCR = (1&lt;&lt;TWINT)|(1&lt;&lt;TWEN);<br />while(!(TWCR&amp;(1&lt;&lt;TWINT)));<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12774">stanleygoldi</a> — 1 wrz 2019, o 22:18</p><hr />
]]></content>
</entry>
</feed>