PIC18F25K22 - Timer, Nested interrupts och annat

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
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 »

Beror lite på vad man menar med "PIC". En PIC32 kör upp
till 200 MHz core frekvens och hinner med ganska mycket
på 160 ns. Ska man jämföra så ska man jämföra liknande
arkitekturer med samma användningsområden, annars är
det lite meningslöst.
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 »

> if(var1 >= 92) {var2 = nytt_varde;}

På en 16F1938 med XC (free version) blir det:

Kod: Markera allt

   383                           ;main.c: 209: if(var1 >= 92) {var2 = 123;}
   384                           
   385                           ;incstack = 0
   386                           ; Regs used in _main: [wreg+status,2+status,0+pclath+cstack]
   387  016A  305C               	movlw	92
   388  016B  0020               	movlb	0	; select bank0
   389  016C  025C               	subwf	main@var1,w
   390  016D  1C03               	skipc
   391  016E  2973               	goto	l759
   392  016F  307B               	movlw	123
   393  0170  00DA               	movwf	??_main
   394  0171  085A               	movf	??_main,w
   395  0172  00DB               	movwf	main@var2
   396  0173                     l759:	
Kanske att man kan handtrimma bort ett par instruktioner på rad 393 och 394.
Och MOVLB ifall man vet att man ligger i rätt bank, kan gå att få kompilatorn
att fixa det med "near unsigned char...". Kan bli lite annorlunda på en PIC18...
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 »

Visst är det så. Helt olika "djur". Jag bara tog upp det som ett exempel.
Lite kul att du tog upp PIC32, jag har övervägt att börja använda den. Med tanke på att den har CTMU.
Vi avhandlade det i en tidigare tråd och jag har för mig att du använde ordet "fånig" om mig när jag skrev att jag kunde tänka mig en PIC32 för att minimera lidandet. Gör mig absolut inget. :)

Din kompilerade kod dök upp medans jag skrev. Ajajaj, lite ont gör det... Minnesbankar är väl den klassiska PICens största svaghet. Det får 8086 att verka helt rimligt.
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 »

Ja, det är en "feature" som många pekar finger mot. Men som allt annat
så måste det vägas tillsammans med arkitekturen för övrigt. T.ex så har
PIC16F1xxx hela RAM dels adresserad på den traditionella sättet, dels
adresserat som en linjär och kontinuerlig adress rymd utan "bankning".

Sen så är det ju en jäkla fördel att ha samma adresseringsmetod till *allt*
Allt minne och alla register för enheter ligger i samma adressrymd och
adresseras på samma sätt med samma instruktioner. Jämför t.ex. med
AVR där det finns 3 eller 4 olika adressrymder för RAM och register med
olika instruktioner beroende på var det ligger. PIC har *en* "set bit" medan
AVR har minst två olika "set bit". Och en stor del av AVR minnet stöder
enbart "load/store", ingenting annat. På en PIC kan man göra "bit set"
över hela 512 eller 1024 bytes minnet (eller hur mycket man nu har), på
en AVR är det väl enbart de 16 eller 32 s.k. "register" som stöder "bit set".

Därför har en PIC16F1xxx 49 unika instruktioner medan en AVR har över
150 unika instruktioner (som gör i princip samma sak) p.g.a. arkitekturen
och dubbleringen av instruktioner.

Så det går inte att lyfta ut en enstaka egenskap som t.ex bankningen och låta
den vara helt avgörande, man måste titta på hela arkitekturen... :-)
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 »

Visst är det så. Men man kan väl ändå få tycka att den klassiska PIC-arkitekturen, precis som 8086, suger. :D
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 »

Att många klassiska arkitekturen "suger" är ju ointressant idag.
Lite som att bedöma Volvo S80 utifrån att man hade en Amazon.
Man kommer bara att upplevas som oinformerad och som en fåntratt.

Därför är ditt inlägg om CortexM4 i just *denna* tråd enbart löjligt
och tillför inte ett smack för att lösa ursprungsfrågan.
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 »

Lugn och fin nu sodjan. Det var inte meningen att trampa på ömma tår.
Jag bara gav ett exempel och du kontrade med PIC32.
När det gäller ursprungsfrågan tycker jag nog jag har bidragit en del. Min CortexM4 är väl ungefär lika relevant för ursprungsfrågan som din PIC32 eller AVR. :)

Den klassiska PIC-arkitekturen var utmärkt för sin tid. Problemet är att Microchip har skapat en "kludge" i senare generationer. Valet att basera PIC32 på MIPS var klokt.
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 »

Vilket jävla larv...

Att jag nämnde PIC32 var enbart för att försöka förklara (helt bortkastat
uppenbarligen) varför CortexM4 var helt off-topic från början.

Du har en jäkla förmåga att stöka till trådar, det är ju inte första gången.
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 »

Ber så hemskt mycket om ursäkt. Det var inte meningen. :(
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 »

Helt OK. Det blev lite hetsigt där...
Det är ju fredag e.m, så nu tar vi det lugnt... :-)
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 »

Bra så.
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 »

Icecap skrev: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.
Den assembler-koden jag får fram syns nedan. Spontant känns det som att ni har väldigt rätt. Det här går inte banta så mycket mer.

Vad jag håller på med är när en puls (som är 1 µs lång) kommer på en pinne så verifierar jag så den verkligen är där (genom att polla pinnen tror jag det heter). I nuläget pollar jag bara en gång men jag överväger att blanda in A/D-omvandling och var då nyfiken på om det gick att göra något åt en sån här enkel manöver för att spara tid.
Det fungerar bra som det är nu men att lägga in A/D-pollning (komparator) kan göra det mycket mer pålitligt.
Så det här är lite mer: "Fan, det hände! Eller var det falsklarm, vi kollar en gång till. Japp, ta action!".

Det var inte mening att det skulle bli stor grej, tänkte bara kolla om ni hade något fiffigt sätt.

Antagligen jobbar jag efter 90-10 regeln, åt helt fel håll :)
sodjan skrev:> if(var1 >= 92) {var2 = nytt_varde;}

På en 16F1938 med XC (free version) blir det:

Kod: Markera allt

   383                           ;main.c: 209: if(var1 >= 92) {var2 = 123;}
   384                           
   385                           ;incstack = 0
   386                           ; Regs used in _main: [wreg+status,2+status,0+pclath+cstack]
   387  016A  305C               	movlw	92
   388  016B  0020               	movlb	0	; select bank0
   389  016C  025C               	subwf	main@var1,w
   390  016D  1C03               	skipc
   391  016E  2973               	goto	l759
   392  016F  307B               	movlw	123
   393  0170  00DA               	movwf	??_main
   394  0171  085A               	movf	??_main,w
   395  0172  00DB               	movwf	main@var2
   396  0173                     l759:	
Kanske att man kan handtrimma bort ett par instruktioner på rad 393 och 394.
Och MOVLB ifall man vet att man ligger i rätt bank, kan gå att få kompilatorn
att fixa det med "near unsigned char...". Kan bli lite annorlunda på en PIC18...
Tack för att du tog dig tid.
Jag tryckte in if-satsen i min main-loop och nedan ser du vad jag fick ut. Kompilerat med gratisversionen av "MicroC Pro for PIC" och PIC18F25K22.
Har jag missat att ta med något? Lite svårt när jag inte förstår ett ord från koden.

Kod: Markera allt

L_main10:
0x0136        0xA4D3              BTFSS       OSCCON, 2 
0x0138        0xD030              BRA         L_main11
130 ::                 			   if(val1 >= 92) {
0x013A        0x0E5C              MOVLW       92
0x013C        0x5C20              SUBWF       _val1, 0 
0x013E        0xE302              BNC         L_main12
131 ::                 			   val2 = 123;
0x0140        0x0E7B              MOVLW       123
0x0142        0x6E21              MOVWF       _val2 
132 ::                 			   }
L_main12:
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 »

Magnus_K: Du har en beundransvärd självbild. :tumupp:
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 »

Som du ser så har koderna i princip samma funktion.
Det är lite effektivare kodat i ditt fall, dels p.g.a av "branch"
instruktionen i PIC18 (blir en skip/goto kombo i PIC16) samt
p.g.a. att XC8 "free" gör något extra innan var2 sätts...

Och nej, du kan nog inte göra det effektivare själv...
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 »

lillahuset skrev:Magnus_K: Du har en beundransvärd självbild. :tumupp:
Det där tolkar jag som positivt!
sodjan skrev:Som du ser så har koderna i princip samma funktion.
Det är lite effektivare kodat i ditt fall, dels p.g.a av "branch"
instruktionen i PIC18 (blir en skip/goto kombo i PIC16) samt
p.g.a. att XC8 "free" gör något extra innan var2 sätts...

Och nej, du kan nog inte göra det effektivare själv...
Ok, tack. Då är det bara att anpassa sig.
Skriv svar