
PIC18F25K22 - Timer, Nested interrupts och annat
- lillahuset
- Gått bort
- Inlägg: 13969
- Blev medlem: 3 juli 2008, 08:13:14
- Ort: Norrköping
- 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
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.
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;
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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);
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);
Re: PIC18F25K22 - Timer, Nested interrupts och annat
> 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...
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...
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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!
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!
- 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
@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?
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?
Re: PIC18F25K22 - Timer, Nested interrupts och annat
> 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.
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.
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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:
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:
Ä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.
En switch(X) blir ju "i verkligheten" till en:
Kod: Markera allt
if(X == Värde_1)
{
}
else if(X == Värde_2)
{
}
osv.
Exempel:
Kod: Markera allt
switch(XXX)
{
case 0:
A++;
break;
case 1:
B++;
case 2:
C++;
}
Ä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.
- 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
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.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...
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!
Re: PIC18F25K22 - Timer, Nested interrupts och annat
> 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...
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...