30. august 2015 - 14:26
Der er
1 kommentar
Forkert udlæst grader
Hej,
Ved måske godt det ikke er noget i kan svare på , men prøver alligevel.
Jeg har en temperatur føler tilkoblet en microchip.
Men noget i kodningen går galt, for den er fejl med ca 60 grader.
Alle data bliver læst ind i 2 bytes, og derfra skal graderne "bare" omsættes til normale tal.
Det er nok det med bit til int som går galt.
Poster hele koden.
unsigned char read()
{
char i,result = 0;
Rx_18B20; // TRIS is input(1)
for(i = 8; i > 0; i--)
{
Tx_18B20; // TRIS is output(0)
Port_18B20 = 0; // genarate low pluse for 2us
__delay_us(DS18B20_PULLUP_TIME);
Rx_18B20; // TRIS is input(1) release the bus
if(Port_18B20 != 0) {
result |= 1<<i;//i
}
__delay_us(DS18B20_WAIT_TIME); // wait for recovery time
}
return result;
}
30. august 2015 - 14:27
#1
#include <htc.h> //include hitech C header file
#include "lcd.h"
#include <stdlib.h>
#include <stdio.h>
#define _XTAL_FREQ 4000000
// This configuration bits are for PIC16F690 using internal crystal
//__CONFIG(FCMEN_ON & IESO_OFF & BOREN_OFF & CPD_OFF & CP_OFF & MCLRE_OFF & PWRTE_ON & WDTE_OFF & FOSC_INTRCIO);
#pragma config FOSC = INTRCIO // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF // Code Protection bit (Program memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown-out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal External Switchover mode is disabled)
#pragma config FCMEN = ON // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is enabled)
#define SCS_BIT 0x01
#define INT_OSC_8MHZ (0b01110000 | SCS_BIT)
#define INT_OSC_4MHZ (0b01100000 | SCS_BIT)
#define INT_OSC_2MHZ (0b01010000 | SCS_BIT)
#define INT_OSC_1MHZ (0b01000000 | SCS_BIT)
#define INT_OSC_500KHZ (0b00110000 | SCS_BIT)
#define INT_OSC_250KHZ (0b00100000 | SCS_BIT)
#define INT_OSC_125KHZ (0b00010000 | SCS_BIT)
#define INT_OSC_31KHZ (0b00000000 | SCS_BIT)
#define Skip_ROM 0xCC
#define Convert_T 0x44
#define Read_scratchpad 0xBE
#define Port_18B20 RA2
#define Tx_18B20 TRISA2 = 0
#define Rx_18B20 TRISA2 = 1
#define WAIT1 1000
#define WAIT2 500
#define DS18B20_CONV_TIME 750
#define DS18B20_RESET_PULSE 480
#define DS18B20_WAIT_TIME 60
#define DS18B20_PULLUP_TIME 2
#define ONEWIRE_PRESENT 0
#define ONEWIRE_ABSENT 1
unsigned char TLow;
unsigned char vDisp[9];
unsigned char DP;
void init (void)
{
ANSEL = 0; //Initialize A/D ports off
ANSELH = 0; //Initialize A/D ports off
CM1CON0 = 0; //Initialize comp 1 off
CM2CON0 = 0; //Initialize comp 2 off
PORTA = 0x00; // Clears PORTA
PORTB = 0x00; // Clears PORTB
PORTC = 0x00; // Clears PORTC
TRISA = 0x00; // Sets PORTA to all output
TRISB = 0x00; // Sets PORTB to all output
TRISC = 0x00; // sets PORTC to all output.
//TRISA1=1;
// We want 8MHz
OSCCON = INT_OSC_8MHZ;
// Wait for clock to stabilise.
__delay_ms(10);
}
unsigned char reset()
{
Tx_18B20; // Tris = 0 (output)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(DS18B20_RESET_PULSE); // 1 wire require time delay
Rx_18B20; // Tris = 1 (input)
__delay_us(DS18B20_WAIT_TIME); // 1 wire require time delay
if (Port_18B20 == 1) // if there is a presence pluse
{
__delay_us(DS18B20_RESET_PULSE);// Reset and return
return ONEWIRE_PRESENT; // return 0 ( 1-wire is presence)
}
__delay_us(DS18B20_RESET_PULSE); // Reset and return
return ONEWIRE_ABSENT; // return 1 ( 1-wire is NOT presence)
}
void write(char WRT)
{
char i,Cmd;
Cmd = WRT;
Rx_18B20; // set pin# to input (1)
for(i = 0; i < 8; i++)
{
if((Cmd & (1<<i))!= 0)
{
// write 1
Tx_18B20; // set pin# to output (0)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(DS18B20_PULLUP_TIME); // 1 wire require time delay
Rx_18B20; // set pin# to input (release the bus)
__delay_us(DS18B20_WAIT_TIME); // 1 wire require time delay
} else {
//write 0
Tx_18B20; // set pin# to output (0)
Port_18B20 = 0; // set pin# to low (0)
__delay_us(DS18B20_WAIT_TIME); // 1 wire require time delay
Rx_18B20; // set pin# to input (release the bus)
}
}
}
unsigned char readH()
{
char i,result = 0;
Rx_18B20; // TRIS is input(1)
for(i = 8; i > 0; i--)
{
Tx_18B20; // TRIS is output(0)
Port_18B20 = 0; // genarate low pluse for 2us
__delay_us(DS18B20_PULLUP_TIME);
Rx_18B20; // TRIS is input(1) release the bus
if(Port_18B20 != 0) {
result |= 1<<i;//i
}
__delay_us(DS18B20_WAIT_TIME); // wait for recovery time
}
return result;
}
unsigned char readL()
{
char i,result = 0;
Rx_18B20; // TRIS is input(1)
for(i = 0; i < 8; i++)
{
Tx_18B20; // TRIS is output(0)
Port_18B20 = 0; // genarate low pluse for 2us
__delay_us(DS18B20_PULLUP_TIME);
Rx_18B20; // TRIS is input(1) release the bus
if(Port_18B20 != 0) {
result |= 1<<i;//i
}
__delay_us(DS18B20_WAIT_TIME); // wait for recovery time
}
return result;
}
/*******************************************************************************
* MAIN FUNCTION *
*******************************************************************************/
int main(void)
{
unsigned short tempL, tempH; //, fraction;
init();
lcd_init();
__delay_ms(500);
lcd_goto(0x00);
lcd_puts("Try again");
__delay_ms(2000);
lcd_clear();
vDisp[4] = '.';
vDisp[6] = " ";
vDisp[7] = "´";
vDisp[8] = 'C';
lcd_goto(0x00);
lcd_puts("Temp:");
while(1) // create an infinite loop
{
if (!reset() == ONEWIRE_PRESENT)
{
write(Skip_ROM);
write(Convert_T);
__delay_ms(DS18B20_CONV_TIME);
reset();
write(Skip_ROM);
write(Read_scratchpad);
tempL = readL(); //read low temp value
tempH = readH(); //read high temp value
DP = tempL & 0x01; // 'Check if Temperature is integer or fractional
if (tempH){ //If reading is negative
vDisp[0] = '-';
tempL = ((~tempL) + 1) >> 1;
}
else{
vDisp[0] = '+';
tempL = tempL >> 1; // 'Shift one position right (divide by 2) to get integer reading and get rid of decimal point
}
vDisp[1] = (tempL / 100) + 48; // 'Get hundreds and convert to ASCII
vDisp[2] = ((tempL / 10) % 10) + 48; // 'Get tens and convert to ASCII
vDisp[3] = (tempL % 10) + 48; // 'Get units and convert to ASCII
if (DP){ // 'If reading is fractional, ie has 0.5 at end
vDisp[5] = '5';
}
else{ // 'If reading is a whole number
vDisp[5] = '0';
}
lcd_goto(0x08);
lcd_putch(vDisp[0]);
lcd_putch(vDisp[1]);
lcd_putch(vDisp[2]);
lcd_putch(vDisp[3]);
lcd_putch(vDisp[4]);
lcd_putch(vDisp[5]);
lcd_putch(vDisp[6]);
lcd_putch(vDisp[7]);
lcd_putch(vDisp[8]);
lcd_goto(0x40);
}
}
}