Bonjour à tous
Je viens de m’inscrire sur votre forum, pour demander votre aide, car je tourne en rond depuis presque 2 jours sur un problème de programmation de TIMER0 du pic 18f458.
Explication du projet :
Je souhaite faire un compte à rebours a durée programmable via clavier avec buzzer lorsque le temps programmer est écoulé, pour mes séances d’étirements après une bonne dose de nage.
Pour la partie affichage, ce sont 3 afficheurs 7 segments (temps max 9min et 59 sec), un convertisseur BCD 7 segments MC14543B, et des transistors pour acheminer le courant nécessaire au led (Iled =20ma, Ibcd = 10ma) qui sont utilisés
Le tous est multiplexé sur le PORTB du pic 18f458. Pin 7, 5, 4 du port B utilisé pour la sélection d’un afficheur, Pin 3, 2, 1, 0 pour commander l’entrée du BCD.
Après documentation sur le net, pour une bonne précision temporelle, l’utilisation des TIMER est la bonne solution à la stabilité temporelle .
Je me suis donc plongé dans la data sheet du pic 18F458 pour essaie de comprendre et de codé le fonctionnement du timer 0
J’ai choisie le mode 16bit du timer 0, et une fréquence d’interruption de 10ms, pour un bon multiplexage des afficheurs.
Ce qui me donne après le petit calcul de la fréquence de mon quartz qui est de 10Mhz, que le registre T0CON dois être configuré en : 00000010 (timer off, 16bit, clk interne, comptage sur front descendant, prescaler ON configuré en 1 :8).
Pour arriver à 10ms un offset de 62411 est requis, ce qui me donne les valeurs suivantes dans les registres :
- TMROH = F3
- TMROL = CB
Suivant mon interprétation de la data sheet et du calcul, le Timer compte 3125 cycle pour arrivé à la valeur max de 2 registre TMROH et TMROL, puis passe le bit TMR0IF à 1, si le bit TMR0IE (qui autorise les interruptions) l’est aussi.
Avec toutes ces données, je me suis lancé dans la programmation avec la denière version deMBLAP et la toolsuite C18., et la bonjours les problèmes, entre les build qui passe pas à cause de point virgule qui manquaient, les accolades des boucles etc… bref vous l’avez compris je suis encore loin d’être un as dans la programmation en C, je dirais même un début débutant
Après moult essaie sans succès, je me tourne vers vous pour essaie de solutionné mon problème de timer.
Donc voici mon code (Pour l’instant c’est juste un code de test pour voir si le timer fonctionne correctement)
Mais ceci ne fonctionne pas, le PORTBbits.RB7 ce met à 1 seulement il le reste 2 sec, puis bascule à 0 pendant environ 10msCode PHP:
#include <p18f458.h>
#pragma config OSC = HS
int temps;
void main (void)
{
TRISB = 0x00; // Port B toutes les I/O en sortie
//-------------------------------------------------
PORTBbits.RB3=0;
PORTBbits.RB2=0; // Sortie vers convetiseur BCD 7 segment
PORTBbits.RB1=1; // pour affichage du nombre 8 (test en dur)
PORTBbits.RB0=0;
//-------------------------------------------------
INTCON =0x00; // Mis à zéros du registre INTCON
T0CON= 0b00000010; // Configuration du timer Off, 16bit, internal CLK, prescaler On 1 :8
TMR0H =0xF3; // Mis en place de l'offset à 62411
TMR0L =0xCB;
// Ce qui nous donne avec cette configuration une interruption toutes les 10ms
INTCONbits.TMR0IF = 0; // Mis a zéros du flag d'interruption
INTCONbits.TMR0IE = 1; // Autorisation de l'interruption
T0CONbits.TMR0ON =1; // activation du timer
PORTBbits.RB7=0; // Mis à zéros du Pin 7 du port B
temps=0; // Mis à zéros de la variable temps
while (1)
{
if(INTCONbits.TMR0IF ==1){temps++;PORTBbits.RB7=1;INTCONbits.TMR0IF = 0;}
// si interruption TMROIF == 1, alors incrémentation de la valeur de temps
// Mis à 1 du pin 7 du port B
// Remise a zéros de TMROIF
if(temps>=10) {PORTBbits.RB5=1;}
// si temps est supérieure ou égale a 10 pin 5 Port B à 1
}
}
Quand a cette ligneelle ne fonctionne même pas, j’ai beau attendre 20 sec et plus leCode PHP:
if(temps>=10) {PORTBbits.RB5=1;}
ne passe pas à 1.Code PHP:
PORTBbits.RB5
Ce que je comprends pas c’est pourquoi le PORTBbits.RB7 reste actif pendant 2 sec, puis a un temps de repos de 10ms qui est le temps cherché. Ni pourquoi la bouclene fonctionne pas. J’ai beau me cassé le crâne sur le clavier je trouve plus de solutionCode PHP:
if (temps>=10) {PORTBbits.RB5=1;}
Merci d'avance à tous ceux qui vont m'aider dans mon problème
-----