ds1820 и 16f1824 не работает

Поклонники продукции Microchip Technology Inc тусуются тут.
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Всем привет.
Сделал копипаст с одного проекта в другой и на дисплей выводится какая то дрянь то с отрицательными числами то многозначные числа.
Копаюсь весь день, уже не знаю что сделать.
Копировал с 18F46k22

Код: Выделить всё

#define _XTAL_FREQ  4000000
#include <HTC.H>
#include "d:\mplab\TermoScooter\include\1wireTermo.h"
#include <stdio.h> // Для работы Sprintf


long sys1 = 0, SData = 0;
unsigned int  lowByte=0 , highByte=0;
int i = 0, TempWater = 0, TempWaterInt=0, bt1=0, bat1=0;
char string = 0, commands = 0, commands1 = 0, commands2 = 0;
float TempWaterDec = 0;

__CONFIG(STVREN_OFF &  FOSC_INTOSC & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & LVP_OFF & CP_OFF & CPD_OFF
 & BOREN_OFF & CLKOUTEN_OFF & IESO_OFF & FCMEN_OFF & PLLEN_OFF);

#define serial_error()        RCSTAbits.OERR = 1
#define nostop()               RCSTAbits.FERR == 1
#define serial_fix()        {RCSTAbits.CREN = 0; RCSTAbits.CREN = 1;}
#define vbod  9600
#define SPBRG_ ((_XTAL_FREQ /vbod) -16)/16
//char v[20];
char vTemp[100];
unsigned char command[50]="init value", command_len = 0, command_i = 0;
bit command_state = 0, TXOn = 0, readBit = 0, EndWater = 0, StartID = 0, Heat = 0, AutoMode = 0, bSound = 0, MStop = 0, CommandWarning = 0;

volatile unsigned char RC_REG;

/*
__EEPROM_DATA(0,0,0,0,0,0,0,0);

void EEPROMWriteInt(int p_address, int p_value)  
{  
	lowByte = ((p_value >> 0) & 0xFF);  
	highByte = ((p_value >> 8) & 0xFF);  

	eeprom_write(p_address, lowByte);  
	eeprom_write(p_address + 1, highByte);  
} 
unsigned int EEPROMReadInt(int p_address)  
{  
	lowByte = eeprom_read(p_address);  
	highByte = eeprom_read(p_address + 1);  

	return ((lowByte << 0) & 0xFF) + ((highByte << 8) & 0xFF00);  
}  
*/

void Delay(unsigned int tick)	// Delay 100 us per tick
{
	while(tick--)
	{
		__delay_ms(1);    // Delay 90 us      
	}
}
void Delay_sound(unsigned int tick)	// Delay 100 us per tick
{
	while(tick--)
	{
		__delay_us(90);    // Delay 90 us      
	}
}
void Sound(unsigned int freq,unsigned int time)
{

	unsigned int dt=0,m=0;	// Keep value and 
	dt = 5000/freq;   	// Keep active logic delay
	time = (5*time)/dt;	// Keep counter for generate sound
	for(m=0;m<time;m++) // Loop for generate sound(Toggle logic P0.12)   
	{
		LATA2 = 1;    // RC0=1
		Delay_sound(dt);	// Delay for sound	
		LATA2 = 0;    // RC0=0      
		Delay_sound(dt);	// Delay for sound
	}		

}

unsigned char tempRom[8];
unsigned char temp1[]=0x10,0xE8,0x62,0xE8,0x02,0x08, 0x00,0x8D;
unsigned char temp2[]=0x10,0xE9,0x6C,0xD2,0x01,0x08, 0x00,0xAF;


void readAddr(void)
{
	for(int i=0; i<8; i++){
		tempRom[i]=0;
	}
	char err_status2;	// Keep respond status
	err_status2 = onewire_reset2();	// Reset onewire bus
	if(err_status2==0)   	// Check connection to DS1820
	{
		onewire_write_byte2(0x33); 	// Read ROM
//		onewire_reset2();	// Restart
		for(int i=0; i<8; i++){
			tempRom[i]=onewire_read_byte2();
		}
	}
}
void startTempConvert()
{
	unsigned char temp_buff2[2];	// Keep raw temp.
	char err_status2;	// Keep respond status
	err_status2 = onewire_reset2();	// Reset onewire bus
	if(err_status2==0)   	// Check connection to DS1820
	{
		onewire_write_byte2(0xCC); 	// Skip ROM
		onewire_write_byte2(0x44);  	// Start Conversion
	}
}

int readTemp(void)
{
unsigned char temp_buff2[];	// Keep raw temp.
	char err_status2;	// Keep respond status
	err_status2 = onewire_reset2();	// Reset onewire bus
	if(err_status2==0)   	// Check connection to DS1820
	{
		onewire_write_byte2(0xCC); 	// Skip ROM
		onewire_write_byte2(0x44);  	// Start Conversion
		//	__delay_us(120);	// Delay 120 us for state
		onewire_reset2();	// Restart
		onewire_write_byte2(0xCC); 	// Skip ROM
		onewire_write_byte2(0xBE); 	// Read Scratch Pad

		temp_buff2[0] = onewire_read_byte2(); // Keep raw data
	 	temp_buff2[1] = onewire_read_byte2(); // Keep raw data 
	}
	return((temp_buff2[1]<<8)+temp_buff2[0]);	// Return raw data
//return 51;
}


void usart_putc(unsigned char c)
{
	while(TXIF!=1);	// Wait transmition ready
	TXREG = c;		// Send byte

}

int getch_Usart(void)//   Получение байта
{
	if (RCIF>0 ){
		return RCREG;
	}
	return -1;
}

void us_put(unsigned char *s) //передача строки.
{
	while(*s)	// Loop for send string
	{
		usart_putc(*s++);	// Send byte from string
	}
}
/*
void SendCommandSimple(unsigned char cnum)
{ 
	usart_putc(1);
	usart_putc(cnum);
}

void SendCommandArg1(unsigned char cnum, unsigned char arg1)
{ 
	usart_putc(2); 
	usart_putc(cnum); 
	usart_putc(arg1); 
} 

void SendCommandInt(unsigned char cnum, int arg1) 
{  
	usart_putc(3);  
	usart_putc(cnum);  
	usart_putc((arg1 >> 0) & 0xFF);  
	usart_putc((arg1 >> 8) & 0xFF);  
}

int GetArgInt() 
{ 
	int res = 0; 
	res = (command[2] << 8) | command[1]; 
	return res;
}

void Command1()
{
i = GetArgInt();
}

void ExecCommand()   //----------------------------- Прием с голубого ------------------------------
{

if (command[0] == 'I') if (command[1] == 'D') if (command[2] == ':')
{
}
if (command[3] == '1') //Пуск
{

}
if (command[3] == '2') //Стоп
{

}
if (command[3] == '3') // Предпрогрев
{

}
}
*/

void SendData()  //---------------------------------- Передача на комп.
{

	if (sys1 - SData > 1000) //Передача не быстрой информации
	{ 
bt1 = readTemp();
sprintf(vTemp,"ID:1:%d\r\n",bat1);	
us_put(vTemp);
SData = sys1;
	}
}

void interrupt CCP_INT(void)
{
/*
if (RCIF && RCIE)
	{
		if(OERR == 1)
			serial_fix(); // переполнение буфера
		if (nostop()) {RCREG;} // пропуск стопового
		else
		{
			RC_REG =RCREG;
      		if (command_state == 0)
			{
				command_state = 1;
				command_i = 0;
				command[command_i]=RCREG;
			}
			else 
			{
				command[++command_i]=RCREG;

				if (command_i > 0 && command[command_i-1] == 0xD && command[command_i] ==0xA  )
				{
					command[command_i-1]=0;
					command_state = 0;
					ExecCommand();
				}
			}

		} 
	}
*/
	if (INTF)
	{
		INTF = 0;
	}
//Sound(1000,20);
//Delay(2500);

	if (TMR0IF)
	{ 
		sys1+=3;
		TMR0=70;
		TMR0IF = 0;
 	}
}

void usart_init()
{

    PIR1 = 0;
	PEIE = 1;   // разрешаем прерывания периферии
	RCSTAbits.SPEN=1;//разрешение работы последовательного порта
	TXSTAbits.SYNC =0;//включение асинхронного режима работы
	BAUDCONbits.BRG16 = 0; //0
	TXSTAbits.TX9=0; // выбираем 8 - битовую передачу
	RCSTAbits.RX9=0; // выбираем 8 - битовый прием
	TXSTAbits.BRGH =1;//включаем высокоскоростной режим //1
	SPBRG= SPBRG_; //34;   //SPBRG_;// устанавливаем скорость обмена   
	TXSTAbits.TXEN=1;// не люблю я ножек в 3 состоянии....
	TXIE=0;//запрещаем прерывания от передатчика
	RCSTAbits.CREN =1;  // разрешаем прерывания от приемника
	RCIE=1;
	GIE = 1;// разрешаем прерывания
}


void main()
{
    OSCCON = 0b01101011;
//	ADCON1 = 0b00000000;
	TRISA = 0b000000;
	TRISC = 0b000000;
	ANSA0 = 0;
	ANSA1 = 0;
	ANSA2 = 0;
	ANSA4 = 0;
	ANSELC = 0b00000000;
	OPTION_REG = 0b0000011;
	WPUA = 0b000000;
	WPUC = 0b000000;
 //	PSA = 0;
     //OSCTUNE = 0b11111111;
	TMR0IE = 1;
	INTE	= 1;
    RXDTSEL = 1;
    TXCKSEL = 1;
   Sound(1000,50);
Delay(50);
Sound(2000,50);
Delay(50);
Sound(1000,50);
Delay(50);
Sound(2500,50);
  usart_init();
	while(1)
	{

bat1 =  readTemp()>>1; //DS1820
//bat1 =  (float)bt1 / 2.0;
//TempWaterDec = ((tempp & 0x8) >> 3)*0.5 + ((tempp & 0x4) >> 2)*0.025+((tempp & 0x2) >> 1)*0.125;
//TempWaterInt = ((float)(tempp >> 4  )+((tempp & 0x8) >> 3)*0.5 + ((tempp & 0x4) >> 2)*0.025+((tempp & 0x2) >> 1)*0.125)*10.0;
SendData();
	}
}

include 1wire

Код: Выделить всё

//------------------------------------------------------------------------//
// Compiler: Hitech C 
// Library for 1-Wire bus
// Hardware:
//		RC0	==>	1-Wire bus	
//------------------------------------------------------------------------//
#ifndef _1WIRE2_H_
#define _1WIRE2_H_
#include <stdlib.h>
#include <string.h>	// Include Library for i2c bus	

#define ONEWIRE_TRIS2 TRISC0 	
#define ONEWIRE_PIN2 LATC0
void onewire_dir_out2()
{
	ONEWIRE_TRIS2 = 0;
}
void onewire_dir_in2()
{
	ONEWIRE_TRIS2 = 1;
}
char onewire_reset2() // инициализация
{
	char err2 = 0;	// Переменная для статуса ответа
	char GIE_tmp2;	// Переменная для прерывания
	ONEWIRE_PIN2 = 0;	// Делаем пин = 0.
	onewire_dir_out2();	// Меняем порт на выход.
	__delay_us(480);	// Задержка 480 us
	GIE_tmp2 = GIE;		// сохраняем состояние прерывания
	GIE = 0;			//Выключаем все прерывания
	onewire_dir_in2();	// Меняем порт на вход.
	__delay_us(70);		// Задержка 70 us
	err2 = RC0;	// Читаем что записалось в пине 1 или 0.
	GIE = GIE_tmp2;		// Возвращаем статус прерывания
	__delay_us(480-70);	// Задержка для получения ответа
	if(RC0==0)	// проверяем ответ от DS18B20
	{
		err2 = 1;		// Если нет единички то возвращаем ошибку.
	}
	return err2;		// Возвращаем переменную как есть на 0.
}
unsigned char onewire_write_bit2(char b2 )
{
	char GIE_tmp2;	// Keep global interrupt status
	GIE_tmp2 = GIE;	// Record global interrupt value
	GIE = 0;		// Ensure disable all interrupt
	onewire_dir_out2();	// Change to output port
	__delay_us(1);  // Delay 1 us
	if(b2) 
	{
		onewire_dir_in2();	// If bit is 1 set bus high 
	}	                                 
	__delay_us(15); // Delay 15 us
	if(RC0 == 0) 
		b2 = 0;       // sample at end of read-timeslot
	__delay_us(60-15);	// Delay for write data bit state
	onewire_dir_in2();	// Change to input port
	GIE = GIE_tmp2;	// Return global interrupt value
	return b2;
}
unsigned char onewire_write_byte2(unsigned char b2)
{
	unsigned char i2 = 8, j2;	// Keep counter
	do 
	{
		j2 = onewire_write_bit2(b2 & 1);	// Write data bit
		b2 >>= 1;	// Shift bit 1 time
		if(j2)	// Data bit is "1"?
		{
			 b2 |= 0x80;	
		}
	} 
	while(--i2);
	return b2;
}
unsigned char onewire_read_byte2(void)
{                              
  return onewire_write_byte2(0xFF);              // read by sending 0xFF (a dontcare?)
}
#endif
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15574
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ds1820 и 16f1824 не работает

Сообщение BOB51 »

18-е и 16-е саапсем рызный однако...
8)
Реклама
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Да чем они разные??
Интервалы все равно такие же.
Биты почти такие же.
Ошибки то нет, компилируется.
Я уже давно понял что с 16f свяжешься и гемор получишь.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

AVT-28 писал(а):Да чем они разные??......
Для начала - в __CONFIG-е.
С Уважением, Альберт (Albert_V).
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Ну конфиг у меня вроде норм?
ТАм тоже биты похожи.
Реклама
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

AVT-28 писал(а):...ТАм тоже биты похожи.
"Похожи" - это ни о чём. Скачайте документацию на два контроллера и сравните __CONFIG, инициализацию периферии и т.д..
С Уважением, Альберт (Albert_V).
Реклама
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

В данный момент проблемы не в конфиге,
камень то работает на 4-х мгц или я не понял совсем чего то.
значение переменых отлично передаются на комп.
У меня там usart если посмотреть код.
Но с температурой какой то бред.
Осциллографом если тыкнуть то сигнал есть с датчика.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

AVT-28 писал(а):В данный момент проблемы не в конфиге,
камень то работает на 4-х мгц или я не понял совсем чего то.....
Конечно не поняли. И не поймёте, пока не изучите документацию.
Найдите отличия в конфигурации OSCILLATOR MODULE:
СпойлерPIC18(L)F2X/4XK22
Изображение

PIC16(L)F1824/8
Изображение
Дальше - сами ищите отличия.
Последний раз редактировалось Albert_V Сб янв 17, 2015 19:32:44, всего редактировалось 1 раз.
С Уважением, Альберт (Albert_V).
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

ничего не нашел такого от чего бы инклюд температурный ошибался.
В общем сколько времени потратил, уже успел бы съездить за 18F, переразвести плату и спаять заново и было бы уже готово. :)
Завтра так и сделаю.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

Для начала, "копа́йте" void main() по части инициализации контроллера. Обратите внимание на то что у некоторых контроллеров, при подаче питания, входы могут быть назначены на ADC, компаратор и т.д.
От чтения документации компилятор не спасёт.
С Уважением, Альберт (Albert_V).
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Ну это элементарные вещи, конечно там все нормально.
Даташит с ног на голову перевернул. :)
ДАвно у меня такого гемора на пустом месте не было
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15574
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ds1820 и 16f1824 не работает

Сообщение BOB51 »

Система обеспечения прерываний и аппаратная организация стека весьма разняться. Если задействованы обработчики по прерываниям - ошибок не избежать.
Хоша под Си вроде бы и незаметно тех нюансов, но вполне вероятно, что и библиотеки работают по-разному. Про отличия в доступе к ОЗУ и таблицам в ПЗУ вообще разговор особый...
Максимум совмещения еще так-сяк в отношении доступа к содержимому акумулятора в энхансед серии среднемладших имеется, и то лишь "чуток" приятнее, чем у стандартных среднемладших, но всё еще далече даже для стандартного режима 18-й серии.
Так что если при пересадке исходника с младшей серии на старшую еще можно режим совместимости обеспечить, то обратно (со старшей на младший) аппаратные яйца могут не пустить.
8)
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

О чём говорить, если INIT в void main() - это пародия на установку начальной конфигурации? :)
Если бы ТС читал документацию, он увидел бы, что кроме:
Спойлер

Код: Выделить всё

void main()
{
    OSCCON = 0b01101011;
//   ADCON1 = 0b00000000;
   TRISA = 0b000000;
   TRISC = 0b000000;
   ANSA0 = 0;
   ANSA1 = 0;
   ANSA2 = 0;
   ANSA4 = 0;
   ANSELC = 0b00000000;
   OPTION_REG = 0b0000011;
   WPUA = 0b000000;
   WPUC = 0b000000;
 //   PSA = 0;
     //OSCTUNE = 0b11111111;
   TMR0IE = 1;
   INTE   = 1;
    RXDTSEL = 1;
    TXCKSEL = 1;
   Sound(1000,50);
Delay(50);
Sound(2000,50);
Delay(50);
Sound(1000,50);
Delay(50);
Sound(2500,50);
  usart_init();
   while(1)
   {
остаётся ещё много регистров, в которые надо загрузить осмысленные данные при старте программы.
С Уважением, Альберт (Albert_V).
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Ну мало читать надо еще понимать, я в контроллерах еще не очень. Мало практиики. Все регистры те что по умолчанию disabled зачем их еще раз дисаблить??
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

Тогда ответьте на два вопроса:
1. PLL* в вашей программе включен?
2. PLL* для программы, которую вы
AVT-28 писал(а):...Копировал с 18F46k22...
должен быть включен?
* - относится к OSCILLATOR MODULE
Последний раз редактировалось Albert_V Вс янв 18, 2015 01:12:12, всего редактировалось 1 раз.
С Уважением, Альберт (Albert_V).
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

pll Выключен. Я его запустить так и не смог.
в 46k22 это делается элементарно, тут я заманался просто.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

Не ответили на второй вопрос...
С Уважением, Альберт (Albert_V).
Аватара пользователя
AVT-28
Потрогал лапой паяльник
Сообщения: 378
Зарегистрирован: Вс сен 11, 2011 12:35:11

Re: ds1820 и 16f1824 не работает

Сообщение AVT-28 »

Да в 46к20 был включен а тут выключен.
Если бы какие были проблемы с таймерами/частотами то usart бы не работал.
Аватара пользователя
Albert_V
Друг Кота
Сообщения: 4119
Зарегистрирован: Чт сен 12, 2013 00:54:12
Откуда: ЗаМКАДье. Там, где ЦУП

Re: ds1820 и 16f1824 не работает

Сообщение Albert_V »

AVT-28 писал(а):Да в 46к20 был включен а тут выключен.
Если бы какие были проблемы с таймерами/частотами то usart бы не работал.
:facepalm:
Изучайте то, с чем работаете.
"Железо", в отличие от людей, не прощает ошибок.
С Уважением, Альберт (Albert_V).
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15574
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: ds1820 и 16f1824 не работает

Сообщение BOB51 »

Увы... Это последствия СИшного "гипноза" наблюдаются... :facepalm:
Или первый холодный душ после некоторых успехов легконачинающего.
Ничего, теперь пора и за освоение матчасти взяться - очередной этап роста подготовки!
:beer:
Ответить

Вернуться в «PIC»