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 ---
Forum général sur le langage C !

Modérateur : Jérémy

Algorythmie : Assigner un port à un autre
Florian41
Membre
Membre
Messages : 13
Enregistré en : mai 2017

#1 Message par Florian41 » lun. 29 mai 2017 15:35

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"

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
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » lun. 29 mai 2017 17:23

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
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Algorythmie : Assigner un port à un autre
Florian41
Membre
Membre
Messages : 13
Enregistré en : mai 2017

#3 Message par Florian41 » mar. 30 mai 2017 09:20

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...

Algorythmie : Assigner un port à un autre
Florian41
Membre
Membre
Messages : 13
Enregistré en : mai 2017

#4 Message par Florian41 » mar. 30 mai 2017 12:01

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

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
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mer. 31 mai 2017 11:17

Bonjour à tous,

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+
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Algorythmie : Assigner un port à un autre
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#6 Message par paulfjujo » mer. 31 mai 2017 20:18

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 ?


18F45K80_test.jpg

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.
Aide toi, le ciel ou FantasPic t'aidera

Algorythmie : Assigner un port à un autre
Florian41
Membre
Membre
Messages : 13
Enregistré en : mai 2017

#7 Message par Florian41 » mar. 6 juin 2017 14:10

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 :wink:

Algorythmie : Assigner un port à un autre
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#8 Message par paulfjujo » mar. 6 juin 2017 19:16

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 ?
Aide toi, le ciel ou FantasPic t'aidera

Algorythmie : Assigner un port à un autre
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » mar. 6 juin 2017 20:03

Bonjour,

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....
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Algorythmie : Assigner un port à un autre
Florian41
Membre
Membre
Messages : 13
Enregistré en : mai 2017

#10 Message par Florian41 » jeu. 8 juin 2017 10:47

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.

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 ;)


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 47 invités