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

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#31 Message par paulfjujo » ven. 12 juil. 2024 20:58

[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


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)>)    // 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(= 0; i < 8; i++)
  { k = 0;
 while(! PORTAbits.RA0)
  //  while(!DHT22_Pin)
    {  k++;
      if (> 100) {Time_out = 1;}
     __delay_us(1);
     }
 __delay_us(30);
  if(! PORTAbits.RA0)
 // if(!DHT22_Pin)
      bit_clear(_Donnee, (- i));               // Clear bit (7 - i)
    else
    
{
      bit_set(_Donnee, (- i));                 // Set bit (7 - i)
      k=0;
       while( PORTAbits.RA0)
          // while(DHT22_Pin)
       {                         // Wait until pin goes low
      k++;
      if (> 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]  = (/ 100) % 10  + 48;
    Texte[1]  = (/ 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_Tests_2024-0711.X.zip


16F84_DHT22_LCD_2x16_2024-0711_.jpg
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%

:sifflotte: 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%)


_16F84_DHT22_LCD_2x16_4bits_2024-0712_MC.zip


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.
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 97
Enregistré en : août 2021

#32 Message par RETRAITE128 » sam. 13 juil. 2024 11:59

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

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#33 Message par paulfjujo » sam. 13 juil. 2024 12:11

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
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 97
Enregistré en : août 2021

#34 Message par RETRAITE128 » sam. 13 juil. 2024 12:21

Re Bonjour,

Merci pour cette mise au point.

Je vois que sur le brochage que vous annoncez que D4 à D7 sont sur RB4 à RB7 est-ce normal ?

Cordialement,

Alain

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#35 Message par paulfjujo » sam. 13 juil. 2024 14:09

Ach So !
enfer et damnation !

16F84_DHT22_Test_schema_2024-0713.jpg



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.
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#36 Message par paulfjujo » sam. 13 juil. 2024 18:21

version speciale avec MikroC
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 !

_16F84_DHT22_LCD_RB3-RB6_2024-0713_MC.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.
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 97
Enregistré en : août 2021

#37 Message par RETRAITE128 » sam. 13 juil. 2024 18:36

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
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#38 Message par paulfjujo » sam. 13 juil. 2024 19:08

modifié source et Hex en version MikroC
_16F84_DHT22_LCD_2x16_RB3-RB6_2024.zip
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Aide toi, le ciel ou FantasPic t'aidera

Hygromètre à PIC
RETRAITE128
Débutant
Débutant
Messages : 97
Enregistré en : août 2021

#39 Message par RETRAITE128 » dim. 14 juil. 2024 15:02

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

Hygromètre à PIC
paulfjujo
Avatar de l’utilisateur
Maître
Maître
Messages : 3182
Âge : 74
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#40 Message par paulfjujo » dim. 14 juil. 2024 18:45

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

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_byte1T_byte2RH_byte1RH_byte2CheckSum ;
unsigned int TempRH;

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 ikvalue;     // k is used to count 1 bit reading duration
  
value=0;
  
Time_out=0;
  for(
08i++)
  { 
0;
    while(  
PORTA.B0==0)
    {  
k++;
      if (
100
      {
Time_out 1;
        break;
       }
      
Delay_us(1);
     }
  
Delay_us(30);
    if(  
PORTA.B0==0)
      
bit_clear(value, (i));               // Clear bit (7 - i)
    
else
    {
      
bit_set(value, (i));                 // Set bit (7 - i)
      
k=0;
       while(  
PORTA.B0==1)
      {                         
// Wait until pin goes low
      
k++;
      if (
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 ;    // 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
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

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