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
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 | }
|
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.