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
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3182
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
[quote="paulfjujo"]bonsoir,
ça été laborieux de traiter ce PIC en XC8 (version free)
beaucoup moins performant que MikroC version Pro
pas possible de mettre UART3 et LCD dans le meme programme car rien qu'avec le LCD :
Program space used 3FFh ( 1023) of 400h words ( 99.9%)
Data space used 34h ( 52) of 44h bytes ( 76.5%)
voir les détails sur ma page web
16F84_DHT22_LCD_2x16_2024-0711_.jpg
ce matin 12/07
j'ai Temp=26.2°C Hum=74.2%
...il pleut
sur ma station Meteo :
T=26.3°C et H=74%
mesures AM2302 coherentes !
************************************************************************************************************
la version LCD en MikroC Pro 7.60
Available RAM: 52 [bytes], Available ROM: 1024 [bytes]
Compilation Started P16F84.c
All files Compiled in 78 ms
Used RAM (bytes): 40 (77%) Free RAM (bytes): 12 (23%)
Used ROM (program words): 881 (86%) Free ROM (program words): 143 (14%)
nota: il doit etre possible de le compiler avec la version d'essai MikroC Pro...car < 2Ko

beaucoup moins performant que MikroC version Pro
pas possible de mettre UART3 et LCD dans le meme programme car rien qu'avec le LCD :
Program space used 3FFh ( 1023) of 400h words ( 99.9%)
Data space used 34h ( 52) of 44h bytes ( 76.5%)
voir les détails sur ma page web
Code : Tout sélectionner
/*
*version optimisée avec advisor optimisation level=0 -> level 2
* gagne 4 Bytes sur 68 ... OK
*06-07-2024
* File: main.c
* Author: Paul
*/
// PIC16F84 monté sur carte BlueBird Electronics PCB053 4MHz
// programmateur POK508 alimenté en 12V DC
// liaison DB9 F POK508 --- DB9 Male TU-S9 Trend interface RS232/USB
// verifier que le port virtuel soit declare en #PORT < 4
// voir as16f684_legacy.h pour les Mnemoniques
// pack,PIC16Fxxx_DFP,1.3.42,Microchip
// xc8\v2.36
//06/07/2024
// PIC 16F84 monté sur mini breadboard, avec quartz de 8Mhz
// PIC alimenté via alim externe : le +5V USB du cordon prolific
// Pickit4 connecté as usual
// chargement du programme ..OK en quelques secondes ..run OK
#define VERSION "20240711"
#define With_LCD
//#define With_UART3
// avec LCD
// Erasing...
// [config mem] 0x2007, expected 0x3fff, got 0x0.
// Programming did not complete.
// attention : deconnecter RB6 RB7 sur le LCD ..conflit avec PickiT4
//#define VERSION "20240707"
//avec uart3 seulement
#include <xc.h>
#define _16F684
#include <builtins.h>
#include <__at.h>
#define _XTAL_FREQ 8000000 // Quartz 8Mhz encadré par 2x22pF
// was #define _XTAL_FREQ 4000000 // filtre ceramique sur carte BlueBird Electronics PCB053
// programmateur POK508 et icprog105d.exe
//2007 CONFIG 3FF1 FOSC=XT
#pragma config FOSC = XT // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF // Watchdog Timer (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (Power-up Timer is enabled)
#pragma config CP = OFF // Code Protection bit (Code protection disabled
#define Byte uint8_t
#define Word uint16_t
#define CR 13
#define LF 10
#define TX3 PORTAbits.RA2 // for UART3
#define TX3_Pin_Dir TRISAbits.TRISA2 // for UART3
#define LED_Dir TRISAbits.TRISA3
#define LED PORTAbits.RA3
#define DHT22_Pin PORTAbits.RA0
#define DHT22_Pin_Dir TRISAbits.TRISA0
#include <__at.h>
#ifdef With_LCD
#define LCD_CLEAR 0x01 //Clear display
#define LCD_RETURN_HOME 0x02 //Return cursor to home
#define Display_ON 0x0C
#define Display_OFF 0x08
#define LCD_CURSOR_OFF 0x0C //Turn off cursor
#define LCD_TURN_ON 0x0C //Turn Lcd display on
#define LCD_TURN_OFF 0x08 //Turn Lcd display off
#define NbCarPL 16
#define LIGNE1 0x80 /* LCD 1 LIGNE */
#define LIGNE2 0xC0 /* LCD 2 LIGNES ET + */
#define QUATRE_BIT 0 /* 4-bit Interface */
#define NB_LIGNE 8 /* LCD 2 LIGNES ET + */
#define TAILLE_5X7 0 /* MATRICE 5x7 */
#define SET 32 | (QUATRE_BIT) | (NB_LIGNE) | (TAILLE_5X7)
// LCD 2x16 en mode // 4 bits
#define Donnee PORTB
#define RS PORTBbits.RB0
#define RW PORTBbits.RB1
#define En PORTBbits.RB2
#endif
#define bit_set(var,bitno) ((var) |= 1 << (bitno))
#define bit_clear(var,bitno) ((var) &= ~(1 << (bitno)))
/*
Byte c3 __at (0x0020);
Byte RS_Count __at (0x0021);
Byte RS_tmp __at (0x0022);
Byte RS_Delay __at (0x0023);
* */
int i,j;
Byte Texte[18];
unsigned char Time_out ;
//const char Temp[] = "Temp = 00.0 C ";
//const char Hum[] = "RH = 00.0 % ";
unsigned char T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int Temp, RH;
void Start_signal(void);
unsigned char Read_Donnee(void);
char check_response(void);
void strConstRamCpy(unsigned char *dest, const char *source);
/*
void UART3_Write(uint8_t cc) // 16MHz 19200 bauds
{
c3=~cc; // complement du caractere !
// avec TX3_PIN => RA2
__asm(" movlw 8 ");
__asm(" movwf _RS_Count");
__asm(" bcf PORTA,2 ");
__asm(" call RSdelai2");
__asm(" L00:");
__asm(" rrcf _c3,1 ");
__asm(" btfsc STATUS,0 ");
__asm(" goto L10 ");
__asm(" bsf PORTA,2 ");
__asm(" goto L20 ");
__asm(" L10:");
__asm(" bcf PORTA,2 ");
__asm(" L20:");
__asm(" call RSdelai2 ");
__asm(" decfsz _RS_Count,1 ");
__asm(" goto L00 ");
__asm(" bsf PORTA,2 ");
__asm(" call RSdelai2 ");
__asm(" call RSdelai2 ");
__asm(" goto LA1");
__asm(" RSdelai2: ");
__asm(" MOVLW 28 ");
__asm(" MOVWF _RS_tmp ");
__asm(" RS00:");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" DECFSZ _RS_tmp,F ");
__asm(" GOTO RS00 ");
__asm(" NOP");
__asm(" NOP");
__asm(" NOP");
__asm(" RETURN ");
__asm(" LA1: ");
__asm(" nop");
}
*/
#ifdef With_LCD
void Pulse_En (void);
void LCD_Delay_20ms(void);
void LCD_Cde(unsigned char cmd);
void Init_XC8_LCD (void);
void LCD_Put(char data);
void LCD_Print(char *str);
//void LCD_CPrint(const char *Cstring);
void LCD_Pos(char L,char posX);
#endif
void strConstRamCpy(unsigned char *dest, const char *source)
{ // --- Copie le texte depuis FLASH ROM vers RAM
while (*source)
{
*dest++ = *source++ ;
}
*dest = 0 ; // terminateur
}
#ifdef With_LCD
void Pulse_En (void)
{
En = 1;
__delay_ms(20);
En=0;
__asm(" NOP");
__asm(" NOP");
}
void LCD_Delay_20ms()
{
__delay_ms(20);
}
void LCD_Cde(unsigned char cmd)
{
LCD_Delay_20ms();
RS=0;
En=0;
Donnee &=0x0f; //clear port
__asm("NOP");
Donnee |= cmd&0xf0; //write upper nibble of cmd to UPPERT port
LCD_Delay_20ms();
Pulse_En();
Donnee &= 0x0f; //clear port and shift left 4 times
__asm("NOP");
Donnee |= (cmd<<4)&0xf0; //write lower nibble of cmd to UPPERT port
LCD_Delay_20ms();
Pulse_En ();
return;
}
void Init_XC8_LCD ()
{
LCD_Delay_20ms();
TRISB=TRISB & 0x0F;
//TRISBbits.TRISB = TRISBbits.TRISB & 0x0F;
// B0 ..B3 as input B4..B7 as ouput
__asm("NOP");
Donnee &=0x0f; //clear port
LCD_Delay_20ms();
TRISB0=0;
TRISB1=0;
TRISB2=0;
RW=0;
RS=0;
En=0;
LCD_Delay_20ms();
Donnee=Donnee& 0x0f; //clear port and shift left 4 times
__asm("NOP");
Donnee=Donnee | 0x30; //write lower nibble of cmd to UPPERT port
Pulse_En ();
LCD_Delay_20ms();
// Upper nibble interface
Donnee & = 0x0f; // 2em ini
Donnee | = 0x30; // 0b00110000;
Pulse_En() ;
LCD_Delay_20ms();
// Upper nibble interface
Donnee & = 0x0f; // 3em ini
__asm("NOP");
Donnee | = 0x30;
Pulse_En() ;
LCD_Delay_20ms();
//Force le mode 4 Bits 0x02H sur quartet MSB du PortB
//Function SET Commande 0 0 1 DL N F X X avec RS=0 RW=0
// Upper nibble interface
Donnee &= 0x0f; // Clear upper port
__asm("NOP");
Donnee |= 0x20; // 0b00100000;
Pulse_En() ;
LCD_Delay_20ms();
//Function SET Commande 0 0 1 DL N F X X avec RS=0 RW=0
//Definit la taille de l'interface (DL=0 pour mode 4 bits, DL=1 pour mode 8 bits),
// le nombre de lignes (NL=0 pour 1 ligne, N=1 pour 2 ou 4 lignes),
// et la taille des fontes (F=0 pour des cars 5x7, F=1 pour des cars 5x10).
LCD_Cde(0x28); //0b00101000 2Line 5x8
//Display on/off control 0 0 0 0 1 D C B
// affichage (D), curseur (C), clignotement du curseur (B).
// pour faire de la place!
// LCD_Cde(0x08) ; // 0b00001000) display off
// LCD_Cde(0x01); // 0b00000001)/display clear
//Entry mode setting
//Entry mode command " 0 0 0 0 0 1 ID S "
//ID =0 no cursor increment during read and write
//ID =1 cursor increment during read and write
//S =0 no display during read and write
//S =1 display shift
LCD_Cde(0x06) ; // 0b00000110) 0x06 if cursor inc and no display shift
//Display on off ,Blink ,cursor command set "0 0 0 0 1 D C B "
//D=1 dislay on, C=1 cursor off, B=1 blink off
LCD_Cde(0x0C); // 0b00001100); display ON, cursor ON, blink OFF
LCD_Delay_20ms();
LED=1;
}
void LCD_Put(char data)
{
// __delay_ms(1);
RS=1;
__asm("NOP");
En=0;
Donnee &=0x0f; //clear port
Donnee|= data&0xf0; //write upper nibble to port
En = 1; // Clock the cmd in
__delay_ms(1);
En = 0;
Donnee &= 0x0f; //clear port
Donnee |= (data<<4)&0xf0; //shift left 4 times
En = 1;
// __delay_ms(1);
__asm("NOP");
En = 0;
}
void LCD_Print(char *str1)
{ char i=0;
while( *(str1+i)>0 ) // Write String in RAM to LCD up to null
{
LCD_Put(*(str1+i)); // Write character to LCD
i++;
if (i>15) break;
}
}
/* pour faire de la place!
void LCD_CPrint(const char *Cstring)
{ char i=0;
while(*(Cstring+i) >0) // Write constant string to LCD up to null
{
LCD_Put(*(Cstring+i));
i++;
if (i>15) break;
}
}
*/
// position pointeur de la DD_RAM Ligne LIG colonne COL
// home haut gauche -> ligne0 colonne0
void LCD_Pos(char L,char posX)
{
if (L==1) LCD_Cde(0x80+posX); // D7=1 + adresse D6..D0 = 0 a 15
if (L==2) LCD_Cde(0xC0+posX); // D7=1 + offset 40H 2nd line + adress D6..D0 = 0 a 15
}
#endif
void Start_signal()
{
DHT22_Pin_Dir = 0;
TRISAbits.TRISA0=0;// Configure connection pin as output
PORTAbits.RA0=0;
//DHT22_Pin = 0; // Connection pin output low
__delay_ms(25);
PORTAbits.RA0=1;
//DHT22_Pin = 1; // Connection pin output high
__delay_us(30);
DHT22_Pin_Dir = 1; // Configure connection pin as input
}
char check_response()
{
__delay_us(40);
if(! PORTAbits.RA0)
// if(!DHT22_Pin)
{ // Read and test if connection pin is low
__delay_us(80);
if(PORTAbits.RA0)
//if(DHT22_Pin)
{ // Read and test if connection pin is high
__delay_us(50);
return (1);
}
}
}
unsigned char Read_Donnee()
{
unsigned char i, k, _Donnee;
_Donnee= 0; // k is used to count 1 bit reading duration
Time_out=0;
// break;
for(i = 0; i < 8; i++)
{ k = 0;
while(! PORTAbits.RA0)
// while(!DHT22_Pin)
{ k++;
if (k > 100) {Time_out = 1;}
__delay_us(1);
}
__delay_us(30);
if(! PORTAbits.RA0)
// if(!DHT22_Pin)
bit_clear(_Donnee, (7 - i)); // Clear bit (7 - i)
else
{
bit_set(_Donnee, (7 - i)); // Set bit (7 - i)
k=0;
while( PORTAbits.RA0)
// while(DHT22_Pin)
{ // Wait until pin goes low
k++;
if (k > 100) {Time_out = 1;}
__delay_us(1);}
}
}
return _Donnee;
}
void Delay_500ms()
{
__delay_ms(500);
}
void main()
{
PORTA = 0b00000001;
TRISA = 0b00000001 ; // PORTA is RA0,1= analog input RA2=sortie DAC RA3,4,5=Digital output
TRISB = 0b00000000 ;
PORTA=0;
LED_Dir=0;
LED=0;
// pour UART3
/*
TX3_Pin_Dir=0;
TX3=1;
c3=0;
RS_Count=0;
RS_tmp=0;
RS_Delay=0;
* */
DHT22_Pin_Dir =0;
for (i=0;i<sizeof(Texte)-1;i++) Texte[i]=0;
/*
__asm(" CLRWDT ;Clear WDT and prescaler");
__asm("BSF STATUS, 5");
__asm("MOVLW 0x01");
__asm("MOVWF OPTION_REG ");
__asm("BCF STATUS, 5 ");
*/
// OPTION REG 0x81
// RBPU INTEDG T0CS T0SE PSA PS2 PS1 PS0
// OPTION_REG=0x07; //b00000001; Prescaler =256
// OPTION_REG=0x00; //(par defaut) FOSC/(4x2) => 8/8= 1µS
OPTION_REG=0x02; //(par defaut) FOSC/(4x4) =>16/8= 2µS
#ifdef TEST_LCD_ONLY
while(1)
{
for (i=0;i<6;i++)
{
PORTAbits.RA3=0;__delay_ms(200);
PORTAbits.RA3=1;__delay_ms(200);
}
__delay_ms(2000);
Init_XC8_LCD ();
LCD_Pos(1,0);
strConstRamCpy(Texte,"Test LCD2x16 ");
LCD_Print (Texte);
__delay_ms(2000);
LCD_Pos(2,1);
// strConstRamCpy(Texte,"L2 LCD2x16 ");
LCD_CPrint ("L2 LCD2x16 ");
LCD_Cde(LCD_RETURN_HOME); //0x02
}
#endif
__delay_ms(2000);
#ifdef With_LCD
Init_XC8_LCD ();
#endif
// mise en comment ci-dessous pour faire de la place!
//pour verifier si le programme se lance bien !
// for (i=0;i<6;i++)
// {
// PORTAbits.RA3=0;__delay_ms(200);
// PORTAbits.RA3=1;__delay_ms(200);
// }
//strConstRamCpy(Texte,"16F84 at 8Mhz ");
//LCD_Pos(1,0);
//LCD_Print(Texte);
// strConstRamCpy(Texte,"Mesure AM2302 ");
// LCD_Pos(2,0);
// LCD_Print(Texte);
__delay_ms(2000);
// while(1);
//}
while(1)
{
Delay_500ms();
#ifdef With_UART3
j++;
Texte[0] = (j / 100) % 10 + 48;
Texte[1] = (j / 10) % 10 + 48;
Texte[2] = j % 10 + 48;
Texte[3] = ' ';
Texte[4] =0;
CPrint("j=");
Print(Texte);
#endif
Start_signal();
if(check_response())
{ // If there is response from sensor
RH_byte1 = Read_Donnee(); // read RH byte1
RH_byte2 = Read_Donnee(); // read RH byte2
T_byte1 = Read_Donnee(); // read T byte1
T_byte2 = Read_Donnee(); // read T byte2
CheckSum = Read_Donnee(); // read checksum
if(Time_out){ // If reading takes long time
strConstRamCpy(Texte,"Time out!");
LCD_Print(Texte);
}
else{
if(CheckSum == ((RH_byte1 + RH_byte2 + T_byte1 + T_byte2) & 0xFF))
{
RH = RH_byte1;
RH = (RH << 8) | RH_byte2;
Temp = T_byte1;
Temp = (Temp << 8) | T_byte2;
if (Temp > 0x8000)
{
Texte[6] = '-';
Temp = Temp & 0x7FFF;
}
else
strConstRamCpy(Texte, "Temp = 00.00 C ");
Texte[7] = (Temp / 100) % 10 + 48; //T_byte1 / 10 + '0';
Texte[8] = (Temp / 10) % 10 + 48; //T_byte1 % 10 + '0';
Texte[10] = Temp % 10 + 48; //T_byte2 / 10 + '0';
Texte[11] =223; // put degree symbol (°)
Texte[12]='C';
Texte[13]=' ';
Texte[14]=' ';
Texte[15]=0;
LCD_Pos(1, 0); // go to row 1 column 0,
LCD_Print(Texte);
//1234567890123456
strConstRamCpy(Texte,"RH = 00.0% ");
Texte[7] = (RH / 100) % 10 + 48; //RH_byte1 / 10 + '0';
Texte[8] = (RH / 10) % 10 + 48; //RH_byte1 % 10 + '0';
Texte[10] = RH % 10 + 48;
Texte[11] = '%';
Texte[12] = ' ';
Texte[13] = ' ';
Texte[15]=0;
LCD_Pos(2, 0); // go to Row 2, column 0
LCD_Print(Texte);
}
else {
LCD_Cde(LCD_CLEAR);
LCD_Pos(1, 0);
strConstRamCpy(Texte,"Checksum Err");
LCD_Print(Texte);
}
}
}
else
{
strConstRamCpy(Texte,"no resp.from DHT");
LCD_Print(Texte);
}
PORTAbits.RA3=1;
for (i=0;i<6;i++)
{
PORTAbits.RA3=0;__delay_ms(200);
PORTAbits.RA3=1;__delay_ms(200);
}
}
}
16F84_DHT22_LCD_2x16_2024-0711_.jpg
ce matin 12/07
j'ai Temp=26.2°C Hum=74.2%
...il pleut
sur ma station Meteo :
T=26.3°C et H=74%

************************************************************************************************************
la version LCD en MikroC Pro 7.60
Available RAM: 52 [bytes], Available ROM: 1024 [bytes]
Compilation Started P16F84.c
All files Compiled in 78 ms
Used RAM (bytes): 40 (77%) Free RAM (bytes): 12 (23%)
Used ROM (program words): 881 (86%) Free ROM (program words): 143 (14%)
nota: il doit etre possible de le compiler avec la version d'essai MikroC Pro...car < 2Ko
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 97
- Enregistré en : août 2021
Bonjour,
Je viens d'essayer le nouveau programme, il démarre après quelques secondes pour afficher, sur une seule ligne, une série de caractères genre @L etc..
J'ai fais l'essai de divers programmateurs et de divers programmes sans différence d'affichages.
Désolé pour tout le travail que vous produisez.
Cordialement,
Alain
Je viens d'essayer le nouveau programme, il démarre après quelques secondes pour afficher, sur une seule ligne, une série de caractères genre @L etc..
J'ai fais l'essai de divers programmateurs et de divers programmes sans différence d'affichages.
Désolé pour tout le travail que vous produisez.
Cordialement,
Alain
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3182
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour,
il y a quelques minutes, j'ai vu que la balise quote avait inhibé les liens vers le zip et l'image
j'ai rectifié ...
il y a donc une version compilée MPLABX XC8
et aussi une version compilée MikroC
ces 2 versions fonctionnent OK sur mon LCD !
rappel sur le hardware :
16F84 avec Q= 8MHz
LCD 2 lignes de 16 cars
PIC LCD
RB0 RS
RB1 RW
RB2 En
D0,D1,D2,D3 ..au GND (0V)
RB4 D4
RB5 D5
RB6 D6
RB7 D7
il y a quelques minutes, j'ai vu que la balise quote avait inhibé les liens vers le zip et l'image
j'ai rectifié ...
il y a donc une version compilée MPLABX XC8
et aussi une version compilée MikroC
ces 2 versions fonctionnent OK sur mon LCD !
rappel sur le hardware :
16F84 avec Q= 8MHz
LCD 2 lignes de 16 cars
PIC LCD
RB0 RS
RB1 RW
RB2 En
D0,D1,D2,D3 ..au GND (0V)
RB4 D4
RB5 D5
RB6 D6
RB7 D7
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 97
- Enregistré en : août 2021
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3182
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
Ach So !
enfer et damnation !
en fait , apres retour sur ton schema , je vois que c'est une disposition inhabituelle du port data
en principe on se debrouille toujours pour travailler avec des quartets = demi-byte donc
correspondance directe des bits ..
nota : je n'ai pas de bibliotheque Lcd Mplabx .... comme Lcd.c en CCS
çà explique le smilblick affiché !
je regarde pour remettre en face B3-D4 ..etc ..
à suivre...
enfer et damnation !
en fait , apres retour sur ton schema , je vois que c'est une disposition inhabituelle du port data
en principe on se debrouille toujours pour travailler avec des quartets = demi-byte donc
correspondance directe des bits ..
nota : je n'ai pas de bibliotheque Lcd Mplabx .... comme Lcd.c en CCS
çà explique le smilblick affiché !
je regarde pour remettre en face B3-D4 ..etc ..
à suivre...
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Modifié en dernier par paulfjujo le sam. 13 juil. 2024 19:09, modifié 1 fois.
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3182
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
version speciale avec MikroC
compilée pour RB3-RB6 data LCD
source et *.hex dans le zip !
testé OK sur un autre LCD 4x20 neuf .. car mon LCD 2x16 a les 4 pins D0..D3 soudées directes au Gnd !
nota : contrast avec Vo -- R=4.7K --- reliée au Gnd
les Pins D0 D3 du LCD laissées en l'air
backlight non connecté ..visibilité suffisante
mesure aujourd'hui
Temp=26.6°C RH=46.4% à l'interieur bureau
sur ma station meteo , boitier capteur à l'exterieur derriere un volet (ensoleillé)
T=30.9°C RH=33%
compilée pour RB3-RB6 data LCD
Code : Tout sélectionner
#define RETRAITE128
#ifdef RETRAITE128
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D7 at RB6_bit;
sbit LCD_D6 at RB5_bit;
sbit LCD_D5 at RB4_bit;
sbit LCD_D4 at RB3_bit;
#else
// Lcd pinout settings standard
sbit LCD_RS at RB0_bit;
sbit LCD_EN at RB2_bit;
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
#endif
#ifdef RETRAITE128
// Pin direction
// LCD 4x20 mode 4 bits MSB 4 bits data LSB -> Gnd
// pin 1 ....2....3.....4.....5....6....x...x...x...x...11...12...13....14
// Gnd +Vcc Vd RB0 RB1 RB2 Gnd Gnd Gnd Gnd RB3 RB4 RB5 RB6.
// retro eclairage 15=A->+Vcc 16=K R 390 ohms->Gnd/
// contraste fixe Pin 3 R=4.7K vers Gnd
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB6_bit;
sbit LCD_D6_Direction at TRISB5_bit;
sbit LCD_D5_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
#else
// Pin direction
// LCD 4x20 mode 4 bits MSB 4 bits data LSB -> Gnd
// pin 1 ....2....3.. 4.....5....6....x...x...x...x...11..12...13..14
// Gnd +Vcc Vd RB0 RB1 RB2 Gnd Gnd Gnd Gnd RB4 RB5 RB6 RB7
// retro eclairage 15=A->+Vcc 16=K R 390 ->Gnd/
// standard
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
#endif
source et *.hex dans le zip !
All files Compiled in 93 ms
Used RAM (bytes): 38 (73%) Free RAM (bytes): 14 (27%) Used RAM (bytes)
Used ROM (program words): 950 (93%) Free ROM (program words) 74 (7%)
testé OK sur un autre LCD 4x20 neuf .. car mon LCD 2x16 a les 4 pins D0..D3 soudées directes au Gnd !
nota : contrast avec Vo -- R=4.7K --- reliée au Gnd
les Pins D0 D3 du LCD laissées en l'air
backlight non connecté ..visibilité suffisante
mesure aujourd'hui
Temp=26.6°C RH=46.4% à l'interieur bureau
sur ma station meteo , boitier capteur à l'exterieur derriere un volet (ensoleillé)
T=30.9°C RH=33%
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 97
- Enregistré en : août 2021
Bonsoir,
C'est bien là le souci, je viens de réaliser une maquette sur Labdec et ça fonctionne.
Par contre vous verrez sur la photo, il apparaît avant le sigle %, le signe α.
Merci encore, en attendant le programme lié au schéma.
Cordialement,
Alain
C'est bien là le souci, je viens de réaliser une maquette sur Labdec et ça fonctionne.
Par contre vous verrez sur la photo, il apparaît avant le sigle %, le signe α.
Merci encore, en attendant le programme lié au schéma.
Cordialement,
Alain
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Hygromètre à PIC
Hygromètre à PIC
-
RETRAITE128
Débutant- Messages : 97
- Enregistré en : août 2021
Bonjour,
J'ai testé le dernier programme modifié, mais désolé rien sur l'afficheur.
Vous évoquer le logiciel MikroC que je possède mais en version démo, je ne peux donc pas faire grand chose.
Je vais refaire un typon pour coller avec votre schéma à vous.
Je vous tiendrai au courant bien sur.
Bon dimanche,
COrdialement,
Alain
J'ai testé le dernier programme modifié, mais désolé rien sur l'afficheur.
Vous évoquer le logiciel MikroC que je possède mais en version démo, je ne peux donc pas faire grand chose.
Je vais refaire un typon pour coller avec votre schéma à vous.
Je vous tiendrai au courant bien sur.
Bon dimanche,
COrdialement,
Alain
Hygromètre à PIC
- paulfjujo
Maître- Messages : 3182
- Âge : 74
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
le dernier zip
specifié RB3..RB6 correspond à ta version de schema
et je l'ai testé OK...
nota: R/W LCD au Gnd
mon schema presenté plus haut , post#35, est en version RB4-RB7
le source MikroC avec aiguillage conditionnel
pour mode RB3-RB6 ou RB4-RB7 pour Data LCD
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F84 -RA -LHF -C -O11111014 -fo8 -
...
281 123 Compiled Successfully _16F84_DHT22_LCD2x16_MC.c
0 127 All files Compiled in 78 ms
0 1144 Used RAM (bytes): 38 (73%) Free RAM (bytes): 14 (27%) Used RAM (bytes): 38 (73%) Free RAM (bytes): 14 (27%)
0 1144 Used ROM (program words): 953 (93%) Free ROM (program words): 71 (7%) Used ROM (program words): 953 (93%) Free ROM (program words): 71 (7%)
0 125 Project Linked Successfully _16F84_DHT22_LCD_2024.mcppi
0 128 Linked in 31 ms
0 129 Project '_16F84_DHT22_LCD_2024.mcppi' completed: 281 ms
0 103 Finished successfully: 14 juil. 2024, 20:25:52 _16F84_DHT22_LCD_2024.mcppi
il faut essayer avec la version free de MikroC
au moins pour verifier si le LCD affiche un message
specifié RB3..RB6 correspond à ta version de schema
et je l'ai testé OK...
nota: R/W LCD au Gnd
mon schema presenté plus haut , post#35, est en version RB4-RB7
le source MikroC avec aiguillage conditionnel
pour mode RB3-RB6 ou RB4-RB7 pour Data LCD
Code : Tout sélectionner
//ac:DHT22
//MikroC et 16F84
// C:\_MikroC\_MesProjets_MikroC\_16F84_DHT22_UART3_9600bds
// P16F84_4MHz_blueBird_board.cfgsch
// P16F84_8MHz.cfgsch (sur mini breadbboard orange )
// CONFIG : $2007 : 0x3FF1
// 16F84 # 84-0045-04
// Resonateur 4Mhz sur platine de test BlueBoard-Electronics Farnell 527-646
// sortie TX sur RA2
// sortie Led sur RA3
// signal DHT22 sur RA0
// ICProgr + POK508 programmateur (alim POK508 + TU59 DB8<-> USB COM2
// nota: prends ENORMEMENT de temps à programmer !! > 5minutes
// sur breadboard Q=8MHz 16F84 0130G38-20
// EEPROM PIC : _16F84_DHT22_UART3_9600bds_2024_0712.ihex
#define VERSION "2024-0712"
#define CR 13
#define LF 10
#define LED_Dir TRISA.RA3
#define LED PORTA.RA3
#define bit_set(var,bitno) ((var) |= 1 << (bitno))
#define bit_clear(var,bitno) ((var) &= ~(1 << (bitno)))
#define DHT22_Pin PORTA.RA0
#define DHT22_Pin_Dir TRISA.RA0
// Lcd pinout settings
// Special RETRAITE128 FANTASPIC
// https://fantaspic.fr/viewtopic.php?f=10&p=22172#p22172
sbit LCD_RS_Direction at TRISB0_bit;
sbit LCD_RW_Direction at TRISB1_bit;
sbit LCD_EN_Direction at TRISB2_bit;
sbit LCD_RS at RB0_bit;
sbit LCD_RW at RB1_bit;
sbit LCD_EN at RB2_bit;
#define RETRAITE128
#ifdef RETRAITE128
sbit LCD_D7 at RB6_bit;
sbit LCD_D6 at RB5_bit;
sbit LCD_D5 at RB4_bit;
sbit LCD_D4 at RB3_bit;
#else
// Lcd pinout settings standard
sbit LCD_D7 at RB7_bit;
sbit LCD_D6 at RB6_bit;
sbit LCD_D5 at RB5_bit;
sbit LCD_D4 at RB4_bit;
#endif
// Special RETRAITE128 FANTASPIC
#ifdef RETRAITE128
// Pin direction
// LCD 4x20 mode 4 bits MSB 4 bits data LSB -> Gnd
// pin 1 ....2....3.....4.....5....6....x...x...x...x...11...12...13....14
// Gnd +Vcc Vd RB0 RB1 RB2 Gnd Gnd Gnd Gnd RB3 RB4 RB5 RB6.
// retro eclairage 15=A->+Vcc 16=K R 390 ohms->Gnd/
// contraste fixe Pin 3 R=4.7K vers Gnd
sbit LCD_D7_Direction at TRISB6_bit;
sbit LCD_D6_Direction at TRISB5_bit;
sbit LCD_D5_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
#else
// Pin direction
// LCD 4x20 mode 4 bits MSB 4 bits data LSB -> Gnd
// pin 1 ....2....3.. 4.....5....6....x...x...x...x...11..12...13..14
// Gnd +Vcc Vd RB0 RB1 RB2 Gnd Gnd Gnd Gnd RB4 RB5 RB6 RB7
// retro eclairage 15=A->+Vcc 16=K R 390 ->Gnd/
// standard
sbit LCD_D7_Direction at TRISB7_bit;
sbit LCD_D6_Direction at TRISB6_bit;
sbit LCD_D5_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB4_bit;
#endif
char Texte[18];
int i,j,k;
unsigned char Time_out ;
unsigned char T_byte1, T_byte2, RH_byte1, RH_byte2, CheckSum ;
unsigned int Temp, RH;
void strConstRamCpy(unsigned char *dest, const char *source);
void Start_signal(void);
char check_response(void);
unsigned char Read_Donnee(void);
void Delai()
{
Delay_ms(500);
}
void Start_signal()
{
DHT22_Pin_Dir = 0; // Configure connection pin as output
DHT22_Pin = 0; // Connection pin output low
Delay_ms(25);
DHT22_Pin = 1; // Connection pin output high
Delay_us(30);
DHT22_Pin_Dir = 1; // Configure connection pin as input
}
char check_response()
{
Delay_us(40);
if(DHT22_Pin==0)
{ // Read and test if connection pin is low
Delay_us(80);
if(DHT22_Pin==1)
{ // Read and test if connection pin is high
Delay_us(50);
return 1;
}
}
}
unsigned char Read_Donnee()
{
unsigned char i, k, value; // k is used to count 1 bit reading duration
value=0;
Time_out=0;
for(i = 0; i < 8; i++)
{ k = 0;
while( PORTA.B0==0)
{ k++;
if (k > 100)
{Time_out = 1;
break;
}
Delay_us(1);
}
Delay_us(30);
if( PORTA.B0==0)
bit_clear(value, (7 - i)); // Clear bit (7 - i)
else
{
bit_set(value, (7 - i)); // Set bit (7 - i)
k=0;
while( PORTA.B0==1)
{ // Wait until pin goes low
k++;
if (k > 100)
{Time_out = 1;
break;
}
Delay_us(1);
}
}
}
return (value);
}
void strConstRamCpy(unsigned char *dest, const char *source)
{ // --- Copie le texte depuis FLASH ROM vers RAM
while (*(source)>0)
{
*dest++ = *source++ ;
}
*dest = 0 ; // terminateur
}
void main()
{
TRISB = 0b00000000 ; // RB0,RB1,RB2 inputs RB3,RB4=sorties RB6,RB7 =entrees
TRISA = 0b00000001 ; // RA0,RA1 = Input RA2=TX ouput RA3=Sortie Led RA5..RA7=Entrees
LCD_RW_Direction=0;
LCD_RW=0;
//INTCON=0;
PORTA=0;
DHT22_Pin_Dir=0;
DHT22_Pin=0;
LED_Dir=0;
LED=0;
Time_out=0;
for(i=0;i<6;i++)
{
LED=0;
Delai() ;
LED=1;
Delai() ;
}
Lcd_Init();
Lcd_Cmd(_LCD_CLEAR); // Clear display
Lcd_Cmd(_LCD_CURSOR_OFF);
strConstRamCpy(Texte,"DHT22 16F84 8MHz");
Lcd_Out(1,1,Texte);
strConstRamCpy(Texte,"MikroC 7.60 Pro ");
Lcd_Out(2,1,Texte);
strConstRamCpy(Texte,"Version 13-07-24");
Lcd_Out(3,1,Texte);
Delai() ; Delai() ;
Lcd_Cmd(_LCD_CLEAR);
//while(1);
while(1)
{
Start_signal();
// Lcd_Out_CP('1');
if(check_response())
{ // If there is response from sensor
RH_byte1 = Read_Donnee(); // read RH byte1
RH_byte2 = Read_Donnee(); // read RH byte2
T_byte1 = Read_Donnee(); // read T byte1
T_byte2 = Read_Donnee(); // read T byte2
CheckSum = Read_Donnee(); // read checksum
if(Time_out){ // If reading takes long time
strConstRamCpy(Texte,"Time out!");
Lcd_Out(1,1,Texte);
}
else
{
if(CheckSum == ((RH_byte1 + RH_byte2 + T_byte1 + T_byte2) & 0xFF))
{
strConstRamCpy(Texte,"Temp = 00.0 C ");
RH = RH_byte1;
RH = (RH << 8) | RH_byte2;
Temp = T_byte1;
Temp = (Temp << 8) | T_byte2;
if (Temp > 0x8000)
{
Texte[6] = '-';
Temp = Temp & 0x7FFF;
}
else
Texte[6] = ' ';
Texte[7] = (Temp / 100) % 10 + 48;
Texte[8] = (Temp / 10) % 10 + 48;
Texte[10] = Temp % 10 + 48;
Texte[11] = 223; // Degree symbol
Lcd_Out(1,1,Texte);
strConstRamCpy(Texte,"RH = 00.0 % ");
Texte[7] = (RH / 100) % 10 + 48;
Texte[8] = (RH / 10) % 10 + 48;
Texte[10] = RH % 10 + 48;
Lcd_Out(2,1,Texte);
}
else
{
strConstRamCpy(Texte,"Checksum Error!");
Lcd_Out(2,1,Texte);
}
}
}
else
{
strConstRamCpy(Texte,"Pas de reponse..");
Lcd_Out(2,1,Texte);
Delai() ;
}
Delai() ;
}
}
0 1 mikroCPIC1618.exe -MSF -DBG -pP16F84 -RA -LHF -C -O11111014 -fo8 -
...
281 123 Compiled Successfully _16F84_DHT22_LCD2x16_MC.c
0 127 All files Compiled in 78 ms
0 1144 Used RAM (bytes): 38 (73%) Free RAM (bytes): 14 (27%) Used RAM (bytes): 38 (73%) Free RAM (bytes): 14 (27%)
0 1144 Used ROM (program words): 953 (93%) Free ROM (program words): 71 (7%) Used ROM (program words): 953 (93%) Free ROM (program words): 71 (7%)
0 125 Project Linked Successfully _16F84_DHT22_LCD_2024.mcppi
0 128 Linked in 31 ms
0 129 Project '_16F84_DHT22_LCD_2024.mcppi' completed: 281 ms
0 103 Finished successfully: 14 juil. 2024, 20:25:52 _16F84_DHT22_LCD_2024.mcppi
il faut essayer avec la version free de MikroC
au moins pour verifier si le LCD affiche un message
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 10 invités