Терморегулятор на PIC16F628А, mikroC PRO
Терморегулятор на PIC16F628А, mikroC PRO
помогите с проблемой, мерцанием показаний
- Вложения
-
- TEST.rar
- проект
- (26.71 КБ) 484 скачивания
- Реклама
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
Вы, видмо, где-то в основном цикле на долго запрещаете прерывания.
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
запрет прерывания только при посылке команд на датчик, без этого не как (Аlex писал(а):Вы, видмо, где-то в основном цикле на долго запрещаете прерывания.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
Прерывания нужно запрещать только на основную часть тайм-слота, которая критична к увеличению задержек. Фтопку встроенные ф-ии, только свои.Roma4ka писал(а):без этого не как (
Сделайте хотя-бы через каждую команду, а не через несколько.
Кстати, у Вас частота на каждый индикатор = ~28Гц, это очень мало.
- urry
- Сверлит текстолит когтями
- Сообщения: 1262
- Зарегистрирован: Пн дек 08, 2008 10:58:48
- Откуда: Винница
- Контактная информация:
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
можно. например, при индикации какое -то время вы уверены, что 10 мс у вас есть или сколько там.
Ставьте флаг - разрешение - запрет работы в прерывании ,а в основном цикле анализируйте, сначала ожидайте запрета, он пройдет - и у вас есть время для работы.
Ставьте флаг - разрешение - запрет работы в прерывании ,а в основном цикле анализируйте, сначала ожидайте запрета, он пройдет - и у вас есть время для работы.
- Реклама
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);
}- Вложения
-
- PIC16F628_2.rar
- 628а
- (20.94 КБ) 271 скачивание
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
Можете выложить всю папку проекта вместе с исходниками и .cof файлом ?
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
к сожалению в проєкте нет такого файла, в архиве все что естьАlex писал(а):Можете выложить всю папку проекта вместе с исходниками и .cof файлом ?
- Вложения
-
- PIC16F628.rar
- прожект
- (153.71 КБ) 337 скачиваний
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
Я так понял у Вас компилятор MicroC ? Скомпилил Ваш проект, попробовал запустить в протеусе, всё показывает.
У Вас где 00 показывает ? На железе или в протеусе ?
У Вас где 00 показывает ? На железе или в протеусе ?
Re: Терморегулятор на микроконтроллере PIC16F84 датчикe DS18
да я использую mikroC PRO for PICАlex писал(а):Я так понял у Вас компилятор MicroC ?
если в протеусе свойствах PIC16F628a убрать 4MHz то показания будут 55,9С ... это ошибкаАlex писал(а):У Вас где 00 показывает ? На железе или в протеусе ?
в железе показывает 00,0С
датчик испытаны в другом проекте.... работает на все 100%
- Вложения
-
- 628_2.lay
- Layout
- (69.41 КБ) 355 скачиваний
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на PIC16F84 mikroC PRO
Значит, скорее всего, придётся писать свои ф-ии для работы с датчиком.
Re: Терморегулятор на PIC16F628А, mikroC PRO
так это связано с тем что внутренней генератор 628 не работает на 4MHz
скорость посылки и прием команд DS18B20 и 628 разная
скорость посылки и прием команд DS18B20 и 628 разная
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на PIC16F628А, mikroC PRO
Скорее всего. Т.е. не выдержаны таймауты в тайм-слотах.
И ещё, у Вас задержка между командой преобразования и командой чтения = 500 Мс, а нужно минимум 750.
И ещё, у Вас задержка между командой преобразования и командой чтения = 500 Мс, а нужно минимум 750.
-
borys
- Держит паяльник хвостом
- Сообщения: 927
- Зарегистрирован: Вт сен 07, 2010 19:27:48
- Откуда: Ташкент
Re: Терморегулятор на PIC16F628А, mikroC PRO
Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц.
Re: Терморегулятор на PIC16F628А, mikroC PRO
в чем же тогда у меня ошибка при обмене данных с DS18B20borys писал(а):Roma4ka слегка ошибается - внутренний генератор в этом МК успешно работает на 4 МГц.
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: Терморегулятор на PIC16F628А, mikroC PRO
Roma4ka, изучите 1-wire и реализуйте протокол сами, без всяких готовых библиотек. Только тогда уже можно будет понять в чём у Вас проблема. Хрен знает, что там делает эта библиотека... 


