Port Pin und Tabelle

OP #3800642
Lesenswert?

hei,

MPLAP 8.84  C18  PIC18F46K22

wird wahrscheinlich schlecht formuliert sein.

besteht eine Möglichkeit, verschiede Port Pin, die an unterschiedlichen 
Ports und unterschiedlichen Bits, per Table öder ähnliches anzusprechen.

Beispiel:

1)   0b00001000  (Bit 3)  ==  LATAbits.LATA3

2)   0b00000100  (Bit 2)  ==  LATDbits.LATD2

habe im meinem Code alles andere mit Masken am laufen, was einwandfrei 
funktioniert.
  die gefragte Option würde alles weitere flexibel gestalten und mir 
viel Code sparen.



schönen Tag
#3800718
Lesenswert?

Hier mal eine Routine für den AVR. Mit kleinen Anpassungen sollte sie 
auch auf dem PIC laufen.
1
#include <avr/io.h>
2

3
enum REGNO { REG_IN, REG_DIR, REG_OUT };
4
enum ACTION { PIN_READ, PIN_SET, PIN_CLEAR };
5

6
volatile uint8_t *ports[] = { &PINA, &PINB, &PINC, &PIND, &PINE, 
7
                              &PINF, &PING, &PINH, &PINJ, &PINK, &PINL };
8

9
uint8_t bitmask[] = { 1, 2, 4, 8, 16, 32, 64, 128 };
10

11
int8_t debugport( uint8_t portno, uint8_t regno, uint8_t bitno, uint8_t action )
12
{
13
  uint8_t mask = bitmask[bitno];
14
  volatile uint8_t *ptr = ports[portno];
15
  
16
  if( portno >= sizeof(ports) / 2 )
17
    return -1;
18
  if( ptr == 0 )
19
    return -1;
20
  if( bitno >= 8 )
21
    return -1;
22
  if( regno >= REG_OUT )
23
    return -1;
24
  ptr += regno;
25
  
26
  switch( action ){
27
    case PIN_READ:  return !!(*ptr & mask);     // 0 or 1
28
    case PIN_SET:   *ptr |=  mask; return 0;    // 0 = success
29
    case PIN_CLEAR: *ptr &= ~mask; return 0;
30
  }
31
  return -1;                                    // -1 = error
32
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren