Forum: Mikrocontroller und Digitale Elektronik Port Pin und Tabelle


von L. R. (keyboard)


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

von Karol B. (johnpatcher)


Lesenswert?

L. R. schrieb:
> Beispiel:
>
> 1)   0b00001000  (Bit 3)  ==  LATAbits.LATA3
>
> 2)   0b00000100  (Bit 2)  ==  LATDbits.LATD2

Und wie soll zwischen verschiedenen Ports (A und D) unterschieden 
werden? Zumindest das müsstest du doch mit in die Tabelle aufnehmen, 
oder verstehe ich deine Frage komplett falsch?

Mit freundlichen Grüßen,
Karol Babioch

von Amateur (Gast)


Lesenswert?

Probiers mal mit:
0b00001000  (Bit 3)  &=  LATAbits.LATA3

von PicPaul (Gast)


Lesenswert?

Vielleicht als Unterprogramm:

Tab     equ     H'00'
Bit2    equ     2
Bit3    equ     3

Ausg    btfss   Tab,Bit3
        bcf     LATA,Bit3
        btfsc   Tab,Bit3
        bsf     LATA,Bit3
        btfss   Tab,Bit2
        bcf     LATD,Bit2
        btfsc   Tab,Bit2
        bsf     LATD,Bit2
        return  0

von Peter D. (peda)


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
}

von L. R. (keyboard)


Lesenswert?

hei,

danke für die Info.

schönen Tag

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.