PIC18F25K22 - Timer, Nested interrupts och annat

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 är en korrekt tolkning. :D
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 »

Den här frågan borde nog placeras under Programmering men tar det här ändå. Vet inte riktigt hur jag ska ställa frågan så ni förstår vad jag är ute efter men gör ett försök.

Nedan är några rader kod och kommenteringen lär väl vara ganska avslöjande även fast man inte sitter i MicroC.
Min undrar är om dessa 8 rader ska upprepas, kanske 20 gånger men med olika utgångar, vad finns det för alternativ att lösa det här på?

Det första som slog mig vara använda switch case och placera varje kombination i ett case. Känns det som rätt väg att vandra?
Har också funderat på om det går att lösa med makron men lite osäker på om det ens fungerar.

Kod: Markera allt

             TRISC.B4 = 0;                // Ställer om från ingång till utgång
             TRISC.B5 = 0;
             LATC.B4 = 1;                 // Sätter utgång hög
             LATC.B5 = 1;
             TRISC.B6 = 0;                // Ställer om från ingång till utgång
             TRISC.B7 = 0;
             LATC.B6 = 0;                 // Sätter utgång låg
             LATC.B7 = 0;
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 46963
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: PIC18F25K22 - Timer, Nested interrupts och annat

Inlägg av TomasL »

I MPLAB kan du sätta hela porten med en enda rad, typ
TRISA=0b01010101;
För pic32 blir motsvarande
PORTSetPinsDigitalOut(IOPORT_E, BIT_0 | BIT_1 | BIT_2 | BIT_3 | BIT_4 | BIT_5 | BIT_6 | BIT_7);
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 »

> Känns det som rätt väg att vandra?

Att göra vadå? Använda en switch/case? Tja, ifall programlogiken
passar för en switch/case så är det väl rätt väg...
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 »

switch() är för att välja "1 av x" och har inget med detta att göra.

Men om du vill göra en konfigurering av alla portar vid uppstart klurar du såklart ut vilken väg varje portpinne ska gå (in/ut) och sedan startvärdet (0/1) och skriver alla bits till samma port i samma skrivning. Mycket mer tid och minneseffektivt!
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 »

@TomasL och Icecap:
I MicroC så kan man också skriva tex TRISA = 0b00011001 för att sätta en hel port och genom att göra det så skulle just dom 8 raderna kunna komprimeras till 4. Visst kan man utföra samma sak på bara 2 rader i och med det är samma port jag är och gräver i men i detta fall är det viktigt att det händer i just den här ordningen. Det här är inte heller under uppstarten utan ska utföras under programmets gång.

Men nog om detta. Det är inte det här jag undrar över.

Ska göra ett nytt försök.
Jag har 20 olika portkonfigurationer som kommer att användas under programmets gång. Switch() fungerar nog för att skifta mellan dessa men finns det fler sätt, som tex makro?
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 »

> I MicroC så kan man också skriva tex TRISA = 0b00011001...

Ja, om du vet hur alla *8* bitarna ska sättas. om du inte vet det
så måste du läsa AND/OR och skriva tillbaka. D.v.s. i princip samma
sak som bit operationerna gör...

I assembler skulle jag göra ett macro som tar några parametrar
för aktuella bitar och värde. I (käll-) koden blir det sedan lite renare
med en enda rad per "anrop". I slutkoden blir det som om det hade
skrivits varje gång. Fördelen är att det bli inline utan extra CALL.

Beroende på vilka skillnader det är mellan de 20 olika varianterna
så kanske det kan bli några olika macron med färre parametrar.
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 »

Om du ska ändra portkonfigurationen dynamisk, alltså programmet ändrar det medan det kör, kan switch() vara en helt OK lösning.

En switch(X) blir ju "i verkligheten" till en:

Kod: Markera allt

if(X == Värde_1)
  {
  }
else if(X == Värde_2)
  {
  }
osv.
Den kan bara vara snyggare att läsa och om man INTE placerar break; mellan två case: "faller den igenom" så att man kan återvinna lite kod.

Exempel:

Kod: Markera allt

switch(XXX)
  {
  case 0:
    A++;
    break;
  case 1:
    B++;
  case 2:
    C++;
  }
Är XXX 0 blir A räknat upp ett steg.
Är XXX 1 blir B räknat upp ett steg och då det saknas en "break;" kommer även C att räknas upp ett steg.
Är XXX 2 blir C räknat upp ett steg.

Detta kan man använda ibland om man vill.

Men om man har så många portkonfigurationer som ska utföras dynamisk hade jag nog gjort en tabell och hämtat värden i den till de olika konfigurationer.

Men det känns som att du mer fokuserar på fina programfunktioner än funktionalitet.
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 »

sodjan skrev:> I MicroC så kan man också skriva tex TRISA = 0b00011001...

Ja, om du vet hur alla *8* bitarna ska sättas. om du inte vet det
så måste du läsa AND/OR och skriva tillbaka. D.v.s. i princip samma
sak som bit operationerna gör...
Anledningen till varför jag valde att enbart röra enkla bitar, speciellt då det bara är 4 bitar vid varje konfiguration som ska ställas om, är just för att inget annat kommer ställa om portarna förutom dessa "20 konfigurationer". Jag tänkte på att AND/OR:a hela registren men fått för mig att det tar mer tid än att göra som jag gjort.
Tror jag bara rör till det ännu mer nu men som sagt, den här biten tror jag att jag behärskar bra nog.

Det verkar som att det går att lösa med makron också då men får se om jag förstår hur. Ska läsa lite om det.

@Icecap:
Tackar för dina exempel!
I nuläget har jag börjat skriva som ditt första exempel, dvs med if-satser men tycker det blir mindre lätt överskådligt. Vet inte vad du syftar på med "fina programfunktioner", men personligen tycker jag det går hand i hand med funktionalitet.
Det jag försöker göra är att efterfråga olika programfunktioner (då jag inte kan bättre).
Du ger ju ett väldigt bra annat förslag med tabeller. Använde det här när jag skrev till 7-segmentare senast och det är absolut värt att fundera vidare på.

Ska ta och skissa lite på det!
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 »

> Det verkar som att det går att lösa med makron också

C makron eller ASM makron?
Kan man definiera ett makro i C med flera rader?
Det kan man visst...
Då kan du kanske definiera ett makro med
parametrar för det du vill göra, blir effektivare
än en eller ett par funktioner...
Skriv svar