Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
24.04.2009, 11:37 | #121 | |
Форумец
|
Цитата:
Код:
if (SetTemp>temp_whole){ // если уставка выше PORTA=8; // то включение Lcd_Chr(2,14,'1'); // и отображение "1" } else{ // если нет PORTA=0; // выключение Lcd_Chr(2,14,'0'); // и отображение "0" Последний раз редактировалось petrd; 25.04.2009 в 16:45. |
|
24.04.2009, 14:32 | #122 |
Форумец
|
Термостат
В посте №80 выложил код термостата с алгоритмом прямого гистерезиса. Алгоритм управления нагрузкой реализован по принципу state-машины. При нарастании температуры отключение происходит при t>tуставки. При снижении температуры включение происходит при t<(tуставки-2 град.). Оказалось легче написать код, чем объяснить.
|
25.04.2009, 14:30 | #123 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
А у меня в голове - опилки.
Да уж, без такого Гуру как petrd я пока бессилен в этих пиках. Вот еще вопр. какой мах. ток может быть на выходе МК (управление нагрузкой). Кстати термодатчик завышает на 1.8 градуса, при комнатной темпер. Измерял и сравнивал с мультиметром, даже двумя, MY-64. Но если учесть, что точность показании температуры у него +- 1 град., то где-то на 0.8 все таки есть завышение. (Со льдом не сравнивал) Последний раз редактировалось romchik77; 25.04.2009 в 15:15. |
25.04.2009, 17:11 | #124 | |
Форумец
|
До 25 мА. Все параметры указываются в datasheet на МК.
Цитата:
Код:
temp_whole = (temp2write >> RES_SHIFT)-2;// занизить показания на 2 град |
|
26.04.2009, 21:38 | #126 | |
Форумец
|
Цитата:
Вывод 14 (может обозначаться как Vcc или Vdd) - питание +5 в. Вывод 5 (может обозначаться как Vss или GND) - земля, общий, 0 в. Вывод 4 (MCLR) - вывод сброса (в этом МК всегда вход), при лог. "0" на этом выводе МК находится в состоянии сброса, при лог "1" - в работе. В некоторых схемах его подключают напрямую к +5 в, но это, наверное, не совсем правильно. Обычно его подключают к + 5 в через резистор номиналом от 1 до 10 кОм. P.S. Меня зовут Петр. |
|
26.04.2009, 23:09 | #127 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
ОК! просто сейчас не в состоянии, друг умер, не судите строрго! ( 34года, жить бы да жить)
Корректировать я ничего не буду (температуру) Нех файл - получил Есть вопросик а когда настройки меняются, когда частота и может еще что-то меняется..... Последний раз редактировалось romchik77; 27.04.2009 в 05:58. |
27.04.2009, 07:32 | #128 |
Форумец
|
Термин - настройки - по отношению к МК обычно не употребляется, а говорят - конфигурация. Вся конфигурация PIC в MikroC находится в окошке Project -> Edit Project. Устанавливаемая в нем частота - это информация для компилятора, он использует эту частоту для собственных расчетов задержек в разных встроенных библиотеках и функциях, например, Delay_ms(), Delay_us(), UART, ШИМ, освобождая программиста от некоторой рутины. После компиляции все частотозависимые расчеты будут проведены относительно данной частоты, и если она будет отличаться от частоты реального кварца, то задержки и т.п. не будут выдерживаться и как будет работать программа неизвестно. В случае тех кодов, что я приводил, используется внутренний RС генератор PIC16F628A, а он может работать только на двух частотах 4 МГц (наш случай) и 48 кГц(обычно используется в режиме пониженного энергопотребления, поэтому данный PIC относится к МК выполненным по nanoWatt-ной технологии). Поэтому замена частоты на другую в нашем случае собъет компилятор с толку. Если надо менять частоту на другую или требуется высокая стабильность частоты, то надо ставить внешний кварц, изменять биты в слове конфигурации, указывать в окошке новую рабочую частоту и заново компилировать программу. Или я не о том?
|
27.04.2009, 20:51 | #129 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
О том.
Термостат. Прошил МК, все ок! но заметил незначительный минус в работе. При превышении температуры 100 гр. и последующем ее снижении ниже 100, в первом разряде индикации температуры остается единица в место нуля. Получается например 199 гр. вместо 099. Интересно, а проект "термометр" так же работает? |
27.04.2009, 21:28 | #130 | |
Форумец
|
Цитата:
Код:
....... if (temp_whole/100) text[0] = temp_whole/100 + 48; else text[0]=48; ........ Последний раз редактировалось petrd; 27.04.2009 в 21:57. |
|
29.04.2009, 12:45 | #134 |
mono all
Сообщений: 55
Регистрация: 12.07.2006
Не в сети |
расскажите про режим sleep и как из него возвращаться, интересует опять таки 12 серия, таймер 1, надо для создания больших задержек. (microC)
Спасибо! Последний раз редактировалось mono; 29.04.2009 в 13:12. Причина: вложение |
29.04.2009, 14:41 | #135 |
Форумец
|
Чтобы проснуться при помощи TMR1 необходимо использовать прерывания по переполнению TMR1 и при этом он должен работать как асинхронный счетчик по входу T1CKI. Пока что могу сказать - не увидел в коде обработчика прерывания от TMR1 и не увидел на схеме откуда могут поступать на вход T1CKI внешние такты, не увидел настроек регистра OSCCON для получения 1 Мгц. И увидел, что у Вас по коду TMR1 тактируется от внутреннего генератора, но в режиме sleep он остановлен, а значит, значение TMR1 не будет увеличиваться и переполнения не дождаться. По-моему так, или нет? Может лучше WDT использовать, от него можно задержку получить до 286 сек.? И желательно пояснить суть работы всего устройства.
|
29.04.2009, 14:54 | #136 | |
Форумец
|
Цитата:
|
|
29.04.2009, 17:34 | #139 | |
mono all
Сообщений: 55
Регистрация: 12.07.2006
Не в сети |
Цитата:
обычный даталогер с работой от батареек, считывает температуру окруж. среды, затем записывает во флеш, и засыпает на минуту или на час, затем всё по новой, когда вся флеш заполнена засыпает совсем. |
|
29.04.2009, 17:54 | #140 |
Форумец
|
Просто сохранять температуру - это, по-моему, бесполезно без привязки ко времени. Или нет? Тренируемся? Как вариант - прицепить микросхему RTC, вот она то и будет такты давать во время спячки для TMR1.
|
30.04.2009, 16:50 | #142 | |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
Заказ PICKit2
petrd,
Цитата:
|
|
01.05.2009, 23:18 | #143 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
термостат
|
02.05.2009, 20:03 | #144 | ||
Форумец
|
Цитата:
1. PIC12F683 - маленький - 8 ног, с АЦП - хороший контроллер в ряде PIC12, стоит попробовать. 2. PIC16F887 - 40 ног, на сегодняшний день лучший (опять же по-моему мнению) среди PIC16, на нем можно попробовать все, на что возможны PIC16 и в нем есть все что есть у PIC16 (кроме аппаратного модуля управления LCD, ну он не очень и нужен). 3. PIC18F4520 - 40 ног, типичный представитель PIC18, общего применения без наворотов, а если с наворотами, то PIC18F2550 - 28 ног, с USB (на нем PICKit2 сделан). Тут я не рассматриваю PIC с модулями CAN, моторныеи т.д. 4. Ну и можно ЖКИ приглядеть, может что подешевле выйдет. Для сенсорного управления подойдет PIC16F628A (для первых опытов, так как он имеет компрараторы), а дальше можно конкретное что-нибудь подобрать. Цитата:
[PHP]сonst unsigned short TEMP_RESOLUTION = 12, OFFSET = 2;[/PHP] двойку заменить на что надо, снова откомпилировать и прошить, в принципе можно в программе дописать, чтобы по мере необходимости изменять OFFSET. |
||
03.05.2009, 20:50 | #145 | |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
[PHP]сonst unsigned short TEMP_RESOLUTION = 12, OFFSET = 2;[/PHP] я конечно так и подумал, но чтоб так просто...
Цитата:
З.Ы. я на работе связан с прошивкой ATmega8, но немного по другому, там проще. petrd, спасиб за совет, обязательно чего нибудь подвыберу. |
|
05.05.2009, 22:28 | #146 |
Registered User
Сообщений: 391
Регистрация: 16.11.2008
Не в сети |
DV164121a отладочная плата - это и есть PICkit2 c демоплатой?
а вообще зачем нужна демоплата. И ненужно ли к этому еше чего нибудь типа там шнуров или еще чего... Вот на ChipProg2 например, есть колодка. Положил МК и шей, а на PICkit2 как соединяется МК. Извините за глуп вопр. Выбрал из индикаторов ACM1602K-FL-GBH-02 знакосинтезирующии. Вот не знаю правда сойдет вместо WH1602. Последний раз редактировалось romchik77; 05.05.2009 в 23:24. Причина: дополнение |
06.05.2009, 07:27 | #147 | ||||
Форумец
|
Цитата:
Цитата:
Цитата:
Цитата:
|
||||
07.05.2009, 16:07 | #148 | |
Форумец
|
Цитата:
Код:
#define Up Button(&PORTA, 0,10,0) #define Dn Button(&PORTA, 1,10,0) #define SetBut Button(&PORTB, 7,10,0) #define Relay_On() PORTA=8 #define Relay_Off() PORTA=0 const unsigned short TEMP_RESOLUTION = 12; unsigned short MaxTemp, old_MaxTemp, state, MinTemp, old_MinTemp; char *text = "000.00", *maxT = "000", *minT="000"; unsigned temp; void Display_Temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; if (temp2write & 0x8000) { // преобразование отрицательной температуры text[0] = '-'; temp2write = ~temp2write + 1; } temp_whole = temp2write >> RES_SHIFT ; // извлечение целой части // преобразование целой части температуры в символы text[0] = temp_whole/100 + 48; // извлечение сотен text[1] = (temp_whole/10)%10 + 48; // извлечение десятков text[2] = temp_whole%10 + 48; // извлечение единиц // извлечение и преобразование дробной части temp_fraction = temp2write << (4-RES_SHIFT); temp_fraction &= 0x000F; temp_fraction *= 625; // преобразование дробной части в символы text[4] = temp_fraction/1000 + 48; // извлечение тысячных text[5] = (temp_fraction/100)%10 + 48; // извлечение сотых //text[6] = (temp_fraction/10)%10 + 48; // извлечение десятых //text[7] = temp_fraction%10 + 48; // извлечение единиц Lcd_Out(1,7,text); // вывод температуры на ЖКИ // код стейт-машинки switch(state){ case 0: { if(temp_whole<MaxTemp){ Relay_On(); Lcd_Chr(1,16,'1'); } else { Relay_Off(); Lcd_Chr(1,16,'0'); state=1; } }; break; case 1: { if(temp_whole<MinTemp){ Relay_On(); Lcd_Chr(1,16,'1'); state=0; } else { Relay_Off(); Lcd_Chr(1,16,'0'); } }; break; } // окончание стейт-машинки }//~ void main() { CMCON = 7; // Все выводы цифровые входы-выходы TRISA=0b11110111; // все выводы PORTA на вход, RA3 - выход state=0; Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Out(1, 1, "Temp:"); Lcd_Chr(1,13,223); // вывод символа точки и "С" как единицы измерения Lcd_Chr(1,14,'C'); Lcd_Out(2,1,"Min"); Lcd_Out(2,9,"Max"); MaxTemp=Eeprom_Read(0); // читаем уставку из EEPROM MinTemp=Eeprom_Read(1); if (MaxTemp>125){ MaxTemp=25; MinTemp=23; old_MaxTemp=MaxTemp; old_MinTemp=MinTemp; delay_ms(50); Eeprom_Write(0,MaxTemp); Eeprom_Write(1,MinTemp); delay_ms(50); } minT[0]=MinTemp/100+48; minT[1]=(MinTemp/10)%10+48; minT[2]=MinTemp%10+48; Lcd_Out(2,5,minT); maxT[0]=MaxTemp/100+48; maxT[1]=(MaxTemp/10)%10+48; maxT[2]=MaxTemp%10+48; Lcd_Out(2,13,maxT); //--- главный цикл do{ //--- чтение температуры из DS18B20 Ow_Reset(&PORTA,2); // сигнал сброса Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0x44); // команда CONVERT_T Delay_us(120); Ow_Reset(&PORTA,2); Ow_Write(&PORTA,2,0xCC); // команда SKIP_ROM Ow_Write(&PORTA,2,0xBE); // команда READ_SCRATCHPAD temp = Ow_Read(&PORTA,2); temp = (Ow_Read(&PORTA,2) << 8) + temp; //--- обработка нажатия кнопок if(SetBut){ //нажимаем кнопку на RB7 (вход в режим уставки) while(SetBut){} do{ // изменение мин. температуры Lcd_Out(2,5," "); delay_ms(300); Lcd_Out(2,5,minT); delay_ms(300); if (Up){ // нажимаем кнопку на RA0 ("выше") MinTemp++; if (MinTemp>=MaxTemp) MinTemp=MaxTemp; } if (Dn){ // нажимаем кнопку на RA1 ("ниже") MinTemp-- ; if (MinTemp==255) MinTemp=0; } minT[0]=MinTemp/100+48; minT[1]=(MinTemp/10)%10+48; minT[2]=MinTemp%10+48; Lcd_Out(2,5,minT); } while(!SetBut); while(SetBut){} do{ // изменение макс. температуры Lcd_Out(2,13," "); delay_ms(300); Lcd_Out(2,13,maxT); delay_ms(300); if (Up){ // нажимаем кнопку на RA0 ("выше") MaxTemp++; if (MaxTemp>125) MaxTemp=125; } if (Dn){ // нажимаем кнопку на RA1 ("ниже") MaxTemp-- ; if (MaxTemp<MinTemp) MaxTemp=MinTemp; } maxT[0]=MaxTemp/100+48; maxT[1]=(MaxTemp/10)%10+48; maxT[2]=MaxTemp%10+48; Lcd_Out(2,13,maxT); } while(!SetBut); while(SetBut){} // выход из режима уставки } if (old_MaxTemp!= MaxTemp) { // если было изменение макс. температуры Eeprom_Write(0,MaxTemp); // то сохраняем в EEPROM новое значение уставки delay_ms(50); old_MaxTemp = MaxTemp; // и сохраняем для текущей работы } if (old_MinTemp!=MinTemp) { // если было изменение мин. температуры Eeprom_Write(1,MinTemp); // то сохраняем в EEPROM новое значение уставки delay_ms(50); old_MinTemp = MinTemp; // и сохраняем для текущей работы } //--- форматирование, вывод на ЖКИ температуры и уставки, включение-выключение Display_Temperature(temp); Delay_ms(500); }while (1); } Последний раз редактировалось petrd; 20.09.2010 в 10:02. |
|