Hur hantera portar dynamiskt i Hitech PICC

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Hur hantera portar dynamiskt i Hitech PICC

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

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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"...
Rick81
Inlägg: 755
Blev medlem: 30 december 2005, 13:07:09

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg av Andax »

Du vill ha indirekt adressering till pinnarna i princip?
I värsta fall blir det en loop med en switch-sats i....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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.
Användarvisningsbild
Icecap
Inlägg: 26650
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Hur hantera portar dynamiskt i Hitech PICC

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

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

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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å... :-)
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg av Micke_s »

Tanken är att få det hyfsat enkelt och du bara behöver ändra på ett ställe.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg 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.
Användarvisningsbild
Micke_s
EF Sponsor
Inlägg: 6741
Blev medlem: 15 december 2005, 21:31:34
Ort: Malmö

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg av Micke_s »

Fördelen att kunna ange ett pin nr är att du kan använda dessa i en for loop t.ex.
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Hur hantera portar dynamiskt i Hitech PICC

Inlägg av victor_passe »

Ja, du använder setPin(pin,state) för att adressera pinnarna.
Jag förstår inte vad problemet är.
Skriv svar