Om IntToStr är rätt eller fel att använda kan man ju fråga sig, men eftersom den finns så vilie jag använda den. Det vore dessutom trevligt om man kunde lära sig hur man hanterar problem av den här typen med RAM.
På sid 33 i denna manual kan man läsa om problemet. Tyvärr så gick det inte att kopiera endast den aktuella sidan i manualen, så jag fick länka till hela.
Där förklaras ju bra hur det ligger till, jag förstår bara inte hur man skall använda det som står där, i koden rent praktiskt. Eftersom RAM bank 0 och 1 är använd av variabler, så gäller det tydligen att använda sig av bank 2 eller 3 till "meas_temp" variable rutin. Något svar från microeforumet har inte dykt upp så jag får förlita mig på gamla kära EF.
Skickar med programkoden här. Vissa delar av programmet där stegmotor slås av och på är än så länge bara testrutiner och skall inte tas på allvar.
Nu skall jag åka ut och laga en storköks-diskmaskin på ett café. Hoppas någon hittar en bra lösning på detta problem medan jag kryper omkring på ett blött golv under en bautadiskmaskin.
Kod: Markera allt
/**************************************************************
* Programet Skrivet av Urban Hahne
* Filnamn: MaxDS18B20.c
* Funktion: Läser in temperaturinfo från MAX6675 kopplad till
* termogivare typ k. Samt temperaturinfo från DS10B20-givare.
* Microkontroller: PIC16F887
* Programmer skrivet i microC for PIC och använder färdiga
* rutiner för LCD, One-wire och SPI-communication.* Delar
* av koden är plankad och modifierad från microC´s exempelkoder.
**************************************************************/
// LCD module connections
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB7_bit;
sbit LCD_D4 at RD0_bit;
sbit LCD_D5 at RD1_bit;
sbit LCD_D6 at RD2_bit;
sbit LCD_D7 at RD3_bit;
sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB7_bit;
sbit LCD_D4_Direction at TRISD0_bit;
sbit LCD_D5_Direction at TRISD1_bit;
sbit LCD_D6_Direction at TRISD2_bit;
sbit LCD_D7_Direction at TRISD3_bit;
// End LCD module connections
//******************* output bits ***************************
sbit circ_pump at RA4_bit ;
sbit blower at RA6_bit ;
//******************* Stegmotor anslutningar ****************
sbit C_E at RA0_bit ; //0 = count
sbit MON at RA1_bit ; //M0 M2 till 0 för att slå av motor
sbit RST at RA2_bit ; //Räknar upp vid 0
sbit DIR at RA3_bit ; //aktiv låg. Sätt till 1 vid ränkning
sbit STP at RA5_bit; //Stega motor
long int step = 0;
//************************************************************
//**************** limitations ******************************
unsigned int water_min_temp = 75 ;// no fire stop the blower
unsigned int water_max_temp = 85 ;// to hoot give less speed to the blower
unsigned int aire_max_temp = 30 ;// close aire_gate
unsigned int aire_min_temp = 25 ;// open aire_gate
unsigned int water_cold_temp = 24 ;// stop circ.pump
unsigned int water_start_temp = 27 ;// start circ.pump
//*******************indicator****************************
//******************* definitioner ************************
#define stegtid delay_us(500);
#define paustid delay_ms(200);
// **************** MAX6675 Stuff ****************************
unsigned char spi_out_H;
unsigned char spi_out_L;
unsigned int spi_out;
unsigned char buffer;
char meas_temp[7];
//*******************texter****************************
char sPstop[] = "Pump Stoppad" ;
char sPstart[] = "Pump Startad" ;
char sMoreAire[] ="Mer Luft";
char sLessAire[] ="Mindre Luft" ;
// **************** DS18B20 Stuff ****************************
const unsigned short TEMP_RESOLUTION = 12; //18B20: = 12bit
unsigned char temp_out[7];
unsigned int temp;
unsigned short stemp ;
//************************************************************
void step_right(){
DIR = 1 ;
MON = 1 ;
step = 1000;
do
{
STP = 1 ;
stegtid;
STP = 0 ;
stegtid;
step--;
} while(step);
}
void step_left()
{
DIR = 0 ;
MON = 1 ;
step = 1000;
do
{
STP = 1 ;
stegtid;
STP = 0 ;
stegtid;
step--;
} while(step);
}
void init_cpu()
{
//***************** Config and init-stuff *******************
ANSEL = 0; // Configure AN pins as digital I/O
ANSELH = 0;
C1ON_bit = 0; // Disable comparators
C2ON_bit = 0;
TRISA = 0b00000000 ;
TRISB = 0b00000000 ;
TRISC = 0b00010000 ;
TRISD = 0b00000000 ;
TRISE = 0b00001001 ;
PORTC = 0b00000001 ;
}
void init_step_motor()
{
//****************** init step *******************************
C_E = 0 ; // Counter = 0 for counting
DIR = 1 ; //depend on motor connection
RST = 1 ; // must be 1 for counting
MON = 0 ; // motor on/off
//***********************************************************
}
void init_spi()
{
//******************** init SPI *****************************
SPI1_Init_Advanced(_SPI_MASTER_OSC_DIV4, // Initialize PIC as master
_SPI_DATA_SAMPLE_END, // Data sample at end
_SPI_CLK_IDLE_LOW,
_SPI_HIGH_2_LOW);
}
//***********************************************************
void init_lcd()
{
Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off
}
//************** for test (take away later ) *****************
void motor_test()
{
LCD_OUT(1,1, "Motor test");
LCD_OUT(2,1, "One rev. Right ");
step_right();
Delay_ms(500);
LCD_OUT(2,1, "One rev. Left ");
step_left();
MON = 0 ;
LCD_OUT(2,1, "Motor Ok. ");
Delay_ms(1000);
Lcd_Cmd(_LCD_CLEAR);
//***********************************************************
}
void read_DS18B20()
{
//******* Perform DS18B20 temperature reading *************
Ow_Reset(&PORTE, 2); // Onewire reset signal
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0x44); // Issue command CONVERT_T
Delay_us(120);
Ow_Reset(&PORTE, 2);
Ow_Write(&PORTE, 2, 0xCC); // Issue command SKIP_ROM
Ow_Write(&PORTE, 2, 0xBE); // Issue command READ_SCRATCHPAD
// this is the 16 bit from DS18B20
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
temp = temp >> 4 ; //Use only integer part of temp.
IntToStr(temp,temp_out);
LCD_OUT(2,1, "Vattentemp ");
LCD_Chr_Cp (temp_out[3]); // hundreds
LCD_Chr_Cp (temp_out[4]); // ten
LCD_Chr_Cp (temp_out[5]); // one
LCD_Chr_Cp (223); // degree symbol
LCD_Out_Cp ("C");
Delay_ms(300);
} // at least 220ms, see
//**********END DS18B20 temperature reading ****************
//******* Perform MAX6675 temperature reading *************
void read_MAX6675()
{
RC0_bit = 0; // CS=0
spi_out_H = Spi1_Read(buffer); // upper 8 bit from MAX6675
spi_out_L = Spi1_Read(buffer); // lower 8 bit
RC0_bit = 1; // CS=1
Delay_ms(1);
spi_out = spi_out_H*256+spi_out_L;
spi_out = spi_out >> 4; // formatting result
spi_out = spi_out* 26/100;
IntToStr(spi_out, meas_temp);
LCD_OUT(1,1, "Hetluft ");
//LCD_Chr_Cp (meas_temp[2]); // thousands
LCD_Chr_Cp (meas_temp[3]); // hundreds
LCD_Chr_Cp (meas_temp[4]); // tens
LCD_Chr_Cp (meas_temp[5]); // ones
LCD_Chr_Cp (223); // degree symbol
LCD_Out_Cp ("C");
Delay_ms(300); // at least 220ms, see datasheet}
}
//************ check_water_temp *****************
void check_water_temp(){
if (temp <= water_cold_temp)
{
circ_pump = 0;
LCD_CMD(144);
Lcd_Out_CP(sPstop);
}
else
if (temp >= water_start_temp)
{
circ_pump = 1;
LCD_CMD(144);
Lcd_Out_CP(sPstart);
}
}
//************ check_aire_temp *****************
void check_aire_temp(){
if (spi_out <= aire_min_temp)
{
//step_right();
LCD_CMD(208);
Lcd_Out_CP(sMoreAire);
}
else
if (spi_out >= aire_max_temp)
{
// step_left();
LCD_CMD(208);
Lcd_Out_CP(sLessAire);
}
}
void main(){
init_cpu();
init_step_motor();
init_spi();
init_lcd();
motor_test();
//************* main loop ****************
do {
read_DS18B20();
check_water_temp();
read_MAX6675();
check_aire_temp();
} while (1);
}