Söker programmeringstips, XOR på PORTB

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
bearing
Inlägg: 11682
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Söker programmeringstips, XOR på PORTB

Inlägg 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;
	}
Senast redigerad av bearing 23 oktober 2006, 07:57:08, redigerad totalt 1 gång.
Användarvisningsbild
Icecap
Inlägg: 26737
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
bearing
Inlägg: 11682
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg av bearing »

Oj, det försvann visst när tog bort ett stycke. PIC 16F628A.
Användarvisningsbild
Icecap
Inlägg: 26737
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
bearing
Inlägg: 11682
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43267
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar