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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.