Sida 1 av 1

Hur hantera portar dynamiskt i Hitech PICC

Postat: 4 maj 2013, 18:21:57
av Rick81
Jag behöver mer än två PWM från en PIC18f2620 och håller på med ett lib för att få flera PWM från timer med interrupt.

Jag skulle vilja ha ett snyggt "ej hårdkodat" lib som är lätt att använda i flera projekt.

Ungeför så här vill jag ha det

Kod: Markera allt

PWM_SetNumberOfPWM(4);

PWM_SetPin(0, RA0);
PWM_SetPin(1, RA2);
PWM_SetPin(2, RB0);
PWM_SetPin(3, RC3);


PWM_SetPeriod(0, 100);

PWM_SetValue(0, 20);
PWM_SetValue(1, 30);
PWM_SetValue(2, 40);
PWM_SetValue(3, 50);


void PWM_SetPin(char index, *portPin)   //Ex void PWM_SetPin(0, RA0)
{
	if(index <= NUMBER_OF_PWM)
	{
		pwmStored[i].pin = portPin;	// Ex pwmStored[i].pin  = RA0
		return 1;
	}
	return 0;
}

void NewPeriod()
{
	for(i = 0; i < NUMBER_OF_PWM; i++)
	{
		*(pwm[i].pin) = 1;	// Ex. RA0 = 1
	}

}
Mitt problem är att jag inte vet hur jag ska göra för att kunna hantera portar RA0, RB1.... dynamiskt.

Något tips?

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 4 maj 2013, 20:47:05
av sodjan
Kan du ge ett exempel på vad du menar med "dynamiskt".
Port och pin-nummer är hårdkodade i bit set/clear kommandona,
så där går det inte att göra något "dynamiskt"...

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 10:57:20
av Rick81
Innan har jag gjort så här:
#define PWM1PIN RA0
PWM1PIN = 1

Nu vill jag istället sätta upp port med funktioner för att kunna hantera en array:
PWM_SetPin(0, RA0);

Dvs jag vill ha en pekare till RA0 så nästa gång vill jag tex göra
PWM_SetPin(0, RB5)

I funktionen så används kodraden:
*(pwm.pin) = 1; och då ska RA0 eller RB5 ändras beroende på funktion innan.

Men jag vet inte vilken datatyp jag ska använda

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 11:15:03
av Andax
Du vill ha indirekt adressering till pinnarna i princip?
I värsta fall blir det en loop med en switch-sats i....

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 11:27:32
av sodjan
Ja, eftersom pin-nummer inte är variabel i själva instruktionen
så behöver man ha individuella instruktioner för varje (i förväg)
tänkbar pinne. Kanske t.ex en switch om det gäller C.

Eller för att uttrycka det på ett annat sätt, "port" och "pin" måste
vara kända vid compile-time, det kan inte ändras vid run-time.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 11:30:48
av Icecap
Fast man kan göra det med adress till porten och ett bitmönster - men det är en mycket dålig lösning på ett icke-problem.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 12:11:14
av Micke_s
Case sats och define på vilka portpinnar du använder. Tillsammans med "#ifdef" kan du få rätt så dynamiskt utan att behöva

Kod: Markera allt

#define PWM0 PA0
#define PWM1 PB1


void set_pwm(int num){
   switch(num){
#ifdef PWM0
      case 0:
         PWM0=1;
         break;
#endif
#ifdef PWM1
      case 1:
         PWM1=1;
         break;
#endif
#ifdef PWM2
      case 2:
         PWM2=1;
         break;
#endif
  default:
     //error....
  }
}


Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 12:18:39
av sodjan
Du menar så att man inte inluderar/bygger kod i onödan, så att säga.
Ja, det är ju alltid bra. Sen behövs den en clear_pwm() också... :-)

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 13:11:27
av victor_passe
Jag skulle ha så användaren definar makron liknande de nedan

Kod: Markera allt

#define setPin1(state) LATAbits.LATA4=state
#define setPin2(state) LATAbits.LATA5=state
#define setPin3(state) LATCbits.LATC1=state
osv
Sedan använda följande i libet

Kod: Markera allt

#define setPin(pin,state) setPin##pin(state)
## kan vara bra ibland och den är rätt skum vilket alltid är skoj.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 14:21:44
av Micke_s
Tanken är att få det hyfsat enkelt och du bara behöver ändra på ett ställe.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 14:29:32
av victor_passe
Du behöver bara ändra på övre kodsegmentet

Och du får ha någon #define på antal pinnar.
Du kan inte få det enklare, du måste definiera vilka pinnar och hur många.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 14:44:30
av Micke_s
Fördelen att kunna ange ett pin nr är att du kan använda dessa i en for loop t.ex.

Re: Hur hantera portar dynamiskt i Hitech PICC

Postat: 5 maj 2013, 18:20:49
av victor_passe
Ja, du använder setPin(pin,state) för att adressera pinnarna.
Jag förstår inte vad problemet är.