
| Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
![]() |
||
PIC контроллеры. Программаторы и первый проект на PIC
|
||
| Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
![]() |
|
|
Опции темы |
|
|
#151 |
|
Форумец
Сообщений: 523
Регистрация: 08.02.2007
Возраст: 51
|
Он там один в нижнем новгороде chipnn кажется. Просто никогда по почте ничего не заказывал. Но тут такой вариант, пропустить жалко а в москву никак... Так что решил попробовать и рискнул 768 рублями , тем более шашлык 350р. уже. Ну не съем пару порций
|
|
|
|
|
#152 |
|
Форумец
|
Ага http://www.chip-nn.ru. Да не, я думаю ничего стремного нет, они партнеры с Гамма-спб. Если что будет не так, то можно на www.microchip.su шум поднять. А я в www.trt.ru заказал, жду.
|
|
|
|
|
#153 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
И я в www.trt.ru заказал, жду
petrd,С термостатом, не удивлюсь еще какому ни-будь навороту. И все же как "создать" алгоритм. |
|
|
|
|
#154 | |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
Термостат
Цитата:
б) Допустим нажав Кн.3 вошёл в меню уставки мин. или мах. и если в таком состоянии бросить, то девайс просто не работает, пока не выйдешь из настройки, что не допустимо. ![]() а что означает в железе..., Вы собираете и смотрите или же виртуально? З.Ы. с праздничком Последний раз редактировалось romchik77; 09.05.2009 в 21:38. |
|
|
|
|
|
#155 | ||
|
Форумец
|
Цитата:
Цитата:
|
||
|
|
|
|
#156 | ||
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
Цитата:
Цитата:
|
||
|
|
|
|
#157 |
|
Форумец
|
Вот переделал. Теперь если после входа в режим уставки примерно в течении 30 сек. не будет нажатий кнопок "Выше" или "Ниже", то программа выйдет из режима уставки. Ну и для сравнения кодов убрал сотые, на их месте теперь будет пробел. Процедуру обработки нажатия кнопок вынес в отдельную подпрограмму и появилась подпрограмма обработки прерываний от TMR0 (таймер нужен для отсчета 30 сек.). Проверил - в железе вроде работает как надо, что не так - говорите.
Код:
#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.0", *maxT = "000", *minT="000";
unsigned temp, counter;
/************* подпрограмма обработки прерываний **************************/
void interrupt(){
if(INTCON.T0IF){
counter++;
INTCON.T0IF=0;
}
}// interrupt
/*************подпрограмма обработки нажатия кнопок**************************/
void Control_Button(){
if(SetBut){ //нажимаем кнопку на RB7 (вход в режим уставки)
while(SetBut){}
counter=0;
INTCON.GIE=1; // включили механизм прерываний
do{ // изменение мин. температуры
Lcd_Out(2,5," ");
delay_ms(300);
Lcd_Out(2,5,minT);
delay_ms(300);
if (Up){ // нажимаем кнопку на RA0 ("выше")
counter=0;
MinTemp++;
if (MinTemp>=MaxTemp)
MinTemp=MaxTemp;
}
if (Dn){ // нажимаем кнопку на RA1 ("ниже")
counter=0;
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);
if (counter>450)
return;
}
while(!SetBut);
while(SetBut){}
do{ // изменение макс. температуры
Lcd_Out(2,13," ");
delay_ms(300);
Lcd_Out(2,13,maxT);
delay_ms(300);
if (Up){ // нажимаем кнопку на RA0 ("выше")
counter=0;
MaxTemp++;
if (MaxTemp>125)
MaxTemp=125;
}
if (Dn){ // нажимаем кнопку на RA1 ("ниже")
counter=0;
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);
if (counter>450)
return;
}
while(!SetBut);
while(SetBut){} // выход из режима уставки
INTCON.GIE=0; // выключили механизм прерываний
}
}
/* подпрограмма форматирования, вывода на ЖКИ температуры и уставок, включение-выключение*/
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 - выход
OPTION_REG = 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms
INTCON.T0IE=1; // разрешили прерывания по переполнению TMR0
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;
Control_Button(); // подпрограмма обработки нажатия кнопок
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 в 09:37. |
|
|
|
|
#158 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
термостат
petrd, вот вчера прошил МК включил. Через пару минут он заглючил (как только температура упала до уст МИН, нагрузка включилась и на дисплее 000,0 *С. После вообще чистый экран).
Прошиваю еще раз (перед прошивкой включаю сравнение - все Ок!). Включаю работает, но при подаче питания индикация температуры на 1 сек показывает 85.0 *С. Показания температуры сначала как бы подвисали потом нормально и вот еще заметил ставишь устав МИН 25, температура падает до 25.6 и включается нагрузка (остальные значения МИН работают нормально). Нулей на индикаторе больше не появлялось. Может я в чем-то ошибся. Хотя конфигурация, флаги вроде те же. Вот Нех: |
|
|
|
|
#159 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#160 | ||
|
Форумец
|
Цитата:
Цитата:
|
||
|
|
|
|
#161 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
У меня схема пока собрана на макетке и нагрузка - светодиод! (в будущем будет 1кв тен, управляться через симистор) Датчик нагреваю руками и паяльником, как и Вы.
Да тоже подозреваю ИП. Хотя с ранней программой работает Ок!. В общем спасибо, ссылка кстати. Завтра на работе буду пробовать. З.Ы. Может питание и в другой теме (с триггером). ИП брался один и тот же. |
|
|
|
|
#162 | |
|
Форумец
|
Цитата:
Небольшой offtop - сегодня был в РАДИОХИТе и офигел - там столько отладочных средств и EasyPIC5, EasyAVR, родная шайба ICD2, куча отладок и макеток от Olimex, практически под все распространенные сегодня контроллеры всяких производителей, аж слюна потекла, но цены заставили ее сглотнуть назад. |
|
|
|
|
|
#163 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
Интересно вот эта штука для отладки http://www.mikroe.com/en/tools/easypic5/ сколько стоит в "Радиохит", если помните.
А на счет глюк, завтра буду проверять на работе, там вся аппаратура, да и программатор только там |
|
|
|
|
#164 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#165 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
Значит так, виновато питание. Пробовал и то и другое, сравнил, посмотрел осциллографом. Но даже с идеальным питанием бывают моменты когда проскакивают 000,0 *С, независимо от уставок! Думаю, эт от моего монтажа (ведь должна быть земля, а у мня куча проводов. Вот не думал, что МК такие капризные).
Петр, а не знаете какая должна быть схема питания МК, я имею ввиду фильтр, как с наименьшими усилиями сотварить. А может уже готовый какой есть? |
|
|
|
|
#166 |
|
неламер
Сообщений: 2,557
Регистрация: 29.11.2005
|
romchik77 попробуй поставить около ног микрухи кондючек по питанию. и там же дросселек небольшой.
|
|
|
|
|
#167 | |
|
Форумец
|
Цитата:
1. По поводу нулей, видимо что-то такое на шине 1-Wire происходит, что сбивает нормальный процесс чтения. Для этого разработчики предусмотрели в DS18B20 модуль вычисления CRC. Поэтому его надо будет использовать. 2. Схемы питания я всегда использую стандартные: трансформатор - диодный мост, конденсатор 1000 мкФ+ керамический 0,1 мкф - стабилизатор 7805 - конденсатор 100 мкФ+ керамический 0,1 мкф. И на выводы питания МК еще один керамический 0,1 мкф. И еще мне нравится на стандартных адаптерах питания делать - разъем на макетку запаял, 7805, 100 мкф+0,1 на выход и все, входной конденсатор можно не ставить, в адаптере обычно уже есть и мост и конденсаторы. P.S. Да еще. Если адаптер без разъема, то на входе 7805 ставлю 1N4007, чтобы не пожечь, если полярность попутаю. |
|
|
|
|
|
#168 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
Попробую все вышесказанное. А какой индуктивности, $erega2net. дросселек небольшой.
petrd, хм... как я понял эта шина 1-Wire может тянуться до 300м.!!! (бред какой-то), или действительно так. И нужно ли экранировать? |
|
|
|
|
#169 |
|
Форумец
|
Разработчики от Dallas заявляют 300 м при соблюдении стандарта на протокол (что еще надо почитать), ну а на вскидку - протокол низкоскоростной + CRC, так что теоретически возможно, но практически я бы не рисковал, ибо для этого есть другие протоколы.
|
|
|
|
|
#170 |
|
Форумец
Сообщений: 523
Регистрация: 08.02.2007
Возраст: 51
|
Немного не в тему, но не смог удержаиться. Супер. Сам с удовольствием прочитал. Таким бы людям книги писать. В такой же манере, помниться на физфаке Власов паскаль преподовал году этак в 93...94.
http://vrtp.ru/index.php?showtopic=10583&st=0 |
|
|
|
|
#171 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#174 | |
|
Форумец
|
Цитата:
|
|
|
|
|
|
#175 |
|
Registered User
Сообщений: 391
Регистрация: 16.11.2008
|
petrd, не, я узнав, что зарегистрировавшиеся 29.04.09 уже получили PICKit2, написал Закатовой Татьяне (Тритон). Пришел ответ - Татьяна в отпуске, по заказу выслано 22.05.09 ждите! никакого идентификатора не сообщили. Так что пака ждемс...
|
|
|
|
|
#177 |
|
Форумец
|
|
|
|
|
|
#178 |
|
Форумец
Сообщений: 3,287
Регистрация: 28.07.2004
|
petrd, Присматриваюсь к графическому дисплею PG 12864 (ars-ann-h) (т.к. стоит немножко дороже 1602 или 1604) как к универсальному изделию с бОльшими возможностями для макетирования конструкций. Возник вопрос, имеются ли различия в управлении в зависимости от буквенных маркировок изделия, т.к. в найденных даташитах (нашел для LRS-HNN-B) по последним буквам отличается от располагаемого для приобретения модуля, названного вначале этого сообщения. И если встречали в сети или разрабатывали, то подскажете пожалуйста примеры работы и инициализации этого дисплея или подобных, буду Вам крайне благодарен.
Огромное спасибо за тему! |
|
|
|
|
#179 | |
|
Форумец
|
Цитата:
Код:
void main() {
Glcd_Init(&PORTB, 0, 1, 2, 3, 5, 4, &PORTD); // инициализация ЖКИ
Glcd_Set_Font(FontSystem5x8, 5, 8, 32); // установка шрифта
Glcd_Fill(0x00); //очистка экрана
Glcd_Write_Text("Hello world!", 10, 2, 1); // вывод текста
}
|
|
|
|
|
|
#180 |
|
Форумец
Сообщений: 3,287
Регистрация: 28.07.2004
|
А на ASMе подпрограмм на них не втречали? Хочется очень детально проработать каждый нюанс взаимодействия (или это можно почувствовать и без АSMa?), т.к. делаю для души, никуда не спешу, а основной интерес не зажечь дисплей, а "поковыряться" Значит есть смысл ещё качать даташиты на контроллеры, которые на плате дисплея и разбираться? Я понял, что данный дисплей состоит из двух банков (секций), которые нужно переключать и есть два варианта построения битности данных, с задействованием 4 бит, (линий данных) и всех 8. И ещё попутно вопросик: на него можно отдельно купить тач скрин по размеру или лучше применить что то готовое, как единое целое?
Последний раз редактировалось EXPRESS; 29.05.2009 в 19:24. |
|
|