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.