Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#11 Message par dyli » jeu. 16 mars 2017 14:56 lien vers la Data-Sheet : Cliquez ici

oui, ca se voit, c'est un vrai professionnel, et il a beaucoup de facilité. :bravo:
Modifié en dernier par dyli le jeu. 16 mars 2017 15:17, modifié 1 fois.

question sur langage c pour pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#12 Message par paulfjujo » jeu. 16 mars 2017 18:08 lien vers la Data-Sheet : Cliquez ici

:oops: Arretez , je ne vais plus pouvoir enfiler mes chaussures ..
et on est pas là , pour se tartiner, congratuler ou au contraire se faire entartrer

.. il a beaucoup de facilité


Que nenni ! c'est simplement beaucoup de temps passé, en autodidacte, sur ces bestiaux de MCU ...
42 ans depuis mon premier microprocesseur 8 bits 6502 KIM 1. (que j'ai encore ) ,
époque ou on se sentait bien seul ( au niveau contact technique ) ,
comparativement à aujourd'hui avec internet.

exit
le privilege de l'age, avant qu' Halzeimer s'en mêle !
Aide toi, le ciel ou FantasPic t'aidera

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#13 Message par dyli » jeu. 16 mars 2017 18:34 lien vers la Data-Sheet : Cliquez ici

re bonsoir paulfjujo,

c'était juste pour répondre a Jérémy.... 8-)

je reviens avec une derniére question...donc, quand je fais la comparaison de temperature avec 30 degré ( if (temp_whole>25) && (temp_whole<30))
ca marche, mais le probleme c'est quand je déscend a -25 degré ca fait allumer la led rouge, ce que je voudrais pas..

La meme chose se passe avec (temp_whole<=5 )si je voulais allumer une led orange ou un chauffage electrique quand la température est en dessous de 5 degré
ca marche , par contre si la température est -6 ou plus grand que -5 la led orange s'éteint, ce qui n'est pas demandé :? cette comparaison ne tient pas compte de la signe de température.


Code : Tout sélectionner

Read_Temperature();
Display_Temperature();
if (temp_whole>25) && (temp_whole<30)
  portC.B0=;  // led rouge sur RC0
 else
 portC
.B0=0;

 if   (temp_whole<=)
         portC.B1=;  // led orange sur RC1
         else
         portC
.B1=0;
Delay_ms(100);
}
 while (1);
}

question sur langage c pour pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#14 Message par paulfjujo » jeu. 16 mars 2017 19:42 lien vers la Data-Sheet : Cliquez ici

ette comparaison ne tient pas compte de la signe de température.


EXACT, y a un bug !
le signe "-" n'est que affiché sur le resultat de la mesure

Le complement à 2 pour la partie negative est OK, mais ensuite il faut rajouter le signe
J'avais deja vu ce probleme sur une autre appli (18F47J53_Tests_UART2_LCD_I2C2_ADC12b_DS18B20_160120.c)

// 19-01-2016
// test avec temperature congelateur -22°C ... BAD affichage en LONG
// car NON signé et ne traite que du positif

où j'avais besoin de la valeur numerique de temperature en °C

essaie ceci .. pas encore testé

Code : Tout sélectionner



char  Display_Temperature
()
{
unsigned short RES_SHIFT TEMP_RESOLUTION 8;
char temp_whole;
unsigned int temp2write;
unsigned int temp_fraction;

temp2write temp;
// Check if temperature is negative
if (temp2write 0x8000)
{
text[0] = '-';
temp2write = ~temp2write 1;
}
else
text[0] = ' ';   // espace pour positif
// Extract temp_whole   12
temp_whole temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[1] = temp_whole/100 48;
text[2] = (temp_whole/10)%10 48// Extract tens digit
text[3] = temp_whole%10 48// Extract ones digit
text[4] = '.';

// Extract temp_fraction and convert it to unsigned int
temp_fraction temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// Convert temp_fraction to characters

text[5] = temp_fraction/1000 48// Extract thousands digit
// Print temperature on LCD
Lcd_Out(11text);
// Print degree character and'C' for Celsius
Lcd_Chr_CP(0xDF); // 223 ASCII for degree symbol on my LCD
Lcd_Chr_CP('C');
if(
text[0] == '-')
return (-
temp_whole);
else
return(
temp_whole);
}

 
Aide toi, le ciel ou FantasPic t'aidera

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#15 Message par dyli » jeu. 16 mars 2017 22:44 lien vers la Data-Sheet : Cliquez ici

Re bonsoir paulfjujo,

Je viens de testé le dernier code sous proteus avec le DS18S20, pic 16f877A.
La temperature affichiée sur lcd corresponds a celle sur DS18S20 comme avant.
J'ai mis ton code,par contre pour les seuils de commutation , led rouge a +30 degré (ON), orange a -5 degré(ON) ne s'allument plus. Que les temperatures soient négatives ou positives.
Je teste tojours temp_whole

voici le nouveau code avec modifications:

Code : Tout sélectionner

//  lecture de temperature par DS18S20  pic1f6877A
// LCD module connections

sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB1_bit;
sbit LCD_D4 at RB2_bit;
sbit LCD_D5 at RB3_bit;
sbit LCD_D6 at RB4_bit;
sbit LCD_D7 at RB5_bit;

sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB1_bit;
sbit LCD_D4_Direction at TRISB2_bit;
sbit LCD_D5_Direction at TRISB3_bit;
sbit LCD_D6_Direction at TRISB4_bit;
sbit LCD_D7_Direction at TRISB5_bit;
// End LCD module connections

//  Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
//  18S20: 9  (default setting; can be 9,10,11,or 12)
//  18B20: 12
//Programmer: Syed Tahmid Mahbub
//Compiler: mikroC PRO for PIC v4.60
//Target PIC: PIC16F877A

// Set TEMP_RESOLUTION to the corresponding resolution of used DS18x20 sensor:
// 18S20: 9 (default setting; can be 9,10,11,or 12)
// 18B20: 12

unsigned short TEMP_RESOLUTION = 9;
unsigned temp;
char *text = "000.00";
int i;
int colona;
char temp_whole;
unsigned int temp2write;

void Read_Temperature()
{
// Perform 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
temp = Ow_Read(&PORTE, 2);
temp = (Ow_Read(&PORTE, 2) << 8) + temp;
}



char  Display_Temperature()
{
unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp2write;
unsigned int temp_fraction;

temp2write = temp;
// Check if temperature is negative
if (temp2write & 0x8000)
{
text[0] = '-';
temp2write = ~temp2write + 1;
}
else
text[0] = ' ';   // espace pour positif
// Extract temp_whole   12
temp_whole = temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[1] = temp_whole/100 + 48;
text[2] = (temp_whole/10)%10 + 48; // Extract tens digit
text[3] = temp_whole%10 + 48; // Extract ones digit
text[4] = '.';

// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// Convert temp_fraction to characters

text[5] = temp_fraction/1000 + 48; // Extract thousands digit
// Print temperature on LCD
Lcd_Out(1, 1, text);
// Print degree character and'C' for Celsius
Lcd_Chr_CP(0xDF); // 223 ASCII for degree symbol on my LCD
Lcd_Chr_CP('C');
if(
text[0] == '-')
return (-temp_whole);
else
return(
temp_whole);
}
void main()
{

CMCON |=7;
ADCON1 = 0x0D;
TRISE.B2 = 1; // Configure RE2 pin as input
TRISC =0X00;  // portc en sortie
PORTC =0;

Lcd_Init(); // Initialize LCD
Lcd_Cmd(_LCD_CLEAR); // Clear LCD
Lcd_Cmd(_LCD_CURSOR_OFF); // Turn cursor off

// Main loop


do
{
Read_Temperature();
Display_Temperature();
if (temp_whole>25 && temp_whole<30)
  portC.B0=;  // led rouge sur RC0
 else
 portC
.B0=0;

 if   (temp_whole <=-)
         portC.B1=;  // led orange sur RC1
         else
         portC
.B1=0;
Delay_ms(100);
}
 while (1);
}

question sur langage c pour pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#16 Message par paulfjujo » ven. 17 mars 2017 08:38 lien vers la Data-Sheet : Cliquez ici

bonjour,

dans un premier temps, rajoute un espace dans l'init de texte:
pour l'emplacement du signe.
...à suivre
Aide toi, le ciel ou FantasPic t'aidera

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#17 Message par dyli » ven. 17 mars 2017 18:37 lien vers la Data-Sheet : Cliquez ici

Bonsoir Paul,

J'ai trouvé une explication intéressante pour des valeurs négatives, mais c'est pour un DS18B20, a peu de chose prés c'est le meme que DS18S20.

http://electromag1.wifeo.com/thermostat-a-base-de-ds18b20.php

question sur langage c pour pic
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2597
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#18 Message par paulfjujo » ven. 17 mars 2017 20:31 lien vers la Data-Sheet : Cliquez ici

Code : Tout sélectionner



char  Display_Temperature
()
{
unsigned short RES_SHIFT = TEMP_RESOLUTION - 8;
char temp_whole;
unsigned int temp2write;
unsigned int temp_fraction;

temp2write = temp;
// Check if temperature is negative
if (temp2write & 0x8000)
{
text[0] = '-';
temp2write = ~temp2write + 1;
}
// Extract temp_whole   12
temp_whole = temp2write >> RES_SHIFT ;
// Convert temp_whole to characters
if (temp_whole/100)
text[1] = temp_whole/100 + 48;
text[2] = (temp_whole/10)%10 + 48; // Extract tens digit
text[3] = temp_whole%10 + 48; // Extract ones digit
text[4] = '.';

// Extract temp_fraction and convert it to unsigned int
temp_fraction = temp2write << (4-RES_SHIFT);
temp_fraction &= 0x000F;
temp_fraction *= 625;

// Convert temp_fraction to characters

text[5] = temp_fraction/1000 + 48; // Extract thousands digit
// Print temperature on LCD
Lcd_Out(1, 1, text);
// Print degree character and'C' for Celsius
Lcd_Chr_CP(0xDF); // 223 ASCII for degree symbol on my LCD
Lcd_Chr_CP('C');
if(
text[0] == '-')
return (-temp_whole);
else
return(
temp_whole);
}
 


j'ai pas eu le temps de mettre mes sondes dans le congelateur ...pour un test reel ..

je pensais que tu utilisais un DS18B20 ?
Aide toi, le ciel ou FantasPic t'aidera

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#19 Message par dyli » ven. 17 mars 2017 21:15 lien vers la Data-Sheet : Cliquez ici

Re bonsoir,

Vu que c'est un exercice dans le but d'apprendre, peu importe que ca soit un DS18B20 OU DS18S20..Dans cet exercice c'est un DS18S20. En plus pour le moment j'ai pas le matériel, juste la simulation. Ok, on attend les résultats.

question sur langage c pour pic
dyli
Débutant
Débutant
Messages : 33
Enregistré en : février 2017

#20 Message par dyli » dim. 19 mars 2017 18:39 lien vers la Data-Sheet : Cliquez ici

Bonsoir paulfjujo,

Je viens de trouvé une combine qui marche.

voici le code de ce que j'ai modifié. Il y a juste un petit probleme que j'arrive pas a resoudre, c'est quand je lance la simulation le pinRC1 se met a 1 pendant
1 seconde, j'ai meme mis Portc a zero, mais c'est pareil, je sais pas comment faire. A part ca le programme fonctionne cette fois ci. :-D

Code : Tout sélectionner

// Main loop


do
{

 Read_Temperature();
 Display_Temperature();
if (temp & 0x8000)  // voir si la temperature lue est positive ou negative
 temp_to_check =-temp_whole;
 else temp_to_check=temp_whole;

if (temp_to_check <=3&& temp_to_check <=-1)
   portC.B0=;      // led rouge sur RC0 ON
   else
   portC
.B0=0;       // led rouge sur RC0 OFF
 
 if 
(temp_to_check>25 && temp_to_check>29)
   portC.B1=;      // led orange sur RC1 ON
   else
   portC
.B1=0;      // led Orange sur RC0 Off
 

 Delay_ms
(100);
}
 while (1);
}


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 15 invités