Port Pin und Tabelle

OP #3800642
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
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
Gast
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.