Bonjour/bonsoir Fernando et à tout le groupe,
La réponse est : NON, c'est pas normal. Qu'est ce que t'as dans GestionBouton(i); et GestionAffichage(i); ??
-----
Bonjour/bonsoir Fernando et à tout le groupe,
La réponse est : NON, c'est pas normal. Qu'est ce que t'as dans GestionBouton(i); et GestionAffichage(i); ??
Je ne vois pas la configuration des bits en-tête du programme. Ton WDT est désactivé ?
Utilise ca après le #include ++> : __CONFIG _WDT_OFF
NOTE : il y a d'autres paramètres à configurer comme le quartz, et protection code etc.
Je ne sais pas. J'ai refait un autre test en affichant un autre texte dans cette boucle "while" et en enlevant mes fonctions. Le LCD n'affiche jamais ce qui est dans cette boucle. Est ce que les temporisations peuvent influencer quelque chose ? Je vois que le LCD affiche le texte, l'efface et le ré affiche. La fréquence du Quartz est précisée en début de programme. Sinon je ne vois pas ce que son les entêtes ? Je ne comprend pas ?
Quel texte? Pour ta connaissance, les PICs il faut configurer des registres au debut du programme. Comme clock utilisee, watch dog etc. Tu utilises quartz externe ? As tu ajouter ce que je t, ai dit ?
entete c'est les fichiers include en haut du programme .
Dernière modification par spown ; 27/02/2014 à 00h27.
Test ca :
Code:void main(void) { unsigned char i; i=0; //__delay_ms(1000); init_PIC(); RELAY=1; __delay_ms(1000); lcd_init(); lcd_goto(0); // select first line lcd_puts("TITRE"); lcd_goto(0x40); // Select second line lcd_puts(" version 1.0"); __delay_ms(4000); lcd_clear(); __delay_ms(4); while(1) { GestionBouton(i); //on lance les boucles de gestion GestionAffichage(i); } }
Non ça ne fonctionne pas en ajoutant une tempo de 4ms. Par contre, si je mets la tempo de 4s à 1s, il entre dans la boucle while mais il en sort et recommence l'initlaistion du LCD, l'affichage du titre et ainsi de suite .... Je ne comprend pas le fonctionnement ?
J'ai ajouté ça en entête mais le comportement est le même que précédemment:
#define _CONFIG _WDT = OFF
#define FOSC = EXTRC
Je pense que j'ai résolu mon problème. Je ne peux pas utliser des tempo trop longs donc j'ai fait ça:
et je remplace __delay_ms(4000) par delay_100ms(40) et ça fonctionne l'affichage ne sort plu de la boucle infinie. Il faut quand même que je creuse pour comprendre ? Auriez-vous des pistes sur ses tempo trop longs ?Code:void delay_100ms(unsigned char n) { while (n-- != 0) { __delay_ms(100); } }
Mais c'est faut , ce que tu viens de faire c'est une simple définition des nouveaux variable. ajoute cette macro comme tu le vois ici==> __CONFIG _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _EXTRC_OSC juste apres ( #include "pic16f876.h" )
Pourquoi tu lies pas TOUT, je demande EST CE QUE TU UTILISES un QUATRZ externe ou interne ?
Si ça donne des erreurs essaye ça ==> __CONFIG( _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _EXTRC_OSC); à la place.
C'est un quartz externe de 8MHz.
As tu essayé ca : __CONFIG( _MCLRE_OFF & _PWRTE_OFF & _WDT_OFF & _EXTRC_OSC); ?
L'explication de l'erreur, c'est que __delay_ms est limité dans ton fichier htc.h
J'ai essayé mais erreur lors de la compilation:
Error [800] C:\Users\Rom\AppData\Local\Tem p\s750.; 45. symbole "_EXTRC_OSC" indéfini
Error [800] C:\Users\Rom\AppData\Local\Tem p\s750.; 45. symbole "_WDT_OFF" indéfini
Error [800] C:\Users\Rom\AppData\Local\Tem p\s750.; 45. symbole "_PWRTE_OFF" indéfini
Error [800] C:\Users\Rom\AppData\Local\Tem p\s750.; 45. symbole "_MCLRE_OFF" indéfini
Fais moi voir ton fichier htc.h et pic16f876.h pour vérifier les bonnes déclarations
Je t'ai joins les 2 fichiers que tu m'as demandé. Je suis en train de me battre avec mon codeur incrémental. Sur interne, je trouve des codes où l'on doit générer une fonction interruption sur des changements d'états afin de savoir le sens de rotation du codeur. Sur ma carte, il est connecté au entrée C0 et C1 mais elles ne possèdent pas d'interruption. J'ai donc réalisé une fonction qui check les valeurs sur ces deux entrées pour connaitre le changement d'état ... Est-ce la meilleure solution ? Avec cette fonction, j'ai de nouveau les problèmes que j'observais précédemment (bouclage de l'affichage en sortant des fonctions while(1)). J'ai vraiment l'impression d'avoir qq chose de bancale dans mon code.
Les fichiers joints
A renommer en .rar et à décompresser
J'ai refait des tests hier soir et c'est vraiment les fonctions de temporisations qui influent sur le fonctionnement du programme. Pour l'affichage de mon menu, si la tempo est inférieur à 4ms, le programme boucle et si j'utilise la fonction __delay_us, il affiche des caractères bizarres sur l'afficheur LCD. Est-ce que le compilateur Hi-tech 9.83 peut être la cause ? Faut-il que j'en change ?
Essayes ca : __CONFIG( PWRTE_OFF & WDTE_OFF & FOSC_XT & LVP_OFF & CPD_OFF & CP_OFF);
Note: Pourquoi tu veux utiliser __delay_us ? Le LCD demande quelques millisecondes pour la réception du 1er caractère apres l'initialisation et non micro-secondes
Dernière modification par spown ; 01/03/2014 à 17h07.
Bonjour spown,
J'ai effectivement essayé ta dernière proposition et celle fonctionne. Je suis désolé de répondre si tard mais j'ai repris le travail cette semaine et je suis donc moins dispo pour avancer sur mon projet perso.
Je pense que j'aurais d'autres questions rapidement que je trouverais de nouveau du temps ... merci encore
Rebonjour,
J'ai enfin fini mon menu avec sous-menu et changement de variable ... c'est vraiment pas une partie de plaisir. Il faut penser à tous les cas possible ...
La prochaine étape est de sauvegarder certaine valeur dans la mémoire du pic. Si j'ai bien compris la mémoire disponible et la mémoire EEPROM. Est-ce que c'est la seule disponible ? J'ai trouvé ce site très intéressant : http://claude.dreschel.free.fr/comme.../RW_EEPROM.htm
J'ai essayé le code en C qu'il présente mais j'ai des erreurs liées au define en haut du code. Je pense qu'ils ne sont pas adaptés avec mon compilo ?
Auriez-vous des idées ?Code:#define EEPROM_WRITE(addr, value) while(WR)continue;EEADR=(addr);EEDATA=(value);EEPGD=0;GIE=0;WREN=1;\ EECON2=0x55;EECON2=0xAA;WR=1;WREN=0 #define EEPROM_READ(addr) ((EEADR=(addr)),(EEPGD=0),(RD=1),EEDATA)
Merci d'avance
Il y a 3 types de mémoires dans ton pics : Flash, RAM et EEPROM.
Quel type d'erreur??
OK, donc si je veux stocker des valeurs (char et int uniquement) pour qu'elle soit toujours dispo au prochain redémarrage, j'utilise EEPROM ?
Les erreurs:
Warning [111] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 19.37 redéfinition de la macro "EEPROM_WRITE" du pré-processeur (-TECH Software\PICC\9.83\include\eep rom_routines.h: 21)
Warning [111] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 20.66 redéfinition de la macro "EEPROM_READ" du pré-processeur (C:\Program Files (x86)\HI-TECH Software\PICC\9.83\include\eep rom_routines.h: 28)
Error [984] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 36.59 type redeclaré
Error [1098] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 36.59 conflit de déclaration pour la variable "eeprom_write"
Error [984] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 877.1 type redeclaré
Error [1098] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 877.1 conflit de déclaration pour la variable "eeprom_write"
Warning [343] C:\Users\Rom\Desktop\Retard_bo x\v0.1\retard_v0.1.c; 880.1 return implicite à la fin d'une fonction non void
Warning au début c'est sur les define.
Les erreurs ensuite c'est sur les fonctions que j'ai reprise du site que j'ai présenté au-dessus. Est ce que les fonctions EEPROM_WRITE et EEPROM_READ sont déjà définies dans un include ?
Tes 'eeprom_write' et read sont déjà déclarés quelques part. Je peux pas savoir sans tout le code. EEPROM_READ et WRITE sont pas définies dans tes include ( d’après la version que tu m'as montré pour l'afficheur ).
Je te joins le code qui pose problème:
Je ne vois pas où ils sont déclarés deux fois. Ce code est quelque chose que j'ai repris du site que j'ai indiqué plus haut. Est-ce que je dois déclarer quelque chose de spéciale au niveau de l'initialisation du PIC ?Code://---------------------------------E/S et variables generales--------------------- #include <htc.h> #include <stdio.h> #include <string.h> #include <math.h> #include "pic.h" #include "pic16f876.h" ; #define _XTAL_FREQ 8000000 #define EEPROM_WRITE(addr, value) while(WR)continue;EEADR=(addr);EEDATA=(value);EEPGD=0;GIE=0;WREN=1;\ EECON2=0x55;EECON2=0xAA;WR=1;WREN=0 #define EEPROM_READ(addr) ((EEADR=(addr)),(EEPGD=0),(RD=1),EEDATA) // CONFIG __CONFIG( PWRTE_OFF & WDTE_OFF & FOSC_XT & LVP_OFF & CPD_OFF & CP_OFF); //-------------------------------Déclaration de fonction------------------------- //************************************************************************** void ecriture_eeprom(unsigned char adr,unsigned int valeur); unsigned int lecture_eeprom(unsigned char adr); void eeprom_write(unsigned char addr, unsigned char value); unsigned char eeprom_read(unsigned char addr); //************************************************************************ void main(void) { init_PIC(); /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// int toto; if(lecture_eeprom(0) !=0xFFFF) { toto = lecture_eeprom(0); } else { toto=100; ecriture_eeprom(0,toto); } void eeprom_write(unsigned char addr, unsigned char value) { EEPROM_WRITE(addr, value); GIE=1; // si besoin } unsigned char eeprom_read(unsigned char addr) { return(EEPROM_READ(addr)); } void ecriture_eeprom(unsigned char adr,unsigned int valeur) { eeprom_write(adr,(unsigned char)valeur); valeur >> = 8; eeprom_write(adr+1,(unsigned char)valeur); } unsigned int lecture_eeprom(unsigned char adr) { unsigned int temp; temp=(unsigned char)eeprom_read(adr+1); temp << = 8; temp|=(unsigned char)eeprom_read(adr); return(temp); }
Il te manque une accolade pour fermer le main "}". Puis, il est ou ton while (1) ???
C'est une erreur de copier/coller. J'ai bien une accolade à la fin du main et une boucle pour afficher mon menu. Le problème est que j'ai des erreurs sur les fonctions de lecture et écrire dans l'EEPROM depuis que j'ai rajouté ces fonctions.
Ok, Mais tu peux pas mettre des fonctions à l’intérieur de main.
Je sais. Je te renvoie le code du main.
Code:void main(void) { init_PIC(); /////////////////////////////////////////////////////// /////////////////////////////////////////////////////// int toto; if(lecture_eeprom(0) !=0xFFFF) { toto = lecture_eeprom(0); } else { toto=100; ecriture_eeprom(0,toto); } while(0) { //coeur de mon menu } }
C'est while(1).