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 ---
- 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 ---
Modérateur : Jérémy
question sur langage c pour pic
question sur langage c pour pic
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Arretez , je ne vais plus pouvoir enfiler mes chaussures ..
et on est pas là , pour se tartiner, congratuler ou au contraire se faire entartrer
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.
le privilege de l'age, avant qu' Halzeimer s'en mêle !
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.
le privilege de l'age, avant qu' Halzeimer s'en mêle !
question sur langage c pour pic
re bonsoir paulfjujo,
c'était juste pour répondre a Jérémy....
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.
c'était juste pour répondre a Jérémy....
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=1 ; // led rouge sur RC0
else
portC.B0=0;
if (temp_whole<=5 )
portC.B1=1 ; // led orange sur RC1
else
portC.B1=0;
Delay_ms(100);
} while (1);
}
question sur langage c pour pic
- paulfjujo
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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(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);
}
question sur langage c pour pic
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:
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=1 ; // led rouge sur RC0
else
portC.B0=0;
if (temp_whole <=-5 )
portC.B1=1 ; // led orange sur RC1
else
portC.B1=0;
Delay_ms(100);
} while (1);
}
question sur langage c pour pic
question sur langage c pour pic
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
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
Expert- Messages : 2597
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
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 ?
question sur langage c pour pic
question sur langage c pour pic
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.
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.
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=1 ; // 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=1 ; // led orange sur RC1 ON
else
portC.B1=0; // led Orange sur RC0 Off
Delay_ms(100);
} while (1);
}
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 54 invités