• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!

balistik

Members
  • Публикации

    4
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

О balistik

  • Звание
    Новенький

Информация

  • Город
    Сергиев Посад

Электроника

  • Стаж в электронике
    Менее года
  • Сфера радиоэлектроники
    Микроконтроллеры
  • Оборудование
    Есть pickit2, pirkit3,arvisp, китайский универсальный программатор, паяльная станция. Понабрал для реализации готовых проектов и мелкого ремонта.
  1. Всем спасибо. Построил прототип, все заработало на нем без проблем. Даже дисплей по i2c подключил еще.
  2. Спасибо. Отказался от цифрового датчика. Перешел на аналоговый 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; }
  3. Eeprom В Proteuse

    У меня тоже в протеусе фигово работает еепром. Часть переменных читается, часть нет. Не пишутся вообще. unsigned char eep1 EEMEM; //объявил eeprom_write_byte(&eep1, 0);//записал regim = eeprom_read_byte(&eep1);//считал Ну и при чтении и записи отключаю прерывания.
  4. Всем доброго времени суток. Я реальный нуб в 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; }