Japp, som rubriken lyder Behöver jag lite råd/tips på hur jag ska lägga upp koden när PIC:en ska utföra flera olika saker samtidigt.
Ok. Vi säger att PIC:en tex. skall skicka och ta emot meddelanden (eget kodat, dvs. ej typ inbyggt USART, om det nu spelar någon roll i sammanhanget), polla ingångar, osv.
Hur ska man lägga upp koden? Jag har läst på vissa ställen att man kan göra det utan interrupt och på andra ställen med interrupt, men det känns som man vill använda interrupt!? Eller?
(Dock verkar de program utan interrupt inte så tidskritiska, utan är mer periodiskt återkommande rutiner.)
Många säger att när man använder interrupt, så skall man så snabbt som möjligt lämna interruptrutinen, där man bara skall sätta någon variabel , medans andra verkar skriva kod som tar lång tid i interruptet.
Tankar kring detta?
Nu ett exempel:
Jag har gjort både en sändare och mottagare av Manchester-kodade meddelanden.
Det jag inte fattar är hur man gör rutiner som är tidskritiska, utan att skriva iaf lite i interruptrutinen. Om man som jag ska skicka signaler med ca 900us mellan, hur gör man det utanför interruptrutinen?
Så som jag har det nu är att när jag får interrupt på TMR0, så har jag hela sändarkoden i interruptrutinen (typ en state-machine som inte väntar någonstans).
Om man bara hade satt en variabel i interruptrutinen som talar om för main-koden att nu ska du göra något som måste göras direkt!, så går ju inte detta!? Hmmm.
Kom gärna med tips och förslag på hur man skall tackla Multitasking med PIC.
Här är min kod i interruptrutinen för sändaren. (Inte helt klart, men det fungerar):
Kod: Markera allt
void interrupt(void){
// TMR0 overflow interrupt. on TMR0 interrupt TOIF is set.
if(INTCON.T0IF == 1){
TMR0 = 120; // börja att räkna upp till 444us igen.
counter444us = counter444us + 1;
if(counter444us == 2){// när vi har det såhär så dröjer det 889us innan start sekvensen börjar...
counter444us = 0;
switch(nextState){
case StartSequence:
TRISC.F2 = startBits >> counter_in_transmitFkn; //TRISC.F2 = 1 stänger av PWM, dvs vi får en nolla.
counter_in_transmitFkn--;
if(counter_in_transmitFkn < 0){
nextState = data;
counter_in_transmitFkn = 15;
}
break;
case Data:
TRISC.F2 = byte_to_send_encoded_temp >> counter_in_transmitFkn;
counter_in_transmitFkn--;
if(counter_in_transmitFkn < 0){
nextState = StartSequence;
counter_in_transmitFkn = 3;
}
break;
}
} //end if(counter444us == 2)
INTCON.T0IF = 0; // reset flag
}
}