Po pierwsze, timer liczy od 0 do 255, ale to oznacza 256 impulsów pomiędzy przepełnieniami, czyli powinno być 256, a nie 255 * 128us. Po drugie zaokrągliłeś wynik z 32.64 do 32 przed dzieleniem, co w efekcie dało niedokładny wynik ilości przepełnień. W rzeczywistości częstotliwość przerwań można obliczyć dużo prościej: ( 8000000 / 1024 ) / 256 = ok. 30,5176.....
Witam, potrzebuje pomocy z timerem1 w atmega328p. mam taki kod: [syntax=c] // Ustawienie timera 1 TIMSK1 |= (1<<TOIE1); // umozliwenie przerwan od timera1 TCCR1B |= (1<<CS00) | (1<<CS02); // prescaler na 1024 TCNT1 = 60000; // wartość rejestru w którym odbywa się liczenie na 60000 sei(); // przerwanie od timera1 ISR(TIMER1_OVF_vect)...
Mam ustawiony timer w Input Capture Ustawienie timera z przepełnieniem licznika IC_Timers 40000 (po prostu potrzebowałem równy czas też dla odmierzania zegarka i innych bajerów do odmierzania czasu ) przerwanie co 20ms. https://obrazki.elektroda.pl/6280175200_... Od lewej okres, czas stanu wysokiego, aktualny timer ICR1, poprzedni timer...
Korzystając z tego kursu [url=http://maxembedded.com/2011/06/avr-... nie moge uzyskać migania diody przy modyfikacji kodu: [syntax=c]int main( void ){ DDRB = LED1; PORTB = LED1; TCCR2B |= (1<<CS21)|(1<<CS22); TCNT2 = 0; TIMSK2 |=(1<<TOIE2); sei(); while(1){ } } ISR(TIMER2_OVF_vect) { if (TCNT2 >= 10) PORTB &=...
[syntax=cpp] #include "avr/io.h" #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "myuart.h" #include "mk_term.h" volatile uint8_t kawalek; volatile uint16_t impuls; //zmienna która jest liczbą impulsów przed wyrezerwanie timera #define D1_ON PORTD |=(1<<PD7); #define D2_ON PORTD |=(1<<PD6);...
Witam. Tak ustawiam Timer2 [syntax=c] void initTimer2(void) { /* Funkcja inicjująca timer2 w tryb asynchroniczny wykorzystujący kwarc 32,768kHz timer2 odpowiada za odliczanie czasu generuje przerwania co 8 sekund ==== Rejestr ASSR w Timer_Counter_2 ====== */ TIMSK2 = 0;//Disable timer2 interrupts ASSR &= ~(1 << EXCLK); ASSR |= (1<<AS2);//Enable...
Witam, muszę tak skonfigurować timer1 aby przerwanie występowało co 1us. Mam uC atmega328pu i kwarc 16MHz. Warości, które wpisuję do rejestrów porównania są na pewno poprawne, ale w moim przypadku dioda zmienia swój stan w czasie dłuższym niż 1s (dla testów w ISR umieściłem licznik ,który w momencie osiągnięcia warości 1 milion zmienia stan diody)....
Timer 2 ma ustwienia prescalera na 1 i rejestru porównawczego na 7 Zacznijmy od tego: timer w trybie CTC, preskaler 1, OCR2A=7, czyli przerwanie co 8 taktów zegara, a ile taktów trwa procedura obsługi tego przerwania? Samo wejście i wyjście z procedury zajmuje więcej czasu.
Spoko dondu, mi jedynie chodzi o nieprzerywanie programu głównego w czasie wykonywania pewnych zadań. A obsłużyć przerwanie zdążę spokojnie gdy głóœny program zostanie wstrzymany w kontrolowany sposób. Rozumiem że flagi które podaliście trzeba samemu zerować po wykryciu wartości true? Czy może timer to robi i to go trzeba uruchomić ponownie po...
czy ktoś byłby mi w stanie pomóc w ustawieniu przerwania na int1 urzywająć timera1 ? ponieważ nie radzę sobie z ustawieniem tego 16 bitowego timera. ogolnie przerwanie miało by wyłączać silnik jesli zostanie wciśniety przycisk bądź krancówka
Witam, drogich forumowiczów. Mam problem z komunikacją kilku urządzeń w sieci rs485. A tak prawdę mówiąc to z komunikacją pomiedzy dwoma, jednym "master" i jednym "slave". Normalnie staram się zadawać pytania w ostateczności na forum Elektroda, ale po prawie 3 tygodniach siedzenia przy problemie, przeglądaniu masy poradników i postów związanych z rs485...
Witam, pisze program w którym wykorzystuję 16 bitowy Timer1 z Atmegi 328. Najpierw konfiguruję go tak: [syntax=vbnet]Config Timer1 = Timer , Prescale = 64 'Kwarc 18.43MHz, 1/18430000 * 64 = 3.473us Enable Timer1 On Timer1 Impulsuj 'ISR[/syntax] a potem mam procedurę przerwania której zadaniem testowym jest wygenerować przebieg prostokątny: [syntax=vbnet]'---------------------ISR....
Niestety problem znów się pojawił: Program nie wchodzi do pętli while, gdzie warunek jest niespełniony dopiero po zatrzymaniu dopiero co ustawionego rejestru licznika, próbowałem jeszcze inny sposób, z bitami zmiennej flag ustawianymi w przerwaniach - do przerwania wchodzi, ale jak wróci do programu to nie wychodzi z pętli - tak jakby warunek był cały...
Próbuję przerobić przykład "Przyklady\LCDAlfa\LCDAlfa-transact-int\... z książki [url=http://helion.pl/ksiazki/jezyk-c-dl...
Mam problem z przerwaniem w trybie asynchronicznym - Amtega328. Załączam program uproszczony do niezbędnych elementów: [syntax=c]//co 0.5s ISR(TIMER2_OVF_vect) { ... _delay_us(30); //V1 //while(TIFR2 & (1<<TOV2)); //V2 //while(TIFR2 & (1<<TOV2)) _delay_us(1);//V3 //while(TIFR2 & (1<<TOV2)) TIFR2 |=1<<TOV2;//V4 //cli();...
Witam, napotkałem problem dotyczący generowania od dwóch do czterech sygnałów PWM na dwóch timerach - 8 i 16 bitowym. Posiadam Atmegę 328p z kwarcem 16 Mhz. Timer 8 bitowy ma generować przerwanie z czestotliwością 800 Hz (po 200 Hz na kanał, przy obsłudze czterech kanałów.). Timer 16 bitowy ma generować przerwanie by w efekcie PWM miał szerokość od...
Zadaniem programu ma być odmierzenie 1 sekundy (zmiana stanu na wy). Przerwanie od timera 2 przychodzi co 1ms. Kwarc zewnętrzny ~11MHz. Czy ktoś mógłby napisać dlaczego program nie działa? #include<avr/io.h> #include <avr/interrupt.h> int i=0; int main(void) { DDRC = 0b00001000; TCCR2=_BV(CS22); TIMSK = _BV(TOIE2);...
Wzorowałem się na przykładzie z sieci. Czy poniższy kod wygląda ok? Póki co nie mam jak sprawdzić na biurku, jedynie widzę, że krótkie połączenia pinu do masy pokazują mi na LCD pewno wartości i przeważnie zaraz się zerują(czasami zostaje jakaś wartość). [syntax=c] //************** ICP PRZERWANIE TIMER1 *************************************** ISR(TIMER1_CAPT_vect)...
Witam Zacząłem sprawdzać przerwanie TIMER1 w trybie przepełnienia. Na symulatorze program normalnie działa jednak w rzeczywistości inaczej. .include "m8def.inc" .equ przyciski = portc .equ in_przyciski = ddrc .equ wyjscie1 = portb .equ out_wyjscie1 = ddrb .equ wyjscie2 = portd .equ out_wyjscie2 = ddrd .equ wys0 = portd0 .equ wys1 = portd1...
Witam, $regfile = "m8def.dat" $crystal = 8000000 Config Pinb.1 = Output Config Pind.1 = Output Config Timer2 = Timer , Prescale = 128 Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Compare B Pwm = Disconnect , Prescale = 8 Cls Cursor Off Portd.0 = 1 Portd.1 = 0 Set Portd.4 On Timer2 Czas1s Dim Licz8ms As Byte Dim Wartoscpwm As...
Witam Mam jakiś błąd w programie ale nie mogę dojść gdzie. Przed mian'em mam obsługę przerwania dla SIG_OUTPUT_COMPARE1A która teoretycznie powinna się wywoływać co 1s. Timer1 ustawiony w tryb compare na preskalerze 256, ustawienia timera są na początku maina. SIGNAL(SIG_OUTPUT_COMPARE1A) // sygnal porownania od timera 1A { sec++; sec%=60;...
Mam taki problem: chcę w programie wykorzystywać przerwania od przepełnienia dwóch timerów (0 i 1). W timer0 mam obsługę wyśw. LED i opóźnienie dla klawiatury a w timer1, z założenia wywoływanym co 100ms, coś jakby zegar z minutami i sekundami, choć nie jest to najważniejsze bo to program testowy. Problem w tym, że przerwanie od timer1 wcale się nie...
Witam, Mam problem z obsluga przerwan od przepelnienia licznikow. W projekcie wykorzystuje 3 liczniki w atmega8, timer2 wykorzystuje do generacji sygnalu 40kHz natomiast pozostale dwa maja zliczac czas od nadania sygnalu do otrzymania echa. Narazie napisalem osobną obsluge kazdego z timerow i dzialalo. Po wrzuceniu wszystkiego do jednego projektu dziala...
Witajcie, Chciałem uruchomić cykliczne przerwanie (100Hz) od timera TB0 i robię coś nie tak, bo przerwanie nie jest wyzwalane. Mikrokontroler taktowany wewnętrznym RC 2.66MHz. Konfiguracja Timera: [syntax=c] TCB0_CCMP = 26666; //100Hz TCB0_CTRLA = TCB_CLKSEL_CLKDIV1_gc|TCB_ENABLE_bm; //2.66MHz TCB0_CTRLB = TCB_CNTMODE_INT_gc; //Periodic Interrupt TCB0_INTCTRL...
Chciałbym zrobić symulację naciśnięć klawiszy na klawiaturze PS/2 wykorzystując ATMega328 z rezonatorem kwarcowym 16MHz i interfejs PS/2 na USB. Posiłkowałem się tym opisem PS/2. https://www.avrfreaks.net/sites/default/... Z opisu wynika, że urządzenie PS/2 (wspomniana klawiatura) musi być w każdej chwili przygotowane do odbioru...
Witam Potrzebuję podpiąć się pod zegar sterujący PWM arduino aby uzyskać przerwania co 50 do 100ms czyli co np 50 ms nastąpiło by przerwanie i wywołanie odpowiedniej funkcji. Niestety nie potrafię tego kodu co znalazłem w internecie rozgryść czy ktoś mógłby mi wyciągnąć z poniższego kodu co jest niezbędne do zrealizowania tego i wytłumaczyć co z czym...
Witam wszystkich, robię mały projekt do którego używałem Atmegę8. Zaczyna mi brakować pamięci więc stwierdziłem, że wymienię ją na Atmegę328. Niestety jest trochę zabawy z przerobieniem kodu, po pierwsze w Atmega328 nie można używać PD0 itp, tylko PORTD0. Po drugie timery ustawia się innymi rejestrami. Ogólnie program sobie przerobiłem, niestety została...
Cześć. Od około dwóch tygodni pracuję nad układem, którego głównym zadaniem jest jak najdokładniejszy pomiar czasu propagacji fali ultradźwiękowej między dwoma membranami piezoelektrycznymi. Układ jest zbudowany zgodnie ze schematem blokowym przedstawionym poniżej: http://obrazki.elektroda.pl/4225526900_1... Mikrokontroler to Atmega328...
Witam. Koledzy niby prosty układzik między innymi z czujnikiem temperatury DS18b20. Nijak nie mogę uruchomić tego czujnika. Sprawdziłem wszystko pod kątem połączeń zwarć i zimnych lutów. Ba nawet czujnik podmieniałem i nadal temperatura odczytana z czujnika to -0.1. Wiem że mam jakiegoś babola w programie którego nie widzę. Jak znam życie to jakiś banał...
https://obrazki.elektroda.pl/7400017800_... Dzisiaj przedstawię proces portowania biblioteki obsługującej MultiFunctionShield na Arduino R4 oraz krótko zademonstruję jej możliwości, czyli wyświetlanie danych na 7-segmentowym, 4-cyfrowym wyświetlaczu oraz kontrolę klawiatury i buzzera. Przy okazji też zobaczymy jak można zrealizować...
ustaw timer = 6 w podprogramie obsługi przerwania bo tam jest on wywoływany " co przerwanie"
skonfigurować timer aby wygenerował przerwanie po X czasu.
No nie bardzo. Pętle busy waits są w przerwaniu niewskazane. Zrób tak jak napisał (at)BlueDraco : odczyt poprzedniej konwersji-start następnej konwersji-wyjście bez czekania. [syntax=c]ISR(TIMER1_COMPA_vect) { switch(wejscie) { case 2: adc3=ADC; ADMUX = 0; ADMUX = (1<<REFS0)|wejscie; ADCSRA |= (1<<ADSC); break; case 3: adc2=ADC; ADMUX =...
Ograniczeń sprzętu się nie pzeskoczy. Tylko jak już robić to programowo to można dla wszystkich trzech serw, kod taki sam, a zostaje jeden timer więcej. Ale powstaje problem pod postacią jitteru wejścia w przerwanie, jeśli mikrokontroler wykorzystuje jeszcze inne przerwania. Ponieważ ATMega ma jednopoziomowy system przerwań zrobi się bałagan. A może...
Koncepcję mam taką: - ustawiam jeden timer żeby generował przerwanie co 20ms i w tym przerwaniu zwiekszam zmienną typu unsigned int o 1. Czyli przy wykonaniu 50 takich przerwaniń mam okres 1 sekundu. Zmienna niech będzie c. - w momencie wykrycia zamiany stanu przycisku np. B0 ustawiam zmienną określająca timer dla tego portu na wartość c+TIMEOUT, gdzie...
Przepraszam, że odkopuję temat ale mam problem właśnie z timerem 0 w atmedze 328p i jak bym miał zakładać nowy temat to nazwał bym go prawie tak samo jak ten więc wolałem napisać w już istniejącym temacie. Chcę sprawdzić działanie 8-bit Timer/Counter0 w ATmega328P. Efekt do uzyskania prosty. Ustawiam pin C5 jako wyjście (na początku stan niski) i przy...
Co myślisz o tym żeby użyć tylko jeden Timer? [youtube]https://www.youtube.com/watch?v... [syntax=basic4gl]$regfile = "attiny2313.dat" $crystal = 16000000 '*** Timer0 Config for 500Hz Interrupt CTC Mode *** Config Timer0 = Timer , Prescale = 256 , Compare A = Disconnect , Compare B = Disconnect , Clear Timer = 1 Enable Compare0a :...
Przyznam że ja wprowadziłem Was w błąd opisując program z linku który wkleiłem. Autor tegoż projektu nie użył preskalera w timer0 (coś mi się zwidziało) tylko timer0 jako licznika który zlicza impulsy do 256 (bo więcej chyba nie może) po czym następuje przepełnienie i przerwanie i jego obsługa w której zliczana jest ilość przepełnień która z kolei mnożona...
Witam, mam "dziwny" problem z uC atmega328P. mam układ zbudowany z lcd na HD44780, czujnika temp lm35dz oraz diody led. Układ zachowuje się w dziwny sposób. Program wygląda tak : [syntax=c] //czytanie przetwrnika adc // zamiana na zmienna temp która ma postać bez przecnika, np. dla temp 23,5 jest 235 if(temp>250) LCD_WriteText("A"); mruganie_diody=0...
Jeśli urządzenie działa tak jak chce autor, to każdy sposób wykorzystania przerwania zewnętrznego jest prawidłowy. W niektórych przypadkach podłączenie przycisku pod pin przerwania zewnętrznego jest niezbędne np. by wybudzić mikrokontroler z trybu Power Down lub Standby. Czasami nie ma po prostu innego wyjścia, ze względu specyficzne wykorzystanie...
Pytanie, czy da się ustawić przerwanie od obu zboczy dla wybranych pinów? Bo alternatywą jest przerwanie od timera z wystarczającą (czyli dużą) częstotliwością.
"...\avr-objcopy.exe" -O ihex -R .eeprom... Zrobiłem to w automacie, ale spotkało mnie coś o czym wspomniał bart-projects tzn: Hex na PC`cie zajmuje mniej miejsca niż Bin bo w Bin albo cały obraz pamięci no i gdy nie miałem parametrów z "-R" to mój wsad dla małego procesora miał...
Chciałbym aby timer2 (tryb asynchroniczny) wybudzał mikrokontroler co 1s i zmieniał stan na pinie. Niestety z jakiegoś powodu mikrokontroler nie zostaje wybudzony, a wchodzi w stan uśpienia na pewno ponieważ pobór prądu spada do ok. 1uA [syntax=c] #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> void RTCInit(void){...
Witam. Mam układ 3 grzałek połączonych w trójkąt do 3-fazowej sieci, każdy triak jest włączany optotriakiem, podłączonym do pinów wyjściowych expandera. Pomiędzy wszystkie 3 fazy podpięte mam detektory przejścia przez 0 ( http://obrazki.elektroda.pl/1004320500_1... do odmierzania czasu wykorzystuję timer1. Wartość OCR1A obliczam ze wzoru...
Zrobiłem kod z przerwaniem i również nie działa tak jak powinien [syntax=c]#include <avr/io.h> #include <util/delay.h> #include<stdio.h> #include<hd44780.c> #include<avr/interrupt.h> #define TRIG PC1 #define ECHO PD2 volatile int echo_flag =0; volatile int time =0; char ekran[6]; int main(){ DDRD = 0x00; // ustawienie portu...
Hej, Potrzebuję pomocy w opanowaniu pomiaru: napięcia (3x) i prądu (rezystor 0.1om) Ciągle wychodzą mi głupoty i nie wiem gdzie popełniam błąd. Chciałbym mierzyć napięcie 0-5.5V i prąd 0-2.5A Na początek schemat (ze schematu wykroiłem co zbędne) i kod (tu tylko to co potrzeba do pomiarów) aby było wiadomo o czym gadam ;) https://obrazki.elektroda.pl/4328627700_...
Bascom nie wykonuje dwóch działań arytm. lub instrukcji w jednej lini. Wiem to, wskaż w którym miejscu próbowałem coś takiego zrobić. Chodzi o last=last+getadc(1) ? Instrukcja wykonuje się poprawnie. Wyglada że chcesz mi wmówic, że wprowadziłem cię w błąd. Nie, po prostu stwierdzam, że po wprowadzeniu zmian nadal nie działa tak jak bym chciał. To wyjaw...
Jak w czystym C (AVR GCC) wyglądała by funkcja millis() ?, a może pokaż też 2 podejście (listing), gdzie milisekundy to zmienna globalna np millis. Wykorzystaj timer do przerwać dostępny na każdym AVR. W AVR GCC, funkcja podobna do `millis()` z Arduino, która zwraca liczbę milisekund od startu programu, może być zaimplementowana z wykorzystaniem timera...
Procedura zmiany preskalera taktowania jądra jest sprawdzona przez ustawienie Timera na przerwanie co 1 sek, więc tego jestem pewien. Nie wiem po co niektórzy wypowiadają się błędnie na temat $crystal. $crystal jest punktem odniesienia dla kompilatora w celu przeliczenia i dobrania ustawień. Dalej nie wiem dlaczego kompilator wymusza błędnie U2X0. PS...
1. Optotranzystor podłączony przez opornik po stronie wtórnej transformatora sieciowego http://obrazki.elektroda.pl/7212953500_1... 2. OK, dzięki 3. Doskonale zdaję sobie sprawę, że w przerwaniu ma być "szybko i krótko" i właśnie dlatego chciałbym aby przerwanie wyglądało tak jak w tym drugim kodzie ( paradoksalnie - przy kodzie gdzie...
Kolego Greebqmaster proponowałbym tak: robisz przerwanie co "rozdzielczość serwa" czyli co np. 20uS i w tym cyklicznym przerwaniu zwiększasz licznik oraz porównujesz go z kilkoma zmiennymi odpowiedzialnymi za poszczególne wyjścia sterujące: [syntax=c]ISR (TIMER1_COMPA_vect) //przerwanie co 20us { static uint16_t cnt=0; cnt++; if(cnt>1000) { cnt =...
Witam Zrobiłem sobie układ, który ma na wyświetlaczu wyświetlać godzinę oraz temperaturę wody. Samą obsługę wyświetlacza jakoś udało mi się ogarnąć, natomiast mam problem przy odczycie temperatury z czujników oraz czasu z ds1302. Na początku ustawiam sobie godzinę 10:40 i to wyświetla się poprawnie, ale jak idzie odczyt z ds1302 to wyświetla mi się...
Nie nie rób się kaczką albo sie prześpij ahahahahahaha :D OCIE1B zamieniasz na OCIE1A OCR1B zamieniasz na OCR1A zamieniasz wektor TIMER1_COMPB_vect na TIMER1_COMPA_vect kasujesz wszędzie to TCNT1=0 bo nie ma sensu Dla Timer0, w przerwaniu, pod linijką "dot ++ ; " dopisz TCNT0 = 6; To też można na palcach policzyć: 8MHz to jest na sekundę a sekunda ma...
Poza (jakże słusznymi) konkluzjami kolegi d.d, oglądam sobie ten kod i ... W zależności z której tablicy(iChooseBuff) korzysta teraz przerwanie to z tej bierze informacje. Jeśli osiągnie koniec tablicy to pętla główna ładuje nowe info do tablicy nr 1, a przerwanie w tym czasie zczytuje info z drugiej tablicy, i na odwrót. Możliwe, że jest to przerost...
Co do rezygnacji z Waitms 750, to miałem kiedyś taki pomysł: - przerwanie od Timer0 wywołuje [syntax=basic4gl] 1wreset 1wwrite &HCC 1wwrite &H44 [/syntax] reset licznika reset flagi - przerwanie od Timer0 wywołuje [syntax=basic4gl] '*************** Czujnik 1 1wreset 1wverify Dsid1(1) Ds1_brak = Err Rfm_tab(6) = Ds1_brak 1wwrite &HBE Rfm_tab(8) = 1wread()...
Witam, Popełniłeś kilka błędów: - aby odblokować przerwania od przepełnienia timera 1 trzeba ustawić bit 2 a nie 5 w rejsestrze TIMSK - wektor przerwania od przepełniania timera 1 to nie 0x12 a 0x24 Dobrze jest przy pisaniu w C korzystać z funkcji dostarczanych wraz z kompilatorem "intrinsic function" takich jak __interrupt_enable, __interrupt_disable,...
Funkcja DZIAŁA [syntax=cpp]//Data utworzenie: 20-09-2014 #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <avr/pgmspace.h> #include "MYUART/myuart.h" #include "MK_TERMINAL/mk_term.h" #define REF_256 (1<<REFS1)|(1<<REFS0) #define REF_VCC (0<<REFS1)|(1<<REFS0) #define SR 8 typedef...
A co na to symulacja programu? Taki program wgraj: .nolist .include "m32def.inc" .list ; ## START ########################################... .cseg ;=======================================... ;= WEKTORY PRZERWAŃ = ;=======================================... .org 0x0000 rjmp reset_vector ; po...
Tak, o ile procesor nie będzie w uśpieniu. Jeśli będzie to wymagana jest funkcjonalność asynchronicznego wybudzania, czego ATMega nie ma dla zboczy, wyłącznie dla poziomu. Trzeba też pamiętać, że zmiany krótsze niż okres zegara mogą być przez MCU niezauważone. Oczywiście dla kwartcu 14 MHz i impulsu 20us nie jest to problemem.
... Dlaczego tak się dzieje? :/ Dlatego, że przerwanie ISR(TIMER1_COMPA_vect) jest wywoływane co 128 taktów zegara, a wykonanie procedury przerwania timera1 zajmuje ~200 taktów. Po zakończeniu wykonywania przerwania od timera, gdy uC wraca do programu głównego, ma już ustawioną flagę od OCR1 i ewentualnie flagę RXC. Ponieważ timer "stoi wyżej" w hierarchii...
timer atmega przerwanie przerwanie timer bascom atmega644 timer przerwanie
a8498 przetwornica przekręcić wałek wymiana grzałki
bateria milwaukee philips lattego
Xerox WorkCentre 6605 skanowanie do OneDrive – czy działa bez włączonego komputera? Renault Espace IV – lokalizacja modułu sterowania klimatyzacją, ECU klimatyzacji, roczniki 2002-2014