TMR0IF_BIT signifie quelque chose pour le compilateur puisque je l'ai vue dans des exemple fourni avec MicroC, j'ai quand même fait ce que tu ma dit mais cela ne change rien, je comprend pas du tout ce qu'il se passe.
-----
TMR0IF_BIT signifie quelque chose pour le compilateur puisque je l'ai vue dans des exemple fourni avec MicroC, j'ai quand même fait ce que tu ma dit mais cela ne change rien, je comprend pas du tout ce qu'il se passe.
Dans ce cas poste le code complet là où tu en es et je vais te reposter un code fonctionnel.
@+
J'ai la version 5.6, moi je ne veut pas que l'on fasse le programme à ma place je veut comprendre le/les erreure/s commise.Code:/* * horloge a tube VFD * PIC16F887 * fréquence 8MHZ * RTC ds1307 * capteur température ds18s20 * interruption: prescaler par 16; interruption toute les 2.048ms */ #define selectreg PORTA.RA2 #define moin PORTA.RA3 #define plus PORTA.RA4 #define select PORTA.RA5 // choix : (temperature); horloge; date #define TMR0IF_BIT INTCON.F2 char segments [13], seconde = 0, minute = 0, heure = 0, jour = 1, mois = 1, an = 12, selection = 0, disp = 1; volatile char i = 0; /******************************************************************************* initialisation RTC *******************************************************************************/ void initialiseRTC (){ I2C1_Init (100000); // initialisation a 100KHz de la vitesse d'horloge I2C1_Start(); I2C1_Wr(0xD0); // adresse DS1307 I2C1_Wr(0); // début adresse 0 I2C1_Wr(0); // quartz enable et seconde = 0 I2C1_Wr(0); // minute remise a 0 I2C1_Wr(0); I2C1_Wr(1); I2C1_Wr(1); I2C1_Wr(1); I2C1_Wr(0x12); I2C1_Stop; } /******************************************************************************* Lecture RTC *******************************************************************************/ void lectureRTC (){ I2C1_Start(); I2C1_Wr(0xD0); // Adresse DS1307 I2C1_Wr(0); // debut adresse 0 I2C1_Repeated_Start(); I2C1_Wr(0xD1); // Adresse DS1307 pour lecture seconde = I2C1_Rd (1); minute = I2C1_Rd (1); heure = I2C1_Rd (1); I2C1_Rd (1); jour = I2C1_Rd(1); mois =I2C1_Rd(1); an =I2C1_Rd(0); I2C1_Stop(); }//~ /******************************************************************************* Transforme le binaire codé décimal en décimal *******************************************************************************/ void transformBDD (){ seconde = ((seconde & 0xF0) >> 4) *10 + (seconde & 0x0F); minute = ((minute & 0xF0) >> 4) *10 + (minute& 0x0F); heure = ((heure & 0xF0) >> 4) *10 + (heure & 0x0F); jour = ((jour & 0xF0) >> 4) *10 + (jour & 0x0F); mois = ((mois & 0xF0) >> 4) *10 + (mois & 0x0F); an = ((an & 0xF0) >> 4) *10 + (an & 0x0F); }//~ /******************************************************************************* écriture RTC *******************************************************************************/ void ecritureRTC (){ I2C1_Start(); I2C1_Wr(0xD0); // adresse DS1307 I2C1_Wr(0); // début adresse 0 I2C1_Wr(seconde); I2C1_Wr(minute); I2C1_Wr(heure); I2C1_Wr(0); I2C1_Wr(jour); I2C1_Wr(mois); I2C1_Wr(an); I2C1_Stop; } /******************************************************************************* transform décimal en binaire codé décimal *******************************************************************************/ void transformDBD (){ seconde = (seconde / 10) << 4 +(seconde % 10); minute = (minute / 10) << 4 +(minute % 10); heure = (heure / 10) << 4 +(heure % 10); jour = (jour / 10) << 4 +(jour % 10); mois = (mois / 10) << 4 +(mois % 10); an = (an / 10) << 4 +(an % 10); } /******************************************************************************* Affichage multipléxé *******************************************************************************/ void affichage (){ if (PORTD == 0x7F){ PORTD = 0xFE; } else{ PORTD = ~PORTD ; PORTD = PORTD << 1 ; PORTD = ~PORTD ; } switch (PORTD){ case 0xFE: disp = heure/10; break; case 0xFD: disp = heure%10; break; case 0xFB: disp = 10; break; case 0xF7: disp = minute/10; break; case 0xEF: disp = minute%10; break; case 0xDF: disp = 10; break; case 0xBF: disp = seconde/10; break; case 0x7F: disp = seconde%10; break; } PORTB = segments [disp]; } /******************************************************************************* interruption *******************************************************************************/ void interrupt (){ if (TMR0IF_BIT){ TMR0IF_BIT = 0; i = 1; } }//~ /******************************************************************************* Réglage date et heure *******************************************************************************/ void reglage (){ while(selection <=3){ switch (selection) { case 1: //réglage des secondes if(plus){ seconde++; if(seconde > 59) seconde = 0; } if(moin){ seconde--; if(seconde == 0) seconde = 59; } break; case 2: //réglage des minutes if(plus){ minute++; if(minute > 59) minute = 0; } if(moin){ minute--; if(minute < 0) minute = 59; } break; case 3: //réglage des heures if(plus){ heure++; if(heure > 23) heure = 0; } if(moin){ heure--; if(heure < 0) heure = 23; } break; } if(selectreg){ selection++;} // on reste dans la boucle tant que selectreg n'est pas relaché while(plus || moin || selectreg){} // on reste dans la boucle tant que le BP n'est pas relaché } transformDBD (); ecritureRTC (); selection = 0; // On re-initialise la variable selection }//~ /******************************************************************************* Programme principal *******************************************************************************/ void main() { initialiseRTC (); segments [0] = 0x80; segments [1] = 0xF2; segments [2] = 0x48; segments [3] = 0x60; segments [4] = 0x32; segments [5] = 0x24; segments [6] = 0x04; segments [7] = 0xF0; segments [8] = 0x00; segments [9] = 0x20; segments [10] = 0x7E; // - segments [11] = 0x38; // ° segments [12] = 0x8C; // C TRISA = 0xFF; //entrée PORTA = 0x00; TRISB = 0x01; //RB0 en entrée PORTB = 0x00; // port b : segments TRISC = 0xFF; //entrée PORTC = 0x00; TRISD = 0x00; PORTD = 0x7F; // port d : digits ANSEL = 0; // Configure pins en numérique ANSELH = 0; OPTION_REG = 0x83; INTCON = 0xE0; TMR0 = 0; while (1) { lectureRTC(); if(i){ if(selection == 0){ transformBDD (); } affichage (); i = 0 ; } if(selectreg){ //partie concernant le reglage de l'heure et de la date reglage (); } } }//~ /******************************************************************************* FIN *******************************************************************************/
Oui mais il faut que je vois tout le code sur mon compilateur là c'est moins commode.
Je n'ai regardé que la partie interruption, il y a peut-être d'autres erreurs.
Le verrou est au cul de chaque afficheur.
Comme pour le multiplexage, on envoie un code sur 7 ou 8 bits (avec le DP) vers le bus commun a chaque afficheur.
Quand on active le registre a verrouillage (verrou), on envoi le code sur le bus, on deverouille le verrou, il recupere l'octet, on le reverrouille et il presente a sa sortie l'octet memorisé jusqu'au passage suivant. Donc le verrou permet avec ce systeme de laisser l'etat memorisé pendant toute la duree du cycle, donc l'afficheur reste eclairé tout le temps entre deux mises a jour...
Voir du coté du 74LS259 ou plus recent ici: http://www.alldatasheet.com/datashee...DM74LS259.html
HULK28: vous ne pouvez que modifier la partie interruption, normalement dans le reste il n'y a pas d'erreur.
FRANCK_026: je ne veut pas utiliser d'autre composant, donc je ne vait pas utiliser cette solution.
C'est lecture RTC qui ne va pas, tu passes ton temps dans cette fonction.
Que je passe mon temps dans cette fonction ou pas on "s'en fou" puisque l'afficheur et fait grâce au timer
Donc il faut la mettre en tâche secondaire, il est inutile d'aller dedans plus d'une fois par seconde.
Moralité il faut que tu y ailles seulement quand c'est utile, il te faut modifier ce qu'il y a dans le while().
Ben non, justement.
Si tu te trouves dans la fonction ton i peut passer à 1 que tu ne changeras rien vu que rien ne sera pris en compte vu que tu ne t'y trouves pas, voilà pourquoi quelque soit la fréquence rien ne change vis à vis de tes afficheurs...
Tu comprends bien que tant que tu es dans la fonction RTC tu ne peux voir à temps le i changer vu qu'il est à l'extérieur de cette fonction.
La seule chose à faire à mon avis, c'est activer l'alim des digits aux bons moments, quitte à interrompre une tâche de lectrure de l'horloge (puisque secondaire en priorité), ce qui sous entend de mettre des conditions d'exécutions selon que i soit passé à 1 ou pas.
De ça dépendra la qualité de ton affichage.
Autre solution, si on considère que lire 1 fois par seconde l'horloge est suffisant, tu interdis l'interruption ce laps de temps nécessaire (TMR0IE=0).
Re,
tu te sers de TMR0IF et tu incrémentes une variable temps à chaque accès dans l'interruption.
Cette interruption survenant toutes les 2.048ms pour avoir un ordre de lecture toutes les secondes environ tu incrémentes jusqu'à 400 cette variable puis tu mets j=1 -> TMR0IE=0 -> lecture horloge (j est activé donc dans le while() tu lis la RTC -> une fois fait tu remets j=0 -> puis TMR0IE=1 (pour que le compteur reparte -> et le tour est joué.
j doit être en volatile également.
je vois ce que vous voulez me dire, mais je croi avoir trouver l'erreur, cela viens du tube VFD, enffaite un tube VFD demande une alimentation de 50V hors moi je l'utilise avec une alimentation de 18V, et donc cela doit ete a cause de ca?
Ben tu devrais deja le savoir ce genre de chose:
http://forums.futura-sciences.com/el...-tube-vfd.html
30V suffisent.
Il n'empeche que ton programme en l'etat ne peut fonctionner sans ces modifications indispensables au niveau du soft comme nous l'avons vu precedemment.
Solutionne ton probleme d'alim et reviens quand ca sera fait.
Si tu avais un scope on gagnerait du temps.
Oui je sais mais je n'avai pas d'autre alim et je penser juste que au pire des cas les segments s'allumeraient moin fort. Je vais commander un transfo pour les testes. A oui aussi vue que mon PIC est sur une easypic7 il y a des leds sur le PORTD la ou selectionne le digit a allumé, est bien les leds ne clignotes pas donc le probléme ca vien bien de l'alim. J'ai bien un scope cher moi, mais la je n'y suis pas.
PS: d'ailleur le montage que j'avai fait pour converti 9V en 30V a n'a pas fionctionner bien lontemps le transistor MOS a griller.
C'est sur qu'a l'heure ou le simulateur sur PC remplace l'oscilloscope la fiabilite va en prendre un serieux coup....
Tu aurais du aller au bout de ta demarche concernant ton alim, ce n'est pas parceque ca ne fonctionne pas du premier coup qu'il faut tout arreter.
Si ton Mos a grille c'est qu'il y a une grosse connerie sur ta carte.
Un peu comme le soft, si il faut tout arreter a la premiere erreur de code il n'y aurait pas grand chose de fait en ce bas monde.
Je ne te donnerai qu'un seul conseil: avance a petit pas mais avance en ayant regle les problemes l'un apres l'autre c'est la methode la plus efficace que je connaisse et la meilleure maniere d'apprendre
Oui je suis bien d'accord avec toi, mais la je ne suis pas cher moi j'ai juste ma platine de devellopement, mon afficheur vfd plus l'alim, mais n'ayant rien pour reparer n'y le scope je suis bloquer pour l'instant.
PS: j'ai verifier plusieurs fois mon alim et tout est bien connecter comme sur le schema.
Avant de reparer il faut voir a quoi ressemble ton alim.
Poste ton schema et tout ce que tu as d'utile pour regarder le probleme.
Reposte ca dans la precedente discussion ouverte pour l'alim, sinon ca va etre le bazar ici.
Le schéma de l'alim est déjà présent en premiere page de l'autre poste.
Cette alim n'etait que pour tester, mais je vais peut être plutôt attendre de recevoir un transfo 2*18V, qui me permettra d'alimenter mon tube avec une tension de 50V.
Après verification au scope, j'ai bien une fréquence de 61Hz, donc chaque digit est allumé pendant 2ms.
Parcontre je viens de penser: si j'allume un digits toute les 2ms (sachant qu'il y en a 8) donc 1 digit est allumer toute les 14ms (7digits suivant * 2ms) pendant 2ms, donc ce probléme de scintillement est dû à cela.
J'ai dit nimporte quoi sur mon derniere poste, vue que la fréquence est de 61Hz le scintillement ne devrer pas ce voir, faut que je regarde de plus prés du coter alimentation.