2011-03-31 3 views
0

En raison de limitations de conception, j'ai une ligne d'adresse pour un contrôleur de mémoire réparti sur 3 ports différents d'un PIC 18F4550. Cartographie:PIC18 Lecture/écriture de données lors de la division entre les ports

#define A0 PORTBbits.RB2 
#define A1 PORTBbits.RB3 
#define A2 PORTBbits.RB4 
#define A3 PORTBbits.RB5 
#define A4 PORTAbits.RA0 
#define A5 PORTAbits.RÄ1 
#define A6 PORTAbits.RÄ2 
#define A7 PORTAbits.RÄ3 
#define A8 PORTAbits.RÄ4 
#define A9 PORTAbits.RÄ5 
#define A10 PORTEbits.RE0 
#define A11 PORTEbits.RE1 
#define A12 PORTEbits.RE2 

Je voudrais accéder à ce que une variable seule adresse, et ont essayé d'utiliser un syndicat pour le faire, mais simplement obtenir une « erreur de syntaxe » avec:

union 
{ 
     struct 
     { 
      A0 :1; 
      A1 :1; 
      A2 :1; 
      A3 :1; 
      A4 :1; 
      A5 :1; 
      A6 :1; 
      A7 :1; 
      A8 :1; 
      A9 :1; 
      A10 :1; 
      A11 :1; 
      A12 :1; 
     }; 
} ADDRESS; 

Comment est-ce que je vais faire ça?

+0

Non, cela ne va pas fonctionner - vous ne pouvez pas utiliser un syndicat pour le faire. Quelle que soit la solution que vous avez trouvée, j'ai peur que ça devienne laid. Vous aurez probablement besoin d'une ou plusieurs macros ou fonctions pour convertir entre les adresses et les différents bits de port. –

+0

Ok, comme je le soupçonnais, un peu de décalage et de masquage seront nécessaires. Je vais y aller demain et poster une réponse. –

Répondre

0

Ce ne sera pas vraiment facile si les E/S que vous utilisez sont hachées dans plusieurs ports.

La seule simplification que vous pouvez faire est de gérer votre mémoire dans les pages consultées par trois morceaux d'adresses différentes:

lowAddr will be RB2:RB5 
midAddr will be RA0:RA5 
highAdd will be RE0:RE2 

Il aurait été préférable d'avoir le plus gros morceau pour une partie basse adresse pour les pages de mémoire peuvent être plus grand. Ici vous aurez seulement 16 pages d'octets. Par conséquent, vous pouvez définir une structure de champ de bits pour gérer votre mémoire en une seule variable.

struct { 
    uint16 lowAddr : 4; 
    uint16 midAddr : 6; 
    uint16 highAddr : 3; 
    uint16 : 3; 
} memoryAddr; 

De cette façon, vous pouvez gérer plus efficacement la mise à jour du port comme pour PortB:

LATB &= 0xFF^(3 << 2); 
LATB |= memoryAddr.lowAddr << 2; 
+0

J'écris normalement directement sur PORTB, quel avantage y a-t-il à utiliser les registres LATB? –

+0

@Ali vous trouverez une bonne réponse à cette question sur le lien suivant: http://stackoverflow.com/questions/2623428/difference-between-port-and-latch-on-pic-18f – greydet

Questions connexes