Сделал копипаст с одного проекта в другой и на дисплей выводится какая то дрянь то с отрицательными числами то многозначные числа.
Копаюсь весь день, уже не знаю что сделать.
Копировал с 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();
}
}
Код: Выделить всё
//------------------------------------------------------------------------//
// 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


