PIC18F25K22 - Timer, Nested interrupts och annat

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Korvspadet klarnar så sakteligen :)

Nu kommer det en kluring tror jag.
När jag testade mitt första program så kopplade jag skopet på RC4, 5, 6 och 7. Gjorde detta för att försäkra mig om att någon av dessa aldrig ställdes hög innan jag själv ville det.
Lite brydd blev jag när RC6 och 7 gjorde det precis vid uppstart. Pulsen varade 1,5µs och var bara en ensam puls som sedan gick låg.
Som ni förstår misstänkte jag direkt min runskrift så jag kommenterade bort alla interrupts och övrig kod så det enda som var kvar var init();. Detta är alltså det enda som fanns inom main och while-loopen, men pulsen kvarstod.

Jaha, då händer det alltså något inom init() som gör detta. Nedan ser ni hur den ser ut. Först stänger jag alltså av dom analoga funktionerna i PORTA och C. Sedan ställer jag dessa portar till utgångar. Slutligen ställs vissa I/O:s som ingångar.

Jag misstänkte att pulsen kommer när jag ställer TRISC som utgång och mycket riktigt, efter att kommenterat bort detta så försvann pulsen.

Frågan är: Finns det ett speciellt flöde man brukar följa för att "lösa" sånt här? Jag har någonstans i bakhuvet att jag fått rådet innan att det är lättare att först ställa hela registret till 0 och sedan enabla de utgångar jag önskar separat.
Finns det just i det här fallet något jag kan göra för att just RC6 och 7 inte ska gå hög?
Måste tyvärr iväg men det som står på min lista, som jag inte provat än, är att innan TRIS-registren sätts till utgångar så skriver jag 0 till alla relevanta LATx-register. Tror ni det kommer hjälpa?

Kod: Markera allt

void init()
     {
     PIE1.TMR2IE = 1;                // Enable TMR2 overflow interrupt
     PIE2.TMR3IE = 1;                // Enable TMR3 overflow interrupt
     PIE1.TMR1IE = 1;                // Enable TMR1 overflow interrupt
     
     RCON.IPEN = 1;                  // Enable interrupt priority
     INTCON.GIE = 1;                 // Enable global and high prio interrupts
     INTCON.PEIE = 1;                // Enable peripheral and low prio interrupts

     IPR1.TMR2IP = 0;                // TMR2 overflow interrupt has low prio
     IPR2.TMR3IP = 1;                // TMR3 overflow interrupt has high prio
     IPR1.TMR1IP = 0;                // TMR1 overflow interrupt has low prio
     
     OSCCON = 0b01111000;            // 16 MHz, HFINTOSC
     OSCTUNE.PLLEN = 1;              // 4 x PLL = 64 MHz
     T1CON = 0b00010011;             // TMR1 enabled and use instruction clock, 1:2 prescaler, 16-bit timer
     T3CON = 0b01000100;             // TMR3 disabled and use system clock, 1:1 prescaler, 2 x 8-bit timer
     TMR1H = 255;                    // preset for timer1 MSB register
     TMR1L = 241;                    // preset for timer1 LSB register
     T2CON = 0b00000001;             // TMR2 disabled (B2), 1:4 prescaler, 1:1 postscaler
     PR2 = 60;                       // TMR2 match value. Interrupt at 15us and 66'666,67Hz
     
     ANSELA = 0;                     // Disable analog function for port A
     ANSELC = 0;                     // Disable analog function for port C
     TRISA = 0;
     TRISC = 0;
     TRISA.B2 = 1;
     TRISA.B3 = 1;
     TRISC.B4 = 1;
     TRISC.B5 = 1;
     TRISC.B6 = 1;
     TRISC.B7 = 1;

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

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av sodjan »

> Frågan är: Finns det ett speciellt flöde man brukar följa för att "lösa" sånt här?

Att sätta porten så som du vill ha den *innan* man sätter TRISx.

> Tror ni det kommer hjälpa?

Högst sannolikt.

En annan lösning då man har ansluten utrustning (t.ex MOSFET med
motorer eller annat som inte får "falsk-triggas") är extern pull-down som
ser till att hålla linjen låg innan processorn *aktivt* driver den hög.

Utgångs latcharna (LATx registren) är "undefined" efter power-on.
Det brukar markeras med ett "u" i dokumentationen för registren.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Fasen vad skönt när det finns förklarliga själ till allt :tumupp:
Precis som du säger så var samtliga LATx-registren "undefined" från POR/BOR. När jag satte dessa till 0 innan TRISx sattes till utgång så försvann den irriterande pulsen.

Glömde nämna det i förra inlägget men pulldown hade jag redan monterat då jag testade detta helt utan belastning och ville få en ren signal.

Tack för hjälpen. Nu ska jag vara tyst ett tag.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Nej ni får stå ut med mig och mina korkade frågor en stund till.
Är det någon som vet varför inte OSCCON.HFIOFS flaggar när man kör med 4xPLL?

Den flaggan ska man få när den interna oscillatorn är stabil och pga lite tidskritiska anledningar så valde jag att använda den för att få igång while-loopen, så här: while(OSCCON.HFIOFS){etc etc}

Loopen kommer verkligen inte igång.
Funderat och sökt i databladet men finner inget skrivet om det. Missar jag något igen?
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46964
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av TomasL »

Inte en aning, men hittade detta i databladet:
When the IRCF bits and the INTSRC bit are all clear,
the INTOSC output (HFINTOSC/MFINTOSC) is not
enabled and the HFIOFS and MFIOFS bits will remain
clear. There will be no indication of the current clock
source.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Hmm nja... INTSRC är clearad men inte IRCF-bitarna så detta borde inte gälla mig.
Den kanske helt enkelt inte är stabil? Matad från PICKit2:an.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av sodjan »

> When the IRCF bits and the INTSRC bit are all clear,

Det betyder att man kör på 32 KHz LFINTOSC oscillatorn,
vilket sannolikt inte är fallet.

En annan sak:
"When the HFINTOSC is selected as the primary clock, the main system clock
can be delayed until the HFINTOSC is stable. This is user selectable by the
HFOFST bit of the CONFIG3H Configuration register. When the HFOFST bit
is cleared, the main system clock is delayed until the HFINTOSC is stable.
When the HFOFST bit is set, the main system clock starts immediately."

Du kan testa att cleara HFOFST i CONFIG3H och se om den ändå startar.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Hmm, och sen fortsätter texten med:

"In either case, the HFIOFS bit of the OSCCON register
can be read to determine whether the HFINTOSC is
operating and stable."


Provade för skoj skull att ha kvar snabbstart (HFOFST = 1) av HF-oscillatorn , och i while(1) låta HFIOFS-biten tända en LED.
Lutade mig tillbaka men den kom aldrig på.. Eller ja, tänker inte vänta mer än 30 sekunder på att den ska starta upp :)
Gjorde då enligt ditt tips och deaktivera snabbstarten och jajamensan, funkar klockrent, rent ut sagt.

Det jag inte förstår är att det känns som om det är omvänt, eller?
Enligt ditt urklipp så läser jag det som att om jag deaktiverar snabbstarten (HFOFST = 0) så kommer systemklockan vänta tills oscillatorn är stabil. Samt att om den är aktiverad så vevar systemklockan igång direkt, oberoende om oscillatorn är stabil eller ej.

Nu kanske man inte ska göra en höna av fjäder men försöker förstå hur det hänger ihop.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Tänkte kolla om någon har lust att hjälpa mig med ett bitvis operation (eller vad det heter?)?

Skulle vilja jämföra vilket som tar längst tid att utföra; en if-sats kontra en bitvis operation som kommer till samma resultat.

Jag har en variabel (var1) som är en byte stor och om värdet är högre än 92 (0101 1100) så sätter man var2 till ett nytt värde.
En if-sats hade väl typ sett ut som if(var1 >= 92) {var2 = nytt_varde;}
Frågan är väl, går det ens att göra det här effektivare? Värdet 92 kommer ej ändras under programmets gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av lillahuset »

Det där borde kompileras till högst fem instruktioner. Är det för mycket?
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Kan prova att kompilera i kväll och kolla men om det går att minska vore jag glad. Antagligen har jag lite marginal när jag räknar över hela funktionen men ville ändå höra med er som kan det här.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av lillahuset »

Är det en operation som ska utföras VÄLDIGT ofta? Annars finns det säkert annat som det lönar sig bättre att optimera.
Användarvisningsbild
Magnus_K
EF Sponsor
Inlägg: 5854
Blev medlem: 4 januari 2010, 17:53:25
Ort: Skogen mellan Uppsala-Gävle

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Magnus_K »

Jo förhållandevis ofta men utmaningen ligger i att försöka utföra lite saker under en 1us.
Egentligen är det redan löst men jag kikar på att klämma in lite till, som detta.
Användarvisningsbild
Icecap
Inlägg: 26647
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av Icecap »

Magnus_K: ett sätt är att kolla assembler koden som kompilern gör - men jag tror att du får svårt vid att trimma den signifikant.

Frågan är: är den en operation som utförs ofta?

Om det "bara" är en "jahopp, nu hände det så jag får väl markera" är det ju en sak.
Men om det är en "Fan, det hände! Nu gäller det att vara snabb så att uträkningen blir rätt" är det en annan sak.

Så vilket är det?

Sedan ska du akta dig för 80-20 regeln. Den handlar om att man kan lägga 20% ork/tid/pengar på rätt grej att optimera och få 80% utbyte. Men väljer man fel grej att optimera kostar det 80% och ger 20%.

Just denna regel är orsaken till dessa frågor.
Senast redigerad av Icecap 2 oktober 2015, 10:41:07, redigerad totalt 1 gång.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av lillahuset »

Jo PIC kan ju vara lite utmanande om tidshorisonten är 1us. I mitt nuvarande projekt tar en av interruptrutinerna ~160ns. Det är ca 30 instruktioner i den CortexM4 jag använder. :badgrin:
Skriv svar