Bienvenue aux nouveaux arrivants sur FantasPic !
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.
--- L’équipe FantasPic ---
Modérateur : Jérémy
Algorythmie : Assigner un port à un autre
Bonjour,
Etant débutant dans la programmation de microcontrôleur (pour ma part un PIC18F45k80) je butte sur un problème de port inactif si je configure mon pic par défaut. Il s'agit des pin 15 et 16 (PORT RC0 et RC1) qui ne veulent pas se mettre à 1. Or je dois commander un circuit de puissance en sortie sur 12 voies, en numérique. Le port D fonctionne correctement mais pas les 2 premiers bits du port C...
Après des heures passés sur des forums et pas de solution, j'ai choisit de contourner le problème, sans me prendre la tête avec la configuration des registres internes de mon pic : Je veux donc assigner les sorties RA0 et RA1 (qui elles fonctionnent correctement) à la place des sorties RC0 et RC1. Pour me simplifier la tache, je crée un tableau intermédiaire pour le " nouveau port C ", sachant de les 2 bits de poids le plus faible s'écriront sur les sortie RA0 et RA1.
Voici mon code sur MPLAB (Je veux au départ forcer toutes les valeurs à 1) :
Modération : Ajout des balises "codes"
Il s'avère qu'une erreur est présente sur la ligne d'écriture de la valeur du tableau... Quel est votre diagnostic?
Etant débutant dans la programmation de microcontrôleur (pour ma part un PIC18F45k80) je butte sur un problème de port inactif si je configure mon pic par défaut. Il s'agit des pin 15 et 16 (PORT RC0 et RC1) qui ne veulent pas se mettre à 1. Or je dois commander un circuit de puissance en sortie sur 12 voies, en numérique. Le port D fonctionne correctement mais pas les 2 premiers bits du port C...
Après des heures passés sur des forums et pas de solution, j'ai choisit de contourner le problème, sans me prendre la tête avec la configuration des registres internes de mon pic : Je veux donc assigner les sorties RA0 et RA1 (qui elles fonctionnent correctement) à la place des sorties RC0 et RC1. Pour me simplifier la tache, je crée un tableau intermédiaire pour le " nouveau port C ", sachant de les 2 bits de poids le plus faible s'écriront sur les sortie RA0 et RA1.
Voici mon code sur MPLAB (Je veux au départ forcer toutes les valeurs à 1) :
Modération : Ajout des balises "codes"
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 8000000
/*# define LATCbits.LATC7 TabPortC[7]
# define LATCbits.LATC6 TabPortC[6]
# define LATCbits.LATC5 TabPortC[5]
# define LATCbits.LATC4 TabPortC[4]
# define LATCbits.LATC3 TabPortC[3]
# define LATCbits.LATC2 TabPortC[2]
# define LATAbits.LATA1 TabPortC[1]
# define LATAbits.LATA0 TabPortC[0]
# define LATDbits.LATD3 TabPortD[3]
# define LATDbits.LATD2 TabPortD[2]
# define LATDbits.LATD1 TabPortD[1]
# define LATDbits.LATD0 TabPortD[0]
*/
int TabPortC[8];
int TabPortD[8];
void main(void)
{
ANCON0=0;
ANCON1=0;
TRISB=0;
TRISC=0;
TRISA=0;
TRISD=0;
PORTB=0b00000000;
PORTC=0b00000000;
PORTA=0b00000000;
PORTD=0b00000000;
while(1)
{
LATCbits.LATC7 = TabPortC[7];
LATCbits.LATC6 = TabPortC[6];
LATCbits.LATC5 = TabPortC[5];
LATCbits.LATC4 = TabPortC[4];
LATCbits.LATC3 = TabPortC[3];
LATCbits.LATC2 = TabPortC[2];
LATAbits.LATA1 = TabPortC[1];
LATAbits.LATA0 = TabPortC[0];
LATDbits.LATD3 = TabPortD[3];
LATDbits.LATD2 = TabPortD[2];
LATDbits.LATD1 = TabPortD[1];
LATDbits.LATD0 = TabPortD[0];
TabPortC[] = 255;
TabPortD[] = 255;
}
}
Il s'avère qu'une erreur est présente sur la ligne d'écriture de la valeur du tableau... Quel est votre diagnostic?
Algorythmie : Assigner un port à un autre
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour Florian41,
Bienvenue sur fantasPic.fr.
J'ai modéré ton post pour rajouter les balises "codes" , et ainsi rendre beaucoup plus lisible ton code. Je te propose de regarder ici : procédure
Par la même occasion je te demanderai , afin, d'obtenir un maximum d'aide, de poste un lien de la data-sheet de ton PIC en suivant cette procédure
Ici : PORTB=0b00000000; tu mets toutes tes sorties à 0. Avec les PIC 18F il est préférable d'utiliser le LATCH plutôt que le PORT . Tu pourrais donc remplacer PORTB=0b00000000; par LATB = 0;
Le probleme viens d'ici : TabPortC[] = 255; ?.
Je travaille sous mikroC pour ma part , mais il me semble qu'il n'est pas possible de remplir un tableau avec cette syntaxe . car tu ne definis aucune case de ton tableau !
Attendons l'avis d'un expert car moi aussi je suis novice !
A + et bienvenue encore
Bienvenue sur fantasPic.fr.
J'ai modéré ton post pour rajouter les balises "codes" , et ainsi rendre beaucoup plus lisible ton code. Je te propose de regarder ici : procédure
Par la même occasion je te demanderai , afin, d'obtenir un maximum d'aide, de poste un lien de la data-sheet de ton PIC en suivant cette procédure
Ici : PORTB=0b00000000; tu mets toutes tes sorties à 0. Avec les PIC 18F il est préférable d'utiliser le LATCH plutôt que le PORT . Tu pourrais donc remplacer PORTB=0b00000000; par LATB = 0;
Le probleme viens d'ici : TabPortC[] = 255; ?.
Je travaille sous mikroC pour ma part , mais il me semble qu'il n'est pas possible de remplir un tableau avec cette syntaxe . car tu ne definis aucune case de ton tableau !
Attendons l'avis d'un expert car moi aussi je suis novice !
A + et bienvenue encore
Algorythmie : Assigner un port à un autre
Bonjour Jeremy,
Datasheet PIC18F45K80
Voici la datasheet du pic que je veux programmer. Mais mon problème viens plutôt du format de mon nouveau portC ... je voudrais donc transférer un entier codé sur 8 bits dans mon port mixte. ... Je pense du coup qu'il faudrait, pour chaque bit du port que je fasse un calcul, soit avec des divisions, soit avec des modulos.
Par exemple : Si j'ai valeur = 128 --> j'active RC7 . Donc en assignation je fait TabPortC[7] = 129 / 128 (int)
Si j'ai valeur = 1 ---> j'active RA0 . Donc en assignation je fait TabPortC[0] = 2 / 1 (int) ...
On peut penser à faire l'équation TabPortC[x] = (valeur + 1) / valeur ... mais ça ne marche pas quand 2 bits en sortie du port sont à 1...
Quelqu'un connaitrait-il un algorithme simple permettant d'inscrire une valeur entière sur 8 bits sur un port binaire qui sera transféré en sortie du microcontrôleur?
Encore désolé si j'explique mal mon problème, mais c'est la seule solution. En effet tout les autres port actifs de mon micro sont réservés pour des périphériques tels que l'afficheur LCD, etc...
Datasheet PIC18F45K80
Voici la datasheet du pic que je veux programmer. Mais mon problème viens plutôt du format de mon nouveau portC ... je voudrais donc transférer un entier codé sur 8 bits dans mon port mixte. ... Je pense du coup qu'il faudrait, pour chaque bit du port que je fasse un calcul, soit avec des divisions, soit avec des modulos.
Par exemple : Si j'ai valeur = 128 --> j'active RC7 . Donc en assignation je fait TabPortC[7] = 129 / 128 (int)
Si j'ai valeur = 1 ---> j'active RA0 . Donc en assignation je fait TabPortC[0] = 2 / 1 (int) ...
On peut penser à faire l'équation TabPortC[x] = (valeur + 1) / valeur ... mais ça ne marche pas quand 2 bits en sortie du port sont à 1...
Quelqu'un connaitrait-il un algorithme simple permettant d'inscrire une valeur entière sur 8 bits sur un port binaire qui sera transféré en sortie du microcontrôleur?
Encore désolé si j'explique mal mon problème, mais c'est la seule solution. En effet tout les autres port actifs de mon micro sont réservés pour des périphériques tels que l'afficheur LCD, etc...
Algorythmie : Assigner un port à un autre
J'ai trouvé une solution plus simple à mon problème : je veux recopier une valeur 3 fois sur 3 ports de sorties : voilà mon code
Mais quand j'implante mon code sur mon micro, dés lors que je met LATD = valeur, je n'ai rien en sortie. En revanche si je détermine ma valeur brute : LATD = 15 par exemple ... là mes sorties sont activées.
Y'a t'il un format obligatoire à inscrire à ma variable de sortie?
Code : Tout sélectionner
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 8000000
int valeur;
int reste;
void main(void)
{
ANCON0=0;
ANCON1=0;
TRISB=0;
TRISC=0;
TRISA=0;
TRISD=0;
PORTB=0b00000000;
PORTC=0b00000000;
PORTA=0b00000000;
PORTD=0b00000000;
while(1)
{
valeur = 0b00001111;
LATD = valeur; // Problème : valeur ne s'affiche pas
LATCbits.LATC7 = LATDbits.LATD3;
LATCbits.LATC6 = LATDbits.LATD2;
LATCbits.LATC5 = LATDbits.LATD1;
LATCbits.LATC4 = LATDbits.LATD0;
LATCbits.LATC3 = LATDbits.LATD3;
LATCbits.LATC2 = LATDbits.LATD2;
LATAbits.LATA1 = LATDbits.LATD1;
LATAbits.LATA0 = LATDbits.LATD0;
}
}
Mais quand j'implante mon code sur mon micro, dés lors que je met LATD = valeur, je n'ai rien en sortie. En revanche si je détermine ma valeur brute : LATD = 15 par exemple ... là mes sorties sont activées.
Y'a t'il un format obligatoire à inscrire à ma variable de sortie?
Algorythmie : Assigner un port à un autre
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour à tous,
Ton premier problème est donc résolu ?
Sinon pour ton nouveau probléme:
Non c'est exactement pareil, que tu mettes 15 en décimal ou 0b00001111 en binaire ou encore 0x000F en hexa!
Tu as bien déclaré ta variable en int . pas de probléme.
As tu essayé avec
Il me semble que par défaut tes broches RD3, RDS2, RD1 et RD0 soit configurtées en analogiques ( P. 364 de la DS) .
Essaye en configurant toutes les sorties en numériques .
en rajoutant ca dans ton initialisation :
PSD je ne sais pas si la syntaxe est la bonne avec MPLAB j'utilise MikroC pour ma part .
A+
Ton premier problème est donc résolu ?
Sinon pour ton nouveau probléme:
Y'a t'il un format obligatoire à inscrire à ma variable de sortie?
Non c'est exactement pareil, que tu mettes 15 en décimal ou 0b00001111 en binaire ou encore 0x000F en hexa!
Tu as bien déclaré ta variable en int . pas de probléme.
As tu essayé avec
Code : Tout sélectionner
valeur = 15;
LATD = valeur;
Il me semble que par défaut tes broches RD3, RDS2, RD1 et RD0 soit configurtées en analogiques ( P. 364 de la DS) .
Essaye en configurant toutes les sorties en numériques .
en rajoutant ca dans ton initialisation :
Code : Tout sélectionner
ANCON0 = 0;
ANCON1 = 0;
PSD je ne sais pas si la syntaxe est la bonne avec MPLAB j'utilise MikroC pour ma part .
A+
Algorythmie : Assigner un port à un autre
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonsoir,
un unsigned char serait mieux approprié pour une image de port de sortie 8 bits ..
mais ça peut tomber en marche avec un entier (int)
testé sous mikroC..
la syntaxe est assez semblable , en rempacant ".bits" par "."
voila le resulta .. je ne sais pas trop quel resultat tu attends ?
nota : tu peux t'essayer au MikroC pro .. version d'essai OK si code < 2ko
un unsigned char serait mieux approprié pour une image de port de sortie 8 bits ..
mais ça peut tomber en marche avec un entier (int)
testé sous mikroC..
la syntaxe est assez semblable , en rempacant ".bits" par "."
voila le resulta .. je ne sais pas trop quel resultat tu attends ?
Code : Tout sélectionner
unsigned char valeur;
int reste;
void main(void)
{
ANCON0=0;
ANCON1=0;
TRISB=0;
TRISC=0;
TRISA=0;
TRISD=0;
PORTB=0b00000000;
PORTC=0b00000000;
PORTA=0b00000000;
PORTD=0b00000000;
while(1)
{
valeur = 0b00001111;
LATD = valeur; // Problème : valeur ne s'affiche pas
LATC.LATC7 = LATD.LATD3;
LATC.LATC6 = LATD.LATD2;
LATC.LATC5 = LATD.LATD1;
LATC.LATC4 = LATD.LATD0;
LATC.LATC3 = LATD.LATD3;
LATC.LATC2 = LATD.LATD2;
LATA.LATA1 = LATD.LATD1;
LATA.LATA0 = LATD.LATD0;
}
}
nota : tu peux t'essayer au MikroC pro .. version d'essai OK si code < 2ko
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Algorythmie : Assigner un port à un autre
Re bonjour Jérémy,
Mon problème de port inactifs est toujours persistant. J'ai constaté que pour des PIC16F et PIC18F, lorsqu'on programme de manière brute ( c'est à dire seulement le main et pas de bits de configuration de registre -lignes #pragma-) il y a systématiquement, au niveau du hard des sorties inactives. J'ai ressayé avec des PIC 18F45K80, des PIC18F26K22, des PIC16F916, ... Tous des modèles neufs, j'ai changé de platine d'essai, j'ai modifié l'emplacement de mon câblage, bref j'ai écarté le problème du mauvais câblage et du court circuit. Et toujours des sorties inactives même quand je les force à 1.
Je trouve simplement hallucinant que si peu de personnes réagissent à mon Topic, à croire qu'il y aurait un code ou une configuration du pic déjà fait que tout le monde utilise et que j'aurais loupé.
Bref, si quelqu'un utilise MPLAB et ou MikroC (j'ai la version pro dans mon entreprise), ça serait génial qu'il me donne son code source et le paramétrage du PIC le plus simple possible lui permettant de mettre à 1 tous les bits de 2 registres de sorties complet (le C et le D, pour faire simple). Cela permettra en plus de ça de débloquer bon nombre de néophytes dans le domaine qui ont fini par abandonner à programmer leur PIC à cause d'une subtilité qui leur a échappé.
J'attends impatiemment vos réponse
Mon problème de port inactifs est toujours persistant. J'ai constaté que pour des PIC16F et PIC18F, lorsqu'on programme de manière brute ( c'est à dire seulement le main et pas de bits de configuration de registre -lignes #pragma-) il y a systématiquement, au niveau du hard des sorties inactives. J'ai ressayé avec des PIC 18F45K80, des PIC18F26K22, des PIC16F916, ... Tous des modèles neufs, j'ai changé de platine d'essai, j'ai modifié l'emplacement de mon câblage, bref j'ai écarté le problème du mauvais câblage et du court circuit. Et toujours des sorties inactives même quand je les force à 1.
Je trouve simplement hallucinant que si peu de personnes réagissent à mon Topic, à croire qu'il y aurait un code ou une configuration du pic déjà fait que tout le monde utilise et que j'aurais loupé.
Bref, si quelqu'un utilise MPLAB et ou MikroC (j'ai la version pro dans mon entreprise), ça serait génial qu'il me donne son code source et le paramétrage du PIC le plus simple possible lui permettant de mettre à 1 tous les bits de 2 registres de sorties complet (le C et le D, pour faire simple). Cela permettra en plus de ça de débloquer bon nombre de néophytes dans le domaine qui ont fini par abandonner à programmer leur PIC à cause d'une subtilité qui leur a échappé.
J'attends impatiemment vos réponse
Algorythmie : Assigner un port à un autre
- paulfjujo
Expert- Messages : 2589
- Âge : 73
- Enregistré en : juillet 2015
- Localisation : 01800
- Contact :
bonjour Florian41
J'avoue ne pas comprendre ta requete !
dans l'exemple ci dessus ,en mikroC,
l'init des ports est bien faite dans le MAIN programme ...
Pour etre actif en sortie, les ports C et D doivent etre initailisés via les TRISC=0 et TRISD=0
car au reset (ou mise sosu tension) tous les ports sont en Entree par defaut.
Il faut veiller aussi à ce que les config ANALOGIQUE soit desactivées
ANSELX ...
Sur quel exemple de programme precis bloques -tu ?
J'avoue ne pas comprendre ta requete !
dans l'exemple ci dessus ,en mikroC,
l'init des ports est bien faite dans le MAIN programme ...
Pour etre actif en sortie, les ports C et D doivent etre initailisés via les TRISC=0 et TRISD=0
car au reset (ou mise sosu tension) tous les ports sont en Entree par defaut.
Il faut veiller aussi à ce que les config ANALOGIQUE soit desactivées
ANSELX ...
Sur quel exemple de programme precis bloques -tu ?
Algorythmie : Assigner un port à un autre
-
Jérémy
Administrateur du site- Messages : 2722
- Âge : 44
- Enregistré en : juillet 2015
- Localisation : Dans le sud
- Contact :
Bonjour,
Paul à raison. Au démarrage ou après un reset, tout les broches sont mises en Entrée, pour éviter d'éventuelle problèmes ( court-circuit) . Tu est donc oblige de les configurer en sortie.
Il faut également veiller à mettre tes sorties en numériques !
Bref , je redis ce qu'a dit Paul....
Florian41 a écrit :Source du message il y a systématiquement, au niveau du hard des sorties inactives.
Paul à raison. Au démarrage ou après un reset, tout les broches sont mises en Entrée, pour éviter d'éventuelle problèmes ( court-circuit) . Tu est donc oblige de les configurer en sortie.
Il faut également veiller à mettre tes sorties en numériques !
Bref , je redis ce qu'a dit Paul....
Algorythmie : Assigner un port à un autre
Re bonjour.
J'ai remis les choses à plat et toujours le même problème. RC0 et RC1 inactives.
Afin de pouvoir éclaircir le problème, je vous présente mon code source sur MPLAB : Celui ci consiste à faire clignoter 4 leds correspondant respectivement aux port RC0, RC1, RC2 et RC3.
Je compile mon programme, je ne charge via l'IPE de MPLAB X ... Et je ne vois que les LEDS branchées à RC2 et RC3 clignoter. Je mesure au voltmètre les sorties RC0 et RC1 ... et rien. Pas de court circuit non plus entre les 2 broches ni de liaison à la masse indésirable... Bref soit ces 2 sorties doivent être déclarées par un code ou des bits de configuration que je ne connais pas, soit je tombe sur le 3e PIC qui a un défaut de fabrication...
Toute analyse de de problème est la bienvenue ;)
J'ai remis les choses à plat et toujours le même problème. RC0 et RC1 inactives.
Afin de pouvoir éclaircir le problème, je vous présente mon code source sur MPLAB : Celui ci consiste à faire clignoter 4 leds correspondant respectivement aux port RC0, RC1, RC2 et RC3.
Code : Tout sélectionner
/*
* File: blinkportc.c
* Author: GNBFLO04
*
* Created on 8 juin 2017, 10:06
*/
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#define _XTAL_FREQ 20000000
void main()
{
ANCON0=0;
ANCON1=0;
TRISC=0b00000000;
PORTC=0;
while(1)
{
PORTC=15;
__delay_ms(500);
PORTC=0;
__delay_ms(500);
}
}
Je compile mon programme, je ne charge via l'IPE de MPLAB X ... Et je ne vois que les LEDS branchées à RC2 et RC3 clignoter. Je mesure au voltmètre les sorties RC0 et RC1 ... et rien. Pas de court circuit non plus entre les 2 broches ni de liaison à la masse indésirable... Bref soit ces 2 sorties doivent être déclarées par un code ou des bits de configuration que je ne connais pas, soit je tombe sur le 3e PIC qui a un défaut de fabrication...
Toute analyse de de problème est la bienvenue ;)
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités