Sida 1 av 1

Söker programmeringstips, XOR på PORTB

Postat: 23 oktober 2006, 06:31:58
av bearing
Det gäller 16F628A.

Jag har två pinnar på PORTB som växlande ska vara var hög resp låg under aktiva tiden i en PWM-period. Under den passiva tiden är TRIS=1 för aktuella pinnar. Innan jag går in i aktiva perioden (Sätter TRIS till 0) vill jag växla pinnarnas värden.

Jag tänkte använda koden: PORTB^=OutTOGGLE; för att få tänkt funktion. OutTOGGLE är en mask som har värdet 0 vid alla bitar utom de aktuella pinnarnas positioner. Det kommer dock inte att funka eftersom PORTB är ingångar som har pullup när TRIS=1;

Har in några tips på hur man kan göra detta snabbt?

Här är den aktuella koden:

Kod: Markera allt

#pragma bit OutA @ PORTB.0
#pragma bit OutB @ PORTB.3

#define OutOFF		0b0000.1001
#define OutON		 0b1111.0110
#define OutTOGGLE	0b0000.1001

bit outMode;
...


...
	if (CCP1IF)	//Sköter pulserandet
	{
		if (outMode==OFF)
		{


			//Detta vill jag göra --------------------------------------------

			PORTB^=OutTOGGLE;

			//-----------------------------------------------------------------

			TRISB&=OutON;	//Sättigång
			
			CCPR1H=pulseWidth.high8;
			CCPR1L=pulseWidth.low8;

			outMode=ON;
		}
		else
		{
			TRISB|=OutOFF;	//Stängav
						
			CCPR1H=pulseDiff.high8;
			CCPR1L=pulseDiff.low8;

			outMode=OFF;
		}

		CCP1IF=0;
	}

Postat: 23 oktober 2006, 07:29:26
av Icecap
Lite tråkigt att du inte anger vilken PIC det gäller, vissa kan man ju använda output-registret på just till sånt.

Postat: 23 oktober 2006, 07:53:16
av bearing
Oj, det försvann visst när tog bort ett stycke. PIC 16F628A.

Postat: 23 oktober 2006, 08:51:40
av Icecap
Ja, det finns ju inte så mycket annat än att strax innan TRIS sätts till 1 får du läsa portens status o spara i en variabel. Då kan du återställa senare när TRIS sätts till 0.

Postat: 23 oktober 2006, 09:47:25
av bearing
OK, det finns inget att sätt alltså.

Jag har tidigare inte förstått varför vissa processorer har 3 st "styr/läs-register" per port, men det förstår jag nu.

Postat: 23 oktober 2006, 10:39:59
av sodjan
> strax innan TRIS sätts till 1 får du läsa portens status o spara i en variabel.

Om du *alltid* gör ändringar på PORTB via ett "skugg-register", så finns
det ingen anledning att först *läsa* PORTB, skugg-registret är ju redan
"rätt".

Sen är det helt rätt, PIC18 (med sitt LATB (output-latch-B)) register gör
detta lite enklare, det kan alltid läsas och man får alltid tillbaka det
som skrev förra gången, oavsett hur pinnarna råkar "stå" just nu...