| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Терморегулятор на PIC16F628А, mikroC PRO https://radiokot.ru/forum/viewtopic.php?f=20&t=59288 |
Страница 1 из 1 |
| Автор: | Roma4ka [ Ср ноя 23, 2011 11:45:58 ] | ||
| Заголовок сообщения: | Терморегулятор на PIC16F628А, mikroC PRO | ||
помогите с проблемой, мерцанием показаний
|
|||
| Автор: | Аlex [ Ср ноя 23, 2011 15:01:33 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
Вы, видмо, где-то в основном цикле на долго запрещаете прерывания. |
|
| Автор: | Roma4ka [ Ср ноя 23, 2011 15:21:09 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
Аlex писал(а): Вы, видмо, где-то в основном цикле на долго запрещаете прерывания. запрет прерывания только при посылке команд на датчик, без этого не как ( |
|
| Автор: | Аlex [ Ср ноя 23, 2011 15:34:16 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
Roma4ka писал(а): без этого не как ( Прерывания нужно запрещать только на основную часть тайм-слота, которая критична к увеличению задержек. Фтопку встроенные ф-ии, только свои.Сделайте хотя-бы через каждую команду, а не через несколько. Кстати, у Вас частота на каждый индикатор = ~28Гц, это очень мало. |
|
| Автор: | urry [ Ср ноя 23, 2011 15:39:18 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
можно. например, при индикации какое -то время вы уверены, что 10 мс у вас есть или сколько там. Ставьте флаг - разрешение - запрет работы в прерывании ,а в основном цикле анализируйте, сначала ожидайте запрета, он пройдет - и у вас есть время для работы. |
|
| Автор: | Roma4ka [ Вс ноя 27, 2011 23:22:19 ] | ||
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 | ||
помогите, почему 16F628A внутреннего генератора на 4MHz при работе с датчикам DS18B20 показывает 0,00 Код: /*
'******************************************************************************* ' Description: The temperature most be displayed on the digits (7 segments) in this method (00,0C) ' Test configuration: ' MCU: PIC16F628A ' Configuration Word ' Oscillator: INTOSC: I/O on ' Watchdog Timer: OFF ' Power up Timer: Disabled ' Master Clear Enable: Enabled ' Browun Out Detect: Enabled ' Low Voltage Program: Disabled ' Data EE Read Protect: Disabled ' Code Protect: OFF '******************************************************************************* */ #define DS18B20 &PORTA,4 #define Relay_On() RA7_bit=1; #define Relay_Off() RA7_bit=0; unsigned short mask(unsigned short num){ switch (num) { case 0 : return 0x50; case 1 : return 0xD7; case 2 : return 0x62; case 3 : return 0x46; case 4 : return 0xC5; case 5 : return 0x4C; case 6 : return 0x48; case 7 : return 0xD6; case 8 : return 0x40; case 9 : return 0x44; } } /*******Endless mask***********/ unsigned short shifter,portb_index; unsigned short portb_array[4]={0x79,0x50,0xC0,0x43}; char ROMCODE [8]={0x28, 0x30, 0xC5, 0xB8, 0x00, 0x00, 0x00, 0x8E} ; unsigned value; bit state; bit oldstate;int m=0,key=0; void interrupt() { RA0_bit=0;RA1_bit=0;RA2_bit=0;RA3_bit=0; PORTB = portb_array[portb_index]; switch (portb_index) { case 0:{RA0_bit=0;RA1_bit=0;RA2_bit=0;RA3_bit=1;}break; case 1:{RA0_bit=0;RA1_bit=0;RA2_bit=1;RA3_bit=0;}break; case 2:{RA0_bit=0;RA1_bit=1;RA2_bit=0;RA3_bit=0;}break; case 3:{RA0_bit=1;RA1_bit=0;RA2_bit=0;RA3_bit=0;}break; } portb_index ++ ; if (portb_index > 3) portb_index = 0; //turn on 1st, turn off 2nd 7 seg.; TMR0 = 0; //reset TIMER0 value; INTCON = 0x20; } extern unsigned sensor(){ unsigned tem,temp1,temp2; int i; INTCON.GIE = 0; //Disable interrupt; Ow_Reset (DS18B20); //one wire reset signal; Ow_Write (DS18B20, 0xCC); //Issue command to DS18B20; Ow_Write (DS18B20, 0X44); //Issue command to DS18B20; INTCON.GIE = 1; //Enable interrupt; Delay_ms(500); //Wait for conversion complete; INTCON.GIE = 0; Ow_Reset(DS18B20); Ow_Write(DS18B20, 0x55); for(i=0; i<=7; i++)Ow_Write(DS18B20,ROMCODE[i]); Ow_Write(DS18B20, 0xBE); temp1 = Ow_Read(DS18B20); temp2 = Ow_Read(DS18B20); INTCON.GIE = 1; tem = (temp2 << 8) + temp1; return tem; } extern on_off(unsigned te) { unsigned int tem,raz; tem=EEPROM_Read(0x01) << 4; raz=EEPROM_Read(0x02) << 4; Delay_ms(20); if (te!=0x0550){ switch(state){ case 0:{if(te<tem){Relay_On();}else {Relay_Off();state=1;}};break; case 1:{if(te<tem-raz){Relay_On();state=0;} else Relay_Off();};break; default:{state=1;};break; } } return; } void Display_Temperature(unsigned int temp2write) { char temp_whole; unsigned int temp_fraction; temp_whole = temp2write >> 4 ; temp_fraction = temp2write ; temp_fraction &= 0x000F; temp_fraction *= 625; portb_array[0] = mask((temp_whole/10)%10); portb_array[1] = mask(temp_whole%10)&0xBF; portb_array[2] = mask(temp_fraction/1000); portb_array[3] = 0x78; } void temperatur(){ //температура нагрева int p; p=Eeprom_Read(1); Delay_ms(20); if (key>3){ if (p==75){p=30;}else {p=p+5;} Eeprom_Write(1,p); Delay_ms(20); } portb_array[0]=mask((p/10)%10); portb_array[1]=mask(p%10)&0xBF; portb_array[2]=0xE4; portb_array[3]=0x78; } void razn(){ //разница int p; p=Eeprom_Read(2); Delay_ms(20); if (key>3){ if (p>=20){p=0;}else {p++;} Eeprom_Write(2,p); Delay_ms(20); } portb_array[0]=0xE0; portb_array[1]=0xEF; portb_array[2]=mask((p/10)%10); portb_array[3]=mask(p%10); } /*************подпрограмма обработки нажатия кнопок**************************/ void Control_Button(){ if (Button(&PORTA, 6, 1, 0)) { // Detect logical one oldstate = 1; if (key==0) {m++; if (m>2)m=0;} key++; } if (oldstate && Button(&PORTA, 6, 1, 1)) { // Detect one-to-zero transition oldstate = 0; key=0; } switch (m) { case 0: Display_Temperature(value);break; case 1: {temperatur();} break; case 2: {razn(); } break; default: Display_Temperature(value); } } void InitMain() { CMCON = 7; // Set AN pins to Digital I/O; OPTION_REG = 0x80; // Set timer TMR0; portb_index = 0; shifter = 1; TMR0 = 0; INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE PORTA = 0x00; TRISA = 0x50; TRISB = 0x00; // All port D pins are configured as outputs PORTB = 0x00; // Turn off all display segments PCON.OSCF = 1; // Set internal oscillator frequency to 4 MHz sensor(); Delay_ms(500); } void main() { InitMain(); do { value=sensor(); Control_Button(); //обработка клавиш /* if ((value==0x0000)||(value>=0x0550)){ Relay_Off(); portb_array[0]=0x68; portb_array[1]=0xFF; portb_array[2]=0x50; portb_array[3]=0xE8; }else */ on_off(value); Delay_ms(250); }while(1); }
|
|||
| Автор: | Аlex [ Вс ноя 27, 2011 23:50:50 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
Можете выложить всю папку проекта вместе с исходниками и .cof файлом ? |
|
| Автор: | Roma4ka [ Пн ноя 28, 2011 09:53:41 ] | ||
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 | ||
Аlex писал(а): Можете выложить всю папку проекта вместе с исходниками и .cof файлом ? к сожалению в проєкте нет такого файла, в архиве все что есть
|
|||
| Автор: | Аlex [ Пн ноя 28, 2011 10:36:17 ] |
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 |
Я так понял у Вас компилятор MicroC ? Скомпилил Ваш проект, попробовал запустить в протеусе, всё показывает. У Вас где 00 показывает ? На железе или в протеусе ? |
|
| Автор: | Roma4ka [ Пн ноя 28, 2011 10:52:52 ] | ||
| Заголовок сообщения: | Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18 | ||
Аlex писал(а): Я так понял у Вас компилятор MicroC ? да я использую mikroC PRO for PIC Аlex писал(а): У Вас где 00 показывает ? На железе или в протеусе ? если в протеусе свойствах PIC16F628a убрать 4MHz то показания будут 55,9С ... это ошибка в железе показывает 00,0С датчик испытаны в другом проекте.... работает на все 100%
|
|||
| Автор: | Аlex [ Пн ноя 28, 2011 11:13:42 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F84 mikroC PRO |
Значит, скорее всего, придётся писать свои ф-ии для работы с датчиком. |
|
| Автор: | Roma4ka [ Пн ноя 28, 2011 12:08:07 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F628А, mikroC PRO |
так это связано с тем что внутренней генератор 628 не работает на 4MHz скорость посылки и прием команд DS18B20 и 628 разная |
|
| Автор: | Аlex [ Пн ноя 28, 2011 12:25:36 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F628А, mikroC PRO |
Скорее всего. Т.е. не выдержаны таймауты в тайм-слотах. И ещё, у Вас задержка между командой преобразования и командой чтения = 500 Мс, а нужно минимум 750. |
|
| Автор: | borys [ Пн ноя 28, 2011 18:55:53 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F628А, mikroC PRO |
Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц. |
|
| Автор: | Roma4ka [ Пн ноя 28, 2011 19:24:27 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F628А, mikroC PRO |
borys писал(а): Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц. в чем же тогда у меня ошибка при обмене данных с DS18B20
|
|
| Автор: | Аlex [ Вт ноя 29, 2011 12:24:07 ] |
| Заголовок сообщения: | Re: Терморегулятор на PIC16F628А, mikroC PRO |
Roma4ka, изучите 1-wire и реализуйте протокол сами, без всяких готовых библиотек. Только тогда уже можно будет понять в чём у Вас проблема. Хрен знает, что там делает эта библиотека... |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


