2017-04-06 3 views
-1

Je développe un firmware pour contrôler un brochage PIC18F45k80 sur une carte personnalisée. Avant de charger et de programmer cette image avec la version finale, je testais mon environnement de programme/débogage (MPLABX IDE + Pickit3) avec le code utilisateur le plus simple: basculer certaines sorties portD avec une période de 50 ms.Comment configurer correctement un port PIC18 D pour le sens de sortie?

3 broches de ceux-ci fonctionnent propperly (RD6, RD5, RD4) mais ce n'est pas le cas de RD3 et R2. Ils n'ont aucun signal, ils ne s'allument jamais. La broche reste avec 0 tout le temps d'exécution. Toutes les broches sont configurés et activés avec la même manière en même temps, comme vous pouvez le voir dans le code suivant:

fichier main.c:

//C libraries 
#include <stdio.h> 
#include <stdint.h> 
#include <stdbool.h> 

#include <pic18f45k80.h> 
#include "18f45k80_mainconfig.h" 
#include <xc.h> 

//Application dependent libraries 
#include "gold_whyl_task.h" 

/*outputs defines*/ 
#define CADENZA  PORTDbits.RD2 //problem with this bit 
#define CAPW  PORTDbits.RD3 //problem with this bit 
#define FREQFISSA PORTDbits.RD4 
#define FISSAWAIL PORTDbits.RD5 
#define COMCICLOSIR PORTDbits.RD6 

/*inputs - debug*/ 
#define PGC   PORTBbits.RB6 
#define PGD   PORTBbits.RB7 

int main() 
    { 

    TRISDbits.TRISD0=1;//input ACTIVACIOn 
    TRISDbits.TRISD1=1;//input CLACSON 
    TRISBbits.TRISB6=1;//pdg 
    TRISBbits.TRISB7=1;//pdc 

    /*outputs*/ 
    TRISDbits.TRISD2=0;//output CADENZA //problem with this 
    TRISDbits.TRISD3=0;//output CAPW //problem with this 

    TRISDbits.TRISD4=0;//output FREQFIJA 
    TRISDbits.TRISD5=0;//output FIJAWAIL 
    TRISDbits.TRISD6=0;//output COMCICLOSIR 

    while(1) 
     { 
      COMCICLOSIR=0; 
      FISSAWAIL=0; 
      CAPW=0; 
      CADENZA=0; 
      FREQFISSA=0; 

      __delay_ms(50); 
      COMCICLOSIR=1; 
      FISSAWAIL=1; 
      CAPW=1; //this assignment has no effect --> it stills 0 
      CADENZA=1;//this assignment has no effect--> it stills 0  
      FREQFISSA=1; 
      __delay_ms(50); 
     } 
} 

Que peut-on se passe? Y at-il un problème avec les définitions, la configuration du port, etc.?

+0

Nous avons un site d'échange séparé pour les microcontrôleurs et l'électronique: http://electronics.stackexchange.com/ – arminb

+0

que voulez-vous dire? J'ai suivi les instructions, je configure toujours les entrées et les sorties de la même manière, mais je n'ai jamais eu qu'une seule partie du port fonctionnant et ne fonctionnant pas le reste, même en configurant le port entier exactement de la même manière. Quel type d'information une fiche technique peut-elle me donner à propos de ce comportement? –

+0

Qu'en est-il de ces broches, HW parlant? Tous les circuits sont-ils identiques? Peut-être que vous devez activer les pull-ups avec le registre 'PADCFG1'. – LPs

Répondre

3

Vous devriez toujours vérifier datasheet

Votre mcu a un A/D port et, malheureusement pour vous, par défaut, il utilise RD2 et RD3.

Vous pouvez voir à page 364, ADCON1 reg qui permet ces broches comme analogiques.

enter image description here

A page 92 vous pouvez voir la configuration à ADCON1 registre au démarrage: -111 1111

enter image description here

Cela signifie que, à la mise sous tension/browout/WDT/... RD2 et Reste RD3 sont définir pour être des entrées analogiques.

Vous devez désactiver les broches du convertisseur A/D pour utiliser ces broches comme I/O.

Je n'ai pas SDK Microchip mais vous devez faire quelque chose comme

ADCON1 &= 0x9F; 

Pour définir bit 6 et bit 5-0 et permettre RD2 et RD3 comme I/O

+0

J'ai toujours trouvé ça étrange Microchip a décidé de mettre par défaut certains ports à être analogique, je suppose que cela rend le Z élevé. –

+0

@Colin__s Très probablement ... – LPs

-1

Tous sont connectés de manière identique, interne tirer vers le haut connecté avec ces broches mais éteint automatiquement lorsque la sortie est configurée. Mais maintenant j'ai trouvé le kit de la question. PORTDbits.RD2 vous permet de lire à partir de pin et peut-être écrire dessus, mais sans garanties (c'est la raison pour laquelle certaines broches fonctionnent et pas l'autre). Au lieu de cela, j'ai utilisé l'option LATD qui écrit la broche lorsque la broche est configurée comme sortie. Maintenant ça marche.

+0

@LPs J'ai configuré ANCON1 = 0x00 (je l'ai dans un autre fichier inclus); avant d'écrire le premier post avec le problème que j'ai commenté. J'ai lu une fois de plus la fiche technique et d'autres ressources, dans lesquelles il est question de différences entre LAT et PORT. Ils suggèrent toujours d'utiliser LAT pour les broches de sortie d'écriture. J'essayais d'écrire une sortie numérique avec PORT. –