Sida 1 av 1

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

Postat: 25 maj 2009, 20:04:40
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.)

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

Postat: 25 maj 2009, 20:09:22
av Scorpiion
Intressant resonemang :)

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

Postat: 25 maj 2009, 20:33:43
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).

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

Postat: 26 maj 2009, 17:14:37
av JimmyAndersson
Trevlig läsning. Tackar. :tumupp: :)