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,