PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] 1wire DS1820 /HIH 3600



gast000
22.03.2005, 11:30
Hi Leute,
hab Probleme mit dem Quellcode,
hat vielleicht schon jemand von Euch den 1wire DS1820 /HIH 3600 Sensor mittels PIC angestuert?

Bräuchte den richtigen Code dringend,
Danke

Goblin
22.03.2005, 11:48
poste den code doch mal und sag, womit du genau probleme hast.

22.03.2005, 20:16
So mein Code:


**************************************
main.c:
#include "setting.h"
#include "display.h"
#include "ds18S20.h"

void main()
{
set_tris_a(BIT2+BIT3);
set_tris_b(BIT2);

lcd_int(); // Initialisierung der LCD-Anzeige
delay_ms(50);

while(1)
{
make_measure();

lcd_gotoxy(1,4);
printf(lcd_putc,"Temperatur: %d,%02u C",temp_2,temp_1);

delay_ms(500);
}

}

setting.h:
#include <16f628.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOLVP
#use fast_IO(b)

#define DS18S20 PIN_A2 // TempSensor
enum BITSTELLE { Bit0=1,BIT1=2,BIT2=4,BIT3=8,BIT4=16,BIT5=32,BIT6=6 4,BIT7=128 };

display.h:
struct port_b_layout
{ // Layout des Ports b
short blank; // freier Portpin
short rs; // LCD RS
short rw; // LCD RW - jetzt freier Portpin
short enable; // LCD ENABLE
int lcddata:4; // LCD-Daten D4...D7
} portb;

#byte portb=6 //LCD an Port B

#define NOP() { #asm nop #endasm }

#define lcd_type 0x28 // 0x24=5x10, 0x28=2 lines
byte const LCD_INIT_STRING[4] = {0x20 | (lcd_type << 2), 0x0C, 0x01, 6};

#define LCD_BLANK() {lcd_send_byte(0,1);delay_ms(2);}

void lcd_send_nibble( byte n )
{
portb.lcddata = n;
nop();
portb.enable = 1;
delay_us(4);
portb.enable = 0;
}

void lcd_send_byte( byte address, byte n )
{
portb.rs = 0;
portb.rs = address;
nop();
// portb.rw = 0; // Ist jetzt auch frei
nop();
portb.enable = 0;
lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

void lcd_int()
{
byte i;
set_tris_b(4);
portb.rs = 0; // siehe 4-Bit Initialisierung (LCD-Datenblatt)
portb.enable = 0;
delay_ms(15); // 15 ms Pause
for(i=1;i<=3;++i)
{
lcd_send_nibble(3); // 3-mal 0011 mit mind. 5ms Pause
delay_ms(5);
}
lcd_send_nibble(2); // 0010 = 4-Bit Interface
for(i=0;i<=3;++i)
lcd_send_byte(0,LCD_INIT_STRING[i]);

}

void lcd_gotoxy( byte x, byte y)
{
byte address;

if (y==1) address=0;
if (y==2) address=0x40;
if (y==3) address=0x14;
if (y==4) address=0x54;
address+=x-1;
lcd_send_byte(0,0x80|address);
}

void lcd_putc( char f)
{
// switch (f)
// {
// case '\c' : lcd_send_byte(0,1);
// delay_ms(2); // break;

// case '\1' : lcd_gotoxy(1,1); break;
// case '\2' : lcd_gotoxy(1,2); break;
// case '\3' : lcd_gotoxy(1,3); break;
// case '\4' : lcd_gotoxy(1,4); break;
// default : lcd_send_byte(1,f); break;
// }

lcd_send_byte(1,f);
}

DS18S20.h:
#define temp_SkippRom 204
#define temp_readPower 180
#define temp_TempComp 68
#define temp_readScrachp 190

void temp_init()
{
set_tris_a(Bit3+Bit4); // Port A auf output Setzen
output_low(DS18S20); // Pin des DS18S20 auf low setzen
delay_us(500); // für mindestens 450ms warten
set_tris_a(bit2+Bit3+Bit4); // Port A auf input setzen und warten
while(input(DS18S20)) // ob der 1-ware bus aus low gezogen wird,
{ // d.h. dann es antwordet mindesten ein DS18S20
} // auf die initalisierung
delay_ms(5);
}

void temp_send(int code)
{
int n;
set_tris_a(Bit3+Bit4); //setze output
for(n=0; n <= 7; n++)
{
if(bit_test(code,n))
{
output_low(DS18S20); //sende 0
delay_us(2); //int write slot
output_high(DS18S20); //send 1
delay_us(65); //duration für 1 und fertig
}
else
{
output_low(DS18S20); //sende 0
delay_us(65); //int write slot & send 0
}

output_high(DS18S20);
delay_us(2);

}
set_tris_a(bit2+Bit3+Bit4); //wieder auf input setzen
delay_ms(1);
}

byte temp_read()
{
byte in;
int b;
in = 0;
delay_ms(4);
for(b=0; b<=7; b++)
{
delay_us(1);
set_tris_a(Bit3+Bit4); //output
output_low(DS18S20); // init read
delay_us(1);
set_tris_a(bit2+Bit3+Bit4); //input
delay_us(2);
if(input(DS18S20))
{
bit_set(in,b);
}
delay_us(60);
}

return(in);
}

// Variablen für Termo
int temp_1;
int temp_2;
long int null;
long int eins;
int scratchpad[8];
int i;

make_measure()
{
temp_init();
temp_send(temp_SkippRom); //skippRom
temp_send(temp_TempComp); //make measure
delay_ms(500); //warten bis TempCompare abgeschlossen...
temp_init();
temp_send(temp_SkippRom); //skippRom
temp_send(temp_readScrachp); //read scratchpad
for (i=0; i<8;i++)
{
scratchpad[i] = temp_read(); // Hier noch ein paar Berechungen zum Temperatur
}
temp_1 = (scratchpad[0])/2; // Im scratchpad[0] steht die Temperatur in 0,5C schritten
temp_1 = temp_1-1; // also noch ein wenig Rechnen, dann bekommt man eine Auflösung
// von 0,05 Grad!
null = (temp_1);
null = null*100;
null = null-25;

eins = (16 - scratchpad[6]);
eins = eins*100;
eins = eins/16;
null = null+eins;

temp_2 = null/100;
eins = temp_2*100;
temp_1 = null - eins;

}


*********************
folgendes Problem
ich verwende kein LED Display
das heißt ich schick alles über den RS232 an den PC
...Problem is halt die Sachen rauszugeben die für mich unnötig sind,dass es aber trotzdem Funktioniert
danke für Eure Hilfe,
hat jemand event. einen andren Code??
ps:wo finde ich die 1820 und setting header files??

13.04.2005, 13:45
Hallo,
wenn du die Temperatur des DS1820 doch nur an den COMx schicken willst , versuche es doch einfach mit folgendem.

http://www.linuxnetmag.com/de/issue8/m8temperature1.html

und dieser software

http://www.digitemp.com/

MFG

qwexx