Assembler (PIC): Tankar om #define och uppdelade portar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Assembler (PIC): Tankar om #define och uppdelade portar

Inlägg av JimmyAndersson »

(Assembler, MPLAB, PIC18F1320.)
Jag har inget specifikt problem, utan är bara rent nyfiken på en grejj i syfte att få lite inspiration och kunskap. :)

Låt säga att man inte har tänkt till när man bestämde vart de olika in/utgångarna på en PIC ska anslutas till, så att det har "blivit" såhär:
PORTB.0 = utgång.
PORTB.1 = ingång.
PORTB.2 = utgång.
PORTB.3 = utgång.
och sedan PORTB.4 - PORTB.7 som ingångar.

Om jag inte förstått fel så går det inte att göra såhär:

Kod: Markera allt

	#define		UTDATA, 0		PORTB, 0
	#define		INDATA, 0		PORTB, 1
	#define		UTDATA, 1		PORTB, 2
	#define		UTDATA, 2		PORTB, 3
        osv...
Istället får man rätta till det senare i koden om man vill ha bitarna för TEST i rätt ordning.

Men om man nu har tänkt till lite och placerat in/utgångarna på ett sätt som gör #define-delen lite vettigare. T.ex såhär:

PORTB.0 = utgång.
PORTB.1 = utgång.
PORTB.2 = utgång.
och PORTB.3 - PORTB.7 som ingångar.

Då blir #define-delen smidigare:

Kod: Markera allt

	#define		UTDATA		PORTB

men vad händer här:

	#define		INDATA_A		PORTB, 3
	#define		INDATA_B		PORTB, 4
	#define		INDATA_C		PORTB, 5
        osv...
. . .
       movlw                b'11111000'
       movwf               TRISB
. . .
och låt säga:

       movlw                h'FF'
       movwf                UTDATA

Jag tycker det ser lite rörigt ut att UTDATA verkar vara definierat till hela PORTB vid en första anblick.
De två sista raderna skriver ju i själva verket inte 11111111 utan snarare xxxxx111 till PORTB.
Nu var h'FF' bara ett exempel. I en "riktig" kod hade det varit mer överskådligt att skriva h'07' (eller b'00000111') istället.


Nu har jag som sagt ingen specifik fråga. Jag är bara lite nyfiken på om man helt enkelt brukar/bör göra såhär när en port är uppdelad till in/utgångar som går till olika delar i en krets. (T.ex LCD-display och ett gäng knappar, för att ta ett vanligt fall.)
Scorpiion
Inlägg: 380
Blev medlem: 24 januari 2008, 20:56:06
Ort: Umeå

Re: Assembler (PIC): Tankar om #define och uppdelade portar

Inlägg av Scorpiion »

Intressant resonemang :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Assembler (PIC): Tankar om #define och uppdelade portar

Inlägg av sodjan »

> #define UTDATA PORTB

OK, så "UTDATA" kan användas på samma sätt som "PORTB" i koden.
Det är princip samma sak. Och jag tror att det står "PORTB" överallt
i LST filerna där du använder "UTDATA"...

> #define INDATA_A PORTB, 3

Helt OK, bara ett "kortnamn" för din ingångar.

> movlw b'11111000'
> movwf TRISB

Helt OK.

> movlw h'FF'
> movwf UTDATA

OK, sätter PORTB till h'FF'. Vad som händer på själva *pinnarna*
beror sedan på TRISB.

> De två sista raderna skriver ju i själva verket inte 11111111 utan snarare xxxxx111 till PORTB.

Nej, du skriver h'FF' till PORTB. Om du däremot *läser* från PORTB så är det inte
säkert att du får h'FF' tillbaka. Om du däremot först sätter alla pinnar till utgångar
så får du det (och alla pinnarna blir "höga". Notera att när man läser från PORTB så
läsar man alltid *pinnen*. Och pinnarna kan antingen drivas extert (=ingång) eller
från PORTB (=utgång).
Användarvisningsbild
JimmyAndersson
Inlägg: 26586
Blev medlem: 6 augusti 2005, 21:23:33
Ort: Oskarshamn (En bit utanför)
Kontakt:

Re: Assembler (PIC): Tankar om #define och uppdelade portar

Inlägg av JimmyAndersson »

Trevlig läsning. Tackar. :tumupp: :)
Skriv svar