multible ds18b20 avec 876A

< Sujet précédent  Sujet suivant >
Index du Forum -> Forum des Projets fin d'études, mini-projets et des réalisations electroniques -> Projets fin d'études
AuteurMessage
Tunisia.png salem
Member



Messages : 102
Inscrit(e) le: 09/01/2008
Posté le 07/02/2013 09:09  
1360224596.DSN (104 Ko)
multible ds18b20 avec 876A
bonjour a ts

je realise une carte de controle de temperature d'une chambre froid.

pour cette realisation j'utulise un pic 876A avec 3 ds18B20 comme capteur de temp
alors mon probleme et que je reussi a identifier les 3 ds et de lire les 3 temp
et ca fonctionne parfate avec une quartez de 4mhz

alors si je change de 4mhz a 20mhz je peut plus avoire des temp
tous ce que je peut lire des 0. -((rellement pas de lecture de s)
alors je pense que la probleme et dans le driver de one_wire.c

si il ya qeulq'un que le tester avec une quartez de 20mhz.

ou bien un nouveau driver de one_wire merci bcp
ceci one_wire.c


// One Wire bus functions - from Dallas publication AN162
// "Interfacing DS18x20/DS1822 1-wire Temperature Sensor in a Microcontroller
// Environment". Delays calculated from values given for 8051.
// Changed variable name ROM[] to RomBytes[] because ROM is a reserved word
// in version 4 of the CCS compiler.

// Global variables
int8 RomBytes[8];
int8 lastDiscrep = 0;
short doneFlag = 0;
int8 FoundROM[9][8]; // Table of found ROM codes, 8 bytes for each
int8 numROMs;
int8 dowcrc; // crc is accumulated in this variable

// crc lookup table
int8 const dscrc_table[] = {
0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53
};

// Returns 0 for one wire device presence, 1 for none
int8 ow_reset(void)
{
int8 presence;

output_low(DQ);
delay_us(488); // Min. 480uS
output_float(DQ);
delay_us(72); // Takes 15 to 60uS for devices to respond
presence = input(DQ);
delay_us(424); // Wait for end of timeslot
return(presence);
}
//******************************************************************************
// Read bit on one wire bus
int8 read_bit(void)
{
output_low(DQ);
delay_us(1); // Added, 1uS min. Code relied on 8051 being slow.
output_float(DQ);
delay_us(12); // Read within 15uS from start of time slot
return(input(DQ));
}
//******************************************************************************
void write_bit(int8 bitval)
{
output_low(DQ);

if(bitval == 1) {
delay_us(1); // 1uS min. Code relied on 8051 being slow.
output_float(DQ);
}
delay_us(105); // Wait for end of timeslot
output_float(DQ);
}
//******************************************************************************
int8 read_byte(void)
{
int8 i;
int8 val = 0;

for(i=0;i<8;i++)
{
if(read_bit()) val |= (0x01 << i);
delay_us(120); // To finish time slot
}

return val;
}
//******************************************************************************
void write_byte(int8 val)
{
int8 i;
int8 temp;

for (i=0;i<8;i++)
{
temp = val >> i;
temp &= 0x01;
write_bit(temp);
}

delay_us(105);
}
//******************************************************************************
// One wire crc
int8 ow_crc(int8 x)
{
dowcrc = dscrc_table[dowcrc^x];
return dowcrc;
}
//******************************************************************************
// Searches for the next device on the one wire bus. If there are no more
// devices on the bus then false is returned.
int8 Next(void)
{
int8 m = 1; // ROM Bit index
int8 n = 0; // ROM Byte index
int8 k = 1; // Bit mask
int8 x = 0;
int8 discrepMarker = 0;
int8 g; // Output bit
int8 nxt; // Return value
short flag;


nxt = FALSE; // Reset next flag to false

dowcrc = 0; // Reset the dowcrc

flag = ow_reset();

if (flag||doneFlag) // If no parts return false
{
lastDiscrep = 0; // Reset the search
return FALSE;
}

write_byte(0xF0); // Send SearchROM command

do
{
x = 0;
if (read_bit() == 1) x = 2;
delay_us(120);
if (read_bit() == 1) x |= 1; // And it's complement

if (x == 3) // There are no devices on the one wire bus
break;
else
{
if (x > 0) // All devices coupled have 0 or 1
g = x >> 1; // Bit write value for search

// If this discrepancy is before the last discrepancy on a previous
// Next then pick the same as last time.
else
{
if (m < lastDiscrep)
g = ((RomBytes[n] & k) > 0);
// If equal to last pick 1
else
g = (m == lastDiscrep); // If not then pick 0

// If 0 was picked then record position with mask k
if (g == 0) discrepMarker = m;
}

// Isolate bit in ROM[n] with mask k
if (g == 1) RomBytes[n] |= k;
else RomBytes[n] &= ~k;

write_bit(g); // ROM search write

m++; // Increment bit counter m
k = k << 1; // and shift the bit mask k
// If the mask is 0 then go to new ROM
if (k == 0)
{ // Byte n and reset mask
ow_crc(RomBytes[n]); // Accumulate the crc
n++;
k++;
}
}
} while (n < 8); // Loop through until through all ROM bytes 0-7

if (m < (65||dowcrc)) // If search was unsuccessful then
lastDiscrep = 0; // reset the last Discrepancy to zero

else // Search was successful, so set lastDiscrep, lastOne, nxt
{
lastDiscrep = discrepMarker;
doneFlag = (lastDiscrep == 0);
nxt = TRUE; // Indicates search not yet complete, more parts remain
}

return nxt;
}
//******************************************************************************
// Resets current state of a ROM search and calls Next to find the first device
// on the one wire bus.
int8 First(void)
{
lastDiscrep = 0;
doneFlag = FALSE;
return Next(); // Call Next and return it's return value;
}
//******************************************************************************
void FindDevices(void)
{
int8 m;

if(!ow_reset())
{
if(First()) // Begins when at least one part found
{
numROMs = 0;

do
{
numROMs++;

for (m=0;m<8;m++)
{
FoundROM[numROMs][m] = RomBytes[m];
}

printf("Device No.%u address ",numROMs);

printf("%X%X%X%X%X%X%X%X\n\r",
FoundROM[numROMs][7],FoundROM[numROMs][6],FoundROM[numROMs][5],
FoundROM[numROMs][4],FoundROM[numROMs][3],FoundROM[numROMs][2],
FoundROM[numROMs][1],FoundROM[numROMs][0]);

} while (Next() && (numROMs<10)); // Continues until no additional
// devices found.
}
}
putc('\n'); putc('\r');
}
//******************************************************************************
// Sends Match ROM command to bus then device address
int8 Send_MatchRom(void)
{
int8 i;
if (ow_reset()) return FALSE; // 0 if device present
write_byte(0x55); // Match ROM

for (i=0;i<8;i++)
{
write_byte(FoundRom[numROMs]); // Send ROM code
}

return TRUE;
}


et ceci mon pg

#include <16F876A.h>
#device adc=8
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NODEBUG, NOBROWNOUT, NOLVP, NOCPD, WRT_50%
#use delay(clock=4000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)

#define DQ PIN_A0 // One Wire Bus pin assignment

#include "1_wire.c"
#include "LCD420.c"
//#include "ds1307.c"
#include "kbd.c"
char key;
int8 i,temp1,temp2,temp3;

int8 day,mth,year,dow,hr,min,sec;
signed int16 temperature;
int8 scratch[9];


void get_temp()
{
if (!ow_reset()) // If a device is present
{
write_byte(0xCC); // Skip Rom command
write_byte(0x44); // Temperature convert command
output_float(DQ);
delay_ms(750); // Max. conv. time is 750mS for 12 bit
ow_reset();

//numroms=0;
if (Send_MatchRom())
{
write_byte(0xBE); // Read scratch pad command
dowcrc = 0;
for (i=0;i<=7;i++) // Get the data bytes
{
scratch = read_byte();
ow_crc(scratch);
}
scratch[8] = read_byte(); // Get crc byte
ow_reset();
if (scratch[8] == dowcrc)
{
temperature = (signed int16) make16(scratch[1],scratch[0]);

if (temperature >= 0) temperature = (temperature + 8)/16;
else
temperature = (temperature - 8)/16;

printf("%4Ld /n/r ",temperature);
}
}
}
}
void aff_date()
{
lcd_gotoxy(1,4);printf( lcd_putc, "%d/%d/%d", day,mth,year);
lcd_gotoxy(11,4);printf( lcd_putc, "%d:%d:%d", hr,min,sec);
}
void aff_temp()
{
lcd_gotoxy(9,1);printf( lcd_putc, "%d", temp1);
lcd_gotoxy(9,2);printf( lcd_putc, "%d", temp2);
lcd_gotoxy(9,3);printf( lcd_putc, "%d", temp3);
}
void main()
{

setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
lcd_init();
//ds1307_init();
kbd_init();
// TODO: USER CODE!!
//printf( lcd_putc, "Starting....");
output_float(DQ); // Set as input. 4k7 pullup on bus.
FindDevices();

while(1)
{

numroms=0;
get_temp();temp1=temperature;
numroms=1;
//ds1307_get_time(hr,min,sec) ;
aff_date();
get_temp();temp2=temperature;
numroms=2;
//ds1307_get_time(hr,min,sec) ;
//aff_date();
get_temp();temp3=temperature;
lcd_putc(" \f");
//lcd_gotoxy(12,1);printf( lcd_putc, "%d", key);
lcd_gotoxy(1,1);printf( lcd_putc, "Temp1 : ");
lcd_gotoxy(1,2);printf( lcd_putc, "Temp2 : ");
lcd_gotoxy(1,3);printf( lcd_putc, "Temp3 : ");
aff_temp();
//ds1307_get_date(day,mth,year,dow);
//ds1307_get_time(hr,min,sec) ;
//aff_date();


}
}


Revenir en haut | Permalien
Tunisia.png Technologuepro
Administrator



Messages : 447
Inscrit(e) le: 15/11/2007
Posté le 08/02/2013 12:25  
RE : multible ds18b20 avec 876A
Bonjour Salem,
A première vue je pense que tu dois augmenter un peu les delay()
si ça retourne des zéro c'est que le ds n'a pas le temps necessaire pour répondre
utilise un pas de 2µs et fait les tests
@+


Le savoir est une chose qu'on peut pas cacher, la connaissance existe pour être transmise aux autres...
Revenir en haut | Permalien
Tunisia.png salem
Member



Messages : 102
Inscrit(e) le: 09/01/2008
Posté le 08/02/2013 14:42  
RE : multible ds18b20 avec 876A
ok merci
je frais le test et je te repandre

Revenir en haut | Permalien

Haut de page

© 2019 Technologue pro, cours électricité électronique informatique · © 2007 - 2019 Technologue pro - Ressources pédagogiques pour l'enseignement technologique en Tunisie
Usage dans un cadre strictement académique

Technologue: cours en ligne gratuit en électricité, électronique, informatique industrielle et mécanique pour l'enseignement technologique en Tunisie et offre des cours en ligne en génie électrique, informatique, mécanique, une base de données de TP, projets fin d'études et un annuaire de ressources pédagogiques
Licence - Sitemap - Qui somme nous ? - confidentialité- Tunisie Index