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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-04-05T16:34:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=2207&amp;mode</id>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-02-03T04:01:08+01:00</updated>
<published>2013-02-03T04:01:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26689#p26689</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26689#p26689"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26689#p26689"><![CDATA[
Zatrybiło. Wieeeeelkie dzięki Panowie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <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=185">coolpablos</a> — 3 lut 2013, o 04:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-02-01T14:14:55+01:00</updated>
<published>2013-02-01T14:14:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26517#p26517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26517#p26517"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26517#p26517"><![CDATA[
Z tego co tu widzę to jednak masz niski poziom, a nie opadające zbocze i tu jest problem.<br />Linię:<br />[syntax=c]EICRA  &amp;= (1&lt;&lt;ISC21);[/syntax]<br />Zamień na:<br />[syntax=c]EICRA |= (1&lt;&lt;ISC21);  // zbocze opadające[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 1 lut 2013, o 14:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-02-01T13:56:21+01:00</updated>
<published>2013-02-01T13:56:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26515#p26515</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26515#p26515"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26515#p26515"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Odpaliłem kod u siebie na ATB z procesorem 644PA i kwarcem 16MHz. Działa w porządku. Może kolega pokaże ten fragment kodu z stmpe811.c i stmpe811.h, gdzie konfigurowane jest przerwanie.<br /></div><br /><br />Plik mk_stmpe811.h:<br />[syntax=c]<br />/*<br /> * mk_stmpe811.h<br /> *<br /> *  Created on: 2012-01-28<br /> *      Author: Mirosław Kardaś<br /> */<br /><br />#ifndef MK_STMPE811_H_<br />#define MK_STMPE811_H_<br /><br />//------------------------------------------ konfiguracja użytkownika<br /><br />// konfiguracja typu wyświetlacza - rozmiar w calach 3,5&quot; lub 4,3&quot;<br />#define TSC_TYP35<br />//#define TSC_TYP43<br /><br />// adres układu na magistrali I2C<br />#define _STMPE811_ADDR 0x88<br /><br />// wybór przerwania INTx oraz pinu przerwania<br />#define USE_IRQ_NR 0<br />#define IRQ_PORTPORTD<br />#define IRQ_DIRDDRD<br />#define IRQ_PIN (1&lt;&lt;PD2)<br />//------------------------------------------ koniec konfiguracji użytkownika<br />[/syntax]<br /><br />Plik stmpe811.c:<br /><br />[syntax=c]<br />#if USE_IRQ_NR == 0<br /><br />        IRQ_PORT        |= IRQ_PIN;<br />        EIMSK           |= (1&lt;&lt;INT2);<br />        EICRA           &amp;= (1&lt;&lt;ISC21); // zbocze opadające<br />#endif<br />[/syntax]<br /><br />[syntax=c]<br />// procedura obsługi przerwania INT x<br />#if USE_IRQ_NR == 0<br />ISR( INT2_vect ) {<br />#endif<br /><br />[/syntax]<br /><br />Działam na ATmega128A.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 1 lut 2013, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-04-05T16:34:22+01:00</updated>
<published>2013-02-01T13:02:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26508#p26508</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26508#p26508"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26508#p26508"><![CDATA[
Odpaliłem kod u siebie na ATB z procesorem 644PA i kwarcem 16MHz. Działa w porządku. Może kolega pokaże ten fragment kodu z stmpe811.c i stmpe811.h, gdzie konfigurowane jest przerwanie.<br />Plik 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;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_STMPE811/mk_stmpe811.h&quot;<br /><br />#include &quot;main.h&quot;<br /><br />#define version 0<br /><br />#if version<br />#define RED1 (1&lt;&lt;PE2)<br />#define RED2 (1&lt;&lt;PF2)<br />#define RED3 (1&lt;&lt;PF5)<br />#define GREEN1 (1&lt;&lt;PF0)<br />#define GREEN2 (1&lt;&lt;PF3)<br />#define GREEN3 (1&lt;&lt;PF6)<br />#define BLUE1 (1&lt;&lt;PF1)<br />#define BLUE2 (1&lt;&lt;PF4)<br />#define BLUE3 (1&lt;&lt;PF7)<br />#else<br />#define LED1_DDR DDRB<br />#define LEDS_DDR DDRD<br />#define LED1_PORT PORTB<br />#define LEDS_PORT PORTD<br /><br />#define RED1 (1&lt;&lt;PB0)<br />#define RED2 (1&lt;&lt;PD2)<br />#define RED3 (1&lt;&lt;PD5)<br />#define GREEN1 (1&lt;&lt;PD0)<br />#define GREEN2 (1&lt;&lt;PD3)<br />#define GREEN3 (1&lt;&lt;PD6)<br />#define BLUE1 (1&lt;&lt;PD1)<br />#define BLUE2 (1&lt;&lt;PD4)<br />#define BLUE3 (1&lt;&lt;PD7)<br />#endif<br /><br />uint8_t i = 0;<br />uint8_t scena = 0;              //scena świetlna domyślnie ustawiona na 0 (wybór sceny nr1)<br />uint8_t kasuj, oblicz, pwm;<br />int temp_suwak&#91;3&#93;;<br />//**************deklaracja położeń suwaków zapisanych w pamięci EEPROM***************<br />EEMEM uint8_t e_suwak_r&#91;3&#93;;<br />EEMEM uint8_t e_suwak_g&#91;3&#93;;<br />EEMEM uint8_t e_suwak_b&#91;3&#93;;<br />//**************deklaracja położeń suwaków odczytanych z pamięci EEPROM***************<br />int suwak_r&#91;3&#93;;<br />int suwak_g&#91;3&#93;;<br />int suwak_b&#91;3&#93;;<br />volatile uint8_t pwm_r&#91;3&#93;;<br />volatile uint8_t pwm_g&#91;3&#93;;<br />volatile uint8_t pwm_b&#91;3&#93;;<br /><br />//********************************* główna funkcja programu main() *******************************<br />int main(void) {<br />//****************odczyt ustawień suwaków i zapis do zmiennych programu*******<br />        for(i=0;i&lt;3;i++)                suwak_r&#91;i&#93; = eeprom_read_byte(&amp;e_suwak_r&#91;i&#93;);<br />        for(i=0;i&lt;3;i++)                suwak_g&#91;i&#93; = eeprom_read_byte(&amp;e_suwak_g&#91;i&#93;);<br />        for(i=0;i&lt;3;i++)                suwak_b&#91;i&#93; = eeprom_read_byte(&amp;e_suwak_b&#91;i&#93;);<br /><br />        i2cSetBitrate(400);                                                     // ustawienie prędkości magistrali I2C<br />        stmpe811_init();                                                        // INICJALIZACJA STMPE811<br />        tft_init();                                                             // inicjalizacja wyświetlacza LCD<br />        tft_cls(black);<br /><br />        setCurrentFont(&amp;DefaultFontInfo);<br />        sei();<br /><br />        ekran_glowny();<br />        polozania_poczatkowe_suwakow(0);<br />        tft_puts(172,63, &quot;  %&quot;, red, black);<br />        tft_puts(172,123, &quot;  %&quot;, green, black);<br />        tft_puts(172,183, &quot;  %&quot;, blue, black);<br />        for(i=0;i&lt;3;i++)        oblicz_procent(i);<br /><br />#if version<br />//***** PROGRAMOWY PWM - 9 KANAŁÓW *******<br />// ustawienie pinów kanałów programowych PWM jako WYJŚCIA<br />DDRE |= RED1;<br />DDRF |= RED2 | RED3 | GREEN1 | GREEN2 | GREEN3 | BLUE1 | BLUE2 | BLUE3;<br /><br />// ustawienia TIMER0 w tryb CTC<br />TCCR0 |= (1&lt;&lt;WGM01);                            // tryb  CTC<br />TCCR0 |= (1&lt;&lt;CS01);<br />OCR0 = 200;                                                     // dodatkowy podział częstotliwości<br />TIMSK |= (1&lt;&lt;OCIE0);                            // zezwolenie na przerwanie CompareMatch<br />#else<br />        //***** PROGRAMOWY PWM - 9 KANAŁÓW *******<br />        // ustawienie pinów kanałów programowych PWM jako WYJŚCIA<br /><br />LED1_DDR |= RED1;<br />LEDS_DDR |= RED2 | RED3 | GREEN1 | GREEN2 | GREEN3 | BLUE1 | BLUE2 | BLUE3;<br /><br />// ustawienia TIMER0 w tryb CTC<br />TCCR0A |= (1&lt;&lt;WGM01);       // tryb  CTC<br />TCCR0B |= (1&lt;&lt;CS01);        //preskaler 8<br />OCR0A = 150;                // dodatkowy podział częstotliwości<br />TIMSK0 |= (1&lt;&lt;OCIE0A);      // zezwolenie na przerwanie CompareMatch<br />#endif<br />for(i=0;i&lt;3;i++)        oblicz_pwm(i);<br /><br />        while(1)<br />        {<br />                if(st_intX_flag)<br />                {<br />                        st_intX_flag = 0;<br />                        oblicz_pwm(i); // i<br />                        obsluga_ekranu_dotykowego();<br />                }<br /><br />        }<br /><br />                                                                        }<br /><br />//********************************* koniec głównej funkcji programu main() *******************************<br />//*************************funkcja obliczająca wskazania procentowe położeń suwaków***********************//<br />void oblicz_pwm(uint8_t pwm)<br />{<br /><br /><br />        for(i=0;i&lt;3;i++) pwm_r&#91;i&#93; = suwak_r&#91;i&#93; - 35;<br />        for(i=0;i&lt;3;i++) pwm_g&#91;i&#93; = suwak_g&#91;i&#93; - 35;<br />        for(i=0;i&lt;3;i++) pwm_b&#91;i&#93; = suwak_b&#91;i&#93; - 35;<br /><br /><br />}<br /><br />void polozania_poczatkowe_suwakow(uint8_t scena)<br />{<br />        tft_fill_rect(suwak_r&#91;scena&#93;,25,4,27,red);<br />        tft_fill_rect(suwak_g&#91;scena&#93;,85,4,27,green);<br />        tft_fill_rect(suwak_b&#91;scena&#93;,145,4,27,blue);<br />        temp_suwak&#91;0&#93; = suwak_r&#91;scena&#93;;<br />        temp_suwak&#91;1&#93; = suwak_g&#91;scena&#93;;<br />        temp_suwak&#91;2&#93; = suwak_b&#91;scena&#93;;<br /><br />}<br />//***************funkcja kasowania wybranego suwaka***************//<br />void kasuj_suwak(uint8_t kasuj)<br />{<br />                if(kasuj == 0)<br />                {<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,25,4,11,black);<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,41,4,12,black);<br />                }<br />                if(kasuj == 1)<br />                {<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,85,4,11,black);<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,101,4,12,black);<br />                }<br />                if(kasuj == 2)<br />                {<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,145,4,11,black);<br />                tft_fill_rect(temp_suwak&#91;kasuj&#93;,161,4,12,black);<br />                }<br />}<br />void oblicz_procent(uint8_t oblicz)<br />{<br /><br />        switch(oblicz)<br />        {<br />        case 0:<br />                tft_putint(160,63,((temp_suwak&#91;0&#93; - 35)/2.55), black, black);<br />                tft_putint(160,63,((suwak_r&#91;scena&#93; - 35)/2.55), red, black);<br />                break;<br />        case 1:<br />                tft_putint(160,123,((temp_suwak&#91;1&#93; - 35)/2.55), black, black);<br />                tft_putint(160,123,((suwak_g&#91;scena&#93; - 35)/2.55), green, black);<br />                break;<br />        case 2:<br />                tft_putint(160,183,((temp_suwak&#91;2&#93; - 35)/2.55), black, black);<br />                tft_putint(160,183,((suwak_b&#91;scena&#93; - 35)/2.55), blue, black);<br />                break;<br />        default:  break;<br />        }<br /><br />}<br />//***************************** funkcja generująca ekran główny****************<br />void ekran_glowny(void)<br />{<br />        tft_fill_rect(35,37,255,3,red);<br />        tft_fill_rect(35,97,255,3,green);<br />        tft_fill_rect(35,157,255,3,blue);<br />        tft_round_rect(255,210, 60,22, 3, 1, blue,red);<br />        tft_puts(262,214,&quot;zapisz&quot;,white, red);<br />        wybor_sceny(scena);<br />}<br />//*******************procedura przełączania ustawień sceny świetlnej******************//<br />void wybor_sceny(uint8_t scena)<br />{<br />        switch(scena)<br />        {<br />        case 0:<br />                tft_round_rect(10,210, 53,22, 3, 1, silver,blue);<br />                tft_puts(17,214,&quot;scena 1&quot;,white, blue);<br />                tft_round_rect(83,210, 53,22, 3, 1, blue,silver);<br />                tft_round_rect(153,210, 53,22, 3, 1, blue,silver);<br />                tft_puts(87,214,&quot;scena 2&quot;,white, silver);<br />                tft_puts(157,214,&quot;scena 3&quot;,white, silver);<br />            break;<br /><br />        case 1:<br />                tft_round_rect(83,210, 53,22, 3, 1, silver,blue);<br />                tft_puts(87,214,&quot;scena 2&quot;,white, blue);<br />                tft_round_rect(10,210, 53,22, 3, 1, blue,silver);<br />                tft_round_rect(153,210, 53,22, 3, 1, blue,silver);<br />                tft_puts(17,214,&quot;scena 1&quot;,white, silver);<br />                tft_puts(157,214,&quot;scena 3&quot;,white, silver);<br />            break;<br /><br />        case 2:<br />                tft_round_rect(153,210, 53,22, 3, 1, silver,blue);<br />                tft_puts(157,214,&quot;scena 3&quot;,white, blue);<br />                tft_round_rect(10,210, 53,22, 3, 1, blue,silver);<br />                tft_round_rect(83,210, 53,22, 3, 1, blue,silver);<br />                tft_puts(87,214,&quot;scena 2&quot;,white, silver);<br />                tft_puts(17,214,&quot;scena 1&quot;,white, silver);<br />            break;<br /><br />        default:  break;<br />        }<br />}<br />void obsluga_ekranu_dotykowego(void)<br />{<br /><br />        int x=TP_X, y=TP_Y;// z=TP_Z;<br />        if(y&gt;22 &amp;&amp; y&lt;52 )<br />        {<br />        if(x&gt;290)       x = 290;<br />        if(x&lt;35)        x = 35;<br />        suwak_r&#91;scena&#93; = x;<br />        kasuj_suwak(0);   //suwak R<br />        oblicz_procent(0);<br /><br />        //<br />        }<br />        if(y&gt;82 &amp;&amp; y&lt;112 )<br />                {<br />                if(x&gt;290)       x = 290;<br />                if(x&lt;35)        x = 35;<br />                suwak_g&#91;scena&#93; = x;<br />                kasuj_suwak(1);   //suwak G<br />                oblicz_procent(1);<br /><br />                }<br />        if(y&gt;142 &amp;&amp; y&lt;172 )<br />                        {<br />                        if(x&gt;290)       x = 290;<br />                        if(x&lt;35)        x = 35;<br />                        suwak_b&#91;scena&#93; = x;<br />                        kasuj_suwak(2);  //suwak B<br />                        oblicz_procent(2);<br /><br />                        }<br />        //********obsługa dotyku przycisków********************//<br />        if(y&gt;215 &amp;&amp; y&lt;250)<br />        {<br />                if(x&gt;5 &amp;&amp; x&lt;68)         scena = 0;<br />                if(x&gt;78 &amp;&amp; x&lt;141)       scena = 1;<br />                if(x&gt;148 &amp;&amp; x&lt;211)      scena = 2;<br />                wybor_sceny(scena);<br />                for(i=0;i&lt;3;i++)        kasuj_suwak(i);<br />                for(i=0;i&lt;3;i++)        oblicz_procent(i);<br />        }<br />        //**********procedura zapisu do pamięci EEPROM*********//<br />        if(y&gt;215 &amp;&amp; y&lt;250 &amp;&amp; x&gt;250 &amp;&amp; x&lt;310)<br />        {<br />                eeprom_write_byte(&amp;e_suwak_r&#91;scena&#93;,suwak_r&#91;scena&#93;);<br />                eeprom_write_byte(&amp;e_suwak_g&#91;scena&#93;,suwak_g&#91;scena&#93;);<br />                eeprom_write_byte(&amp;e_suwak_b&#91;scena&#93;,suwak_b&#91;scena&#93;);<br />                tft_round_rect(255,210, 60,22, 3, 1, blue,green);<br />                tft_puts(262,214,&quot;zapisz&quot;,white, green);<br />                _delay_ms(750);<br />                tft_round_rect(255,210, 60,22, 3, 1, blue,red);<br />                tft_puts(262,214,&quot;zapisz&quot;,white, red);<br />        }<br />        polozania_poczatkowe_suwakow(scena);<br />}<br /><br />ISR( TIMER0_COMPA_vect )<br />{<br /><br />        static uint8_t cnt; // definicja licznika PWM<br />#if version<br />        // bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r&#91;0&#93;) PORTE &amp;= ~RED1;               else PORTE |= RED1;<br />if(cnt&gt;=pwm_r&#91;1&#93;) PORTF &amp;= ~RED2;               else PORTF |= RED2;<br />if(cnt&gt;=pwm_r&#91;2&#93;) PORTF &amp;= ~RED3;               else PORTF |= RED3;<br />if(cnt&gt;=pwm_g&#91;0&#93;) PORTF &amp;= ~GREEN1;     else PORTF |= GREEN1;<br />if(cnt&gt;=pwm_g&#91;1&#93;) PORTF &amp;= ~GREEN2;     else PORTF |= GREEN2;<br />if(cnt&gt;=pwm_g&#91;2&#93;) PORTF &amp;= ~GREEN3;     else PORTF |= GREEN3;<br />if(cnt&gt;=pwm_b&#91;0&#93;) PORTF &amp;= ~BLUE1;              else PORTF |= BLUE1;<br />if(cnt&gt;=pwm_b&#91;1&#93;) PORTF &amp;= ~BLUE2;              else PORTF |= BLUE2;<br />if(cnt&gt;=pwm_b&#91;2&#93;) PORTF &amp;= ~BLUE3;              else PORTF |= BLUE3;<br />#else<br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r&#91;0&#93;) LED1_PORT &amp;= ~RED1;else LED1_PORT |= RED1;<br />if(cnt&gt;=pwm_r&#91;1&#93;) LEDS_PORT &amp;= ~RED2;else LEDS_PORT |= RED2;<br />if(cnt&gt;=pwm_r&#91;2&#93;) LEDS_PORT &amp;= ~RED3;else LEDS_PORT |= RED3;<br />if(cnt&gt;=pwm_g&#91;0&#93;) LEDS_PORT &amp;= ~GREEN1;else LEDS_PORT |= GREEN1;<br />if(cnt&gt;=pwm_g&#91;1&#93;) LEDS_PORT &amp;= ~GREEN2;else LEDS_PORT |= GREEN2;<br />if(cnt&gt;=pwm_g&#91;2&#93;) LEDS_PORT &amp;= ~GREEN3;else LEDS_PORT |= GREEN3;<br />if(cnt&gt;=pwm_b&#91;0&#93;) LEDS_PORT &amp;= ~BLUE1;else LEDS_PORT |= BLUE1;<br />if(cnt&gt;=pwm_b&#91;1&#93;) LEDS_PORT &amp;= ~BLUE2;else LEDS_PORT |= BLUE2;<br />if(cnt&gt;=pwm_b&#91;2&#93;) LEDS_PORT &amp;= ~BLUE3;else LEDS_PORT |= BLUE3;<br />#endif<br />        cnt++;  // zwiększanie licznika o 1<br />}[/syntax]<br />Plik main.h<br />[syntax=c]/*<br /> * main.h<br /> *<br /> *  Created on: 27-01-2013<br /> */<br />#include &lt;stdint.h&gt;<br /><br />#ifndef MAIN_H_<br />#define MAIN_H_<br /><br />void oblicz_pwm(uint8_t pwm);<br />void polozania_poczatkowe_suwakow(uint8_t scena);<br />void kasuj_suwak(uint8_t kasuj);<br />void oblicz_procent(uint8_t oblicz);<br />void ekran_glowny(void);<br />void wybor_sceny(uint8_t scena);<br />void obsluga_ekranu_dotykowego(void);<br /><br />#endif /* MAIN_H_ */[/syntax]<br />Plik mk_stmpe811.h - początek:<br />[syntax=c]/*<br /> * mk_stmpe811.h<br /> *<br /> *  Created on: 2012-01-28<br /> *      Author: Mirosław Kardaś<br /> */<br /><br />#ifndef MK_STMPE811_H_<br />#define MK_STMPE811_H_<br /><br />//------------------------------------------ konfiguracja użytkownika<br /><br />// konfiguracja typu wyświetlacza - rozmiar w calach 3,5&quot; lub 4,3&quot;<br />#define TSC_TYP35<br />//#define TSC_TYP43<br /><br />// adres układu na magistrali I2C<br />#define _STMPE811_ADDR 0x88<br /><br />// wybór przerwania INTx oraz pinu przerwania<br />#define USE_IRQ_NR 2<br />#define IRQ_PORTPORTB<br />#define IRQ_DIRDDRB<br />#define IRQ_PIN (1 &lt;&lt; PB2)<br />//------------------------------------------ koniec konfiguracji użytkownika[/syntax]<br />Plik stmpe811.c - fragment<br />[syntax=c]#if defined(_AVR_IOM32_H) || defined (_AVR_IOM32A_H) || defined(_AVR_IOM16_H_) || defined(_AVR_ATmega16A_H_)<br /><br />#if USE_IRQ_NR == 0<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT0);<br />MCUCR |= (1&lt;&lt;ISC01); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 1<br />// inicjalizacja przerwania synchronicznego INT1<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT1);<br />MCUCR |= (1&lt;&lt;ISC11);// zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 2<br />// inicjalizacja przerwania asynchronicznego INT2<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />GICR |= (1&lt;&lt;INT2);<br />//MCUCSR &amp;= ~(1&lt;&lt;ISC2);// zbocze opadające<br />#endif<br />#elif defined(_AVR_IOM644P_H_) || defined(_AVR_IOM644PA_H_)<br />#if USE_IRQ_NR == 0<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT0);<br />EICRA |= (1 &lt;&lt; ISC01); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 1<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT1);<br />EICRA |= (1 &lt;&lt; ISC11); // zbocze opadające<br />#endif<br /><br />#if USE_IRQ_NR == 2<br />// inicjalizacja przerwania synchronicznego INT0<br />//IRQ_DIR &amp;= ~IRQ_PIN;<br />IRQ_PORT |= IRQ_PIN;<br />EIMSK |= (1 &lt;&lt; INT2);<br />EICRA |= (1 &lt;&lt; ISC21); // zbocze opadające<br />#endif<br />#endif[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 1 lut 2013, o 13:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-01-31T21:30:59+01:00</updated>
<published>2013-01-31T21:30:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26465#p26465</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26465#p26465"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26465#p26465"><![CDATA[
Krauser --&gt; mam pytanie - czy ty gdy pisałeś swój sofcik na taki LCD to korzystałeś z jakiegoś timera ??? bo tu jest dziwna rzecz - rozmawiałem z kolegą przez Skype i oglądałem kod na żywo ... rzeczywiście nawet pusta procedura timera powoduje że po prostu jakby STMPE nie generował przerwań na linii IRQ - sprawdzane oscylem ponoć. A procek nie jest zawieszony - działa sobie dalej<br /><br />więc interesuje mnie czy ktoś korzystał właśnie z jakichś przerwań od timerów przy takich LCD - dziwna rzecz - albo coś sprzętowo nie tak ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 sty 2013, o 21:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2013-01-31T20:37:22+01:00</updated>
<published>2013-01-31T20:37:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26459#p26459</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26459#p26459"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26459#p26459"><![CDATA[
A spróbuj ustawić prescaler timera na np. 64 lub 256.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 31 sty 2013, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-31T19:54:07+01:00</updated>
<published>2013-01-31T19:54:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26456#p26456</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26456#p26456"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26456#p26456"><![CDATA[
Jeszcze tylko sprawdź czy pomaga zmniejszenie prędkości I2C<br />[syntax=c]i2cSetBitrate(100);                                                     // ustawienie prędkości magistrali I2C &lt;----100k[/syntax]<br />Mam ten wyświetlacz to sprawdzę to, ale na atmega644PA.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 31 sty 2013, o 19:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-31T19:48:46+01:00</updated>
<published>2013-01-31T19:48:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26453#p26453</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26453#p26453"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26453#p26453"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Sprawdź co się stanie jak wyłączysz linie kodu odpowiedzialne za ustawianie wyjść<br /></div><br /><br />Układ działa bez zmian (&quot;zawiesza się&quot;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 31 sty 2013, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-31T19:41:01+01:00</updated>
<published>2013-01-31T19:41:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26451#p26451</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26451#p26451"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26451#p26451"><![CDATA[
<div class="quotetitle">coolpablos napisał(a):</div><div class="quotecontent"><br />Dziś zrobiłem pomiary oscyloskopem i zauważyłem, że STMPE811 nie generuje przerwania, tzn. generuje tylko kilka imulsów i koniec. Ilość tych impusów ściśle zależy od ustawionej częstotliowści PWM - im większa częstotliwość, tym szybciej układ się &quot;zawiesi&quot;.<br /></div><br /><br />Sprawdź co się stanie jak wyłączysz linie kodu odpowiedzialne za ustawianie wyjść:<br />[syntax=c]ISR( TIMER0_COMP_vect )<br />{<br /> <br />        static uint8_t cnt; // definicja licznika PWM<br />#if 0 //wyłączenie sterowania wyjściami<br />        // bezpośrednie sterowanie wyjściami kanałów PWM<br />        if(cnt&gt;=pwm_r[0]) PORTE &amp;= ~RED1;               else PORTE |= RED1;<br />        if(cnt&gt;=pwm_r[1]) PORTF &amp;= ~RED2;               else PORTF |= RED2;<br />        if(cnt&gt;=pwm_r[2]) PORTF &amp;= ~RED3;               else PORTF |= RED3;<br />        if(cnt&gt;=pwm_g[0]) PORTF &amp;= ~GREEN1;     else PORTF |= GREEN1;<br />        if(cnt&gt;=pwm_g[1]) PORTF &amp;= ~GREEN2;     else PORTF |= GREEN2;<br />        if(cnt&gt;=pwm_g[2]) PORTF &amp;= ~GREEN3;     else PORTF |= GREEN3;<br />        if(cnt&gt;=pwm_b[0]) PORTF &amp;= ~BLUE1;              else PORTF |= BLUE1;<br />        if(cnt&gt;=pwm_b[1]) PORTF &amp;= ~BLUE2;              else PORTF |= BLUE2;<br />        if(cnt&gt;=pwm_b[2]) PORTF &amp;= ~BLUE3;              else PORTF |= BLUE3;<br />#endif<br />        cnt++;  // zwiększanie licznika o 1<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 31 sty 2013, o 19:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-31T19:22:36+01:00</updated>
<published>2013-01-31T19:22:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26447#p26447</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26447#p26447"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26447#p26447"><![CDATA[
<div class="quotetitle">Malutki_27 napisał(a):</div><div class="quotecontent"><br />Bry <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />A ja się z ciekawości zapytam z jaką częstotliwością popędzasz uC ? Bo 9 programowych timerów to nie w kij dmuchał .........<br /></div><br /><br />Atmega128A@16MHz na zewnętrznym kwarcu<br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Kasowanie flagi jest na końcu, a nie na początku.<br /></div><br />To również nie przyniosło żadnych efektów.<br /><br />Dziś zrobiłem pomiary oscyloskopem i zauważyłem, że STMPE811 nie generuje przerwania, tzn. generuje tylko kilka imulsów i koniec. Ilość tych impusów ściśle zależy od ustawionej częstotliowści PWM - im większa częstotliwość, tym szybciej układ się &quot;zawiesi&quot;.<br /><br />Sprawa ma się całkowicie inaczej gdy umieszczam w komentarzach konfigurację licznika:<br /><br />[syntax=c]<br />TCCR0 |= (1&lt;&lt;WGM01);                            // tryb  CTC<br /><br />                        TCCR0 |= (1&lt;&lt;CS01);             <br /><br />                        OCR0 = 200;                                                     // dodatkowy podział częstotliwości<br /><br />                        TIMSK |= (1&lt;&lt;OCIE0);                            // zezwolenie na przerwanie CompareMatch[/syntax]<br /><br />Po załadowaniu tak skompilowanego programu przerwania od STMPE811 są generowane normalnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 31 sty 2013, o 19:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Malutki_27]]></name></author>
<updated>2013-01-31T12:55:48+01:00</updated>
<published>2013-01-31T12:55:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26413#p26413</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26413#p26413"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26413#p26413"><![CDATA[
Bry <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />A ja się z ciekawości zapytam z jaką częstotliwością popędzasz uC ? Bo 9 programowych timerów to nie w kij dmuchał .........<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=225">Malutki_27</a> — 31 sty 2013, o 12:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-28T20:43:32+01:00</updated>
<published>2013-01-28T20:43:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26130#p26130</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26130#p26130"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26130#p26130"><![CDATA[
Spróbuj tak:<br />[syntax=c]if(st_intX_flag)<br />{<br />   oblicz_pwm();<br />   obsluga_ekranu_dotykowego();<br />   st_intX_flag = 0; //kasowanie flagi <br />}[/syntax]<br />Kasowanie flagi jest na końcu, a nie na początku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 sty 2013, o 20:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2013-01-28T20:20:14+01:00</updated>
<published>2013-01-28T20:20:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26124#p26124</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26124#p26124"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26124#p26124"><![CDATA[
Timer zawsze będzie działać bo wykonuje niezależnie od reszty programu, ja bym spróbował, wywalić na razie zapis do eeprom, albo zwiększyc prescalera timera do 64 (oczywiście jeśli nie będzie migotanie występowało), może być również tak, że brakuje miejsca na stos, chociaż nie masz tam dużych tablic, struktur więc raczej w to wątpię, ale zawsze taka możliwość istnieje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 28 sty 2013, o 20:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-28T17:44:23+01:00</updated>
<published>2013-01-28T17:44:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26101#p26101</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26101#p26101"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26101#p26101"><![CDATA[
<div class="quotetitle">krafin napisał(a):</div><div class="quotecontent"><br />To ja bym proponował wywalenie (zakomentowanie) obsługi buttonow na lcd, a zostawić pwm, i odczyt dotyku a jego dane wyświetlać gdzieś na lcd, aby było wiadomo czy faktycznie i2c i dotyk zaczynają szwankować, czy to jednak obsługa tych buttonow nie działa.<br /></div><br /><br />Właśnie o to chodzi, że program z &quot;czystą obsługą&quot; wyświetlacza działa. Mam na myśli przesuwanie suwaczków, wciskanie buttonów, zapis do EEPROM. Dopiero w momencie gdy dołączam część z PWM komunikacja się I2C się zawiesza kilku wykrytych dotykach, tzn. włączam urządzenie dotykam kilka razy wyświetlacza, zmieniam nastawy i boom - reakcja na dotyk zanika. Czasami zawiesza się po piewszym dotyku, czasami po 20.<br />Odczytywanie flagi przerwania działa - sprawdziłem to na prostym programiku który zmienia kolor tła przy każdym dotyku z czarnego na biały i odwrotnie. <br />Sam procesor też działa i o dziwo timer działał również, pomimo błędów w programie na które koledzy wyżej zwrócili uwagę. Sprawdziłem to robiąc prosty licznik - dodałem kilka linii kodu który zliczał sekundy. Stan licznika wyświetlany był na ekranie. Dodałem to do programu, który wkleiłem w pierwszym poście i to działało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 28 sty 2013, o 17:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2013-01-28T16:36:30+01:00</updated>
<published>2013-01-28T16:36:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26066#p26066</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26066#p26066"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26066#p26066"><![CDATA[
To ja bym proponował wywalenie (zakomentowanie) obsługi buttonow na lcd, a zostawić pwm, i odczyt dotyku a jego dane wyświetlać gdzieś na lcd, aby było wiadomo czy faktycznie i2c i dotyk zaczynają szwankować, czy to jednak obsługa tych buttonow nie działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 28 sty 2013, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-28T13:46:39+01:00</updated>
<published>2013-01-28T13:46:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26052#p26052</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26052#p26052"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26052#p26052"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />A w konfiguracji timera 0 używasz bitu WGM21 z rejestrów timera 2. Kompilator nic nie powie, ale jak czasem taki bit będzie na innej pozycji w to nie wiadomo o co chodzi. Oczywiście trudniej się sprawdza. Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.<br /></div><br /><br />W zamyśle miał być timer0. Nie wiem dlaczego wpisałem WGM21  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> Co dziwne generowanie PWM działało poprawnie na programie który wklejiłem (fakt sprawdzony oscyloskopem)<br /><br /><div class="quotetitle">krafin napisał(a):</div><div class="quotecontent"><br />Ja proponuje zobaczyć w pliku lss w przerwaniu, czy aby na pewno zmienna cnt jest alokowana w ram a nie np. w rejestrze, niby static powinien to załatwić, jednak wolałbym sprawdzić, albo jeszcze lepiej zadeklaruj ją jako globalną volatile.<br /></div><br /><br />PWM działa, co wydaje mi się, jest potwierdzeniem poprawności tej linijki kodu.<br /><br /><div class="quotetitle">krafin napisał(a):</div><div class="quotecontent"><br />Druga rzecz to nie pilnujesz aby zmienna cnt się nie przepełniła, a wystarczy jeden if().<br /></div><br /><br />[syntax=c]<br />static uint8_t cnt; // definicja licznika PWM<br />[/syntax]<br />cnt jest deklarowany jako zmienna 8 bitowa, inkrementacja wartości cnt=255 powoduje przypisanie cnt=0 (chyba <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />) jeżeli się mylę poprawcie mnie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />1. Swój post możesz edytować. Wtedy inni (chętni do pomocy) nie będą zagubieni. Polecam również znaczniki syntax=c<br /></div><br />Zrobione. <br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />2. Ten timer to ma mieć preskaler 1024 ?<br /></div><br />Wg założeń teoretycznych miał być taki, jednak nie zgadzały się częstotliwości generowanego PWM-a, dlatego zacząłem kombinować (aktualnie jest ustawiony na 8). Naniosłem poprawki do wklejonego kodu.<br />Teraz to wogóle jestem zaskoczony, że generownie PWM działało.<br /><div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />3. Masz zewnętrzne rezystory podciągające na magistrali I2C ?<br /></div><br />Tak, 4,7k<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 28 sty 2013, o 13:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-28T13:04:50+01:00</updated>
<published>2013-01-28T13:04:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26046#p26046</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26046#p26046"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26046#p26046"><![CDATA[
1. Swój post możesz edytować. Wtedy inni (chętni do pomocy) nie będą zagubieni. Polecam również znaczniki syntax=c<br />2. Ten timer to ma mieć preskaler 1024 ?<br />3. Masz zewnętrzne rezystory podciągające na magistrali I2C ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 sty 2013, o 13:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krafin]]></name></author>
<updated>2013-01-28T13:00:44+01:00</updated>
<published>2013-01-28T13:00:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26044#p26044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26044#p26044"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26044#p26044"><![CDATA[
Ja proponuje zobaczyć w pliku lss w przerwaniu, czy aby na pewno zmienna cnt jest alokowana w ram a nie np. w rejestrze, niby static powinien to załatwić, jednak wolałbym sprawdzić, albo jeszcze lepiej zadeklaruj ją jako globalną volatile.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Druga rzecz to nie pilnujesz aby zmienna cnt się nie przepełniła, a wystarczy jeden if().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=487">krafin</a> — 28 sty 2013, o 13:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-01-28T12:53:52+01:00</updated>
<published>2013-01-28T12:53:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26042#p26042</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26042#p26042"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26042#p26042"><![CDATA[
<div class="quotetitle">Krauser napisał(a):</div><div class="quotecontent"><br />Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.<br /></div><br /><br />Jak widać nie tylko sobie ale i innym, do których się zwraca z pytaniem<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 sty 2013, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-28T12:50:37+01:00</updated>
<published>2013-01-28T12:50:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26041#p26041</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26041#p26041"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26041#p26041"><![CDATA[
Ale babol. Poprawiłem i bez zmian <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=185">coolpablos</a> — 28 sty 2013, o 12:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-28T12:39:24+01:00</updated>
<published>2013-01-28T12:39:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26037#p26037</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26037#p26037"/>
<title type="html"><![CDATA[Re: Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26037#p26037"><![CDATA[
Na razie zobaczyłem tylko taką podejrzaną konfigurację:<br />[syntax=c]#define RED1 (PE2&lt;&lt;1)<br />#define RED2 (PF2&lt;&lt;1)<br />#define RED3 (PF5&lt;&lt;1)<br />#define GREEN1 (PF0 &lt;&lt;1)<br />#define GREEN2 (PF3 &lt;&lt;1)<br />#define GREEN3 (PF6 &lt;&lt;1)<br />#define BLUE1 (PF1&lt;&lt;1)<br />#define BLUE2 (PF4&lt;&lt;1)<br />#define BLUE3 (PF7&lt;&lt;1)[/syntax]<br />Zamiast np.<br />[syntax=c]#define RED2 (1&lt;&lt;PF2)[/syntax]<br />A w konfiguracji timera 0 używasz bitu WGM21 z rejestrów timera 2. Kompilator nic nie powie, ale jak czasem taki bit będzie na innej pozycji w to nie wiadomo o co chodzi. Oczywiście trudniej się sprawdza. Komentarze niezgodne z prawdą to też utrudnianie sobie roboty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 28 sty 2013, o 12:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-01-28T14:24:10+01:00</updated>
<published>2013-01-28T11:41:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26033#p26033</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26033#p26033"/>
<title type="html"><![CDATA[Timer zakłóca pracę I2C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2207&amp;p=26033#p26033"><![CDATA[
Witam,<br />Jestem w trakcie kończenia projektu trzykanałowego sterownika RGB z użyciem wyświetlacza opisanego w drugiej książce Mirka. Napotkałem na duży problem: timer od progamowej generacji PWM powoduje zawieszanie się komunikacjii I2C, tzn. następuje brak reakcji na dotyk; po zakomentowaniu wszystkich elementów odpowiedzialnych za działanie timera (włącznie z jego konfiguracją) wyświetlacz śmiga aż miło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Domyślam się, że zrobiłem jakiś głupi błąd w programie, ale sam nie jestem w stanie  tego rozwiązać. Proszę o pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Poniżej kod programu:<br /><br /><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;string.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br />#include &quot;MK_SSD1963/MK_SSD1963.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br />#include &quot;MK_STMPE811/mk_stmpe811.h&quot;<br /><br />#define RED1 (1&lt;&lt;PE2)<br />#define RED2 (1&lt;&lt;PF2)<br />#define RED3 (1&lt;&lt;PF5)<br />#define GREEN1 (1&lt;&lt;PF0)<br />#define GREEN2 (1&lt;&lt;PF3)<br />#define GREEN3 (1&lt;&lt;PF6)<br />#define BLUE1 (1&lt;&lt;PF1)<br />#define BLUE2 (1&lt;&lt;PF4)<br />#define BLUE3 (1&lt;&lt;PF7)<br /><br /><br />uint8_t i = 0;<br />uint8_t scena = 0;//scena świetlna domyślnie ustawiona na 0 (wybór sceny nr1)<br />uint8_t kasuj, oblicz, pwm;<br />int temp_suwak[3];<br />//**************deklaracja położeń suwaków zapisanych w pamięci EEPROM***************<br />EEMEM uint8_t e_suwak_r[3];<br />EEMEM uint8_t e_suwak_g[3];<br />EEMEM uint8_t e_suwak_b[3];<br />//**************deklaracja położeń suwaków odczytanych z pamięci EEPROM***************<br />int suwak_r[3];<br />int suwak_g[3];<br />int suwak_b[3];<br />volatile uint8_t pwm_r[3];<br />volatile uint8_t pwm_g[3];<br />volatile uint8_t pwm_b[3];<br /><br />//********************************* główna funkcja programu main() *******************************<br />int main(void) {<br />//****************odczyt ustawień suwaków i zapis do zmiennych programu*******<br />for(i=0;i&lt;3;i++)suwak_r[i] = eeprom_read_byte(&amp;e_suwak_r[i]);<br />for(i=0;i&lt;3;i++)suwak_g[i] = eeprom_read_byte(&amp;e_suwak_g[i]);<br />for(i=0;i&lt;3;i++)suwak_b[i] = eeprom_read_byte(&amp;e_suwak_b[i]);<br /><br />i2cSetBitrate(400);// ustawienie prędkości magistrali I2C<br />stmpe811_init(); // INICJALIZACJA STMPE811<br />tft_init(); // inicjalizacja wyświetlacza LCD<br />tft_cls(black);<br /><br />setCurrentFont(&amp;DefaultFontInfo);<br />sei();<br /><br />ekran_glowny();<br />polozania_poczatkowe_suwakow(0);<br />tft_puts(172,63, &quot;  %&quot;, red, black);<br />tft_puts(172,123, &quot;  %&quot;, green, black);<br />tft_puts(172,183, &quot;  %&quot;, blue, black);<br />for(i=0;i&lt;3;i++)oblicz_procent(i);<br /><br />//***** PROGRAMOWY PWM - 9 KANAŁÓW *******<br />// ustawienie pinów kanałów programowych PWM jako WYJŚCIA<br />DDRE |= RED1;<br />DDRF |= RED2 | RED3 | GREEN1 | GREEN2 | GREEN3 | BLUE1 | BLUE2 | BLUE3;<br /><br />// ustawienia TIMER0 w tryb CTC<br />TCCR0 |= (1&lt;&lt;WGM01);// tryb  CTC<br />TCCR0 |= (1&lt;&lt;CS01);<br />OCR0 = 200;// dodatkowy podział częstotliwości<br />TIMSK |= (1&lt;&lt;OCIE0);// zezwolenie na przerwanie CompareMatch<br /><br />for(i=0;i&lt;3;i++)oblicz_pwm(i);<br /><br />while(1)<br />{<br />if(st_intX_flag)<br />{<br />st_intX_flag = 0;<br />oblicz_pwm();<br />obsluga_ekranu_dotykowego();<br />}<br /><br />}<br /><br />}<br /><br />//********************************* koniec głównej funkcji programu main() *******************************<br />//*************************funkcja obliczająca wskazania procentowe położeń suwaków***********************//<br />void oblicz_pwm(pwm)<br />{<br /><br /><br />for(i=0;i&lt;3;i++) pwm_r[i] = suwak_r[i] - 35;<br />for(i=0;i&lt;3;i++) pwm_g[i] = suwak_g[i] - 35;<br />for(i=0;i&lt;3;i++) pwm_b[i] = suwak_b[i] - 35;<br /><br /><br />}<br /><br />void polozania_poczatkowe_suwakow(scena)<br />{<br />tft_fill_rect(suwak_r[scena],25,4,27,red);<br />tft_fill_rect(suwak_g[scena],85,4,27,green);<br />tft_fill_rect(suwak_b[scena],145,4,27,blue);<br />temp_suwak[0] = suwak_r[scena];<br />temp_suwak[1] = suwak_g[scena];<br />temp_suwak[2] = suwak_b[scena];<br /><br />}<br />//***************funkcja kasowania wybranego suwaka***************//<br />void kasuj_suwak(kasuj)<br />{<br />if(kasuj == 0)<br />{<br />tft_fill_rect(temp_suwak[kasuj],25,4,11,black);<br />tft_fill_rect(temp_suwak[kasuj],41,4,12,black);<br />}<br />if(kasuj == 1)<br />{<br />tft_fill_rect(temp_suwak[kasuj],85,4,11,black);<br />tft_fill_rect(temp_suwak[kasuj],101,4,12,black);<br />}<br />if(kasuj == 2)<br />{<br />tft_fill_rect(temp_suwak[kasuj],145,4,11,black);<br />tft_fill_rect(temp_suwak[kasuj],161,4,12,black);<br />}<br />}<br />void oblicz_procent(oblicz)<br />{<br /><br />switch(oblicz)<br />{<br />case 0:<br />tft_putint(160,63,((temp_suwak[0] - 35)/2.55), black, black);<br />tft_putint(160,63,((suwak_r[scena] - 35)/2.55), red, black);<br />break;<br />case 1:<br />tft_putint(160,123,((temp_suwak[1] - 35)/2.55), black, black);<br />tft_putint(160,123,((suwak_g[scena] - 35)/2.55), green, black);<br />break;<br />case 2:<br />tft_putint(160,183,((temp_suwak[2] - 35)/2.55), black, black);<br />tft_putint(160,183,((suwak_b[scena] - 35)/2.55), blue, black);<br />break;<br />default:  break;<br />}<br /><br />}<br />//***************************** funkcja generująca ekran główny****************<br />void ekran_glowny(void)<br />{<br />tft_fill_rect(35,37,255,3,red);<br />tft_fill_rect(35,97,255,3,green);<br />tft_fill_rect(35,157,255,3,blue);<br />tft_round_rect(255,210, 60,22, 3, 1, blue,red);<br />tft_puts(262,214,&quot;zapisz&quot;,white, red);<br />wybor_sceny(scena);<br />}<br />//*******************procedura przełączania ustawień sceny świetlnej******************//<br />void wybor_sceny(scena)<br />{<br />switch(scena)<br />{<br />case 0:<br />tft_round_rect(10,210, 53,22, 3, 1, silver,blue);<br />tft_puts(17,214,&quot;scena 1&quot;,white, blue);<br />tft_round_rect(83,210, 53,22, 3, 1, blue,silver);<br />tft_round_rect(153,210, 53,22, 3, 1, blue,silver);<br />tft_puts(87,214,&quot;scena 2&quot;,white, silver);<br />tft_puts(157,214,&quot;scena 3&quot;,white, silver);<br />    break;<br /><br />case 1:<br />tft_round_rect(83,210, 53,22, 3, 1, silver,blue);<br />tft_puts(87,214,&quot;scena 2&quot;,white, blue);<br />tft_round_rect(10,210, 53,22, 3, 1, blue,silver);<br />tft_round_rect(153,210, 53,22, 3, 1, blue,silver);<br />tft_puts(17,214,&quot;scena 1&quot;,white, silver);<br />tft_puts(157,214,&quot;scena 3&quot;,white, silver);<br />    break;<br /><br />case 2:<br />tft_round_rect(153,210, 53,22, 3, 1, silver,blue);<br />tft_puts(157,214,&quot;scena 3&quot;,white, blue);<br />tft_round_rect(10,210, 53,22, 3, 1, blue,silver);<br />tft_round_rect(83,210, 53,22, 3, 1, blue,silver);<br />tft_puts(87,214,&quot;scena 2&quot;,white, silver);<br />tft_puts(17,214,&quot;scena 1&quot;,white, silver);<br />    break;<br /><br />default:  break;<br />}<br />}<br />void obsluga_ekranu_dotykowego(void)<br />{<br /><br />int x=TP_X, y=TP_Y;// z=TP_Z;<br />if(y&gt;22 &amp;&amp; y&lt;52 )<br />{<br />if(x&gt;290)x = 290;<br />if(x&lt;35)x = 35;<br />suwak_r[scena] = x;<br />kasuj_suwak(0);  //suwak R<br />oblicz_procent(0);<br /><br />//<br />}<br />if(y&gt;82 &amp;&amp; y&lt;112 )<br />{<br />if(x&gt;290)x = 290;<br />if(x&lt;35)x = 35;<br />suwak_g[scena] = x;<br />kasuj_suwak(1);   //suwak G<br />oblicz_procent(1);<br /><br />}<br />if(y&gt;142 &amp;&amp; y&lt;172 )<br />{<br />if(x&gt;290)x = 290;<br />if(x&lt;35)x = 35;<br />suwak_b[scena] = x;<br />kasuj_suwak(2);  //suwak B<br />oblicz_procent(2);<br /><br />}<br />//********obsługa dotyku przycisków********************//<br />if(y&gt;215 &amp;&amp; y&lt;250)<br />{<br />if(x&gt;5 &amp;&amp; x&lt;68)scena = 0;<br />if(x&gt;78 &amp;&amp; x&lt;141)scena = 1;<br />if(x&gt;148 &amp;&amp; x&lt;211)scena = 2;<br />wybor_sceny(scena);<br />for(i=0;i&lt;3;i++)kasuj_suwak(i);<br />for(i=0;i&lt;3;i++)oblicz_procent(i);<br />}<br />//**********procedura zapisu do pamięci EEPROM*********//<br />if(y&gt;215 &amp;&amp; y&lt;250 &amp;&amp; x&gt;250 &amp;&amp; x&lt;310)<br />{<br />eeprom_write_byte(&amp;e_suwak_r[scena],suwak_r[scena]);<br />eeprom_write_byte(&amp;e_suwak_g[scena],suwak_g[scena]);<br />eeprom_write_byte(&amp;e_suwak_b[scena],suwak_b[scena]);<br />tft_round_rect(255,210, 60,22, 3, 1, blue,green);<br />tft_puts(262,214,&quot;zapisz&quot;,white, green);<br />_delay_ms(750);<br />tft_round_rect(255,210, 60,22, 3, 1, blue,red);<br />tft_puts(262,214,&quot;zapisz&quot;,white, red);<br />}<br />polozania_poczatkowe_suwakow(scena);<br />}<br /><br />ISR( TIMER0_COMP_vect )<br />{<br /><br />static uint8_t cnt; // definicja licznika PWM<br />// bezpośrednie sterowanie wyjściami kanałów PWM<br />if(cnt&gt;=pwm_r[0]) PORTE &amp;= ~RED1; else PORTE |= RED1;<br />if(cnt&gt;=pwm_r[1]) PORTF &amp;= ~RED2;else PORTF |= RED2;<br />if(cnt&gt;=pwm_r[2]) PORTF &amp;= ~RED3; else PORTF |= RED3;<br />if(cnt&gt;=pwm_g[0]) PORTF &amp;= ~GREEN1; else PORTF |= GREEN1;<br />if(cnt&gt;=pwm_g[1]) PORTF &amp;= ~GREEN2; else PORTF |= GREEN2;<br />if(cnt&gt;=pwm_g[2]) PORTF &amp;= ~GREEN3; else PORTF |= GREEN3;<br />if(cnt&gt;=pwm_b[0]) PORTF &amp;= ~BLUE1;else PORTF |= BLUE1;<br />if(cnt&gt;=pwm_b[1]) PORTF &amp;= ~BLUE2; else PORTF |= BLUE2;<br />if(cnt&gt;=pwm_b[2]) PORTF &amp;= ~BLUE3; else PORTF |= BLUE3;<br />cnt++;// zwiększanie licznika o 1<br /><br /><br />}<br />[/syntax]<br /><br /><span style="color: #FF0000">Kod programu w C umieszczamy w znacznikach 'syntax=c'...</span><br /><br /><br /><br /><br />Edit:<br />Zapomniałem dodać, że jako sterownika ekranu używam STMPE811 <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=185">coolpablos</a> — 28 sty 2013, o 11:41</p><hr />
]]></content>
</entry>
</feed>