2017-02-09 3 views
0

Comme ma question dit, pour accéder à Port par son adresse, Pouvons-nous écrire comme "& PORTA" ??Microchip XC16: Peut-on accéder au port en utilisant son adresse ?? par ex: & PortA?

Dans mon problème, je veux lecture/écriture valeur du port de/vers IHM, en utilisant protocole Modbus.

J'ai un tableau de la structure:

typedef struct func_code_reg { 
    volatile uint16_t addr; 
    volatile uint16_t *data; 
}RW_REG_DATA; 

// described as 
RW_REG_DATA rwCoilStatusTbl[] = { 
    //  Addr  Data_Register 
    {  0,   &rwCoil_0000  }, 
    {  1,   &rwCoil_0001  }, 
}; 

Chaque fois que HMI lit les données, il lit la valeur actuelle du registre & rwCoil_000x

Chaque fois que IHM écrit les données, le registre & rwCoil_000x obtient actualisé.

Au lieu de cela, je voudrais utiliser & PORTA pour lire l'état du port ou pour mettre à jour l'état du port.

Est-ce possible? & si possible, est-ce la bonne façon de mettre à jour le statut du port?

Ou tout autre moyen, s'il vous plaît me guider.

(J'utilise série dsPic33E)

+0

Quelle est la valeur de '' & rwCoil_0000' ou & rwCoil_0001'? Est-il mappé à un port? – Swanand

+0

@Swanand, & rwCoil_000x est un registre de 16bit. Il n'est pas encore mappé avec Port. Je n'arrive pas à le mapper avec Port car la valeur de rwCoil_000x sera mise à jour aléatoirement. – skg

+0

Encore une fois, Quelle est la valeur de & rwCoil_0000 ou & rwCoil_0001? – Swanand

Répondre

1

PORTx est déjà mis en correspondance d'enregistrer le contenu du PortX, vous n'avez pas besoin de son adresse. Pour lire depuis un port, utilisez le registre PORTx. Pour écrire, utilisez le registre LATx.

Donc, si vous voulez que la valeur rwCoil_000x à enregistrer sur un port (A), il suffit d'écrire:

LATA = rwCoil_000x; 

Et si vous voulez lire du port dans la même variable, écrire:

rwCoil_000x = PORTA; 

Bien sûr, ceci suppose que PORTA est configuré pour être une sortie à usage général.

+0

Je ne sais pas quand la valeur rwCoil_000x sera modifiée à partir de HMI. Alors, comment puis-je écrire: ** LATA = rwCoil_000x ** ?? Je devrais être au courant quand faire ça ?? Pouvez-vous guider un peu plus à ce sujet ??? L'IHM envoie un paquet de requête à lire/écrire de manière aléatoire dans le cas de chaque registre. – skg

+0

Je ne comprends pas le problème.Même si vous ne savez pas * quand * l'IHM fera une écriture, elle * fera * une écriture, c'est donc quand vous mettez à jour la valeur de sortie via le registre LATx. Si cela n'a pas de sens, j'assume à tort votre configuration matérielle et vous devez l'expliquer. –

0

Si vous souhaitez généraliser sur de nombreux ports différents, vous pouvez créer un tableau de références volatiles à * PORT.

Je l'ai fait une fois pour l'inverse, les sorties, registres LAT, voir Using an array of LATs to toggle outputs. type of (byte) pointer to lat

+0

J'ai vu votre lien. Juste une chose ... ** et LATA ** ont-ils fonctionné dans votre cas? Moyens Comme un tableau de structure, si je l'écris comme ** {1, & LATA} **, il devrait être écrit au PortA chaque fois qu'une demande a été envoyée par HMI ?? – skg

+0

Non, vous avez besoin du système de bitmask. les nombres de bits ne fonctionnent pas, c'est ce que j'ai essayé à l'origine avec la routine asm et ce n'est pas rapide. PORTA est pour la lecture BTW. –