Если это ваш первый визит, рекомендуем почитать справку по форуму. Для размещения своих сообщений необходимо зарегистрироваться. Для просмотра сообщений выберите раздел. |
PIC контроллеры. Программаторы и первый проект на PIC |
Программирование микроконтролеров,ремонт аудио/видео/бытовой техники,полезные устройства для дома,телефония, обсуждение статей журнала Радио |
|
Опции темы |
11.11.2011, 14:48 | #871 |
Форумец
Сообщений: 29
Регистрация: 10.10.2003
Не в сети |
Всем привет, нужна помощь владельца PICkit 2 - прошить устройство.
есть инструкция http://autoterm.ru/download/programmer_pickit_2.pdf спец программа для прошивки http://autoterm.ru/download/programing_bi_5.zip прошивка http://autoterm.ru/download/b5-1014-2014.zip и коньяк (или какие другие ништяки) девайс установлен на машине, так что прошиватся надо будет с ноутбука если нету - я со своим приеду. связь - лс. |
15.11.2011, 12:07 | #872 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Подскажите пожалуйста, для PIC 16F877A подцепил кварцевый резонатор на 4MHz и по 30пФ конденсаторы - схема работает стабильно, попробовал увеличить частоту до 16MHz (маркировка кварца: D160G0I) - схема при подаче питания не запускается, но при программировании PICKit2 с включенным питанием на схему - запускается, конденсаторы оставил для нового кварца те же по 30пФ, правильно ли я понимаю, что необходимо пробовать подбирать другие конденсаторы? Есть готовое решение чтобы запустить схему, кварц купил новый. Смущает то, PIC с ним работает после программирование, когда на схему подано питание ч/з PICKit2.
|
15.11.2011, 12:26 | #873 | |
Форумец
|
Цитата:
|
|
16.11.2011, 03:07 | #874 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Да, конечно. Сегодня попробую конденсаторы подобрать...
Понял, что схема запускается после MCLR Reset - после программирования PIC - не убирая галку на питание схемы +5В - ставишь галочку и затем снимаешь с MCLR - и схема запускается. В чем может быть причина такого поведения? P.S. 1). Интересно, насколько близко необходимо располагать кварцевый резонатор от самой микросхемы или нет разницы? 2). При какой частоте работы PIC осуществляется влияние дорожек на плате? 3). Или это не мой случай? Последний раз редактировалось Teeen; 16.11.2011 в 05:08. |
16.11.2011, 12:57 | #875 | |
Форумец
|
Цитата:
При быстром запуске использую такие правила. 1. Все выводы питания PIC должны быть подключены (для 877А их две пары, у других может быть и больше) . 2. На выводах питания обязательно стоит керамика - 0,1 мкФ (электролит по обстоятельствам). 3. MCLR (если он внешний) подтянут через 10 кОм к "+" питания. После этого проблем с запуском обычно нет. Почитайте - может тут ответ для себя найдете http://www.microchip.su/showthread.p...highlight=MCLR Последний раз редактировалось petrd; 16.11.2011 в 13:03. Причина: ссылка |
|
17.11.2011, 05:55 | #876 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
|
18.11.2011, 08:43 | #878 |
Форумец
|
|
21.11.2011, 11:25 | #879 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Вообщем решил проблему: как я понял программа начинает выполняться раньше, знаний не хватает выразить мысль, чем либо кварцевый резонатор "выйдет" на рабочую частоту, либо МК полностью инициализируется?
В AN607 "Power-up Trouble Shooting" имеется TABLE 2: TIME-OUT IN VARIOUS SITUATIONS (TYPICAL) Oscillator Configuration Power-up Wake-up from SLEEP XT, HS, LP(1) 18 ms 18 ms которая меня натолкнула на мысль выставить бит конфигурации "Power Up Timer" = ON, но этой задержки не хватило, также в процедуру инициализации добавил: void Init(){ delay_ms(1); // задержка выполнения программы в 1мс ... и все заработало, теперь вопрос, что я сделал? Повторюсь, с кварцем на 4 Мгц все работало замечательно... |
23.11.2011, 12:29 | #882 |
Форумец
|
|
24.11.2011, 06:20 | #883 | |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Цитата:
2. Мой код: // Контроллер: PIC16F877A, датчик t: DS18B20, LCD: 16х2 с контроллером HD44780, Bipolar Step-motor // Среда программирования: MikroC PRO for PIC v.4.60.0.0 // Автоматическое управление воздушной заслонкой бензинового генератора... // при запуске анализируется текущая t, если она < уставки (SetTemp), то закрываем заслонку // иначе открываем воздушную заслонку (регулируется кол-вом полных оборотов ротора и // равна константе KolOborotov. // Автор: я // Дата: 16_02_2011г. // Версия: 1.0.0 // Определение констант // //Разрешение DS18B20 //Смещение t в C const unsigned short TEMP_RESOLUTION = 12, OFFSET = 2; const unsigned short FaseMax=4; // кол-во табличных значений для Step_Motor //const unsigned int KolOborotov=FaseMax*100;// кол-во оборотов двигателя до момента полного открытия заслонки // Определение переменных // кол-во оборотов двигателя до момента полного открытия заслонки unsigned int KolOborotov, CurOborotov; unsigned short SetTemp, old_SetTemp; unsigned short counter, curFase; bit state, RotateForOpen; signed short int intMinus; char *text = "000"; char *set = "000"; // НЕ УДАЛЯТЬ! появится 4-ый знак 0 в уставки если убрать. char *ust = "000"; unsigned temp; // LCD module connections sbit LCD_RS at RB4_bit; sbit LCD_EN at RB5_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISB4_bit; sbit LCD_EN_Direction at TRISB5_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections // подпрограмма обработки прерывания void interrupt(){ if(INTCON.T0IF){ switch (RotateForOpen){ case 1: { // вращение влево curFase++; // меняем последовательность включения обмоток двигателя if (curFase>FaseMax) {curFase=1;} // задействуем первую обмотку двигателя };break;// end case case 0: { // вращение вправо curFase--; // меняем последовательность включения обмоток двигателя if (curFase<1) {curFase=4;} // задействуем последнюю обмотку двигателя };break; }// end switch CurOborotov++; // кол-во оборотов, совершенных ротором INTCON.T0IF=0; }// end INTCON.T0IF }// end interrupt // Процедура вращения двигателя, // если Open=0 - закрываем заслонку // если Open=1 - открываем заслонку void RotateMotor(unsigned short int Open){ CurOborotov=0; // текущие обороты ротора RotateForOpen=Open; // задаем направление для вращения ротора Step-motor// задаем вращение if (Open){curFase=4;}else{curFase=1;} // ОТКРЫВАЕМ ИЛИ ЗАКРЫВАЕМ ЗАСЛОНКУ while (CurOborotov<KolOborotov){ switch (curFase){ case 1: {PORTC=0b00001001;};break; //17&18 pins PIC16F877A case 2: {PORTC=0b00000101;};break; // case 3: {PORTC=0b00000110;};break; case 4: {PORTC=0b00001010;};break; }// end switch // RA4_bit=0 - кнопка нажата, RA4_bit=1 - кнопка отпущена // Если при закрывании заслонки была нажата кнопка, то останавливаем двигатель if (!RA4_bit&!Open){ Eeprom_Write(0x0F,CurOborotov); // запоминаем кол-во оборотов ротора до нажатия кнопки delay_ms(50); CurOborotov=KolOborotov; } // останавливаем ротор! }// end while PORTC=0; // Снимаем напряжение с двигателя!!! }// end RotateMotor void Display_Temperature(unsigned int temp2write) { const unsigned short RES_SHIFT = TEMP_RESOLUTION - 8; char temp_whole; unsigned int temp_fraction; // преобразование отрицательной температуры if (temp2write & 0x8000) { intMinus=-1; Lcd_Chr(1,3,'-'); temp2write = ~temp2write + 1; } else{ intMinus=1; Lcd_Chr(1,3,' ');} // извлечение целой части 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; // extract thousands digit text[5] = (temp_fraction/100)%10 + 48; // extract hundreds digit text[6] = (temp_fraction/10)%10 + 48; // extract tens digit text[7] = temp_fraction%10 + 48; // extract ones digit // вывод температуры на ЖКИ Lcd_Out(1, 4, text); //Вывод уставки на ЖКИ ust[0]=SetTemp/100+48; ust[1]=(SetTemp/10)%10+48; ust[2]=SetTemp%10+48; // обрезаем дробную часть уставки ust[3]=0; ust[4]=0; Lcd_Out(1,12,ust); //if (RA3_bit){Lcd_Out(2, 10, "CLOSE");}else{Lcd_Out(2, 10, "OPEN ");}//08_11_2011 if (!RA4_bit){Lcd_Out(2, 10, "CLOSE");}else{Lcd_Out(2, 10, "OPEN ");} intMinus*=temp_whole; switch (state){ case 0:{ // если уставка выше if (SetTemp>intMinus){PORTA=8;}// то включение else{ // если нет PORTA=0; // выключение state=1; } };break; case 1:{ // если уставка выше if (SetTemp-OFFSET>intMinus){ PORTA=8; // то включение state=0;} else{PORTA=0;} // выключение };break; }// end switch (state) }// end Display_Temperature void Init(){ delay_ms(1); // задержка перед выполнением программы! --Не убирать! Нужно подбирать если программа не запускается! ADCON1=6; TRISA=0b11110111; TRISC=0; PORTC=0; // двигатель СТОП! //OPTION_REG = 0x87; // настройка TMR0, прерывания будут каждые 66,304 ms - в HEX OPTION_REG = 0b10000111; // настройка TMR0, прерывания будут каждые 66,304 ms - в Binary INTCON.T0IE=1; // разрешили прерывания по переполнению TMR0 INTCON.GIE=1; // разрешили все прерывания Lcd_Init(); // Initialize LCD Lcd_Cmd(_LCD_CLEAR); // Очистить дисплей Lcd_Cmd(_LCD_CURSOR_OFF); // Курсор не отображать Lcd_Out(1, 1, "t="); // вывод t= Lcd_Out(1,8,"C;u="); // вывод C;u= Lcd_Chr(1,7,223); // вывод символа точки и "С" как единицы измеренияLcd_Chr(1,16,'C'); Lcd_Chr(1,15,223); // вывод символа точки и "С" как единицы измеренияLcd_Chr(1,16,'C'); Lcd_Chr(1,16,'C'); // вывод С Lcd_Out(2, 1, "DUMPER = "); // вывод DUMPER = SetTemp=Eeprom_Read(0); // читаем уставку из EEPROM delay_ms(50); if (SetTemp>125){ SetTemp=25; old_SetTemp=SetTemp; Eeprom_Write(0,SetTemp); // если больше 125 градусов сохраняем в EEPROM t=25C delay_ms(50); } //end if (SetTemp>125) } // end Init() void main() { unsigned short iDO, KolClose, KolOpen; Init(); // Инициализируем LCD и читаем уставку KolOborotov=Eeprom_Read(0x0F);// читаем кол-во оборотов ротора из EEPROM delay_ms(50); if (KolOborotov < 10){ KolOborotov=FaseMax*100; Eeprom_Write(0x0F,KolOborotov); delay_ms(50); } iDO=0; // счетчик, играет роль задержки для измерения t, а потом уже двигаем заслонку KolClose=1; // разрешаем закрытие заслонки только один раз (если не сработает кнопка) KolOpen=1; // разрешаем открытие заслонки только один раз (если не сработает кнопка) //--- главный цикл 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; //--- чтение температуры из DS18B20 if (Button(&PORTA, 0,1,0)){ // нажимаем кнопку на RA0 ("уставка выше") SetTemp++; if (SetTemp>125){SetTemp=125;}} if (Button(&PORTA, 1,1,0)){ // нажимаем кнопку на RA1 ("уставка ниже") SetTemp-- ; if (setTemp==255){SetTemp=0;}} if (old_SetTemp!= SetTemp) { // если было изменение уставки Eeprom_Write(0,SetTemp); // то сохраняем в EEPROM новое значение уставки delay_ms(50); old_SetTemp = SetTemp; // и сохраняем для текущей работы } //--- форматирование, вывод на ЖКИ температуры и уставки, включение-выключение Display_Temperature(temp); Delay_ms(500); //RA3_bit=0, если измеренная t>t уставки //RA3_bit=1, если измеренная t<t уставки //RA4_bit=0, если заслонка закрыта (кнопка замкнута на массу) //RA4_bit=1, если заслонка открыта (кнопка отпущена - высокий уровень) iDO++; if (iDO>2){ if (!RA3_bit&!RA4_bit&KolOpen<2){ RotateMotor(1); // открываем заслонку KolClose=1; // разрешаем закрыть заслонку, т.к. она 100% открыта KolOpen=2; }// end if // Ввели переменную else if (RA3_bit&RA4_bit&KolClose<2){ RotateMotor(0); // закрываем заслонку KolClose=2; // если вдруг кнопка не замкнулась на массу, то чтобы двигатель KolOpen=1; }// end else if // не пытался бесконечно это делать - останавливаем его iDO=5;}// end if iDO }// end do while(1); }// end main |
|
24.11.2011, 21:37 | #884 |
Форумец
|
|
08.12.2011, 16:16 | #886 |
Форумец
|
Один вывод контроллера может быть связан с несколькими модулями (АЦП, компратор, USART, цифровой I/O и т.д.), поэтому при включении контроллера нужно определить в каком режиме будут использоваться соответствующие выводы. В данном случае речь идет о компараторе. При включении питания соответствующие выводы, связанные с компаратором к нему и подключаются, а нам они будут нужны как цифровые I/O. Команда CMCON=7 в данном случае переключает выводы с компаратора на функцию цифровых входов-выходов.
|
09.12.2011, 08:36 | #887 | |
Форумец
Сообщений: 3
Регистрация: 08.12.2011
Не в сети |
благодарю
Цитата:
|
|
09.12.2011, 08:41 | #888 |
Форумец
|
|
09.12.2011, 10:42 | #889 |
Форумец
Сообщений: 3
Регистрация: 08.12.2011
Не в сети |
|
14.12.2011, 04:11 | #890 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Здравтсвуйте petrd!
Подскажите пожалуйста направление... Хочу связать PIC+GSM для удаленного контроля темературы в помещении, если температура достигла заданного минимального порога - схема должна включать обогреватель (сделаю без проблем) и оповещать меня об этом посредством SMS, при достижении выше минимальной на 2-5 градусов - выключать обогрвеватель и также оповещать. Дополнительно хочу - удаленно (с помощью SMS) управлять включением данного обогревателя независимо от температуры в помещении. Что у меня есть: фактически рабочий проект по заданию минимальной и дельты в сторону максимальной температуры + LCD, где все это отображается, теперь хочется прикрутить GSM-модуль (какой проще?) и поэкспериментировать с его работой. Т.е. хотя бы для начала - при достижении min температуры слать сгенерированное sms на мой номер. |
14.12.2011, 07:12 | #891 | |
Форумец
|
Цитата:
2. SIM900 и т.д. |
|
15.12.2011, 08:15 | #892 | |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
Цитата:
Т.е. как это должно выглядеть на пальцах (просто технология), тонкости как именно не нужны. Просьба большая напишите пожалуйста. Забыл написать: 1 вариант не нравится, только второй. Как? petrd Я правильно понимаю: берем PIC с встроенным UART и шлем/принимаем команды в/из GSM модуль(я) и все? Последний раз редактировалось Teeen; 15.12.2011 в 11:29. |
|
19.12.2011, 14:29 | #893 |
Сижу, курю
Сообщений: 152
Регистрация: 23.03.2007
Возраст: 39
Не в сети |
Подскажите где в Воронеже купить PICKIT2?
|
20.12.2011, 06:55 | #894 |
Форумец
|
|
20.12.2011, 16:21 | #895 |
Сижу, курю
Сообщений: 152
Регистрация: 23.03.2007
Возраст: 39
Не в сети |
Тока что купил в магазине Радио Хит, как не странно был в наличии, цена чуть меньше 2000р
|
20.12.2011, 17:01 | #897 |
Сижу, курю
Сообщений: 152
Регистрация: 23.03.2007
Возраст: 39
Не в сети |
Научите меня им пользоваться
В том смысле что есть низковольтное программирование, высоковольтное, debug? Нужно шить и дебагить PIC18F452 |
20.12.2011, 18:19 | #898 | |
Форумец
|
Цитата:
Смотрите, что не поймете спросите. |
|
20.12.2011, 18:41 | #899 |
Сижу, курю
Сообщений: 152
Регистрация: 23.03.2007
Возраст: 39
Не в сети |
Спасибо, читаю.
|
29.12.2011, 04:09 | #900 |
Форумец
Сообщений: 88
Регистрация: 04.02.2011
Возраст: 44
Не в сети |
petrd, здравствуйте и с наступающим Новым годом!
Подскажите пожалуйста, можно порты TXD и RXD модуля http://www.olimex.com/dev/pdf/OTHER/MOD-GSM.pdf соединить напрямую с портами PIC без использования промежуточной микросхемы MAX232 например? И будет достаточно этих 2-ух портов и общей земли для передачи сигналов на MOD-GSM и обратно в PIC? PIC16F877A с аппартаным USART. |