PIC18F25K22 - Timer, Nested interrupts och annat
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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.
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.
Re: PIC18F25K22 - Timer, Nested interrupts och annat
> if(var1 >= 92) {var2 = nytt_varde;}
På en 16F1938 med XC (free version) blir det:
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...
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:
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...
- 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
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.
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.
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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...
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...

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

Re: PIC18F25K22 - Timer, Nested interrupts och annat
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.
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.
- 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
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.
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.
Re: PIC18F25K22 - Timer, Nested interrupts och annat
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.
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.
- 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
Ber så hemskt mycket om ursäkt. Det var inte meningen. 

Re: PIC18F25K22 - Timer, Nested interrupts och annat
Helt OK. Det blev lite hetsigt där...
Det är ju fredag e.m, så nu tar vi det lugnt...
Det är ju fredag e.m, så nu tar vi det lugnt...

- 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 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.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.
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

Tack för att du tog dig tid.sodjan skrev:> if(var1 >= 92) {var2 = nytt_varde;}
På en 16F1938 med XC (free version) blir det:Kanske att man kan handtrimma bort ett par instruktioner på rad 393 och 394.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:
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...
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:
- 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
Magnus_K: Du har en beundransvärd självbild. 

Re: PIC18F25K22 - Timer, Nested interrupts och annat
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...
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...
- 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
Det där tolkar jag som positivt!lillahuset skrev:Magnus_K: Du har en beundransvärd självbild.
Ok, tack. Då är det bara att anpassa sig.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...