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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-30T12:19:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=46&amp;t=12473&amp;mode</id>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2015-07-30T12:19:33+01:00</updated>
<published>2015-07-30T12:19:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135861#p135861</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135861#p135861"/>
<title type="html"><![CDATA[Re: Nie działające Compare Match w Kinetisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135861#p135861"><![CDATA[
Up<br />Naprawdę nikt nic? Próbowałem zrobić PWM. Przerwanie elegancko działa, jedynie co nie chce działać to właśnie wyjście sterowane przez timer. <br />Może żeby korzystać z wyjść timera TPMx_Chn muszę włączyć coś jeszcze?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 30 lip 2015, o 12:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Juffre]]></name></author>
<updated>2015-07-29T16:22:35+01:00</updated>
<published>2015-07-29T16:22:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135810#p135810</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135810#p135810"/>
<title type="html"><![CDATA[Nie działające Compare Match w Kinetisie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12473&amp;p=135810#p135810"><![CDATA[
Siema <br />Mam problem z obsługą Compare Match na płytce KL46Z.<br />Zainicjowałem sobie Timer0, ustawiłem prawidłowo kanały tego timera. Następnie zainicjalizowałem piny odpowiadające za sterowanie wyjściami compare match.<br /><br />Przerwanie działa jednakże, nie togglóje mi pinu wyjściowego.<br /><br />W programie korzystam z bibliotek CMSIS.<br />[syntax=c]/*<br />*Topic: <br />*<br />*Author:  Juffre<br />*<br />*/<br /><br />#include &quot;MKL46Z4.h&quot;<br /><br />#define LED1 5  // dioda jest podpięta do PTD5<br />#define LED1_MASK (1&lt;&lt;5)<br /><br />#define LED2 29  // dioda podpięta jest do PTE29<br />#define LED2_MASK (1&lt;&lt;29)<br /><br /><br />/* DEKLARACJE FUNCKJI */<br />void GPIO_init(void);<br />void TPM0_init(void);<br /><br />/* MAIN */<br />int main(void)<br />{<br />/* INICJALIZACJA */<br /><br />GPIO_init();<br />TPM0_init();<br /><br />/* PĘTLA */<br />while(1)<br />{<br /><br /><br />} // end of while(1)<br /><br /><br />}  // end of main() function<br /><br />/*CIAŁA FUNCKJI */<br />void GPIO_init(void)<br />{<br />SIM-&gt;SCGC5 |=SIM_SCGC5_PORTD_MASK | SIM_SCGC5_PORTE_MASK;// taktowanie dla portów <br /><br />PORTD-&gt;PCR&#91;LED1&#93; =PORT_PCR_MUX(4);<br />PTD-&gt;PDDR |= LED1_MASK;<br /><br />PORTE-&gt;PCR&#91;LED2&#93; =PORT_PCR_MUX(4);<br />PTE-&gt;PDDR |= LED2_MASK;<br /><br />}<br /><br />void TPM0_init(void)<br />{<br /><br />/* SEKCJA TAKTOWANIA TIMERA */<br />SIM-&gt;SOPT2 |= SIM_SOPT2_TPMSRC(3);// MCGIRCLK jako źródło sygnału taktującego timer<br />SIM-&gt;SCGC6 |= SIM_SCGC6_TPM0_MASK;// włączenie taktowania dla TMP0<br /><br />MCG-&gt;C2 &amp;=~(MCG_C2_IRCS_MASK);// wewnętrzny oscylator 32&#91;kHz&#93; <br />MCG-&gt;SC &amp;= ~MCG_SC_FCRDIV(1);// preskaler == 1  ( po restarcie preskaler równa się 2, wpisujemy wiec do bitów FCRDIV same 0 i preskaler ==1 ) <br /><br />MCG-&gt;C1 |= (MCG_C1_IRCLKEN_MASK);// włączamy taktowanie MCGIRCLK z wewnętrzenego oscylatora<br />MCG-&gt;C2 |= (MCG_C2_IRCS_MASK); // wewnętrzny oscylator 4&#91;MHz&#93;<br /><br />/* SEKACJA USTAWIENIA WYZWALANIA */<br />TPM0-&gt;CONF |=TPM_CONF_TRGSEL(8);// wyzwalanie przepełnieniem timera<br /><br />/* SEKCJA KONFIGURACJI TIMERA */<br />/* wybieramy TMP0: kanał 2 steruje diodą czerwoną PTE29, zaś kanał 5 steruje diodą zieloną PTD5 */<br />TPM0-&gt;SC |= TPM_SC_PS(7);// preskaler == 128  -&gt;  f=31250&#91;Hz&#93;    może być zmieniany tylko jeśli Timer jest wyłączony<br />TPM0-&gt;SC |= TPM_SC_CMOD(1);                          // timer jest inkrementowany przez zegar <br />TPM0-&gt;SC |= TPM_SC_TOF_MASK;// skasowanie flagi przerwania<br />TPM0-&gt;SC |= TPM_SC_TOIE_MASK;// włączenie przerwania od przepełnienia timera<br />TPM0-&gt;SC &amp;= ~(TPM_SC_CPWMS_MASK);// wyłączenie zliczania up-down<br /><br />TPM0-&gt;CNT = 0;// wyzerowanie licznika ( licznik inkrementowany przez zegar )<br />TPM0-&gt;MOD = 31250;// przerwanie 1&#91;Hz&#93;<br /><br />/* SEKCJA KONFIGURACJI KANAŁU 5, sterowanie diodą zieloną */<br />TPM0-&gt;CONTROLS&#91;5&#93;.CnSC |= TPM_CnSC_MSA_MASK;// output comapare match<br />TPM0-&gt;CONTROLS&#91;5&#93;.CnSC |= TPM_CnSC_ELSA_MASK;// toggle bit on compare match<br />TPM0-&gt;CONTROLS&#91;5&#93;.CnSC |= TPM_CnSC_CHF_MASK;               // skasowanie flagi przerwania<br />TPM0-&gt;CONTROLS&#91;5&#93;.CnSC |= TPM_CnSC_CHIE_MASK;// włączenie przerwań dla tego kanału <br />TPM0-&gt;CONTROLS&#91;5&#93;.CnV = 15000;// przerwanie co 1&#91;Hz&#93; <br />// MOD &gt; CnV tylko wtedy to działa inaczej przerwanie nie wystąpi nigdy<br /><br />/* KANAŁ 2 zobaczymy */<br />TPM0-&gt;CONTROLS&#91;2&#93;.CnSC |= TPM_CnSC_MSA_MASK;// output comapare match<br />TPM0-&gt;CONTROLS&#91;2&#93;.CnSC |= TPM_CnSC_ELSA_MASK;// toggle bit on compare match<br />TPM0-&gt;CONTROLS&#91;2&#93;.CnSC |= TPM_CnSC_CHF_MASK;              // skasowanie flagi przerwania<br />TPM0-&gt;CONTROLS&#91;2&#93;.CnSC |= TPM_CnSC_CHIE_MASK;// włączenie przerwań dla tego kanału <br />TPM0-&gt;CONTROLS&#91;2&#93;.CnV = 31250;// przerwanie co 1&#91;Hz&#93; <br /><br />  <br /><br />/* KONFIGURACJA PRZERWANIA */<br />NVIC_ClearPendingIRQ(TPM0_IRQn);// usunięcie przerwań<br />NVIC_SetPriority(TPM0_IRQn,2);// priorytet przerwania 2 <br />NVIC_EnableIRQ(TPM0_IRQn);// włączenie przerwań od  TMP0<br /><br />}<br />/* INTERRUPTS HANDLERS */<br />void TPM0_IRQHandler(void)<br />{<br /><br />/* OVERFLOW INTERRUPT */<br />if( TPM0-&gt;STATUS &amp; TPM_STATUS_TOF_MASK)<br />{<br />TPM0-&gt;STATUS |= TPM_STATUS_TOF_MASK;<br /><br /><br />}<br /><br />/* OUTPUT COMPARE MATCH INTERRUPT CHANNEL 5 */<br />if( TPM0-&gt;CONTROLS&#91;5&#93;.CnSC &amp; TPM_CnSC_CHF_MASK)<br />{<br />TPM0-&gt;CONTROLS&#91;5&#93;.CnSC |= TPM_CnSC_CHF_MASK;<br /><br /><br />}<br /><br />/* OUTPUT COMPARE MATCH INTERRUPT CHANNEL 2 */<br />if( TPM0-&gt;CONTROLS&#91;2&#93;.CnSC &amp; TPM_CnSC_CHF_MASK)<br />{<br />TPM0-&gt;CONTROLS&#91;2&#93;.CnSC |= TPM_CnSC_CHF_MASK;<br /><br />}<br /><br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=473">Juffre</a> — 29 lip 2015, o 16:22</p><hr />
]]></content>
</entry>
</feed>