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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-11-03T11:04:19+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4573&amp;mode</id>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-03T11:04:19+01:00</updated>
<published>2013-11-03T11:04:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55233#p55233</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55233#p55233"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55233#p55233"><![CDATA[
Wydaje mi się, że już rozwiązałem problem. Z tym, że wprowadzę małe poprawki, tak by za każdym razem odliczanie było zatrzymywane przerwaniem zewnętrznym przez przycisk. Jak wprowadzę poprawki to wrzucę kod.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 50 minutach ]</span></strong><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />volatile uint16_t wynik;<br />volatile uint8_t k;<br />volatile uint8_t a;<br />volatile uint8_t c;<br />volatile uint32_t b;<br />volatile uint8_t pin;<br />volatile uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br />volatile unsigned char flaga3;<br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br /><br />if (flaga1) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />flaga1 = 0;<br />}<br /><br />if (flaga2) {<br />wylaczenie();<br />b = (b / 5);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />lcd_int(b);<br />lcd_str(&quot;ms&quot;);<br />flaga2 = 0;<br />}<br /><br />if (flaga3) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />lcd_int(wynik);<br />lcd_str(&quot;ms&quot;);<br />flaga3 = 0;<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />wynik = 0;<br />b = 0;<br />c = 1;<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3s<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />OCR0 = 63;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02)); // prescaler 256<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />lcd_cls();<br />wynik = 0;<br />b = 0;<br />c = 0;<br />for (a = 0; a &lt; 5; a++) {<br />wynik = 0;<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3s<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />OCR0 = 63;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02)); // prescaler 256<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect) {<br />flaga1 = 1;<br />}<br /><br />ISR(INT0_vect) {<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />wylaczenie();<br />if (c == 1) {<br />flaga3 = 1;<br />}<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}<br /><br />ISR (TIMER0_COMP_vect) {<br />wynik = wynik + 1;<br />TCNT0 = 0;<br />}[/syntax]<br />Tak wygląda kod po poprawkach i wygląda na to, że działa już poprawnie. Co było źle? Otóż okazuje się, że zatrzymanie timera w przerwaniu działa dobrze, natomiast gdy to zatrzymanie zrobimy za pomocą flagi to już czasami wychodzi dziwnie. Uruchomione są 2 timery, jeden zlicza impulsy by wyświetlać komunikat na wyświetlaczu, drugi zlicza milisekundy, stąd ten prescaler itp. Oczywiście można wszystko zrealizować przy pomocy jednego timera, ale miałem akurat wykorzystać jak najwięcej możliwości Atmegi i tak tez uczyniłem. Poza tym jak widać usunąłem jeden przycisk, teraz zarówno pomiar 1-krotny jak i 5-krotny zatrzymujemy tym samym przyciskiem, który służy jako przerwanie zewnętrzne. Dzięki temu uzyskałem porównywalne wyniki, gdyż wcześniej były większe rozbieżności, przez to, że w jednej metodzie timer zatrzymywałem przyciskiem, a w drugiej przerwaniem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 3 lis 2013, o 11:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-02T13:26:27+01:00</updated>
<published>2013-11-02T13:26:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55154#p55154</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55154#p55154"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55154#p55154"><![CDATA[
Wysłałem Ci PW z kodem.<br /><br />Proszę przeanalizuj go trochę i ew dopytuj ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 2 lis 2013, o 13:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-02T13:17:26+01:00</updated>
<published>2013-11-02T13:17:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55153#p55153</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55153#p55153"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55153#p55153"><![CDATA[
[syntax=c]if (flaga2) {<br />                        b = (b / 5);<br />                        lcd_cls();<br />                        lcd_locate(0, 0);<br />                        lcd_str(&quot;Twoj wynik to&quot;);<br />                        lcd_locate(1, 0);<br />                        lcd_int(b);<br />                        lcd_str(&quot;ms&quot;);<br />                        flaga2 = 0;<br />                        TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />                        TCNT1 = 0;<br />                        TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />                        TCNT0 = 0;<br />                }[/syntax]<br />Ten fragment wykonuje obliczenia dla pomiaru wielokrotnego.<br /><br />Ale by tego dokonać przerwanie ISR (TIMER0_COMP_vect) zlicza milisekundy. Jedna milisekunda to ok. 16 impulsów i co tyle wykonuję przerwanie.<br /><br />Natomiast przerwanie ISR(INT0_vect) odpowiada za naciśnięcie klawisza. Jest to przerwanie zewnętrzne pochodzące od microswitcha i powodujące dodanie kolejnej wartości do zmiennej b.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 2 lis 2013, o 13:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-02T13:12:32+01:00</updated>
<published>2013-11-02T13:12:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55152#p55152</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55152#p55152"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55152#p55152"><![CDATA[
Czy mógłbyś mi opisać w którym miejscu robisz obliczenia ?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />Ew. mam ten kod który widziałeś na filmiku i jak chcesz to moge go wrzucić... Bo nie bardzo już rozumiem Twój kod i Twój tok myślenia i dlaczego tak bardzo upierasz się przy pewnych rzeczach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 2 lis 2013, o 13:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-02T12:50:47+01:00</updated>
<published>2013-11-02T12:50:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55149#p55149</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55149#p55149"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55149#p55149"><![CDATA[
Usunąłem w ogóle ten fragment z dodawaniem czy odejmowaniem 80s, bo też wyniki są wtedy zbyt niskie. A dzielenie następuje przy fragmencie &quot;if (flaga2)&quot;. Teraz kod przedstawia się mniej więcej tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint16_t wynik;<br />uint32_t c;<br />uint32_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br /><br />if (flaga1) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />flaga1 = 0;<br />}<br /><br />if (flaga2) {<br />b = (b / 5);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />lcd_int(b);<br />lcd_str(&quot;ms&quot;);<br />flaga2 = 0;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />wynik = 0;<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3s<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />OCR0 = 16;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02) | (1 &lt;&lt; CS00)); // prescaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wylaczenie();<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />lcd_int(wynik);<br />lcd_str(&quot;ms&quot;);<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />b = 0;<br />wynik = 0;<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3s<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />OCR0 = 16;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02) | (1 &lt;&lt; CS00)); // prescaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />flaga1 = 1;<br />}<br /><br />ISR(INT0_vect) {<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />wylaczenie();<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}<br /><br />ISR (TIMER0_COMP_vect) {<br />wynik = wynik + 1;<br />TCNT0 = 0;<br />}[/syntax]<br /><br />Pojedynczy pomiar pokazuje mi czas od 200 do 300ms, czyli mniej więcej poprawny. Natomiast 5-krotny pokazuje mi na przemian raz kilka tysięcy ms, innym razem 400-700ms, czyli tez niepopranie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 2 lis 2013, o 12:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-02T12:43:13+01:00</updated>
<published>2013-11-02T12:43:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55147#p55147</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55147#p55147"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55147#p55147"><![CDATA[
A w którym miejscu kolega napisał że to ma być podzielone przez 5 ? ( jakoś nie mogę tego dopatrzyć )<br /><br />PS. 80 ms to raczej trzeba odjąć a nie dodać, bo dodajesz już przy &quot;debouncingu&quot; więc 2 razy oszukujesz kolesia któr się sprawdza, a to już jest 160 ms ( ~1/6 sekundy ... ) więc już całkiem sporo, zwłaszcza że wcześniej chciałeś walczyć o 1us ....<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 2 lis 2013, o 12:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-02T11:15:16+01:00</updated>
<published>2013-11-02T11:15:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55137#p55137</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55137#p55137"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55137#p55137"><![CDATA[
Poprawiłem nieco kod, tak by liczenie odbywało się w ms, a nie us (jak było wcześniej). Uruchomiłem dodatkowo timer 8-bitowy, który zlicza milisekundy. Tak przedstawia się kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint16_t wynik;<br />uint32_t c;<br />uint32_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br /><br />if (flaga1) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />flaga1 = 0;<br />}<br /><br />if (flaga2) {<br />c = (b / 5);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />lcd_int(c);<br />lcd_str(&quot;ms&quot;);<br />flaga2 = 0;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />wynik = 0;<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 1ms<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />OCR0 = 16;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02) | (1 &lt;&lt; CS00)); // prescaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wylaczenie();<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />wynik = wynik + 80;<br />lcd_int(wynik);<br />lcd_str(&quot;ms&quot;);<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />b = 0;<br />wynik = 0;<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 1ms<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />OCR0 = 16;<br />TCCR0 |= (1 &lt;&lt; WGM01); //timer 8-bitowy<br />TCCR0 |= ((1 &lt;&lt; CS02) | (1 &lt;&lt; CS00)); // prescaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE0);<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br /><br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />flaga1 = 1;<br />}<br /><br />ISR(INT0_vect) {<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />TCCR0 &amp;= ~((1 &lt;&lt; CS02) | (1 &lt;&lt; CS01) | (1 &lt;&lt; CS00));<br />TCNT0 = 0;<br />wylaczenie();<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}<br /><br />ISR (TIMER0_COMP_vect) {<br />wynik = wynik + 1;<br />TCNT0 = 0;<br />}[/syntax]<br /><br />O ile pomiar jednokrotny działa w porządku (służy do tego KEY1_PIN oraz KEY2_PIN), o tyle pomiar 5-krotny nie pokazuje prawidłowego wyniku, tak jakby nie dzielił przez 5 i mam wynik 1200-1500ms zamiast 200-300ms. Czy ktoś widzi tu może jakiś błąd? Do pomiaru 5-krotnego służy KEY3_PIN oraz przerwanie zewnętrzne ISR(INT0_vect).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 2 lis 2013, o 11:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-01T21:09:05+01:00</updated>
<published>2013-11-01T21:09:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55075#p55075</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55075#p55075"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55075#p55075"><![CDATA[
właśnie testuję dla 10us i 20MHZ i w ogóle czasy się nie zgadzają<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 1 lis 2013, o 21:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-01T21:07:09+01:00</updated>
<published>2013-11-01T21:07:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55074#p55074</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55074#p55074"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55074#p55074"><![CDATA[
Aha, czyli tu może być pies pogrzebany...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 1 lis 2013, o 21:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-01T20:51:39+01:00</updated>
<published>2013-11-01T20:51:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55071#p55071</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55071#p55071"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55071#p55071"><![CDATA[
Właśnie sprawdzałem jak się uC zachowa przy 1us ... nie ogarnia się , nawet przy kwarcu 20Mhz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 1 lis 2013, o 20:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-01T14:22:29+01:00</updated>
<published>2013-11-01T14:22:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55036#p55036</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55036#p55036"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55036#p55036"><![CDATA[
erykko, zerknij <br /><br /><a href="https://www.youtube.com/watch?v=BGTkkmNs_oE"  class="postlink">https://www.youtube.com/watch?v=BGTkkmNs_oE</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 1 lis 2013, o 14:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-01T13:10:53+01:00</updated>
<published>2013-11-01T13:10:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55029#p55029</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55029#p55029"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55029#p55029"><![CDATA[
Mam 16MHz, ale prescaler 1024, więc impulsów w ciągu sekundy mam 15625, stąd ten wynik. Ale spróbuję dodać jeszcze 80ms do wyniku, z tym że to nie wyjaśnia skąd czasami pojawia się rezultat 0,000000s. Nie wiem czy dobrze rozumuję, poprawcie mnie jeśli się mylę. W każdym razie kwarc jest 16MHz, ale 2-bitowy timer nie liczy do takiej wartości, więc używam prescalera, tak by spokojnie doliczyć do tych kilku sekund.<br /><br />A po co mi tak duża dokładność? Akurat ma to być możliwie najdokładniejszy stoper, więc dlatego tak dużo miejsc po przecinku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 1 lis 2013, o 13:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-11-01T08:40:56+01:00</updated>
<published>2013-11-01T08:40:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55012#p55012</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55012#p55012"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55012#p55012"><![CDATA[
To tak mniej więcej jesli się nie mylę to powinieneś odjąć jeszcze przynajmniej 80ms do wyniku bo tracisz je na drgania styków. A tak na gorąco - to chyba nie możliwe jest policzenie każdego impulsu zegara AtMegi ... ale muszę się jeszcze nad tym zastanowić <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />no dobra 1us to 16 instrukcji uP więc powinno się dać ... ( ale po co ? )<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 19 minutach ]</span></strong><br /><br />Napisałeś, że jesteś w stanie zmierzyć <div class="quotetitle">erykko napisał(a):</div><div class="quotecontent"><br />0,000064s.<br /></div> ... Jak ?<br />O ile mnie wzrok nie myli (o tak wczesnej porze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) to jest 64 us ....<br /><br />Jeden cykl zegara przy 16Mhz wykonywany jest co 62,5 ns .... więc po 16 cyklach masz dokładnie 1 us ( pod warunkiem, że nie będziesz używał delay, lcd, działań arytmetycznych, itp )<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 1 lis 2013, o 08:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-11-01T07:40:55+01:00</updated>
<published>2013-11-01T07:40:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55011#p55011</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55011#p55011"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55011#p55011"><![CDATA[
Wycisnąłem z tego najwięcej, tzn. dokładność 6 miejsc po przecinku (mikrosekundy). A dokładnie najmniejszą częścią sekundy jaką potrafię zmierzyć jest 0,000064s.<br /><br />W moim przykładzie są 2 przerwania, pierwsze jest używane do wysłania komunikatu na wyświetlacz, a drugie do zatrzymania stopera i wykonania obliczeń. Nie są one uruchamiane cyklicznie. Timer jest uruchomiony w trybie CTC, więc w każdej sekundzie pojawia się określona liczba impulsów. Po wciśnięciu przycisku następuje zatrzymanie timera, odczytanie stanu liczby impulsów zliczonych przez timer, a następnie obliczenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 1 lis 2013, o 07:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-10-31T23:13:48+01:00</updated>
<published>2013-10-31T23:13:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55002#p55002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55002#p55002"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=55002#p55002"><![CDATA[
Napisz jeszcze proszę o jakiej dokładności mówisz, jaka jest Ci potrzebna, a jaką ustawiłeś w swoim programie ?<br /><br />Próbowałem zanalizować Twój kod ale naprawdę wymiękłem w pewnym momencie... <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><br /><br />PS. Zacząłem pisać swój własny stoper i może będzie działał trochę inaczej niż napisałeś ale może jakoś Ci pomoże. Niestety nie mogę obiecać na kiedy będzie, ale postaram się jak najszybciej. Ja założyłem, że 1/100 sek jest wystarczająco dokładne, więc przerwanie będzie co 10 ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 31 paź 2013, o 23:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-31T21:25:50+01:00</updated>
<published>2013-10-31T21:25:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54983#p54983</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54983#p54983"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54983#p54983"><![CDATA[
<a href="http://forum.atnel.pl/_obrazki/o/1529/5ea90201f87835367c8fd61290969c19.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1529/5ea90201f87835367c8fd61290969c19.png" alt="Obrazek" /></a><br />Tak wygląda schemat, korzystam ze standardowej biblioteki p. Mirka, dodałem tylko możliwość wyświetlania dłuższych liczb (long int). Czym objawia się złe działanie, otóż układ wyświetla wynik w postaci 0,012345s czy 0,001234s, który jest niemożliwy fizycznie do uzyskania. Czasami też wynik potrafi wynosić 0,000000s.<br /><br />KEY1_PIN startuje timer, KEY2 go zatrzymuje, zeruje, wyświetla wynik. KEY3_PIN startuje 5 kolejnych pomiarów, z których wyciągana jest średnia. Pomiary odbywają się przy użyciu przerwania ISR(INT0_vect). Jak widać jest to licznik mierzący czas reakcji, z tym że ma dosyć dużą dokładność.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 31 paź 2013, o 21:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-10-31T20:47:58+01:00</updated>
<published>2013-10-31T20:47:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54978#p54978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54978#p54978"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54978#p54978"><![CDATA[
Erykko - dalej nie mam pojęcia jak ma działać Twój układ i nikt chyba nie wie i nie rozumie jak objawia się błąd. Napisz więc proszę jak ma działać (w miarę dokładnie), dodaj schemat żeby ew. ktoś mógł sobie zbudować układ u siebie i przetestować. Napisz jak objawia się błąd i dlaczego uważasz go za błąd ( możliwe że program działa właściwie ale niezgodnie z Twoimi oczekiwaniami). Musisz napisać coś więcej.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Jakiej biblioteki LCD używasz ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 31 paź 2013, o 20:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-31T19:59:21+01:00</updated>
<published>2013-10-31T19:59:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54966#p54966</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54966#p54966"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54966#p54966"><![CDATA[
Dodam jeszcze kilka informacji w pigułce. Otóż mikrokontroler to Atmega32, kwarc to 16MHZ. Stosuję timer 16-bitowy w trybie CTC, a prescaler 1024, więc w ciągu sekundy mam 15625 impulsów. W związku z tym mnożę otrzymaną wartość razy 64, dzięki czemu po podzieleniu przez milion mogę otrzymać część całkowitą i tą ułamkową po przecinku. Gdzieś musi być jakiś błąd, z tym że nie potrafię go zauważyć. Cały kod przedstawia się tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint32_t wynik;<br />uint32_t c;<br />uint32_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br /><br />if (flaga1) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />flaga1 = 0;<br />}<br /><br />if (flaga2) {<br />mnoznik = 64;<br />b = b / 5;<br />c = (mnoznik * b);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />flaga2 = 0;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wynik = TCNT1;<br />wylaczenie();<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />mnoznik = 64;<br />c = (mnoznik * wynik);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />flaga1 = 1;<br /><br />}<br /><br />ISR(INT0_vect) {<br />wynik = TCNT1;<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />wylaczenie();<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}[/syntax]<br /><br />Jednak błędu należałoby szukać gdzieś tutaj:<br />[syntax=c]if (klawisz_wcisniety(KEY1_PIN)) {<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wynik = TCNT1;<br />wylaczenie();<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />mnoznik = 64;<br />c = (mnoznik * wynik);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />}[/syntax]<br />Analogiczny kod jest dla pomiaru 5-krotnego, więc tam występuje ten sam babol. Tylko, że za nic nie potrafię go znaleźć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 31 paź 2013, o 19:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-30T12:27:45+01:00</updated>
<published>2013-10-30T12:27:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54801#p54801</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54801#p54801"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54801#p54801"><![CDATA[
Jeśli chodzi o przerwanie i ustawienie w nim timera to jest to wyłącznie jego zatrzymanie, a następnie wyzerowanie. Już tłumaczę o co chodzi, otóż jest to stoper, który ma za zadanie mierzyć czas reakcji odpowiednio diodą bądź buzzerem. Mam 2 opcje, pierwsza stosuje pojedynczy pomiar, z kolei kolejna to 5 pomiarów, z których wyciągana jest średnia. Przeniosłem za Twoją radą także funkcję wyłączenia do pętli głównej programu. Ale nadal byłbym wdzięczny, gdyby ktoś mi pomógł z problemem:) W tej chwili kod wygląda tak:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint16_t wynik;<br />uint32_t c;<br />uint8_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br />if (flaga1) {<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />flaga1 = 0;<br />}<br /><br />if (flaga2) {<br />mnoznik = 64;<br />b = b / 5;<br />c = (mnoznik * b);<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />flaga2 = 0;<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wynik = TCNT1;<br />wylaczenie();<br />mnoznik = 64;<br />c = (mnoznik * wynik);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />flaga1 = 1;<br /><br />}<br /><br />ISR(INT0_vect) {<br />wynik = TCNT1;<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}[/syntax]<br />Aha, mikrokontroler to Atmega32. A komentarze sobie pozostawię dla samego siebie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 30 paź 2013, o 12:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-10-26T15:35:26+01:00</updated>
<published>2013-10-26T15:35:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54370#p54370</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54370#p54370"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54370#p54370"><![CDATA[
<div class="quotetitle">erykko napisał(a):</div><div class="quotecontent"><br />ISR(TIMER1_COMPA_vect) {<br />        TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />        TCNT1 = 0;<br />        wylaczenie();<br />        flaga1 = 1;<br /> <br />}<br /></div><br /><br />1. myślę, że ustawianie parametrów pracy Timera już w przerwaniu, to trochę za późno<br />2. Jak piszę jeden z naszych kolegów - Nie pisz komentarzy, dobry kod komentuje się sam - to Twój kod nie jest jeszcze tak dobry (BTW moje też nie są <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) - gdybyś napisał w komentarzu co chciałeś osiągnąć byłoby trochę łatwiej.<br />3. Nie doczytałem jaki procek i zasadniczo niewielkie to znaczenie ma, ale za to wiadomo którego odpalić datasheet'a <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />4. Przy ustawianiu Timerów nie potrzebowałem chyba jeszcze nigdy negowania rejestrów (komentarze)<br />5. TCNT z tego co wiem nie odpowiada za COMPARE MATCH i tu chyba kolega powinien dać OCR - ale w sumie to nie wiem co kolega chciał osiągnąć (komentarze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ) więc mogę się mylić i jest dobrze ... <br />6. znowu wywołanie funkcji wylaczenie() w Timerze - a nie lepiej byłoby flaga_wylacz ...<br />6a. po co, co kilka milisekund ( chyba, że rzadziej albo częściej - komentarze ) wywoływać funkcję która gasi diody ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 26 paź 2013, o 15:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-26T14:29:14+01:00</updated>
<published>2013-10-26T14:29:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54367#p54367</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54367#p54367"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54367#p54367"><![CDATA[
Dzięki bardzo! Rzeczywiście nie zauważyłem tego błędu.<br /><br />Jeszcze bardzo bym prosił o to by ktoś sprawdził kod pod względem obliczeń, bo mam wrażenie, że czasami dostaję dziwne wyniki z timera. Mam kwarc 16MHz i włączony preskaler. Przy takich ustawieniach najmniejsza część sekundy jaka może zostać policzona to 0,000064s. Ale czasami stoper potrafi pokazać nieprawdopodobne wyniki w stylu 0,002123 czy 0,0212345. Wydaje mi się, że gdzieś jest błąd, tylko sam nie potrafię go znaleźć. Jakby ktoś coś zauważył byłbym wdzięczny.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 26 paź 2013, o 14:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sq8dsr]]></name></author>
<updated>2013-10-26T13:51:19+01:00</updated>
<published>2013-10-26T13:51:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54360#p54360</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54360#p54360"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54360#p54360"><![CDATA[
Tak, po wykonaniu czynności kontrolowanej flagą, musi ona wrócić do stanu poprzedniego, tak by wejście w przerwanie mogło ją ponownie ustawić. Inaczej raz ustawiona w przerwaniu będzie powodować nieustanne wykonywanie tego bloku funkcji związanych z wyświetlaczem. A z tego co pamiętam masz tam cls więc siłą rzeczy wyświetlacz jest cały czas kasowany.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1589">sq8dsr</a> — 26 paź 2013, o 13:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[acid3]]></name></author>
<updated>2013-10-26T12:53:04+01:00</updated>
<published>2013-10-26T12:53:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54353#p54353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54353#p54353"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54353#p54353"><![CDATA[
Wydaje mi się, że po ustawieniu flaga1 w Timerze i wywołaniu funkcji obsługującej daną flagę należałoby tą flagę wyzerować, na końcu funkcji na przykład, bo w pętli już po pierwszym wystąpieniu przerwania flaga cały czas jest ustawiona na 1 i cały czas się wykonuje w kółko i lcd_cls  i lcd_str co może spowodować takie efekty wizualne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=944">acid3</a> — 26 paź 2013, o 12:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-26T12:29:43+01:00</updated>
<published>2013-10-26T12:29:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54347#p54347</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54347#p54347"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54347#p54347"><![CDATA[
Poprawiłem kod w następujący sposób:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint16_t wynik;<br />uint32_t c;<br />uint8_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br />volatile unsigned char flaga1;<br />volatile unsigned char flaga2;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br />if (flaga1) {<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br />}<br /><br />if (flaga2) {<br />mnoznik = 64;<br />b = b / 5;<br />c = (mnoznik * b);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />}<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wynik = TCNT1;<br />wylaczenie();<br />mnoznik = 64;<br />c = (mnoznik * wynik);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />wylaczenie();<br />flaga1 = 1;<br /><br />}<br /><br />ISR(INT0_vect) {<br />wynik = TCNT1;<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />wylaczenie();<br />if (a == 5) {<br />flaga2 = 1;<br />}<br />}[/syntax]<br />Jednak jest z tym mały problem, bo wyświetlacz wyświetla te flagi tak jakby nie miał ustawionego kontrastu. Ledwo można coś dostrzec.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 26 paź 2013, o 12:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[erykko]]></name></author>
<updated>2013-10-26T10:15:28+01:00</updated>
<published>2013-10-26T10:15:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54331#p54331</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54331#p54331"/>
<title type="html"><![CDATA[Re: Sprawdzenie kodu w C - prosty stoper]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4573&amp;p=54331#p54331"><![CDATA[
A gdybym jedno przerwanie zrealizował w następujący sposób? A więc dodałem nową zmienną &quot;z&quot;, która podwyższa się co jeden przy każdym przerwaniu, ale wyświetlacz ma dostawać komunikaty dopiero w pętli głównej programu. W tej chwili to jeszcze nie działa poprawnie (wyświetlacz nic nie wyświetla, ale pracuję nad tym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> ).<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//dyrektywy dla preprocesora<br />//dioda<br />#define LED_PIN (1&lt;&lt;PC7) //do którego pinu podłączona dioda<br />#define BUZZ_PIN (1&lt;&lt;PC3) //do którego pinu podłączony jest brzęczyk<br />#define LED_ON PORTC |= LED_PIN //włączenie diody<br />#define LED_OFF PORTC &amp;= ~(LED_PIN) //wyłączenie diody<br />#define LED_TOG PORTC ^=LED_PIN //zmiana stanu diody<br />#define BUZZ_ON PORTC |= BUZZ_PIN; //włączenie buzzera<br />#define BUZZ_OFF PORTC &amp;= ~(BUZZ_PIN) //wyłączenie buzzera<br />#define KONTROLKA1 (1&lt;&lt;PA6) //kontrolka diody<br />#define KONTROLKA2 (1&lt;&lt;PA5) //kontrolka buzzera<br />#define KONTROLKA1_ON PORTA |= KONTROLKA1 //włączenie kontrolki diody<br />#define KONTROLKA1_OFF PORTA &amp;= ~(KONTROLKA1) //wyłączenie kontrolki diody<br />#define KONTROLKA1_TOG PORTA ^=KONTROLKA1 //zmiana stanu kontrolki diody<br />#define KONTROLKA2_ON PORTA |= KONTROLKA2 //włączenie kontrolki buzzera<br />#define KONTROLKA2_OFF PORTA &amp;= ~(KONTROLKA2) //wyłączenie kontrolki buzzera<br />#define KONTROLKA2_TOG PORTA ^=KONTROLKA2 //zmiana stanu kontrolki buzzera<br />//przycisk<br />#define KEY1_PIN (1&lt;&lt;PC6) //na którym pinie jest mikroswitch1<br />#define KEY2_PIN (1&lt;&lt;PC5) //na którym pinie jest mikroswitch2<br />#define KEY3_PIN (1&lt;&lt;PC4) //na którym pinie jest mikroswitch3<br />#define KEY4_PIN (1&lt;&lt;PD2) //na którym pinie jest mikroswitch4<br />#define KEY5_PIN (1&lt;&lt;PA7) //na którym pinie jest microswitch5<br />#define PO_PRZECINKU 6 //zdefiniowanie liczby cyfr wywietlanych po przecinku<br />uint8_t klawisz_wcisniety(uint8_t klawisz); //definicja funkcji<br />uint8_t klawisz_wcisnietypina(uint8_t klawisz); //definicja funkcji dla pinu A<br />void wlaczenie(void); //definicja funkcji włączenia<br />void wylaczenie(void); //definicja funkcji wyłączenie<br /><br />uint32_t mnoznik;<br />uint16_t wynik;<br />uint32_t c;<br />uint8_t czesc_dziesietna;<br />uint32_t czesc_ulamkowa;<br />uint8_t k;<br />uint8_t z;<br />uint8_t a;<br />uint32_t b;<br />uint8_t pin;<br />uint8_t pomocnicza;<br /><br />int main(void) {<br /><br />//inicjalizacja wyswietlacza<br />lcd_init();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Witaj!&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;Nacisnij Start&quot;);<br />DDRC |= (LED_PIN | BUZZ_PIN); //ustawienie PC7 (dioda) i PC3 (brzęczyk) jako wyjscie<br />PORTC &amp;= ~(LED_PIN); //wyłączenie diody na PC7<br />DDRA |= (KONTROLKA1 | KONTROLKA2); //ustawienie PA6 i PA5 (kontrolek) jako wyjscie<br />DDRC &amp;= ~(KEY1_PIN | KEY2_PIN | KEY3_PIN); //ustawienie PC6 i PC5, PC4 jako wejscia<br />PORTC |= KEY1_PIN | KEY2_PIN | KEY3_PIN; //podciągnięcie PC6, PC5, PC4 do VCC<br />DDRD &amp;= ~(KEY4_PIN); //ustawienie PD2 jako wejscie<br />PORTD |= KEY4_PIN; //podciagniecie PD2 do VCC<br />DDRA &amp;= ~(KEY5_PIN); //ustawienie PA7 jako wejscie<br />PORTA |= KEY5_PIN; //podciagniecie PA7 do VCC<br /><br />MCUCR |= (1 &lt;&lt; ISC01); //zbocze opadające<br />GICR |= (1 &lt;&lt; INT0); //przerwanie od przycisku 4<br /><br />KONTROLKA1_ON;<br /><br />sei();<br />//włączenie globalnego zezwolenia na przerwania<br /><br />//pętla główna programu<br />while (1) {<br />k++;<br /><br />if (klawisz_wcisnietypina(KEY5_PIN)) {<br />pin = pin + 1;<br />if (pin % 2 == 0) {<br />pomocnicza = 0;<br />KONTROLKA1_ON;<br />KONTROLKA2_OFF;<br />}<br />if (pin % 2 == 1) {<br />pomocnicza = 1;<br />KONTROLKA1_OFF;<br />KONTROLKA2_ON;<br />}<br /><br />}<br /><br />if (klawisz_wcisniety(KEY1_PIN)) {<br />lcd_cls();<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(1000);<br />if (k % 3 == 1)<br />_delay_ms(1500);<br />if (k % 3 == 2)<br />_delay_ms(2000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br />}<br /><br />if (klawisz_wcisniety(KEY2_PIN)) {<br />wynik = TCNT1;<br />wylaczenie();<br />mnoznik = 64;<br />c = (mnoznik * wynik);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU; i &gt; strlen(ltoa(reszta, bufor, 10));<br />i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />}<br /><br />if (klawisz_wcisniety(KEY3_PIN)) {<br />z = 0;<br />lcd_cls();<br />for (a = 0; a &lt; 5; a++) {<br />if (z == 5) {<br />mnoznik = 64;<br />b = b / 5;<br />c = (mnoznik * b);<br />lcd_cls();<br />lcd_locate(0, 0);<br />lcd_str(&quot;Twoj wynik to&quot;);<br />lcd_locate(1, 0);<br />czesc_dziesietna = c / 1000000;<br />czesc_ulamkowa = (c % 1000000); //reszta z dzielenia<br />lcd_int(czesc_dziesietna);<br />lcd_char(',');<br />uint16_t reszta = czesc_ulamkowa;<br />char bufor&#91;PO_PRZECINKU + 1&#93;;<br />for (uint8_t i = PO_PRZECINKU;<br />i &gt; strlen(ltoa(reszta, bufor, 10)); i--) {<br />lcd_char('0');<br />}<br />lcd_long_int(reszta);<br />lcd_str(&quot;s&quot;);<br />}<br />k = rand();<br />if (k % 3 == 0)<br />_delay_ms(2000);<br />if (k % 3 == 1)<br />_delay_ms(2500);<br />if (k % 3 == 2)<br />_delay_ms(3000);<br />wlaczenie(); //włączenie diody<br />OCR1A = 46875; //próg ustawiony na 3 sekundy<br />TCCR1B |= (1 &lt;&lt; WGM12); //tryb CTC, TIMER1-16bit, rejestr TCCR1B<br />TCCR1B |= ((1 &lt;&lt; CS12) | (1 &lt;&lt; CS10)); // preskaler 1024<br />TIMSK |= (1 &lt;&lt; OCIE1A); //rejestr porównania<br /><br />}<br /><br />}<br />}<br />}<br /><br />//definicja funkcji, nie posiada wrgumentów, zwraca wynik 0 lub 1<br />//definicja funkcji-funkcja posiada argument, zwraca 0 lub 1<br />uint8_t klawisz_wcisniety(uint8_t klawisz) {<br />if (!(PINC &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINC &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />uint8_t klawisz_wcisnietypina(uint8_t klawisz) {<br />if (!(PINA &amp; klawisz)) //sprawdzanie czy wcisnięty klawisz<br />{<br />_delay_ms(80); //drganie styków<br />if (!(PINA &amp; klawisz))<br />return 1;<br />}<br />return 0; // ponowne sprawdzanie czy wcisnięty klawisz<br />}<br /><br />void wlaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_ON;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_ON;<br />}<br />}<br /><br />void wylaczenie(void) {<br />if (pomocnicza == 0) {<br />LED_OFF;<br />}<br />if (pomocnicza == 1) {<br />BUZZ_OFF;<br />}<br />}<br />ISR(TIMER1_COMPA_vect) {<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />wylaczenie();<br />lcd_cls();<br />lcd_locate(0, 0); //ustawienie w 1 wierszu 1 kolumnie<br />lcd_str(&quot;Blad! Za dlugi&quot;);<br />lcd_locate(1, 0); //ustawienie w 2 wierszu 1 kolumnie<br />lcd_str(&quot;czas reakcji&quot;);<br /><br />}<br /><br />ISR(INT0_vect) {<br />wynik = TCNT1;<br />b = b + wynik;<br />TCCR1B &amp;= ~((1 &lt;&lt; CS12) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS10));<br />TCNT1 = 0;<br />wylaczenie();<br />z = z + 1;<br />}[/syntax]<br />Nadal myślę jak zrealizować to pierwsze przerwanie pochodzące od timera i wywołujące komunikat na wyświetlaczu po osiągnięciu pewnego stanu licznika.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1529">erykko</a> — 26 paź 2013, o 10:15</p><hr />
]]></content>
</entry>
</feed>