balistik
Members-
Постов
4 -
Зарегистрирован
-
Посещение
Информация
-
Город
Сергиев Посад
Электроника
-
Стаж в электронике
Менее года
-
Сфера радиоэлектроники
Микроконтроллеры
-
Оборудование
Есть pickit2, pirkit3,arvisp, китайский универсальный программатор, паяльная станция. Понабрал для реализации готовых проектов и мелкого ремонта.
Достижения balistik
-
Всем спасибо. Построил прототип, все заработало на нем без проблем. Даже дисплей по i2c подключил еще.
-
Спасибо. Отказался от цифрового датчика. Перешел на аналоговый LM. Все вроде работает. Протеус тормозит. Приходится комментировать часть кода, потом отлаживать оставшуюся. По поводу огромного числа - это просто крик души был. Блин. Надо бросать протеус и делать прототип. Т.к. работу с еепром он тоже нормально не может симулировать. Может кто посмотрит, что не так может быть с работой с еепром. #define F_CPU 8000000L // óñòàíàâëèâàåì ðàáî÷óþ ÷àñòîòó êîíòðîëëåðà #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> unsigned int temp_ADC; //àíàëîãîâàÿ ïåðåìåííàÿ äàò÷èêà òåìïåðàòóðû volatile //ìàêñèìóì 1024 ïðè íàïðÿæåíèè 5 //0 ãðàäóñîâ Öåëüñèÿ = 376 //100 ãðàäóñîâ Öåëüñèÿ = 451 volatile unsigned int tempint=0; // ïåðåìåííàÿ äëÿ öåëîãî çíà÷åíèÿ òåìïåðàòóðû volatile unsigned int termo_error = 0; //ôëàã îøèáêè òåðìîäàò÷èêà volatile unsigned char regim=0, R1_SHIBER=0, R1_VENT=0, R2_SHIBER=0, R2_VENT=0, R3_SHIBER=0, R3_VENT=0; //ïåðåìåííûå ðåæèìîâ ðàáîòû volatile char press = 0, pr = 0, pr1 = 0, set = 0; //äîïîëíèòåëüíûå ïåðåìåííûå äëÿ êíîïîê #define SHIBER_PB 1 //øèáåð ïîäà÷è òîïëèâà #define SHIBER_PWM OCR1A #define VENT_PB 2 //âåíòèëÿòîð ïîäà÷è âîçäóõà #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // ñâåòîäèîä ðåæèì 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // ñâåòîäèîä ðåæèì 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // ñâåòîäèîä ðåæèì 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // ñâåòîäèîä 4 ïðîãðàììèðîâàíèå #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // êíîïêà MENU #define BUT_U PIND & (1 << PD2) // êíîïêà UP #define BUT_D PIND & (1 << PD0) // êíîïêà DOWN unsigned char eep1 EEMEM; // ðåæèì ðàáîòû unsigned char eep2 EEMEM; // ðåæèì 1 ØÈÌ øèáåð unsigned char eep3 EEMEM; //ðåæèì 1 ØÈÌ âåíòèëÿòîð unsigned char eep4 EEMEM; // ðåæèì 2 ØÈÌ øèáåð unsigned char eep5 EEMEM; // ðåæèì 2 ØÈÌ âåíòèëÿòîð unsigned char eep6 EEMEM; // ðåæèì 3 ØÈÌ øèáåð unsigned char eep7 EEMEM; // ðåæèì 3 ØÈÌ âåíòèëÿòîð unsigned char eep8 EEMEM; // ôëàã ïåðâîãî çàïóñêà ISR (ADC_vect)//Ïðåðûâàíèÿ àíàëîãîâîãî âõîäà { temp_ADC = ADCW; ADCSR |= (1<<ADSC);//çàíîâî âêëþ÷àåì àíàëîãîâûé âõîä } void pin_init(void) { //èíèöèàëèçàöèÿ ïîðòîâ ØÈÌ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer1_init(void) { //èíèöèàëèçàöèÿ òàéìåðà ØÈÌ TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } //***************** îáðàáîòêà íàæàòèÿ êíîïîê ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++;// êíîïêà UP //ðåæèì ðàáîòû +1 è âêëþ÷åíèå if(pr >= 1 && pr < 10){ set = 20; regim++; if (regim>3){regim=3;} eeprom_write_byte(&eep1, regim); // ñîõðàíåíèå íàñòðîéêè â eeprom _delay_ms(200); set = 0; pr = 0; } } if(~BUT_D){if(set == 0)pr1++;// êíîïêà DOWN //ðåæèì ðàáîòû -1 è äî âûêëþ÷åíèÿ if(pr1 >= 1 && pr1 < 10){ set = 20; regim--; //if (regim<1){regim=1;} eeprom_write_byte(&eep1, regim); // ñîõðàíåíèå íàñòðîéêè â eeprom _delay_ms(200); set = 0; pr1 = 0; } } if(~BUT_M){ // êíîïêà MENU //ïåðåõîä â íàñòðîéêè press++; asm("cli"); if(press >= 1 && set != 0){set++;} // ïåðåõîä ïî íàñòðîéêàì if(press <10 && set == 0){set = 1; _delay_ms(200);} // õîä â íàñòðîéêè if(set == 1) eeprom_write_byte(&eep2, R1_SHIBER); if(set == 2) eeprom_write_byte(&eep3, R1_VENT); if(set == 3) eeprom_write_byte(&eep4, R2_SHIBER); if(set == 4) eeprom_write_byte(&eep5, R2_VENT); if(set == 5) eeprom_write_byte(&eep6, R3_SHIBER); if(set == 6) eeprom_write_byte(&eep7, R3_VENT); if(set == 8){ _delay_ms(100); set = 0; press = 0;} // âûõîäèì èç íàñòðîåê _delay_ms(200); asm("sei"); } } //*****************ðåæèì íàñòðîåê******************** void settings(){ //âèçóàëüíîå ïîäòâåðæäåíèå íàñòðîåê if(set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = 0; SHIBER_PWM = R1_SHIBER;} //ØÈÌ øèáåð 0-255 if(set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = 0; VENT_PWM = R1_VENT;} //ØÈÌ âåíòèëÿòîð 0-255 if(set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = 0;; SHIBER_PWM = R2_SHIBER;} //ØÈÌ øèáåð 0-255 if(set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM =0; VENT_PWM = R2_VENT;} //ØÈÌ âåíòèëÿòîð 0-255 if(set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = 0; SHIBER_PWM = R3_SHIBER;} //ØÈÌ øèáåð 0-255 if(set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = 0; VENT_PWM = R3_VENT;} //ØÈÌ âåíòèëÿòîð 0-255 if(set == 7) { if (tempint>40){LED1_ON;}else{LED1_OFF;} if (tempint>60){LED2_ON;}else{LED2_OFF;} if (tempint>80){LED3_ON;}else{LED3_OFF;}} //êîíòðîëü äàò÷èêà òåìïåðàòóðû switch(set) // âêëþ÷åíà íàñòðîéêà { case 1: // íàñòðîéêà R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 255; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 0; _delay_ms(100);} break; case 2: // íàñòðîéêà R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 255; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 0; _delay_ms(100);} break; case 3: // íàñòðîéêà R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 255; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 0; _delay_ms(100);} break; case 4: // íàñòðîéêà R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 255; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 0; _delay_ms(100);} break; case 5: // íàñòðîéêà R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 255; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 0; _delay_ms(100);} break; case 6: // íàñòðîéêà R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 255; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 0; _delay_ms(100);} break; } } int main(){ /*******************************íàñòðîéêà ïåðåôåðèè******************************/ asm("cli"); if(eeprom_read_byte(&eep8) != 1){ // ÷èòàåì eeprom, åñëè òàì ìóñîð (ïåðâûé çàïóñê), ïèøåì ñâîè äàííûå eeprom_write_byte(&eep1, 0); // ðåæèì ðàáîòû eeprom_write_byte(&eep2, 150); // ðåæèì 1 ØÈÌ SHIBER eeprom_write_byte(&eep3, 100); //ðåæèì 1 ØÈÌ VENT eeprom_write_byte(&eep4, 200); //ðåæèì 2 ØÈÌ SHIBER eeprom_write_byte(&eep5, 150); //ðåæèì 2 ØÈÌ VENT eeprom_write_byte(&eep6, 230); //ðåæèì 3 ØÈÌ SHIBER eeprom_write_byte(&eep7, 200); //ðåæèì 3 ØÈÌ VENT eeprom_write_byte(&eep8, 1); // ôëàã ïåðâîãî çàïóñêà } //÷èòàåì íàñòðîéêè èç ïàìÿòè regim = eeprom_read_byte(&eep1); // ÷èòàåì ðåæèì ðàáîòû èç eeprom R1_SHIBER = eeprom_read_byte(&eep2); // ÷èòàåì ðåæèì 1 ØÈÌ âåíòèëÿòîð èç eeprom R1_VENT = eeprom_read_byte(&eep3); //÷èòàåì ðåæèì 1 ØÈÌ øèáåð R2_SHIBER = eeprom_read_byte(&eep4); //÷èòàåì ðåæèì 2 ØÈÌ âåíòèëÿòîð R2_VENT = eeprom_read_byte(&eep5); //÷èòàåì ðåæèì 2 ØÈÌ øèáåð R3_SHIBER = eeprom_read_byte(&eep6); //÷èòàåì ðåæèì 3 ØÈÌ âåíòèëÿòîð R3_VENT = eeprom_read_byte(&eep7); //÷èòàåì ðåæèì 3 ØÈÌ øèáåð _delay_ms(100); pin_init(); timer1_init(); ADMUX |= (1<<REFS0);//íàñòðàèâàåì àíàëîãîâûé âõîä íà ïîðò (PC0) //îïîðíîå íàïðÿæåíèå 5 ïèòàíèÿ êîíòðîëëåðà ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS1) | (1<<ADPS0); asm("sei"); _delay_ms(100); /**********************************èíèöèàëèçàöèÿ *************************************/ while(1){ buttons();//îáðàáîòèê íàæàòèÿ êíîïîê //âûâîäèì êîä îøèáêè äàò÷èêà òåìïïåðàòóðû if (temp_ADC>1000){LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;} //äåëàåì ðàñ÷åò òåìïåðàòóðû îò äàò÷èêà tempint=((((((float)temp_ADC)*5)/1024)*100)-273); if (termo_error == 0){//áëîêèðîâêà ïî òåðìîäàò÷èêó if(set == 0) { //íîðìàëüíûé ðåæèì ðàáîòû if (regim == 0){ //ðåæèì ðàáîòû 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ØÈÌ øèáåð 0-255 _delay_ms(20); VENT_PWM = 0; //ØÈÌ âåíòèëÿòîð 0-255 } if (regim == 1){ //ðåæèì ðàáîòû 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ØÈÌ âåíòèëÿòîð 0-255 _delay_ms(20); if (tempint>40) { //áëîêèðîâêà ïî òåìïåðàòóðå SHIBER_PWM = 0; //ØÈÌ øèáåð 0-255 }else{SHIBER_PWM = R1_SHIBER;} //ØÈÌ øèáåð 0-255 } if (regim == 2){ //ðåæèì ðàáîòû 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ØÈÌ âåíòèëÿòîð 0-255 _delay_ms(20); if (tempint>60) { //áëîêèðîâêà ïî òåìïåðàòóðå SHIBER_PWM = 0; //ØÈÌ øèáåð 0-255 }else{SHIBER_PWM = R2_SHIBER;} //ØÈÌ øèáåð 0-255 } if (regim == 3){ //ðåæèì ðàáîòû 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ØÈÌ âåíòèëÿòîð 0-255 _delay_ms(20); if (tempint>80) { //áëîêèðîâêà ïî òåìïåðàòóðå SHIBER_PWM = 0; //ØÈÌ øèáåð 0-255 }else{SHIBER_PWM = R3_SHIBER;} //ØÈÌ øèáåð 0-255 } } }else{ SHIBER_PWM = 0; _delay_ms(20); VENT_PWM = 0; } if(set != 0){settings();} //âõîä â íàñòðîéêè } return 0; }
-
У меня тоже в протеусе фигово работает еепром. Часть переменных читается, часть нет. Не пишутся вообще. unsigned char eep1 EEMEM; //объявил eeprom_write_byte(&eep1, 0);//записал regim = eeprom_read_byte(&eep1);//считал Ну и при чтении и записи отключаю прерывания.
-
Atmega8 2 ШИМ и прерывание по таймеру для чтения DS18B20
balistik опубликовал тема в МК для начинающих
Всем доброго времени суток. Я реальный нуб в ATMEGA. Могу более-менее понять чужой код и из кусков сделать целое. Вопрос такой: реально ли на ATMEGA8 сделать 2 ШИМ (таймер 1 и2) и внутреннее прерывание (по таймеру 0) для чтения данных с DS18B20 на 8Мгц чтобы еще осталось на опрос кнопок и небольшую логику? Я выложу пример кода. По отдельность: ШИМ, прерывания, логика, запись в ЕПРОМ работает. Собираю все вместе - не работает. Пробовал в Протеусе, тоже глючит, да и протеус тормозит. Может кто чего подскажет. //#define F_CPU 8000000UL // устанавливаем рабочую частоту контроллера #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <avr/eeprom.h> #include "ds18x20.h" #include "onewire.h" #define MAXSENSORS 1 unsigned int tempint = 0; // переменная для целого значения температуры unsigned int subzero = 0; // переменная отрицательных значений температуры unsigned int clock = 0; //задержка для опроса датчика температуры unsigned int termo_error = 0; //флаг ошибки термодатчика unsigned char regim, R1_SHIBER, R1_VENT, R2_SHIBER, R2_VENT, R3_SHIBER, R3_VENT; //переменные режимов работы volatile char press = 0, pr = 0, pr1 = 0, set = 0; //дополнительные переменные для кнопок #define SHIBER_PB 1 //шибер подачи топлива #define SHIBER_PWM OCR1A #define VENT_PB 2 //вентилятор подачи воздуха #define VENT_PWM OCR1B #define LED1_ON PORTD |= _BV(PD3) // светодиод режим 1 #define LED1_OFF PORTD &= ~_BV(PD3) #define LED2_ON PORTD |= _BV(PD4) // светодиод режим 2 #define LED2_OFF PORTD &= ~_BV(PD4) #define LED3_ON PORTD |= _BV(PD6) // светодиод режим 3 #define LED3_OFF PORTD &= ~_BV(PD6) #define LED4_ON PORTD |= _BV(PD7) // светодиод 4 программирование #define LED4_OFF PORTD &= ~_BV(PD7) #define BUT_M PIND & (1 << PD1) // кнопка MENU #define BUT_U PIND & (1 << PD2) // кнопка UP #define BUT_D PIND & (1 << PD0) // кнопка DOWN unsigned char eep1 EEMEM; // режим работы unsigned char eep2 EEMEM; // режим 1 ШИМ вентилятор unsigned char eep3 EEMEM; //режим 1 ШИМ шибер unsigned char eep4 EEMEM; // режим 2 ШИМ вентилятор unsigned char eep5 EEMEM; // режим 2 ШИМ шибер unsigned char eep6 EEMEM; // режим 3 ШИМ вентилятор unsigned char eep7 EEMEM; // режим 3 ШИМ шибер unsigned char eep8 EEMEM; // флаг первого запуска uint8_t Temperature, szero; //-255 uint8_t nSensors, j; uint8_t cel_frac_bits; uint8_t gSensorIDs[MAXSENSORS][OW_ROMCODE_SIZE]; uint8_t search_sensors(void) // поиск DS18B20 { uint8_t i; uint8_t id[OW_ROMCODE_SIZE]; uint8_t diff, nSensors; nSensors = 0; for( diff = OW_SEARCH_FIRST; diff != OW_LAST_DEVICE && nSensors < MAXSENSORS ; ) { DS18X20_find_sensor( &diff, &id[0] ); if( diff == OW_PRESENCE_ERR ) { Temperature = 255; szero = 1; break; } if( diff == OW_DATA_ERR ) { Temperature = 255; szero = 1; break; } for (i=0; i<OW_ROMCODE_SIZE; i++) gSensorIDs[nSensors][i]=id[i]; nSensors++; } return nSensors; } void get_temp(int sensor){ // получаем температуру с датчиков DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); j = gSensorIDs[0][sensor]; // family-code for conversion-routine if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } if (DS18X20_read_meas_single(j, &szero, &Temperature, &cel_frac_bits) != DS18X20_OK) { //если не прочиталось то -255 Temperature = 255; szero = 1; } tempint=(int)Temperature; subzero=(int)szero; } void pin_init(void) { //инициализация портов ШИМ DDRB |= (1<<SHIBER_PB) | (1<<VENT_PB); PORTB &= ~((1<<SHIBER_PB) | (1<<VENT_PB)); } void timer0_init(void) { //инициализация таймера для термодатчика TCCR0 |= (1<<CS00); TIMSK |= ( 1 << TOIE0); TCNT0 = 0xFF; } void timer1_init(void) { //инициализация таймера ШИМ шибера TCCR1A |= (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << WGM12) | (1 << CS10); TCNT1 = 0x00; ICR1 = 0xFF; OCR1A = 0x00; OCR1B = 0x00; } void timer2_init(void) { //инициализация таймера ШИМ вентилятора TCCR2 |= (1 << COM21) | (1 << WGM21) | (1 << WGM20) | (1 << CS20); TCNT2 = 0x00; OCR2 = 0x00; } ISR(TIMER0_OVF_vect){ //прерывание таймера 0 для термодатчика if (clock != 4294967295){_delay_us(50);clock++;}else{get_temp(0);clock=0;} } //***************** обработка нажатия кнопок ********************** void buttons(){ if(~BUT_U){if(set == 0)pr++; // кнопка UP if(pr == 10){ // долгое нажатие } _delay_ms(100); }else{ if(pr >= 1 && pr < 10){ // короткое нажатие regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom set = 0; pr = 0; } pr = 0; } if(~BUT_D){if(set == 0)pr1++; // кнопка DOWN if(pr1 == 10){ // длинное нажатие } _delay_ms(100); }else{ if(pr1 >= 1 && pr1 < 10){ // короткое нажатие. //set = 20; regim--; if (regim<0){regim=3;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom _delay_ms(100); set = 0; pr1 = 0; } pr1 = 0; } if(~BUT_M){ // кнопка MENU press++; if(press == 1 && set != 0){set++;} // переход по настройкам if(press >= 100 && set == 0){set = 1; _delay_ms(200);} // ход в настройки if(set == 1) eeprom_write_byte(&eep2, R1_VENT); if(set == 2) eeprom_write_byte(&eep3, R1_SHIBER); if(set == 3) eeprom_write_byte(&eep4, R2_VENT); if(set == 4) eeprom_write_byte(&eep5, R2_SHIBER); if(set == 5) eeprom_write_byte(&eep6, R3_VENT); if(set == 6) eeprom_write_byte(&eep7, R3_SHIBER); if(set > 6){ _delay_ms(100); set = 0; press = 0;} // если включена настройка даты, }else{ if(set == 0 && press >= 1){ // если не вошли в настройки regim++; if (regim>3){regim=0;} eeprom_write_byte(&eep1, regim); // сохранение настройки в eeprom } press = 0; } } //*****************режим настроек******************** void settings(){ //визуальное подтверждение настроек if(press >= 1 && set == 1) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; SHIBER_PWM = R1_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 2) { LED1_ON; LED2_OFF; LED3_OFF; LED4_ON; VENT_PWM = R1_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 3) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; SHIBER_PWM = R2_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 4) { LED1_OFF; LED2_ON; LED3_OFF; LED4_ON; VENT_PWM = R2_SHIBER;} //ШИМ вентилятор 0-255 if(press >= 1 && set == 5) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; SHIBER_PWM = R3_VENT;} //ШИМ шибер 0-255 if(press >= 1 && set == 6) { LED1_OFF; LED2_OFF; LED3_ON; LED4_ON; VENT_PWM = R3_SHIBER;} //ШИМ вентилятор 0-255 switch(set) // включена настройка { case 1: // настройка R1_VENT if(~BUT_U){R1_VENT++; if(R1_VENT > 254) R1_VENT = 0; _delay_ms(100);} if(~BUT_D){R1_VENT--; if((~BUT_D) && R1_VENT == 0) R1_VENT = 254; _delay_ms(100);} break; case 2: // настройка R1_SHIBER if(~BUT_U){R1_SHIBER++; if(R1_SHIBER > 254) R1_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R1_SHIBER--; if((~BUT_D) && R1_SHIBER == 0) R1_SHIBER = 254; _delay_ms(100);} break; case 3: // настройка R2_VENT if(~BUT_U){R2_VENT++; if(R2_VENT > 254) R2_VENT = 0; _delay_ms(100);} if(~BUT_D){R2_VENT--; if((~BUT_D) && R2_VENT == 0) R2_VENT = 254; _delay_ms(100);} break; case 4: // настройка R2_SHIBER if(~BUT_U){R2_SHIBER++; if(R2_SHIBER > 254) R2_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R2_SHIBER--; if((~BUT_D) && R2_SHIBER == 0) R2_SHIBER = 254; _delay_ms(100);} break; case 5: // настройка R3_VENT if(~BUT_U){R3_VENT++; if(R3_VENT > 254) R3_VENT = 0; _delay_ms(100);} if(~BUT_D){R3_VENT--; if((~BUT_D) && R3_VENT == 0) R3_VENT = 254; _delay_ms(100);} break; case 6: // настройка R3_SHIBER if(~BUT_U){R3_SHIBER++; if(R3_SHIBER > 254) R3_SHIBER = 0; _delay_ms(100);} if(~BUT_D){R3_SHIBER--; if((~BUT_D) && R3_SHIBER == 0) R3_SHIBER = 254; _delay_ms(100);} break; } } int main(){ /*******************************настройка переферии******************************/ cli(); ow_set_bus(&PIND, &PORTD, &DDRD, PD5); // иництализация протокола 1-wire nSensors = search_sensors(); // поиск датчиков DS18B20 DS18X20_start_meas(DS18X20_POWER_EXTERN, NULL); //включаем преобразование температуры pin_init(); //timer0_init(); timer1_init(); timer2_init(); _delay_ms(5); if(eeprom_read_byte(&eep8) != 1){ // читаем eeprom, если там мусор (первый запуск), пишем свои данные eeprom_write_byte(&eep1, 0); // режим работы eeprom_write_byte(&eep2, 150); // режим 1 ШИМ вентилятор eeprom_write_byte(&eep3, 100); //режим 1 ШИМ шибер eeprom_write_byte(&eep4, 200); //режим 2 ШИМ вентилятор eeprom_write_byte(&eep5, 150); //режим 2 ШИМ шибер eeprom_write_byte(&eep6, 230); //режим 3 ШИМ вентилятор eeprom_write_byte(&eep7, 200); //режим 3 ШИМ шибер eeprom_write_byte(&eep8, 1); // флаг первого запуска } //читаем настройки из памяти regim = eeprom_read_byte(&eep1); // читаем режим работы из eeprom R1_VENT = eeprom_read_byte(&eep2); // читаем режим 1 ШИМ вентилятор из eeprom R1_SHIBER = eeprom_read_byte(&eep3); //читаем режим 1 ШИМ шибер R2_VENT = eeprom_read_byte(&eep4); //читаем режим 2 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep5); //читаем режим 2 ШИМ шибер R3_VENT = eeprom_read_byte(&eep6); //читаем режим 3 ШИМ вентилятор R1_SHIBER = eeprom_read_byte(&eep7); //читаем режим 3 ШИМ шибер sei(); _delay_ms(5); /**********************************инициализация ШИМ*************************************/ while(1){ //if (tempint=255) {LED1_ON;LED2_OFF;LED3_ON;termo_error=1;} else {termo_error=0;}//выводим код ошибки датчика темппературы buttons();//обработик нажатия кнопок if (termo_error == 0){//блокировка по термодатчику if(set == 0) { //нормальный режим работы if (regim == 0){ //режим работы 0 LED1_OFF; LED2_OFF; LED3_OFF; LED4_OFF; SHIBER_PWM = 0; //ШИМ шибер 0-255 VENT_PWM = 0; //ШИМ вентилятор 0-255 } if (regim == 1){ //режим работы 1 LED1_ON; LED2_OFF; LED3_OFF; LED4_OFF; VENT_PWM = R1_VENT; //ШИМ вентилятор 0-255 if (tempint >=40) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R1_SHIBER; //ШИМ шибер 0-255 } } if (regim == 2){ //режим работы 2 LED1_OFF; LED2_ON; LED3_OFF; LED4_OFF; VENT_PWM = R2_VENT; //ШИМ вентилятор 0-255 if (tempint >=60) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R2_SHIBER; //ШИМ шибер 0-255 } } if (regim == 3){ //режим работы 3 LED1_OFF; LED2_OFF; LED3_ON; LED4_OFF; VENT_PWM = R3_VENT; //ШИМ вентилятор 0-255 if (tempint >=80) { //блокировка по температуре SHIBER_PWM = 0; //ШИМ шибер 0-255 }else{ SHIBER_PWM = R3_SHIBER; //ШИМ шибер 0-255 } } } }else{ SHIBER_PWM=0; VENT_PWM=0; } if(set != 0) settings();//вход в настройки } //return 0; }