<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=2118&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-18T04:42:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=2118&amp;mode</id>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2015-04-18T04:42:52+01:00</updated>
<published>2015-04-18T04:42:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126817#p126817</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126817#p126817"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126817#p126817"><![CDATA[
3 reklamy w ciągu 16 minut od zarejestrowania? Żegnamy Pana handlowca.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 18 kwi 2015, o 04:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[62miko]]></name></author>
<updated>2015-04-18T04:35:44+01:00</updated>
<published>2015-04-18T04:35:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126815#p126815</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126815#p126815"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=126815#p126815"><![CDATA[
Kupowaliście kiedyś termoparę na .....? Od jakiegoś czasu szukam i nie mogę znaleźć a słyszałem że .... produkuje termopary naprawdę dobrej jakości. Podobno bez problemu można u nich złożyć indywidualne zamówienie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9547">62miko</a> — 18 kwi 2015, o 04:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-03-07T13:52:39+01:00</updated>
<published>2013-03-07T13:52:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=30004#p30004</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=30004#p30004"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=30004#p30004"><![CDATA[
W pliku common.h<br /><br />[syntax=c]<br />/*<br /> * common.h<br /> *<br /> *  Created on: 14-01-2013<br /> *      Author: xxx<br /> */<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />// Makra upraszczające dostęp do portów<br />// *** PORT<br />#define PORT(x) SPORT(x)<br />#define SPORT(x) (PORT##x)<br />// *** PIN<br />#define PIN(x) SPIN(x)<br />#define SPIN(x) (PIN##x)<br />// *** DDR<br />#define DDR(x) SDDR(x)<br />#define SDDR(x) (DDR##x)<br /><br />#define T_ZAR1_ON PORTB |= (1&lt;&lt;PB2)<br />#define T_ZAR1_OFF PORTB &amp;= ~(1&lt;&lt;PB2)<br /><br />typedef struct {<br />uint16_t Kp;<br />uint16_t T_ustaw;<br />} TCFG;<br /><br />//extern TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />extern TCFG ram_cfg;// dane w pamięci RAM<br /><br />void klaw_up(void);<br />void klaw_down(void);<br />void klaw_ok(void);<br />void klaw_menu(void);<br />void F_save(void);<br />void Load_Set( void );<br />void display_temp(uint8_t);<br />uint16_t GetTemperature(void);<br />void F_Pomiar(void);<br />void timer0_init(void);<br />void timer2_init(void);<br /><br />#endif /* COMMON_H_ */<br />[/syntax]<p>Statystyki: Napisane przez Gość — 7 mar 2013, o 13:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-03-07T12:34:55+01:00</updated>
<published>2013-03-07T12:34:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29999#p29999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29999#p29999"/>
<title type="html"><![CDATA[Re: Odp: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29999#p29999"><![CDATA[
Wiem, że można..... Mialem juz wersję na U2008 zrobioną, ale chciałem zrobic wg Mirka, przecież musi działać. Mam podejrzenia ze cos namieszalem przy przenoszeniu kodu na Atmega8.<p>Statystyki: Napisane przez Gość — 7 mar 2013, o 12:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-03-07T09:32:04+01:00</updated>
<published>2013-03-07T09:32:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29990#p29990</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29990#p29990"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29990#p29990"><![CDATA[
No i nie jest to problem z siecią 230V, w kilku różnych miejscach migocze......<br /><br />Macie może jakieś pomysły?<p>Statystyki: Napisane przez Gość — 7 mar 2013, o 09:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-03-04T15:07:20+01:00</updated>
<published>2013-03-04T15:07:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29794#p29794</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29794#p29794"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=29794#p29794"><![CDATA[
No i powiedzmy, że wersja finalna <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Niestety problem z migotaniem regulacji jest nadal..........co ciekawe na oscyloskopie wygląda jak by same impulsy od PC817 przychodziły niestabilne (offset w czasie). Trzeba by przetestować gdzieś na innej sieci niż u nas w firmie.<br /><br />Czy ewentualnie da się to jakoś zniwelować programowo?<br /><br />[syntax=c]<br />/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: xxx<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr/io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/atomic.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br />#include &quot;menu.h&quot;<br /><br />#define T_MAX 600// Maksymalna temperatura - pomiaru - ustawienia<br />#define NOOFSAMPLES128UL // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 100<br /><br />// czas trwania szpilki na PC814 (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 0.8<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile int32_t kanal1;<br />volatile uint8_t ika1;<br /><br />volatile uint16_t T_ustaw = 1, *wsk_T_ustaw, T_pomiar=0;<br />volatile uint8_t T_offset = 0;<br />volatile uint16_t offset = 0; // zmienne ADC<br />volatile uint32_t ADCVal, T_termopary;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />int16_t E = 1; // zmienne epsilon<br />uint16_t Kp = 1, *wsk_Kp; // zmienne Kp<br /><br /><br />// Zmienne dotyczące zmiany trybu pracy<br />uint8_t mode, key_lock, key_down;<br />uint8_t Tryb(void);<br /><br /><br />TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />TCFG ram_cfg;// dane w pamięci RAM<br /><br /><br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />// inicjalizacja UART<br />USART_Init(__UBRR);<br /><br />timer2_init();// inicjacja timera0<br />timer0_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br />lcd_init();// inicjacja LCD<br />PORTC |= K_up | K_down | K_OK | K_save; // ustawienie portu C dla klawiszy<br /><br />if(  Tryb()  )  // jeśli klawisz wciśnięty z klawiszem reset<br />// (czyli zczytanie piewszego stanu klawisza)<br />{<br /> mode = 0;// zmień tryb przełączania na zwykły wł/wył<br /> lcd_locate(0,0);<br /> lcd_str_P(PSTR(&quot;Tryb on/off&quot;));<br /> _delay_ms(1000);<br /> lcd_cls();<br />}<br />else<br />{<br />mode = 1;// jeżeli nie to domyslnie proporcjonalny<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Tryb Proporcjonalny&quot;));<br />_delay_ms(1000);<br />lcd_cls();<br />}<br /><br /><br /><br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />Load_Set();// Ładowanie ustaweń z eeprom<br />lcd_cls();<br />lcd_defchar(0x80,stopien);  // definicja znaku stopnia w LCD<br />lcd_locate(0,0);// (y,x) współżędne wyświetlacza<br />lcd_str_P(PSTR(&quot;Tr:&quot;));<br />lcd_int(T_pomiar);<br />lcd_locate(0,11);<br />lcd_str_P(PSTR(&quot;E:&quot;));<br />lcd_int(E);<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot;Kan:&quot;));<br />lcd_int(kanal1);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Tz=&quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />ram_cfg.T_ustaw = T_ustaw;<br /><br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />// ************ Główna pętla programu *******************<br />while(1)<br />{<br /><br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t up, down, ok, save;<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 100, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 100, klaw_down, klaw_down);<br />SuperDebounce(&amp;ok, &amp;PINC, K_OK, 20, 100, klaw_menu, 0);<br />SuperDebounce(&amp;save, &amp;PINC, K_save, 0, 100, 0, F_save);<br />// Pomiar DS18x20<br />if( !Timer4 ){<br />Timer4 = 50;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if( !Timer2 ){<br />Timer2 = 50;<br />// Jeżeli wykryjesz to pomiar z pierwszego sensora DS18x20<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />// Obliczanie przesuniecia temperatury zimnych końców<br />offset = ( ( cel*10 ) + cel_fract_bits );<br />}<br />else { // Jeżeli błąd DS18x20 komunikat na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if( !Timer3 ){// Pomiar na Termoparze<br />Timer3 = 50; // pomiar raz na 500ms<br />F_Pomiar();<br />}<br /><br />// sterowanie triakiem<br />if(mode)<br />{<br />E = ( T_ustaw-T_pomiar );<br /><br /><br />lcd_locate(0,11);<br />lcd_str_P(PSTR(&quot;E:&quot;));<br />if(E&lt;10){<br />lcd_locate(0,14);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(E&lt;100){<br />lcd_locate(0,15);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br /><br />lcd_locate(0,13);<br />lcd_int(E);<br />if(E &lt;= (-1))E=0;<br /><br />kanal1 = E*Kp;<br />if( kanal1 &gt;= 100 )kanal1 = 100;<br />if( kanal1 &lt;= 0 )kanal1 = 0;<br /><br /><br />if( kanal1 &lt; 10 ){<br />lcd_locate(1,14);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if( kanal1 &lt; 100 ){<br />lcd_locate(1,15);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />lcd_locate(1,12);<br />lcd_int(kanal1);<br />lcd_str(&quot;%&quot;);<br /><br /><br /><br />}<br />else if(!mode){<br />if( T_pomiar &lt;= T_ustaw )kanal1 = 100;<br />if( T_pomiar &gt; T_ustaw )kanal1 = 0;<br />lcd_locate(0,10);<br />lcd_str_P(PSTR(&quot;      &quot;));<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot;      &quot;));<br />}<br /><br />}// koniec petli głownej programu<br /><br />}// Koniec main<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;     &quot;));<br />T_ustaw++;<br />if( T_ustaw &gt; T_MAX )<br />{<br />T_ustaw = 0;<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />if(T_ustaw&lt;10)<br />{<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;       &quot;));<br />}<br />if(T_ustaw&lt;100)<br />{<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;       &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Tz=&quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />ram_cfg.T_ustaw = T_ustaw;<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;     &quot;));<br />T_ustaw--;<br />if(T_ustaw&lt;=0)<br />{<br />T_ustaw=T_MAX;<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;       &quot;));<br />}<br />if(T_ustaw&lt;10)<br />{<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;       &quot;));<br />}<br />if(T_ustaw&lt;100)<br />{<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;       &quot;));<br />}<br /><br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Tz=&quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />ram_cfg.T_ustaw = T_ustaw;<br />}<br />void klaw_ok(void){<br /><br />}<br />void klaw_menu(void){<br />main_menu();<br />lcd_locate(0,0);// (y,x) współżędne wyświetlacza<br />lcd_str_P(PSTR(&quot;Tr:&quot;));<br />lcd_int(T_pomiar);<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Tz: &quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br />void F_save(void){<br />eeprom_write_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />lcd_cls();<br />lcd_str_P(PSTR(&quot;Zapisano ustaw&quot;));<br />}<br />void Load_Set( void ) {<br />eeprom_read_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />wsk_Kp = &amp;Kp;<br />*wsk_Kp = ram_cfg.Kp;<br />if( Kp &lt;= 0)Kp = 1;<br />wsk_T_ustaw = &amp;T_ustaw;<br />*wsk_T_ustaw = ram_cfg.T_ustaw;<br />if( T_ustaw &lt;= 0)T_ustaw = 1;<br />}<br /><br /><br />void display_temp(uint8_t x) {<br />lcd_locate(0,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;,&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal; // -73UL; // błąd napiecia niezrównoważenia wzmacniacza 7.3mV<br /> }<br />  // Napięcie ref w mV * 10 = 25812UL (unsigned long) 1024 maksymalna wartość rejestru ADC<br />  //<br />  return ((((adc*25822UL)/(1024UL*NOOFSAMPLES))*234UL)/100UL); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,6645V stąd stała 26645UL<br />           // 234/100 przelicznik wzmocnienia i pomiaru napiecia<br />           // na temperature<br />}<br />void F_Pomiar(void){<br />lcd_locate(0,3);<br />lcd_str_P(PSTR(&quot;     &quot;));<br />// Temperatura termopary zwracana w formie liczby calkowitej max 60000,<br />// gdzie dwa ostatnie zera to miejsca po przecinku<br />uint16_t pomiar = (GetTemperature()+(offset*10));<br />uint16_t cz_d = pomiar/100;// przeliczanie wartości znaczącej<br />uint8_t cz_u = (pomiar/10)%100;// a tu to co po przecinku<br />lcd_locate(0,4);<br />lcd_int(cz_d);<br />lcd_char(',');<br />lcd_int(cz_u);<br />lcd_str(&quot;\x80&quot;);// wyświetl znak jednostek (C - stopnie Celsiusza)<br />// Przeliczanie wartosci zwracanej przez funkcje do sterowania pomiarem<br />T_pomiar=((GetTemperature()+(offset*10))/100);<br />uart_puts(&quot;Tr=&quot;);<br />uart_putint(cz_d,10);//wysyłanie danych po rs<br />uart_putc(',');<br />uart_putint(cz_u,10);<br /><br />uart_puts(&quot;  E:&quot;);<br />uart_putint(E,10);<br /><br />wsk_T_ustaw = &amp;T_ustaw;<br />uart_puts(&quot;  Tz=&quot;);<br />uart_putint(*wsk_T_ustaw,10);<br /><br />uart_puts(&quot;  Kan:&quot;);<br />uart_putint(kanal1,10);<br /><br />uart_puts(&quot;  Kp=&quot;);<br />uart_putint(Kp,10);<br /><br />uart_puts(&quot;\r\n&quot;);<br />}<br /><br />uint8_t Tryb(void)// tryb właczany domyslnie<br />{<br />if( KEY_DOWN )// klawisz wciśnięty ?<br />{<br />_delay_ms(80);// czas drgań styków<br />if( KEY_DOWN ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR0|= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);// preskaler = 1024<br />//  8MHz / 1024 / 100Hz = 78 =&gt; 256 - 78 = 178: czyli 1ms<br />TCNT0 = 178;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE0);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)// obsługa ADC, zbieranie próbek<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {// Obsługa sterowania triaka<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)// Timer Softwerowy<br />{<br />TCNT0 = 178;<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br />ISR(TIMER2_COMP_vect){// Timer2 dla obsługi triaka<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br /><br />[/syntax]<br />regulator<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br />drgania na PC817<br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><p>Statystyki: Napisane przez Gość — 4 mar 2013, o 15:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-02-13T15:47:12+01:00</updated>
<published>2013-02-13T15:47:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=27921#p27921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=27921#p27921"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=27921#p27921"><![CDATA[
Z racji iż apetyt rośnie w miarę jedzenia, okazało się, iż w projekcie ma być jeszcze regulator P (chyba zrobię PID od razu) dodatkowo wywaliłem te bzdurne pritfy, które na dzień dobry zabierały 2K Flasha. Do tego jeszcze wysyłanie po UART wyników, no i możliwość ręcznego wprowadzanie zmiennych Kp i Kd, jak również błędu wzmacniacza oraz innych parametrów.....<br />Chwilowo bez PID i wprowadzania danych wygląda to tak<br />[syntax=c]/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: xxx<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr\io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\atomic.h&gt;<br />#include &lt;avr\pgmspace.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />#include &quot;MKUART/mkuart.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br />#define T_MAX 600// Maksymalna temperatura - pomiaru - ustawienia<br />#define NOOFSAMPLES128UL // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 100<br /><br />// czas trwania szpilki na PC814 (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br /><br />volatile uint16_t T_ustaw = 1, T_pomiar=0;<br />volatile uint8_t T_offset = 0;<br />volatile uint16_t offset; // zmienne ADC<br />volatile uint32_t ADCVal, T_termopary;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />// inicjalizacja UART<br />USART_Init(__UBRR);<br /><br />timer2_init();// inicjacja timera0<br />timer0_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br />PORTC |= K_up | K_down; // ustawienie portu C dla klawiszy<br /><br />lcd_init();// inicjacja LCD<br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />lcd_cls();<br />lcd_defchar(0x80,stopien);  // definicja znaku stopnia w LCD<br />lcd_locate(0,0);// (y,x) współżędne wyświetlacza<br />lcd_str_P(PSTR(&quot;Temp pom:&quot;));<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T. ustaw = &quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br /><br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />// ************ Główna pętla programu *******************<br />while(1)<br />{<br /><br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t up, down;<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 100, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 100, klaw_down, klaw_down);<br /><br />// Pomiar DS18x20<br />if(!Timer4){<br />Timer4=50;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if(!Timer2){<br />Timer2=50;<br />// Jeżeli wykryjesz to pomiar z pierwszego sensora DS18x20<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />/* Nie wyświetlaj temperatury z DS18x20<br /> * lcd_locate(1,9);<br />if(subzero) lcd_str(&quot;-&quot;);// jeśli subzero==1 wyświetla znak minus (temp. ujemna)<br />else lcd_str(&quot; &quot;);// jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />lcd_int(cel);// wyświetl dziesiętne części temperatury<br />lcd_str(&quot;,&quot;);// wyświetl kropkę<br />lcd_int(cel_fract_bits); // wyświetl dziesiętne części stopnia<br />lcd_str(&quot;C&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />*/<br />// Obliczanie przesuniecia temperatury zimnych końców<br />offset=((cel*10)+cel_fract_bits);<br />}<br />else { // Jeżeli błąd DS18x20 komunikat na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if(!Timer3){// Pomiar na Termoparze<br />Timer3=50; // pomiar raz na 500ms<br />// Temperatura termopary zwracana w formie liczby calkowitej max 60000,<br />// gdzie dwa ostatnie zera to miejsca po przecinku<br />uint16_t pomiar = (GetTemperature()+(offset*10));<br />uint8_t cz_d = pomiar/100;<br />uint8_t cz_u = (pomiar/10)%100;<br /><br />lcd_locate(9,0);<br />lcd_int(cz_d);<br />lcd_char(',');<br />lcd_int(cz_u);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />// Przeliczanie wartosci zwracanej przez funkcje do sterowania pomiarem<br />T_pomiar=((GetTemperature()+(offset*10))/100);<br />uart_putint(cz_d,10);<br />uart_putc(',');<br />uart_putint(cz_u,10);<br />uart_puts(&quot;\r\n&quot;);<br />}<br /><br />// sterowanie triakiem<br />if(T_pomiar&lt;=T_ustaw)kanal1=100;<br />if(T_pomiar&gt;T_ustaw)kanal1=0;<br /><br />}// koniec petli głownej programu<br /><br />}// Koniec main<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br /><br />T_ustaw++;<br />if(T_ustaw&gt;T_MAX){<br />T_ustaw=0;<br />lcd_locate(1,12);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T. ustaw = &quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />T_ustaw--;<br />if(T_ustaw&lt;=0){<br />T_ustaw=T_MAX;<br />lcd_locate(1,10);<br />lcd_str_P(PSTR(&quot;    &quot;));<br />}<br />if(T_ustaw&lt;100){<br />lcd_locate(1,13);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(T_ustaw&lt;10){<br />lcd_locate(1,12);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;T. ustaw = &quot;));<br />lcd_int(T_ustaw);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br /><br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;,&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal; // -73UL; // błąd napiecia niezrównoważenia wzmacniacza 7.3mV<br /> }<br />// Napięcie ref w mV * 10 = 25812UL (unsigned long) 1024 maksymalna wartość rejestru ADC<br />//<br /> return ((((adc*25822UL)/(1024UL*NOOFSAMPLES))*234UL)/100UL); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,5822V stąd stała 26645UL<br />           // 234/100 przelicznik wzmocnienia i pomiaru napiecia<br />           // na temperature<br />}<br /><br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR0|= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);// preskaler = 1024<br />//  8MHz / 1024 / 100Hz = 78 =&gt; 256 - 78 = 178: czyli 1ms<br />TCNT0 = 178;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE0);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)// obsługa ADC, zbieranie próbek<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {// Obsługa sterowania triaka<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)// Timer Softwerowy<br />{<br />TCNT0 = 178;<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br />ISR(TIMER2_COMP_vect){// Timer2 dla obsługi triaka<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br />[/syntax]<br /><br />Zajmuje 4538 bajtów Flash<br />i 146 bajtów RAM, więc jest jeszcze sporo miejsca w Atmedze8..........<br /><br />Jestem w szoku ile dzięki takim Mykom jakie pokazuje Mirek w książce można upchnąć w takich małych procesorach.<br />90% bibliotek na necie to strasznie tłuste biblioteki........ by zamienić pomiar z ADC, przez konwersję na prinft straciłem na dzień dobry 2K Flasha...... szok. A wystarczył myk z przeliczaniem na 16 i 32 bitowej zmiennej z mnożeniem i %100, cyk i 2K kodu mniej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 13 lut 2013, o 15:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-25T12:51:17+01:00</updated>
<published>2013-01-25T12:51:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25789#p25789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25789#p25789"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25789#p25789"><![CDATA[
Zastanawia mnie jedno, Mirek dokładnie opisuje w książce jakich elementów użyć by szerokość impulsu wynosiła 2ms, u mnie są &quot;identyczne&quot; tj. 68K/3W 33K/0.125W + PC814 no i impuls chcąc nie chcąc ma 0,750ms schemat dokładnie taki jak w książce. Następnie wchodzi to na INT0.<br /><br />Już chyba wiem. Zależy w którym miejscu mierzymy impuls, z racji jego kształtu oraz tego że oscyloskop w trybie automatycznym mierzy impuls w 10% i 90% jego wysokości.<br />Pytanie do Mirka jak ma być zmierzony impuls. Bo gdy robię pomiar w 10% wysokości to impuls ma 1.02ms<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/248_f2ba14173d10afe1ae267e6f71a723b4.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/248_f2ba14173d10afe1ae267e6f71a723b4.png" alt="Obrazek" /></a><br /><a href="http://forum.atnel.pl/_obrazki/o/248_81126b7adc999ae934495113c04f1db4.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/248_81126b7adc999ae934495113c04f1db4.png" alt="Obrazek" /></a><br /><br />Niestety obawiam się, że te migotanie jest winą, że źle używam timerów programowych i procesor po prostu nie wyrabia....... zmieniłem szerokość impulsu na 1ms, ale bez zmian.<br /><br />W zasadzie, program działa. tj. spełnia założenia regulacji ustawiamy klawiszami góra dół temperaturę od 1-600C, a grzałka na triaku załatwia resztę.<br />[syntax=c]<br />/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: Wojtek Zakrzowski<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr\io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\atomic.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD\lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br />#define T_MAX 600<br />#define NOOFSAMPLES128UL // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 100<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br />volatile uint16_t T_ustaw = 0, T_pomiar=0;<br />volatile uint8_t T_offset = 0;<br />volatile uint16_t offset; // zmienne ADC<br />volatile uint32_t ADCVal, T_termopary;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />timer2_init();// inicjacja timera0<br />timer0_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br />PORTC |= K_up | K_down | K_ok; // ustawienie portu C dla klawiszy<br /><br />lcd_init();// inicjacja LCD<br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />lcd_cls();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Temp pom:&quot;));<br /><br />char wynik[10];// tablica pomiaru termopary<br /><br />kanal1=50;// testowo na 50% mocy<br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />while(1)<br />{<br /><br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t ok, up, down;<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 10, 1000, klaw_ok, klaw_set);<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 100, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 100, klaw_down, klaw_down);<br /><br />// Pomiar DS18x20<br />if(!Timer4){<br />Timer4=50;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if(!Timer2){<br />Timer2=50;<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />/* Nie wyświetlaj temperatury z DS18x20<br /> * lcd_locate(1,9);<br />if(subzero) lcd_str(&quot;-&quot;);// jeśli subzero==1 wyświetla znak minus (temp. ujemna)<br />else lcd_str(&quot; &quot;);// jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />lcd_int(cel);// wyświetl dziesiętne części temperatury<br />lcd_str(&quot;,&quot;);// wyświetl kropkę<br />lcd_int(cel_fract_bits); // wyświetl dziesiętne części stopnia<br />lcd_str(&quot;C&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />*/<br /><br />offset=((cel*10)+cel_fract_bits);<br />}<br />else { // Jeżeli błąd DS18x20 wywal błąd na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if(!Timer3){// Pomiar na Termoparze<br />Timer3=50; // Co sekunde pomiar i nie blokujemy durnym _delay reszty zasobow<br /><br />sprintf(wynik, &quot;%5u&quot;, (GetTemperature()+(offset*10)));<br />uint8_t len=strlen(wynik);<br />memmove(&amp;wynik[len-1], &amp;wynik[len-2], 3);<br />wynik[len-2]=',';<br />lcd_locate(9,0);<br />lcd_str(wynik);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />T_pomiar=((GetTemperature()+(offset*10))/100);<br />lcd_locate(1,10);<br />lcd_int(T_pomiar);<br />}<br /><br />// sterowanie triakiem<br />if(T_pomiar&lt;=T_ustaw)kanal1=100;<br />if(T_pomiar&gt;T_ustaw)kanal1=0;<br /><br />}// koniec petli głownej programu<br /><br />}// Koniec main<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br /><br />T_ustaw++;<br />if(T_ustaw&gt;T_MAX){<br />T_ustaw=0;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Tset= &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />T_ustaw--;<br />if(T_ustaw==0){<br />T_ustaw=T_MAX;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />if(T_ustaw&lt;T_MAX){<br />lcd_locate(1,7);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(T_ustaw&lt;10){<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_ok(void){ // wywoływana po krótkim przycisnięciu klawisza OK<br />// ustawianie offsetu<br />T_offset++;<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Offset = &quot;));<br />lcd_locate(1,0);<br />lcd_int(T_offset);<br />if(T_offset&gt;20)T_offset=1;<br /><br />}<br />void klaw_set(void){ // wywoływana po długim nacisnieciu klawisza OK<br />// zapis ustawien do eeprom<br />}<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;,&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal; // -73UL; // błąd napiecia niezrównoważenia wzmacniacza 7.3mV<br /> }<br />// Napięcie ref w mV * 10 = 25812UL (unsigned long) 1024 maksymalna wartość rejestru ADC<br />//<br /> return ((((adc*25822UL)/(1024UL*NOOFSAMPLES))*234UL)/100UL); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,5822V stąd stała 26645UL<br />}<br /><br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR0|= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);// preskaler = 1024<br />//  8MHz / 1024 / 100Hz = 78 =&gt; 256 - 78 = 178: czyli 1ms<br />TCNT0 = 178;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE0);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 178;<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br /><br />ISR(TIMER2_COMP_vect){<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br />[/syntax]<br /><br />Co prawda nie jestem zadowolony z &quot;skomplikowanego&quot; algorytmu regulacji tj.<br />[syntax=c]<br />// sterowanie triakiem<br />if(T_pomiar&lt;=T_ustaw)kanal1=100;<br />if(T_pomiar&gt;T_ustaw)kanal1=0;<br />[/syntax]<br />Brakuje mi jakiegoś &quot;miększego&quot; sposobu regulacji. Ale o pid kolega nie chce słyszeć, bo by musiał się potem z tego tłumaczyć <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<p>Statystyki: Napisane przez Gość — 25 sty 2013, o 12:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-25T10:45:10+01:00</updated>
<published>2013-01-25T10:45:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25783#p25783</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25783#p25783"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25783#p25783"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />%ld to long double ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /></div><br />Nie. %ld to jest long int =&gt; int32_t, a %lu to long unsigned int =&gt; uint32_t<br />Najlepiej w tym celu zajrzyj tutaj <!-- m --><a class="postlink" href="http://pl.wikibooks.org/wiki/C/printf" >http://pl.wikibooks.org/wiki/C/printf</a><!-- m -->. Jest ładniej opisane niż to <!-- m --><a class="postlink" href="http://nongnu.org/avr-libc/user-manual/group__avr__stdio.html" >http://nongnu.org/avr-libc/user-manual/ ... stdio.html</a><!-- m --> z tym, że dla AVR short int to to samo co int.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 25 sty 2013, o 10:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-25T08:12:40+01:00</updated>
<published>2013-01-25T08:12:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25771#p25771</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25771#p25771"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25771#p25771"><![CDATA[
%ld to long double ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Spróbuję w weekend bo zapomniałem do pracy zabrać mojego symulatora termopary <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />Dzisiaj muszę zawalczyć z stworzeniem algorytmu do regulacji, jakiś prosty z stałym offsetem powinien starczyć.<br />Pewnie dla doświadczonego programisty to 10 minut <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />PS nie wiem czy widać na filmie, ale światło pulsuje, a przerzuciłem 1:1 program Mirka, nie wiem, czy coś źle nie robię. Muszę jeszcze przeanalizować, czy aby nie ma jakieś dużej różnicy między ustawieniem int0 w Atmedze32, a atmega8 której używam.<br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />Na filmie tego nie widać, jednak aż tak dobrze. Przy ustawieniu 100kroków efekt migotania jest mniejszy, przy 200krokach większy.<br />Co prawda to będzie sterować grzałką, ale nie chciał bym zostawiać tak tego.<p>Statystyki: Napisane przez Gość — 25 sty 2013, o 08:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-24T15:42:46+01:00</updated>
<published>2013-01-24T15:42:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25719#p25719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25719#p25719"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25719#p25719"><![CDATA[
A może dasz przykład. Próbowałeś z %ld ? A tekst można zamienić na liczbę funkcjami z nagłówka stdlib.h atoi lub atol.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 sty 2013, o 15:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-25T08:27:07+01:00</updated>
<published>2013-01-24T15:30:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25718#p25718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25718#p25718"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25718#p25718"><![CDATA[
Działa, jak zwykle masz racje <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, sam czytałem biblioteki i opis sprintf, ale po angielsku to jest napisane tak zagmatwanie, że nie potrafiłem zajarzyć jak to ugryść. <br />Co ciekawe, sprintf jako 3 argument nie przyjmuje uint32_t<br /><br /><br />PS. Troszkę przez to, że temperaturę termopary mam jako tekst mam utrudnione zadanie, ale stwierdziłem, że do regulacji &quot;grzałki&quot; Wykorzystam to co zwraca funkcja GetTemperature + offset DS1820.<br /><br />Jeszcze nie bardzo wiem, jak rozpisać algorytm regulacji, no i muszę powalczyć jeszcze z samym programem. Bo wpisanie lekcji Mirka z książki (rozdział o regulowaniu mocy na 230V) nie do końca mi działa. Testowa żarówka migocze, acz regulacja działa. Chwilowo mam regulację z palca tj. od 0 do 100% można regulować ręcznie...... coś musi być nie tak z czasami i mierzeniem przejścia przez zero.<br /><br />A tak wyglądają przebiegi dla 25%<br /><a href="http://forum.atnel.pl/_obrazki/o/248_18432d3f22b8d5292280c1d0b62c7e22.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/248_18432d3f22b8d5292280c1d0b62c7e22.PNG" alt="Obrazek" /></a><br /><br />Dla 50%<br /><a href="http://forum.atnel.pl/_obrazki/o/248_a5838a570035fac9848cdf6a056a518a.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/248_a5838a570035fac9848cdf6a056a518a.PNG" alt="Obrazek" /></a><br /><br />Dla 75%<br /><a href="http://forum.atnel.pl/_obrazki/o/248_f7036a3be3f7dc6d5a23f3be7e68e553.PNG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/248_f7036a3be3f7dc6d5a23f3be7e68e553.PNG" alt="Obrazek" /></a><br /><br />Niebieski to sygnał na optotriaka, seledyn to szpilki z detekcji zera.<p>Statystyki: Napisane przez Gość — 24 sty 2013, o 15:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-24T15:18:36+01:00</updated>
<published>2013-01-24T15:18:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25716#p25716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25716#p25716"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25716#p25716"><![CDATA[
Funkcja GetTemperature zwraca liczbę dodatnią, a w sprintf masz %d (liczba dziesiętna ze znakiem). Jak wyjdzie z %u ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 24 sty 2013, o 15:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-24T14:20:20+01:00</updated>
<published>2013-01-24T14:20:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25711#p25711</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25711#p25711"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25711#p25711"><![CDATA[
Timery zmęczyłem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Teraz mam problem z &quot;przekręcającą&quot; się wartością pomiaru ADC. Do połowy zakresu jest ok, powyżej zaczyna wywalać ujemne wyniki. <br /><br />Tu linijka z zwracaniem wyniku pomiaru<br />return ((((adc*25822UL)/(1024UL*NOOFSAMPLES))*234UL)/100UL)<br /><br />NOOFSAMPLES = 128 // zbieram 128 próbek <br />234 to współczynnik wzmocnienia wzmacniacza termopary + przelicznik termopara napięcie<br /><br />A tu cały program.<br />[syntax=c]<br />/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: xxx<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr\io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\atomic.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD\lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br /><br />#define NOOFSAMPLES128UL // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 0.75<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br />volatile uint8_t T_ustaw = 0;<br />volatile uint8_t T_offset = 0;<br />// zmienne ADC<br />volatile uint32_t ADCVal;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />timer2_init();// inicjacja timera0<br />timer0_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br />PORTC |= K_up | K_down | K_ok; // ustawienie portu C dla klawiszy<br /><br />lcd_init();// inicjacja LCD<br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />lcd_cls();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Temp pom:&quot;));<br /><br />char wynik[10];// tablica pomiaru termopary<br />kanal1=100;// testowo na 50% mocy<br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />while(1)<br />{<br /><br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t ok, up, down;<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 10, 1000, klaw_ok, klaw_set);<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 200, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 200, klaw_down, klaw_down);<br /><br />// Pomiar DS18x20<br />if(!Timer4){<br />Timer4=50;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if(!Timer2){<br />Timer2=50;<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />lcd_locate(1,9);<br />if(subzero) lcd_str(&quot;-&quot;);// jeśli subzero==1 wyświetla znak minus (temp. ujemna)<br />else lcd_str(&quot; &quot;);// jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />lcd_int(cel);// wyświetl dziesiętne części temperatury<br />lcd_str(&quot;.&quot;);// wyświetl kropkę<br />lcd_int(cel_fract_bits); // wyświetl dziesiętne części stopnia<br />lcd_str(&quot;C&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br />else { // Jeżeli błąd DS18x20 wywal błąd na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if(!Timer3){// Pomiar na Termoparze<br />Timer3=50; // Co sekunde pomiar i nie blokujemy durnym _delay reszty zasobow<br /><br />sprintf(wynik, &quot;%5d&quot;, GetTemperature());<br />uint8_t len=strlen(wynik);<br />memmove(&amp;wynik[len-1], &amp;wynik[len-2], 3);<br />wynik[len-2]=',';<br />lcd_locate(9,0);<br />lcd_str(wynik);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br /><br />// sterowanie triakiem<br /><br />}// koniec petli głownej programu<br /><br />}// Koniec main<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br /><br />T_ustaw++;<br />if(T_ustaw&gt;200){<br />T_ustaw=0;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />//_delay_ms(200);<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />T_ustaw--;<br />if(T_ustaw==0){<br />T_ustaw=200;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />if(T_ustaw&lt;100){<br />lcd_locate(1,7);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(T_ustaw&lt;10){<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_ok(void){ // wywoływana po krótkim przycisnięciu klawisza OK<br />// ustawianie offsetu<br />T_offset++;<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Offset = &quot;));<br />lcd_locate(1,0);<br />lcd_int(T_offset);<br />if(T_offset&gt;20)T_offset=1;<br /><br />}<br />void klaw_set(void){ // wywoływana po długim nacisnieciu klawisza OK<br />// zapis ustawien do eeprom<br />}<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;,&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal; // -73UL; // błąd napiecia niezrównoważenia wzmacniacza 7.3mV<br /> }<br />// Napięcie ref w mV * 10 = 25812UL (unsigned long) 1024 maksymalna wartość rejestru ADC<br />//<br /> return ((((adc*25822UL)/(1024UL*NOOFSAMPLES))*234UL)/100UL); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,5822V stąd stała 26645UL<br />}<br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR0|= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);// preskaler = 1024<br />//  8MHz / 1024 / 100Hz = 78 =&gt; 256 - 78 = 178: czyli 1ms<br />TCNT0 = 178;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE0);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 178;<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br /><br />ISR(TIMER2_COMP_vect){<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br /><br />[/syntax]<br /><br />Wprowadziłem lekką poprawkę, celem zsumowania offsetu potrzebnego dla termopary, sumując wartość temperatury DS18x20 z temperaturą termopary.<p>Statystyki: Napisane przez Gość — 24 sty 2013, o 14:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T21:14:05+01:00</updated>
<published>2013-01-23T21:14:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25686#p25686</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25686#p25686"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25686#p25686"><![CDATA[
Dzięki Krauser, na ciebie zawsze można liczyć <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br /><br />Dzisiaj, już mam dość bo przez swoją głupotę uwaliłem 90% portów USB w moim kompie <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />. <br />Przestroga dla innych, zawsze izolujcie TRIAKi podpięte do 230V by czasem nic nie dotkło..........<br />Poleciał programator STK500v2 (FTDI i atmega8 się usmażyła) no i 7 z 8 portów USB w kompie.<br /><br />Całę szczęście, że FTDI mam na zapasie, już wymieniłem i zaprogramowałem. Jutro zaprogramuje atmege8 w programatorze AVRdragon, no i zostaje kupić HUBa USB, albo najlepiej kontroler na PCI.<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 21:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-23T19:56:43+01:00</updated>
<published>2013-01-23T19:56:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25679#p25679</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25679#p25679"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25679#p25679"><![CDATA[
Do timera powinieneś wpisywać 25<strong>6</strong> - 78, a nie 25<strong>5</strong> - 78. Tutaj jest trochę inaczej niż w trybie CTC. Zauważ, że jak wpiszesz 255 to potrzeba jeszcze 1 tyknięcia timera, aby się przekręcił i wygenerował sygnał przerwania.<br />W procedurze przerwania również musisz na nowo wpisywać liczbę do timera inaczej będzie liczył od 0, a nie od 178 i następne przerwanie będzie nie za 10ms tylko za 33ms. W tym programie masz duży preskaler (1024) co oznacza, że timer na pewno nie zliczy żadnego impulsu do czasu wpisania nowej wartości i możesz wpisać ją bezpośrednio, gdyby preskaler był ustawiony na 1 lub 8 wtedy do TCNT0 należy wpisywac w taki sposób:<br />[syntax=c]TCNT0 = TCNT0+(256-78);[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 sty 2013, o 19:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T15:52:10+01:00</updated>
<published>2013-01-23T15:52:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25665#p25665</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25665#p25665"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25665#p25665"><![CDATA[
A wracając do tematu, coś mnie się zdaje, że namieszałem w przerywaniach albo timerach. Bo nawet jak wywale wszystko z pętli głównej while(1)<br /><br />zostawię tylko cykliczną zmianę na LCD z 1 na 9 w drugim rzędzie to i tak, przechodzi tylko raz. tj. zapala się 1 i program zawisa.<br /><br /><span style="color: #FF0000">Pierwsze co zauważyłem to, że źle zainicjowałem timer0, bo zamiast TOIE0 miałem TOIE2 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, zaraz przeprowadzę testy, czy to już wszystko, czy nadal mój ciemny rozum nie ogarnia <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> czegoś.</span><br /><br />[syntax=c]<br />/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: xxx<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr\io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\atomic.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD\lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br /><br />#define NOOFSAMPLES128 // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 0.75<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br />volatile uint8_t T_ustaw = 0;<br />volatile uint8_t T_offset = 0;<br />// zmienne ADC<br />volatile uint32_t ADCVal;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />timer2_init();// inicjacja timera0<br />timer0_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br />PORTC |= K_up | K_down | K_ok; // ustawienie portu C dla klawiszy<br /><br />lcd_init();// inicjacja LCD<br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />lcd_cls();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Temp pom:&quot;));<br /><br />char wynik[7];// tablica pomiaru termopary<br />kanal1=100;// testowo na 50% mocy<br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />while(1)<br />{<br />/*<br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t ok, up, down;<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 10, 1000, klaw_ok, klaw_set);<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 200, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 200, klaw_down, klaw_down);<br /><br />// Pomiar DS18x20<br />if(!Timer4){<br />Timer4=100;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if(!Timer2){<br />Timer2=100;<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />lcd_locate(1,9);<br />if(subzero) lcd_str(&quot;-&quot;);// jeśli subzero==1 wyświetla znak minus (temp. ujemna)<br />else lcd_str(&quot; &quot;);// jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia)<br />lcd_int(cel);// wyświetl dziesiętne części temperatury<br />lcd_str(&quot;.&quot;);// wyświetl kropkę<br />lcd_int(cel_fract_bits); // wyświetl dziesiętne części stopnia<br />lcd_str(&quot;C&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br />else { // Jeżeli błąd DS18x20 wywal błąd na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if(!Timer3){// Pomiar na Termoparze<br />Timer3=100; // Co sekunde pomiar i nie blokujemy durnym _delay reszty zasobow<br />sprintf(wynik, &quot;%5d&quot;, GetTemperature());<br />uint8_t len=strlen(wynik);<br />memmove(&amp;wynik[len-1], &amp;wynik[len-2], 3);<br />wynik[len-2]=',';<br />lcd_locate(9,0);<br />lcd_str(wynik);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br />*/<br />// sterowanie triakiem<br />lcd_locate(1,0);<br />lcd_int(1);<br />_delay_ms(1000);<br />lcd_locate(1,0);<br />lcd_int(9);<br /><br /><br />}// koniec petli głownej programu<br /><br />}// Koniec main<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br /><br />T_ustaw++;<br />if(T_ustaw&gt;200){<br />T_ustaw=0;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />//_delay_ms(200);<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />T_ustaw--;<br />if(T_ustaw==0){<br />T_ustaw=200;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />if(T_ustaw&lt;100){<br />lcd_locate(1,7);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(T_ustaw&lt;10){<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_ok(void){ // wywoływana po krótkim przycisnięciu klawisza OK<br />// ustawianie offsetu<br />T_offset++;<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Offset = &quot;));<br />lcd_locate(1,0);<br />lcd_int(T_offset);<br />if(T_offset&gt;20)T_offset=1;<br /><br />}<br />void klaw_set(void){ // wywoływana po długim nacisnieciu klawisza OK<br />// zapis ustawien do eeprom<br />}<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal;<br /> }<br /><br /> return (adc*26450UL)/(1024UL*NOOFSAMPLES); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,6645V stąd stała 26645UL<br />}<br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br />TCCR0|= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />TCNT0 = 78;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE2);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br /><br />ISR(TIMER2_COMP_vect){<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br />[/syntax]<br /><br />Przeliczyłem jeszcze raz w/g wzoru<br />//  8MHz / 1024 / 100Hz = 78,125 =&gt; 255 - 78 = 177: czyli ok 10ms<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 15:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-01-23T15:43:41+01:00</updated>
<published>2013-01-23T15:43:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25664#p25664</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25664#p25664"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25664#p25664"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Od gościa z Chorzowa który robił platwormę MegadunioAVT dla Elektroniki Praktyczniej. Byłem u niego po shieldy ETHT + PCB chindunio i PCB Megadunio AVR.<br /></div><br /><br />jak mozesz daj mi namiary na pw <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 23 sty 2013, o 15:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T15:42:13+01:00</updated>
<published>2013-01-23T15:42:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25663#p25663</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25663#p25663"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25663#p25663"><![CDATA[
Od gościa z Chorzowa który robił platwormę MegadunioAVT dla Elektroniki Praktyczniej. Byłem u niego po shieldy ETHT + PCB chindunio i PCB Megadunio AVR.<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 15:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-01-23T15:33:22+01:00</updated>
<published>2013-01-23T15:33:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25661#p25661</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25661#p25661"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25661#p25661"><![CDATA[
a gdzie zamawiales ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 23 sty 2013, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T15:30:14+01:00</updated>
<published>2013-01-23T15:30:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25659#p25659</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25659#p25659"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25659#p25659"><![CDATA[
No ja właśnie też po to te przejściówki zamówiłem <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />. Mam i na attiny i na atmega8. Bajer, bo można sobie przetestować na ATB bez potrzeby składania od razu prototypu na danym procku.<br /><br />Brakuje mi jeszcze czegoś na większe procki <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />. Ale z tym poradziłem sobie zamawiając platformę Megadunio na Atmedze2560.<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 15:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-01-23T15:28:03+01:00</updated>
<published>2013-01-23T15:28:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25657#p25657</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25657#p25657"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25657#p25657"><![CDATA[
<div class="quotetitle">rezasurmar napisał(a):</div><div class="quotecontent"><br />Bo taki muszę użyć w projekcie, tj. taki już jest na płytce. Zresztą do tego starczy w zupełności atmega8. No i mam ich z 10szt w szufladzie, więc miło by było je wykorzystać.<br /></div><br /><br />luzik pytalem z ciekawosci <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />dlatego chce do Atb zamowic u Mirka przejsciowki na inne procki <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 23 sty 2013, o 15:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T15:25:39+01:00</updated>
<published>2013-01-23T15:25:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25655#p25655</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25655#p25655"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25655#p25655"><![CDATA[
Bo taki muszę użyć w projekcie, tj. taki już jest na płytce. Zresztą do tego starczy w zupełności atmega8. No i mam ich z 10szt w szufladzie, więc miło by było je wykorzystać.<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 15:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jachu]]></name></author>
<updated>2013-01-23T15:23:59+01:00</updated>
<published>2013-01-23T15:23:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25653#p25653</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25653#p25653"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25653#p25653"><![CDATA[
a tak z ciekawosci czemu zmeniasz procek ? <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=110">jachu</a> — 23 sty 2013, o 15:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-01-23T14:59:20+01:00</updated>
<published>2013-01-23T14:59:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25651#p25651</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25651#p25651"/>
<title type="html"><![CDATA[Re: Termopara + DS18x20 + LCD + superdebounce na A8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2118&amp;p=25651#p25651"><![CDATA[
Po kilku &quot;dniach&quot; znowu zająłem się moim problemem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br />Przeportowałem obsługę z Atmega32 na Atmega8, czyli musiałem na nowo przepisać inicjację Timerów. Mam z tym problem.<br />Mógł by ktoś bardziej rozgarnięty niż ja rzucić okiem, czy nie spaprałem inicjacji, szczególnie dotyczącej Timera0 oraz timerów programówych.<br />Program startuje, ale potem wisi, tj. warunki timerów programowych się nie wykonują.<br />[syntax=c]<br />/*<br /> * TermoW_main.c<br /> *<br /> *  Created on: 08-01-2013<br /> *      Author: xxx<br /> *      Atmel toolchain 3.4.1<br /> */<br /><br />// Biblioteki standardowe AVR<br />#include &lt;avr\io.h&gt;<br />#include &lt;stdio.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\atomic.h&gt;<br />#include &lt;string.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />// Biblioteki z Książki Mirka Kardasia<br />#include &quot;LCD\lcd44780.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;Keys/keys.h&quot;<br />// moje makra i deklaracje<br />#include &quot;common.h&quot;<br /><br />#define NOOFSAMPLES128 // Ilość próbek na pomiar<br /><br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 0.75<br />/*********************** R E G U L A T O R  -  U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />// zmienne Sterowania Triakiem<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br />volatile uint8_t T_ustaw = 0;<br />volatile uint8_t T_offset = 0;<br />// zmienne ADC<br />volatile uint32_t ADCVal;<br />volatile uint16_t Timer1, Timer2, Timer3, Timer4; // Timery programowe, do obsługi nie blokującej<br />// Definicja znaku GCRAM stopnia<br />uint8_t stopien[] = {12,18,18,12,32,32,32,32}; // Znak stopnia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />void ADC_init() // Inicjacja przetwarzania ADC<br />{<br />ADMUX= _BV(REFS0) | _BV(REFS1) | 0b0000;//Wew. referencyjne, kanał 0, wyrównanie do prawej<br />ADCSRA=_BV(ADEN) | _BV(ADIE) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0);//Włącz ADC, przerwania, preskaler 128<br />ADCSRA|=(_BV(ADFR) | _BV(ADSC));<br />}<br /><br /><br />uint8_t subzero, cel, cel_fract_bits; // definicja zmiennych do przechowywania pomiaru i znaku<br /><br />int main()<br />{<br />timer0_init();// inicjacja timera0<br />timer2_init();// inicjacja timera2<br /><br />DDRB |= (1&lt;&lt;PB2); // Wyjście na triak MOC302x<br />T_ZAR1_OFF;<br /><br />// Przerywanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br />PORTC |= K_up | K_down | K_ok; // ustawienie portu C dla klawiszy<br /><br />lcd_init();// inicjacja LCD<br />ADC_init();// inicjacja ADC<br /><br />search_sensors();// Szukaj DSów na magistrali 1wire<br /><br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />/* czekamy 750ms na dokonanie konwersji przez podłączone czujniki */<br />_delay_ms(750);  //wrzucic potem jakas ciekawa animacje zamiast delay<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits) ) display_temp(0);<br />else {<br />lcd_locate(1,0);<br />lcd_str(&quot; error &quot;);/* wyświetlamy informację o błędzie jeśli np brak czujnika lub błąd odczytu */<br />}<br /><br />lcd_cls();<br />lcd_defchar(0x80,stopien); // definicja znaku stopnia w LCD<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Temp pom:&quot;));<br /><br />char wynik[7];// tablica pomiaru termopary<br />kanal1=100;// testowo na 50% mocy<br /><br />// ************ Odblokowanie przerywań ******************<br />sei();<br /><br />while(1)<br />{<br />// Klawiatura - Obsługa fizycznych klawiszy<br />static uint8_t ok, up, down;<br />SuperDebounce(&amp;ok, &amp;PINC, K_ok, 10, 1000, klaw_ok, klaw_set);<br />SuperDebounce(&amp;up, &amp;PINC, K_up, 10, 200, klaw_up, klaw_up);<br />SuperDebounce(&amp;down, &amp;PINC, K_down, 10, 200, klaw_down, klaw_down);<br /><br />// Pomiar DS18x20<br />if(!Timer4){<br />Timer4=100;<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />}<br />// Wyświetl Pomiar<br />if(!Timer2){<br />Timer2=100;<br />if( DS18X20_OK == DS18X20_read_meas(gSensorIDs[0], &amp;subzero, &amp;cel, &amp;cel_fract_bits)){<br />lcd_locate(1,9);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot;C&quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />else { // Jeżeli błąd DS18x20 wywal błąd na wyświetlacz<br />lcd_locate(1,9);<br />lcd_str( &quot;error&quot; );<br />}<br /><br />}<br />if(!Timer3){// Pomiar na Termoparze<br />Timer3=100; // Co sekunde pomiar i nie blokujemy durnym _delay reszty zasobow<br />sprintf(wynik, &quot;%5d&quot;, GetTemperature());<br />uint8_t len=strlen(wynik);<br />memmove(&amp;wynik[len-1], &amp;wynik[len-2], 3);<br />wynik[len-2]=',';<br />lcd_locate(9,0);<br />lcd_str(wynik);<br />lcd_str(&quot;\x80&quot;); // wyświetl znak jednostek (C - stopnie Celsiusza)<br />}<br /><br />// sterowanie triakiem<br /><br />}<br />}<br /><br /><br />// Obsługa funkcji klawiatury<br />void klaw_up(void){<br /><br />T_ustaw++;<br />if(T_ustaw&gt;200){<br />T_ustaw=0;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />//_delay_ms(200);<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_down(void){ // Obsługa klawiatury<br />T_ustaw--;<br />if(T_ustaw==0){<br />T_ustaw=200;<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;   &quot;));<br />}<br />if(T_ustaw&lt;100){<br />lcd_locate(1,7);<br />lcd_str_P(PSTR(&quot;  &quot;));<br />}<br />if(T_ustaw&lt;10){<br />lcd_locate(1,8);<br />lcd_str_P(PSTR(&quot; &quot;));<br />}<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;Moc = &quot;));<br />lcd_int(T_ustaw);<br />}<br />void klaw_ok(void){ // wywoływana po krótkim przycisnięciu klawisza OK<br />// ustawianie offsetu<br />T_offset++;<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;Offset = &quot;));<br />lcd_locate(1,0);<br />lcd_int(T_offset);<br />if(T_offset&gt;20)T_offset=1;<br /><br />}<br />void klaw_set(void){ // wywoływana po długim nacisnieciu klawisza OK<br />// zapis ustawien do eeprom<br />}<br />void display_temp(uint8_t x) {<br />lcd_locate(1,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;.&quot;);/* wyświetl kropkę */<br />lcd_int(cel_fract_bits); /* wyświetl dziesiętne części stopnia */<br />lcd_str(&quot; C &quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br />uint16_t GetTemperature() // Funcja zwracająca temperature termopary<br />{<br /> uint32_t adc;<br /> ATOMIC_BLOCK(ATOMIC_FORCEON)<br /> {<br />  adc=ADCVal;<br /> }<br /><br /> return (adc*26450UL)/(1024UL*NOOFSAMPLES); // Napięcie referencyje zmierzone na<br />           // procesorze to 2,6645V stąd stała 26645UL<br />}<br />// Inicjacja TIMER0 dla softwerowych timerów<br />void timer0_init(void){<br /><br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer1 – inicjalizacja przerwania co 10ms */<br /><br />TCCR0|= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />//TCNT0 = 78;// przerwanie porównania co 10ms (100Hz)<br />TIMSK |= (1&lt;&lt;TOIE2);// Odblokowanie przerwania OverFlow<br />}<br /><br />void timer2_init(void){<br />//************** TIMER2 Dla sterowania Triakiem *************************<br /><br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// Tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania overflow<br />OCR2 = __OCR_STEP;<br /><br />//************************************************************************<br />}<br /><br />ISR(ADC_vect)<br />{<br /> static uint32_t ADCaccum;<br /> static uint8_t sampleno;<br /><br /> ADCaccum+=ADC;<br /> sampleno++;<br /> if(sampleno==NOOFSAMPLES)<br /> {<br />  ADCVal=ADCaccum;<br />  ADCaccum=0;<br />  sampleno=0;<br /> }<br />}<br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />static uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br /><br />}<br /><br /><br />ISR(TIMER2_COMP_vect){<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br />}<br /><br />[/syntax]<p>Statystyki: Napisane przez Gość — 23 sty 2013, o 14:59</p><hr />
]]></content>
</entry>
</feed>