Insoleuse LED UV Release 2

=> A vos fer à souder ^^ :) ! Des questions en rapport avec un projet ou une de vos réalisation . Une réalisation/projet, à nous présenter au fur et à mesure de sa réalisation.
Rubrique spéciale "Réalisations finies".
MERCI DE NE PAS CRÉER UN DOUBLON DANS LA RUBRIQUE DE DESSOUS.
Hearty
Rang "2 LEDs"
Rang "2 LEDs"
Posts: 76
Joined: 28 Apr 2009, 13:38
Contact:

Insoleuse LED UV Release 2

Unread post by Hearty »

Bonsoir,

J'en avais parlé sur un fil de discussion sur le forum,
j'ai réalisé il y a près de 3 ans une insoleuse à LED UV.
Qui fonctionne très bien et que j'utilise encore régulièrement.
Celle-ci était pilotée par une minuterie à PIC 16F84 et afficheurs 8 Digits.
La minuterie en question, n'était pas de mon cru, j'ai pris un schéma et un code
existant, j'ai juste refais un typon adapté à ma disposition des éléments.
Étant de "l'ancienne école" en électronique les PICs étaient tout nouveaux pour moi.
Pour ceux que cela interesserait, voici le lien décrivant sa réalisation:

Je prévois d'en refaire une en double face,
avec des LED plus puissantes, et surtout, concernant la minuterie
je tiens à la réaliser moi-même et avec afficheur LCD cette fois-ci.

Je suis actuellement sur la minuterie,
après milles déboires, nuits blanches, recherches et j'en passe,
sachant que je ne suis pas vraiment un codeur...
je commence à voir quelque chose ressemblant à une minuterie,
mais il me reste encore quelques défauts que j'aimerais,
avec votre aide résoudre.
J'avoue que je cale là, certainement par saturation,
chaque problème résolu m'en amenait un autre plus difficile.

Voici le schéma:
2.jpg
Le Code en Mikroc

Code: Select all

/*
     Minuterie utilisant le Timer0 pour l'interruption
     Affichage sur LCD 4 bits  Programmation MiKroC 8.2
     FB Aka Hearty 2010
     µControleur  PIC16F84A
     Quartz: HS, 04.0000 MHz
     Formule pour le temps :
     Temps=(256-valeur Décimale chargée TMR0) * 4 * (prescaler OPTION_REG) * 1/Oscillateur en Hz
     Ce qui donne:
     T=(256-0)*4*64*(1/4000000)=  0,999424 sec
 */

#define inter1 PORTA.F0
#define inter2 PORTA.F1
#define inter3 PORTA.F2
#define led1 PORTA.F3
#define relais PORTB.F0
//******************
//Déclaration des variables
signed short int seconde;  // seconde non affichable en l'etat
signed short int minute;
signed short int heure;
unsigned short int  BP1;
unsigned short int  BP2;
unsigned short int  BP3;
unsigned cnt;
unsigned cntMn;
char *text;
char buffer[4];  //variable tampon qui va recevoir la conversion Variable int en string affichable

//*******************************
// Fonction Rom
void LCD_constOut(unsigned char row, unsigned char col, const char *str)   // fonction permettant
        {                                                                  // d'utiliser un texte
        while(*str)                                                        // en ROM sans passer
                {                                                          // par la RAM
                LCD_chr(row, col++, *str++) ;
                }
        }

void intro(){
  Lcd_constOut(1, 4, "HEARTYMER") ;
  Delay_ms(2000);
}
void invit(){
      Lcd_Cmd(Lcd_CLEAR);                      // Nettoyer l'afficheur
      Lcd_ConstOut(1,4,"TEMPS SAISI");
}

// Fonction en test d'affichage sur deux digits traduite d'un MikroBasic
  void Byte2LCD(int num){
    int  lcd_lcd_chr_cp_param_out_char = 47;  //-1 + 48 (char offset for zero), using lcd_chr_cp pram to save ram and speed things up
    //do{
    lcd_lcd_chr_cp_param_out_char++;
    num = num - 10;

    asm {
        BTFSC   STATUS, C
        GOTO $ - 5
      }
    // }
     //while(1);
    LCD_Chr_CP(lcd_lcd_chr_cp_param_out_char);   //quotient + char offset (48)
    LCD_Chr_CP(num + 58);           //remainder + char offset (48) + divisor (10)
  }
// fin de fonction


//******************
//Interruption
void interrupt() {
  cnt++;                      // Incrementer la valeur de cnt à chaque interruption
  TMR0   = 0;                 // Valeur décimale préchargée à soustraire à 256  (99)pour donner 1,0048 sec pour 8Mhz
  INTCON = 0x20;              // Set T0IE, clear T0IF (Met à 1 le bit TMROIE , Efface(0) le Flag TMROIF de débordement d'interruption)
                 }

//******************
//Programme principal
void main() {

//******************
// Initialisation des variables
  OPTION_REG = 0x85;          // Assigner prescaler sur TMR0  valeur 64   = 101 (pour quartz 4Mz)
  TRISB = 0;                  // PORTB en sortie
  PORTB = 0xFF;               // Initialiser le PORTB
  TMR0  = 0;                  // Timer0 Valeur initiale
  seconde=0;
  minute=0;
  cnt = 0;                    // Initialiser cnt
  cntMn = 0;                  //Compteur des minutes
  led1=0;                     // Etat LED1
  BP1=0;                      // Etat Bouton 1 (Seconde)
  BP2=0;                      // Etat Bouton 2 (Minute)
  BP3=0;                      // Etat Bouton 3 (Start)
  relais=0;                   // Etat Relais
  TRISA = 0b00000111;         // RA0,RA1 et RA2 en entrées

//**************************
//Affichage présentation

  Lcd_Config(&PORTB,2,3,0,7,6,5,4);              // Initialiser le LCD connecté au PORTB
  Lcd_Cmd(Lcd_CLEAR);                            // Nettoyer l'afficheur
  Lcd_Cmd(Lcd_CURSOR_OFF);                       // Curseur non affiché
 intro();
  //Lcd_Cmd(Lcd_CLEAR);                            // Nettoyer l'afficheur
 // Lcd_constOut(2, 1, "Temps ") ;

 while(1){                                       //Boucle infinie

//************************
//Réinitialisation
     if((minute==0)&&(seconde==0)){              //Si 0 minute 0 seconde tout est arrêté
      INTCON = 0x20;                             //désactive le TMR0
      BP1=0;
      BP2=0;
      BP3=0;                                     //Bouton Start réinitialisé
      led1=0;                                    //Led1 réinitialisée
      relais=0;                                  //Relais réinitialisé
      //Lcd_Cmd(Lcd_CLEAR);                      // Nettoyer l'afficheur
      Lcd_ConstOut(1,2,"INDIQUER TEMPS");
     }

//**************************
// Gestion Bouton des secondes
     if(inter1==1){
     delay_ms(200);
     BP1=1;
     BP3=0;
     seconde+=5;
     invit();
     }
     if(((seconde <0)|| (seconde >59))) {      // Maintenir entre 0 et 59
      seconde=59;                              // retour à 59
      if((BP2==0)&&(BP3==0)) {
      minute=0;}
      minute--;
      }

//**************************
//Gestion Bouton des minutes
  if(inter2==1){
      delay_ms(200);
      BP2=1;
      BP3=0;
      minute++;
      invit();
      }
  if((minute<0)||(minute>59)){                 // Maintenir entre 0 et 59
       minute=00;                              // retour à 59
      }

//**************************
// Gestion Bouton start
  if (inter3==1){
        delay_ms(50);
        if(BP3==1){
        BP3=0;
        INTCON = 0x20;                         //désactive le TMR0
        }
        BP3=1;
        INTCON = 0xA0;                         // active l'interruption TMRO
        Lcd_ConstOut(1,2,"INSOL. CIRCUIT");
        relais=1;
       }

  if (cnt ==61){
       led1 = ~led1;                           // Inverse etat PORTB LEDs
       seconde--;                              // décrémenter les secondes
       cnt = 0;                                // Reset cnt

        }

//*****************************
// Affichage du compteur
    LCD_Chr(2, 5, '>');
/*    ByteToStr(minute,buffer);       // convertir la variable en string dans buffer pour pouvoir l'afficher
    Lcd_Out(2,5,buffer);
    LCD_Chr_CP(':') ;                //Afficher le séparateur
    ByteToStr(seconde,buffer);      // convertir la variable en string dans buffer pour pouvoir l'afficher
    Lcd_Out_CP(buffer);  */

// test de la fonction deux digits
    Byte2LCD(minute);
    LCD_Chr_CP(':');
    Byte2LCD(seconde);

       }
  }

//******************************

/*     fonction originale mikroBasic
sub procedure Byte2LCD(dim num as byte)

     lcd_lcd_chr_cp_param_out_char = 47 ' -1 + 48 (char offset for zero), using lcd_chr_cp pram to save ram and speed things up

     'do
        inc(lcd_lcd_chr_cp_param_out_char)
         num = num - 10
     ' loop until STATUS.C     ' change to check overflow bit
     asm
        BTFSC   STATUS, C
        GOTO $ - 5
     end asm
     ' loop can be improved by using SUBWF to F instead of W and by inserting MOVLW 10 out side of loop.

     LCD_Chr_CP(lcd_lcd_chr_cp_param_out_char) ' quotient + char offset (48)
     LCD_Chr_CP(num + 58) ' remainder + char offset (48) + divisor (10)
end sub   */

//--------------------------------------------------
Mon problème actuel est le suivant:
Lorsque le décompte se fait en unité,
je n'arrive pas a afficher le "0" devant:
00 >> 09, il ne m'affiche que 0 >> 9
(mon code initial est mis en commentaire momentanément pour tester la fonction Byte2LCD)

j'ai trouvé sur le forum de mikroelectronica
une fonction en mikroBasic que j'ai tenté de traduire en C
permettant de résoudre ce problème,
cela fonctionne en partie, mais l'affichage ne décompte que de 00 à 09
Et ne comprenant pas la fonction ajoutée, je ne vois pas comment
l'adapter pour mon décompte 00 à 59


Je peux fournir le fichier ISIS pour simulation, si besoin est.

Merci,
You do not have the required permissions to view the files attached to this post.
Last edited by Termi87 on 23 Oct 2010, 19:14, edited 3 times in total.
Reason: image
zeltron
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 3298
Joined: 15 Oct 2006, 20:05
Location: planète terre
Contact:

Re: Insoleuse LED UV Release 2

Unread post by zeltron »

Bâ !

Pour éviter d'en venir à la masse, ou a appeller S O S Suicide , ça ferais longtemps que j'aurai pris l'oeuf ou la tomate dans la cuisine :!:

(vous savez, le bon vieux minuteur mécanique de cuisine , qu'on remonte en le tournant "crewic" , qui fait "tic-tac" , et une fois le temps écoulé, qui produit une sonnerie stridente "driiiiaaaiiiiinng" ! c'est simplissime et ça , au moins , ça marche !)

P/S/Z
Hearty
Rang "2 LEDs"
Rang "2 LEDs"
Posts: 76
Joined: 28 Apr 2009, 13:38
Contact:

Re: Insoleuse LED UV Release 2

Unread post by Hearty »

:lol: Zeltron fidèle à toi même.
Tu as du mettre du temps a graver cette réponse
sur ton écran de marbre, et envoyer un ptérodactyle comme messager.

Plus sérieusement, l'intérêt, vois-tu cher ami,
est d'être celui qui fabrique ce minuteur de cuisine,
et non dépendre de celui qui le conçoit.

Pardonne cette métaphore qui rebondie sur ton exemple,
c'est ma manière de tenter de te faire comprendre le pourquoi
de l'acharnement dont je fais preuve, et que ces nuits blanches
ne sont pas vaines à mes yeux.

Bien que je présume que ta réponse est empreinte d'humour,
qui je te l'accorde me fait souvent rire, lorsque je te lis ça et là sur
ce forum, Zeltron grognon : D
CaZaE
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 629
Joined: 01 Jan 2009, 18:48
Contact:

Re: Insoleuse LED UV Release 2

Unread post by CaZaE »

Halala le Zelt et toujours grognon surtout en cette saison de l'année !

Alors pour ton code si je comprend bien tu veut d'un int en faire 2 char distinct un pour les dizaine et un pour les unité ?

Moi je te propose ca :

Code: Select all

void aff_int(int x, int y, int the_int) {
    char toPrint[4];
    
    toPrint[0] = (the_int/1000)+48;
    toPrint[1] = ((the_int%1000)/100)+48;
    toPrint[2] = ((the_int%100)/10)+48;
    toPrint[3] = (the_int%10)+48;
    
    SetPos(x,y);
    PutChar(toPrint[0]);
    PutChar(toPrint[1]);
    PutChar(toPrint[2]);
    PutChar(toPrint[3]);
}


C'est tiré de mon afficheur LCD donc ne tien pas compte des x/y si je lis un peut ton code ca devrait donné ca :

Code: Select all

void aff_int(int the_int,char x,char y) {
    char toPrint[2];

    toPrint[1] = ((the_int%100)/10)+48;
    toPrint[0] = (the_int%10)+48;
  
   LCD_Chr(y, x,toPrint[1]);
   LCD_Chr(y, x+1,toPrint[0]);
}
et en utilisation :

Code: Select all

aff_int(cpt--,10,1)
Donc la la variable cpt et décrémenté et afficher a la ligne 1 au caractère 10

Voila voila

Es que ca correspond a tes besoin ?
Http://ULPprepa.free.fr
Le site des prepa lumières unique au monde
__________________________________________________________________________________
Image
Hearty
Rang "2 LEDs"
Rang "2 LEDs"
Posts: 76
Joined: 28 Apr 2009, 13:38
Contact:

Re: Insoleuse LED UV Release 2

Unread post by Hearty »

CaZaE,

Un grand merci!
Cela fonctionne parfaitement,
c'est exactement ce dont j'avais besoin.

;)
CaZaE
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 629
Joined: 01 Jan 2009, 18:48
Contact:

Re: Insoleuse LED UV Release 2

Unread post by CaZaE »

Bin écoute de rien !

Heureux que ca marche et bonne continuation !
Http://ULPprepa.free.fr
Le site des prepa lumières unique au monde
__________________________________________________________________________________
Image
jC_Omega
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 904
Joined: 10 Aug 2008, 09:45
Contact:

Re: Insoleuse LED UV Release 2

Unread post by jC_Omega »

très bonne technique la technique des modulo ^^

C'est niquel pour mettre dans les chaine de caractère des gros chiffre. ou afficher des nombre a virgule.

car les méthode dit "tout prête" a base de "printf" ou "sprintf", certe sont extrêmement simple a utilisé pour afficher des nombre a base de virgule ou autre, mais elle sont très grès gourmande en mémoire.
Le programme peut vite prendre 10ko de plus en rajoutant juste une ligne de code comme ca.

La ta technique est rapide et peu gourmande.
Mes projets perso :
Image
CaZaE
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 629
Joined: 01 Jan 2009, 18:48
Contact:

Re: Insoleuse LED UV Release 2

Unread post by CaZaE »

Perso j'ai jamais acrocher sur les printf pour coder sur des µControleur ca, ca ete fait par des codeur systeme qui sont passer sous µContronleur XD !
Http://ULPprepa.free.fr
Le site des prepa lumières unique au monde
__________________________________________________________________________________
Image
Hearty
Rang "2 LEDs"
Rang "2 LEDs"
Posts: 76
Joined: 28 Apr 2009, 13:38
Contact:

Re: Insoleuse LED UV Release 2

Unread post by Hearty »

Bonsoir,

Surtout lorsque tu programmes en MikroC sur un 16F84,
L'un très pratique avec ses bibliothèques, mais gourmand en mémoire
et l'autre, avec très peu de mémoire,

Les maitre-mots deviennent,
économie de mémoire par tous les moyens.
chaque octet compte!

Mon code est fini, il me reste 98% de Rom et 75% de Ram,
et j'ai pu afficher les infos que je désirais sur le LCD.

Voici un premier jet du design de la platine minuterie:
3.png
4.jpg
:)
You do not have the required permissions to view the files attached to this post.
Last edited by Hearty on 19 May 2010, 14:49, edited 1 time in total.
jC_Omega
Rang "6 LEDs"
Rang "6 LEDs"
Posts: 904
Joined: 10 Aug 2008, 09:45
Contact:

Re: Insoleuse LED UV Release 2

Unread post by jC_Omega »

ooo très jolie. belle la carte 3d avec les ombre et tout. Très propre tout ca.

c'est fait avec quel logiciel? 'classe'

- ta pas eu de problème pour trouvé le PIC16F84? car il est obsolète de chez obsolète :mrgreen:
- sont remplaçant direct avec programme compatible (plus de mémoire dedans) : PIC16F628 (obsolette aussi, mais 2 fois moins cher)
- sinon le remplacent des 2 est le très polyvalent PIC16F88 (encore plus de mémoire et autre chose, est surtout 4 fois - cher)
Mes projets perso :
Image
Post Reply