Сообщение от romchik77:
ChipProg2 найти-то я нашёл, но вот подключить... он соединяется через LTP порт, коего у меня не ма...
Вопрос как можно соединить или что-то типа переходника какого нибудь...
Сообщение от petrd:
карточки расширения под LPT
Сообщение от romchik77:
есть задумка собрать терморегулятор в диаппазоне где-то 60 град до 110 и наверно на МК...
Сообщение от romchik77:
petrd, скорее всего это инкубатор, с жестким требованием к поддержанию температуры, но температуру должен задать сам пользователь.
Сообщение от :
А что такое ПИД ?
Сообщение от petrd:
ПИД регулирование.
Сообщение от romchik77:
взглянул, но наверно эт слишком, я думаю достаточно двухпозиционного регулирования.
Сообщение от petrd:
И при этом это не очень-то и сложно.
Сообщение от petrd:
Но самый лучший вариант - это ПИД. Он будет уменьшать мощность нагревателя при подходе к уставке и увеличивать при отклонении от нее. При этом точность и скорость достижения нужного результата на порядки лучше двухпозиционного регулирования.
Сообщение от petrd:
(так работает 2-х позиционный). И вот тут море вариантов, чтобы диапазон кол****ий температуры около 60 град был как можно меньше - программные хитрости - введение гистерезисов, отключение за 3 град до уставки и т.п
Сообщение от $erega2net:
а смысл огород такой городить? не проще контроллер с ацп взять и на нем сразу термометр делать.
Сообщение от $erega2net:
он тока до 85 градусов.
Сообщение от petrd:
Да, для простоты лучше сначала двухпозиционный, а там видно будет устраивает или нет.
Сообщение от romchik77:
Ок!
petrd, завтра поеду в Воронеж на несколько дней. Заранее, какие детали и где посоветуете прикупить?
Как я понял - пост №48
const unsigned short TEMP_RESOLUTION = 12; unsigned short SetTemp, old_SetTemp; char *text = "000.0000"; char *set = "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; // 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, 7, text); set[0]=SetTemp/100+48; set[1]=(SetTemp/10)%10+48; set[2]=SetTemp%10+48; Lcd_Out(2,7,set); if (SetTemp>temp_whole){ // если уставка выше PORTA=8; // то включение Lcd_Chr(2,14,'1'); // и отображение "1" } else{ // если нет PORTA=0; // выключение Lcd_Chr(2,14,'0'); // и отображение "0" } }//~ void main() { CMCON = 7; // Все выводы цифровые входы-выходы TRISA=0b11110111; // все выводы PORTA на вход, RA3 - выход Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Out(1, 1, "Temp:"); Lcd_Chr(1,15,223); // вывод символа точки и "С" как единицы измерения Lcd_Chr(1,16,'C'); Lcd_Out(2,1,"Set :"); Lcd_Chr(2,10,223); Lcd_Chr(2,11,'C'); SetTemp=Eeprom_Read(0); // читаем уставку из EEPROM if (SetTemp>125){ SetTemp=25; old_SetTemp=SetTemp; delay_ms(50); Eeprom_Write(0,SetTemp); delay_ms(50); } //--- главный цикл 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 (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); } while (1); }
const unsigned short TEMP_RESOLUTION = 12, OFFSET = 2; unsigned short SetTemp, old_SetTemp, state; char *text = "000.0000"; char *set = "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; // 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, 7, text); set[0]=SetTemp/100+48; set[1]=(SetTemp/10)%10+48; set[2]=SetTemp%10+48; Lcd_Out(2,7,set); // далее код стейт-машины (автомат конечных состояний) switch(state){ case 0: { if(temp_whole<SetTemp){ PORTA=8; Lcd_Chr(2,14,'1'); } else { PORTA=0; Lcd_Chr(2,14,'0'); state=1; } }; break; case 1: { if(temp_whole<(SetTemp-OFFSET)){ PORTA=8; Lcd_Chr(2,14,'1'); state=0; } else { PORTA=0; Lcd_Chr(2,14,'0'); } }; break; } // окончание стейт-машины }//~ void main() { state=0; CMCON = 7; // Все выводы цифровые входы-выходы TRISA=0b11110111; // все выводы PORTA на вход, RA3 - выход Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // назначение выводов ЖКИ - PIC Lcd_Cmd(LCD_CURSOR_OFF); Lcd_Out(1, 1, "Temp:"); Lcd_Chr(1,15,223); // вывод символа точки и "С" как единицы измерения Lcd_Chr(1,16,'C'); Lcd_Out(2,1,"Set :"); Lcd_Chr(2,10,223); Lcd_Chr(2,11,'C'); SetTemp=Eeprom_Read(0); // читаем уставку из EEPROM if (SetTemp>125){ SetTemp=25; old_SetTemp=SetTemp; delay_ms(50); Eeprom_Write(0,SetTemp); delay_ms(50); } //--- главный цикл 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 (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); } while (1); }
Сообщение от mono:
можете выложить пример работы pic12cxxx(например 12f683 12f675) для работы софтово с spi (MicroC), например с любым модулем памяти?
Сообщение от mono:
я проверял в протеусе, подключил встроенную библиотеку soft_spi, попробывал считать ID флешки (at25f512a), так вот ничего не получилось, карточка конечно хорошо, и даже есть задумки как обойти фат, итого влезет вся прога даже 12f675 чип, d ,eleotv как разберусь хочу сделать муз. звонок или чего-нть даталогер. Проект могу выложить... (сойдёт под любой пик 12 серии, я думаю научусь даже на этом), прочитанные данные можно гнать по тому же spi в ЦАП c spi входом.
Сообщение от mono:
Вот, пожалуйста посмотрите, наверняка где-то глюк
/* Надо настроить проект: в Project -> Edit Project должны стоять галки _MCLRE_ON; _WDT_OFF; _INTRC_OSC_NOCLKOUT; у Вас же стоял кварц HS остальные не должны стоять. */ unsigned short take, buffer; // надо правильно определить тип данных, // в данном случае не влияет, но все же void main() { ANSEL = 0; CMCON = 7; //TRISIO = 0x00000010; // неверная запись, какой бит хотели установить? GPIO.4 //TRISIO = 0b000010; // если GPIO.1, то надо так или 0x02 TRISIO=0; // нас интересует только GPIO.2 назначенный как CS, // остальные компилятор сам назначит как надо под SPI и UART, поэтому я вот так написал GPIO = 0; Soft_Spi_Config(&GPIO,4,1,5); // надо переопределить SDI и SDO, у Вас SDO-SDO, SDI-SDI, надо SDI-SDO, SDO-SDI Soft_Uart_Init(GPIO, 3, 0, 9600, 0); do { GPIO.F2=0; // выставили CS (при цикле обращения должен быть равен 0) Delay_ms(50); Soft_Spi_Write(0x15); // команда чтения идентификатора Delay_ms(5); take=Soft_Spi_Read(buffer); Delay_ms(50); Soft_Uart_Write(take); GPIO.F2=1; // убрали CS Delay_ms(50); } while(1); }
Сообщение от mono:
Спасибо за разъяснения, попробую как правильно (как Вы написали), резалт должен быть 1F65h.
unsigned short take_1,take_2, buffer; void main() { ANSEL = 0; CMCON = 7; TRISIO=0; GPIO = 0; Soft_Spi_Config(&GPIO,4,1,5); Soft_Uart_Init(GPIO, 3, 0, 9600, 0); do { GPIO.F2=0; Delay_ms(50); Soft_Spi_Write(0x15); Delay_ms(5); take_1=Soft_Spi_Read(buffer); take_2=Soft_Spi_Read(buffer); Delay_ms(50); Soft_Uart_Write(take_1); Soft_Uart_Write(take_2); GPIO.F2=1; Delay_ms(50); } while(1); }
Сообщение от mono:
нашёл самый простецкий программатор на LPT порт Epichttp://melabs.com/doclist.htm#EPIC
с ним возможно работать?