Insoleuse LED UV Release 2
Posted: 14 May 2010, 23:03
				
				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: Le Code en Mikroc
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,
			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: 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   */
//--------------------------------------------------
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,
 
  Zeltron fidèle à toi même.
  Zeltron fidèle à toi même.


 
  