Effektivisera C kod
Om man tittar på den koden som jag får så handlar det om följande "tider" från det att int genereras.
2 cykler i vektorn för att hoppa till intkoden
Max 5 cykler för att komma till userinterrupt
dvs totalt max 7 cykler för att börja hantera interruptet.
Sedan är ju tiden i ns/us beroende på vilken frekens man kör.
Detta med en 18F8622, koden skiljer naturligtvis lite beroende på vilken proc man använder då de har olika möjligheter.
2 cykler i vektorn för att hoppa till intkoden
Max 5 cykler för att komma till userinterrupt
dvs totalt max 7 cykler för att börja hantera interruptet.
Sedan är ju tiden i ns/us beroende på vilken frekens man kör.
Detta med en 18F8622, koden skiljer naturligtvis lite beroende på vilken proc man använder då de har olika möjligheter.
När jag kollar på WIZ-C så ser det inte särskillt proffsigt ut. De har ju inte ens lyckats göra en vettig hemsida. Men jag fick ett litet tips när jag läste om dess effektivitet:
Jag borde hålla mig till globala variabler till att börja med så kanske det inte blir så mycket sparande. Det är typiskt sånna saker som jag borde lära mig för att kunna programmera PICen effektivt i C anser jag.The FED C Compiler includes a software stack which may be used for local variables. However if it is possible then local variables are stored in temporary global memory space, the size of this area is controlled by the user. This can produce very significant savings in program execution time.
Jo, det här med hemsidan har vi påpekat, ofta, men som engelsmän de är, så är det av sekunda värde.
Däremot så är deras IDE mycket bra, så bra att i stort sett alla har börjat kopiera den.
Kompilatorn i sig genererar hyffsat kompakt kod, och du kan välja mellan ett antal olika optimeringar samt även bestämma hur mycket lokalt "scratch-pad" som skall användas till lokala variabler.
Genom denna "scratch-pad" behöver inte lokala varibler pushas på stacken, så länge inte den är fylld.
Den används bla annat för dels lokala varibler och dels för argument för funktionsanrop, vilket innebär att overheaden vid ett funktionsanrop blir väldigt liten, i princip är det bara W och status som läggs på stacken vid anrop.
I WIZ-C har du möjlighet att i den grafiska simulatorn simulera externa enheter såsom 1-tråds interface, lcd'er snart även uChips ethernet chip, kopplat till ett NW-kort i din egen dator.
I princip går det då till så här: Du lägfger upp ethernet-chipet i simultorn, talar om vilka pinnar som du interfacar med, talar om för sim-chipet vilket nätverkskort det skall använda.
Sedan kan du köra din nätverkskod i IDE'n mot det simulerade chipet som i sin tur hämtar och skickar data via det fysiska nätverkskortet.
OSV.
I pro-versionen jag använder kan man även simulera flera ihopkopplade PICar, dvs du kan ladda in flera projekt samtidigt och koppla ihop dem i ett PIC-nätverk typ, och sedan köra simulering, kan dock bli lite stökigt om man bara har en skärm och kör en bunt PICar via I2C eller 1-tråd eller liknande.
Pro-versionen hanterar dessutom även ren assembler, vilket innebär att du utan problem kan skriva funktioner i ren assembler och länka in dem i projektet.
Naturligt vis kan du som vanligt använda inline ASM och ASM block oavsett vilket.
Däremot så är deras IDE mycket bra, så bra att i stort sett alla har börjat kopiera den.
Kompilatorn i sig genererar hyffsat kompakt kod, och du kan välja mellan ett antal olika optimeringar samt även bestämma hur mycket lokalt "scratch-pad" som skall användas till lokala variabler.
Genom denna "scratch-pad" behöver inte lokala varibler pushas på stacken, så länge inte den är fylld.
Den används bla annat för dels lokala varibler och dels för argument för funktionsanrop, vilket innebär att overheaden vid ett funktionsanrop blir väldigt liten, i princip är det bara W och status som läggs på stacken vid anrop.
I WIZ-C har du möjlighet att i den grafiska simulatorn simulera externa enheter såsom 1-tråds interface, lcd'er snart även uChips ethernet chip, kopplat till ett NW-kort i din egen dator.
I princip går det då till så här: Du lägfger upp ethernet-chipet i simultorn, talar om vilka pinnar som du interfacar med, talar om för sim-chipet vilket nätverkskort det skall använda.
Sedan kan du köra din nätverkskod i IDE'n mot det simulerade chipet som i sin tur hämtar och skickar data via det fysiska nätverkskortet.
OSV.
I pro-versionen jag använder kan man även simulera flera ihopkopplade PICar, dvs du kan ladda in flera projekt samtidigt och koppla ihop dem i ett PIC-nätverk typ, och sedan köra simulering, kan dock bli lite stökigt om man bara har en skärm och kör en bunt PICar via I2C eller 1-tråd eller liknande.
Pro-versionen hanterar dessutom även ren assembler, vilket innebär att du utan problem kan skriva funktioner i ren assembler och länka in dem i projektet.
Naturligt vis kan du som vanligt använda inline ASM och ASM block oavsett vilket.
Låter rätt vettigt det där med WIZ-C. Dock sitter jag redan med ett utvecklingskort med ICD från Mikroelektronica och deras kompilator.
Tittat lite mer på koden som MikroC ger.. Tex denna:
Varför mellanlagra från variabeln när man hämta direkt från orginal variabeln. Antagligen ett fenomen pga att det är en C funktion. Så jag kanske inte borde köra med några argument vid funktionsanrop och hämta direkt från funktionen i stället. Koden blir inte lika flexibel kanske, men effektivare.
Nu spelar inte det så stor roll om en delay tar lite längre tid eftersom man i alla fall kan sätta värdet. Men det är tex STACK_10 som sparas undan vid avbrottsanropet. Och STACK_10 håller väll bara koll på var delay_us finns. Varför inte köra GOTO delay_us i stället?
Tips på hur man kan få bort denna onödiga extragrej att spara undan var delay_us ligger? Ska man göra en egen delay_us som macro kanske?
Tittat lite mer på koden som MikroC ger.. Tex denna:
Kod: Markera allt
;1Wire_Common.c,30 :: Ow_Reset(port,pin); // RESET
$02F6 $083A MOVF FARG_ow_get_ds18b20_data+1, 0
$02F7 $00BE MOVWF FARG_Ow_Reset+0
$02F8 $083B MOVF FARG_ow_get_ds18b20_data+2, 0
$02F9 $00BF MOVWF FARG_Ow_Reset+1
$02FA $21D0 CALL _Ow_Reset
Kod: Markera allt
;1Wire_Master.c,78 :: delay_us(10);
$001D $3010 MOVLW 16
$001E $00FA MOVWF STACK_10
$001F $0BFA DECFSZ STACK_10, F
$0020 $281F GOTO $-1
Tips på hur man kan få bort denna onödiga extragrej att spara undan var delay_us ligger? Ska man göra en egen delay_us som macro kanske?
Kan man om detta på något smidigare sätt så man slipper ha STACK_0?
Samma sak med följande fast med STACK_1
Det var ett tag sedan jag höll på med ASM så för mig tar det ett tag att bara förstå vad koden gör exakt. Men ni ASM gurus här kanske kan komma med något litet förslag efter en sanbbkoll av koden..
Kod: Markera allt
;1Wire_Master.c,95 :: bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0b00000001;
$0033 $0823 MOVF _byte_index, 0
$0034 $0724 ADDWF _ANSWARE_DATA, 0
$0035 $0084 MOVWF FSR
$0036 $0800 MOVF INDF, 0
$0037 $00AD MOVWF _bit_temp
$0038 $0822 MOVF _bit_index, 0
$0039 $00F0 MOVWF STACK_0
$003A $0870 MOVF STACK_0, 0
Kod: Markera allt
;1Wire_Master.c,166 :: if (PORTB.F0!=bit_temp) {
$00CB $3001 MOVLW 1
$00CC $0506 ANDWF PORTB, 0
$00CD $00F1 MOVWF STACK_1
$00CE $0871 MOVF STACK_1, 0
$00CF $062D XORWF _bit_temp, 0
$00D0 $1903 BTFSC STATUS, Z
$00D1 $28D3 GOTO L_interrupt_28
Det var ett tag sedan jag höll på med ASM så för mig tar det ett tag att bara förstå vad koden gör exakt. Men ni ASM gurus här kanske kan komma med något litet förslag efter en sanbbkoll av koden..
TomasL, din jämförelse är nog inte så ärlig.
T.ex så är det antagligen användningen av indexerade arrayer i
ankan's kod som medför att kompilatorn lägger i kod för att
spara/hämta tillbaka FSR* registren. Du borde ha något liknande
i din kod för att göra det jämförbart.
I ankan's fall så skulle man kunna ersätta array hanteringen med
att "köra" FSR* registren direkt via inline-ASM, då skulle antagligen
inte kompilatorn "se" det och utesluta koden för att spara/hämta
dessa register i ISR'en.
Och när det gäller STACK_* variablerna så är det mycket möjligt att
man kan få bort den hanteringen genom andra justeringen av
koden. Man får kolla vilka C-rader som medför att STACK_*
variablerna används (sannolikt där det finns temp värden) och se om
man kan justera koden på något sätt.
> Och STACK_10 håller väll bara koll på var delay_us finns.
Nja, det är en temp variabel som används av delay_us.
Alltså inte var den "är" utan hur långt den har räknat.
Samma temp variabel används av ISR'en, därför måste den sparas undan.
T.ex så är det antagligen användningen av indexerade arrayer i
ankan's kod som medför att kompilatorn lägger i kod för att
spara/hämta tillbaka FSR* registren. Du borde ha något liknande
i din kod för att göra det jämförbart.
I ankan's fall så skulle man kunna ersätta array hanteringen med
att "köra" FSR* registren direkt via inline-ASM, då skulle antagligen
inte kompilatorn "se" det och utesluta koden för att spara/hämta
dessa register i ISR'en.
Och när det gäller STACK_* variablerna så är det mycket möjligt att
man kan få bort den hanteringen genom andra justeringen av
koden. Man får kolla vilka C-rader som medför att STACK_*
variablerna används (sannolikt där det finns temp värden) och se om
man kan justera koden på något sätt.
> Och STACK_10 håller väll bara koll på var delay_us finns.
Nja, det är en temp variabel som används av delay_us.
Alltså inte var den "är" utan hur långt den har räknat.
Samma temp variabel används av ISR'en, därför måste den sparas undan.
Testade lite nu och såg att för varje funktion som anropas i main så blir det en till STACK_XX som ska sparas undan innan interupt.
Förstår inte varför det ska behöva vara så. Tex så blir den en STACK_XX bara för att jag anropar en funktion som heter init() och som bara sätter in och ut gångarna på porten.
Borde inte behövas tycker jag.
Förstår inte varför det ska behöva vara så. Tex så blir den en STACK_XX bara för att jag anropar en funktion som heter init() och som bara sätter in och ut gångarna på porten.
Borde inte behövas tycker jag.
Som svar på sodjan, ett eller två inlägg upp: Jo jag vet att det inte var så representativt.
Har nu klistrat in ankans kod och kompilerat, så här blev resultatet:
kan dock inte svära på att det är hundra korrekt, men det skall inte vara stor skillnad.
[/quote]
Har nu klistrat in ankans kod och kompilerat, så här blev resultatet:
kan dock inte svära på att det är hundra korrekt, men det skall inte vara stor skillnad.
Kod: Markera allt
MODULE : UserInterrupt
Placed at 0x0000B8
299 words (optimised down from 529)
module "UserInterrupt"
UserInterrupt::
_DoSwitch = 1
_Pushn = 1
_PushA = 1
_ZLTE = 1
_LoadWD = 1
_AddD = 1
_LoadPACCA = 1
_RightShiftUSA = 1
_RightShiftA = 0
_LSEQ = 1
;~ Line : 00037 unsigned char olow_cmd;
;~ Line : 00038 unsigned char bit_index;
;~ Line : 00039 unsigned char byte_index;
;~ Line : 00040 unsigned char bit_temp;
;~ Line : 00043 if (bINTF)
0x00B8 0x1C8B btfss (H'0B'+0),1
0x00B9 0x29C1 goto L000025
L000027:
;~ Line : 00044 {
;~ Line : 00045
;~ Line : 00046 switch (onewire_state)
movfw onewire_state
0x00BA 0x0834
0x00BB 0x00F1 movwf ACC
dupmodoff
0x00BC 0x3007 movlw 7
0x00BD 0x0271 subwf ACC,w
0x00BE 0x1803 skpnc
0x00BF 0x29BD goto L000133
0x00C0 0x3000 movlw MDS25>>8
0x00C1 0x008A movwf PCLATH
movfw ACC
0x00C2 0x0871
0x00C3 0x3EC7 addlw MDS25
0x00C4 0x1803 skpnc
0x00C5 0x0A8A incf PCLATH
0x00C6 0x0082 movwf PCL
MDS25:
0x00C7 0x29BC goto L000132
0x00C8 0x28CF goto L000034
0x00C9 0x2930 goto L000066
0x00CA 0x293C goto L000073
0x00CB 0x2947 goto L000080
0x00CC 0x2971 goto L000097
0x00CD 0x2999 goto L000114
dupmodon
;~ Line : 00047 {
;~ Line : 00048 case GET_CMD :
SETPCLATH UserInterrupt,-1,0
0x00CE 0x118A ;bxf PCLATH,3 \ bxf PCLATH,4
L000034::
;~ Line : 00049 bTRB0=1;
0x00CF 0x1683 bsf STATUS,RP0
0x00D0 0x1303 bcf STATUS,RP1
0x00D1 0x1406 bsf 134,0
;~ Line : 00050 olow_cmd >>= 1;
0x00D2 0x1283 bcf STATUS,RP0
0x00D3 0x1003 clrc
0x00D4 0x0CA4 rrf H'24'
;~ Line : 00051 Wait(10);
0x00D5 0x3000 movlw 0
SETPCLATH 0,UserInterrupt,1
; No Code (Optimised out)
0x00D6 0x20A8 call Pushn
0x00D7 0x300A movlw 10
0x00D8 0x20A8 call Pushn
SETPCLATH Wait,0,1
; No Code (Optimised out)
0x00D9 0x2207 call Wait
0x00DA 0x3002 movlw 2
0x00DB 0x07F8 addwf sp
;~ Line : 00052 if(bRB0)
SETPCLATH UserInterrupt,0,1
; No Code (Optimised out)
0x00DC 0x1C06 btfss (H'06'+0),0
0x00DD 0x28E0 goto L000035
L000037:
;~ Line : 00053 olow_cmd |= 0x80;
0x00DE 0x3080 movlw 128
0x00DF 0x04A4 iorwf H'24'
L000035:
;~ Line : 00054 bit_index++;
0x00E0 0x0AA1 incf H'21'
;~ Line : 00055 if (bit_index > 7)
0x00E1 0x3007 movlw 7
0x00E2 0x0221 subwf H'21',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x00E3 0x207D call ZLTE
SETPCLATH L000040,0,0
; No Code (Optimised out)
0x00E4 0x1903 skpnz
0x00E5 0x292F goto L000040
SETPCLATH UserInterrupt,L000040,0
; No Code (Optimised out)
L000042:
;~ Line : 00056 {
;~ Line : 00057 byte_index=0;
0x00E6 0x01A2 clrf H'22'
;~ Line : 00058 bit_index=0;
0x00E7 0x01A1 clrf H'21'
;~ Line : 00059 if (ow_active)
movfw 53
0x00E8 0x0835
0x00E9 0x3800 iorlw 0
SETPCLATH L000045,UserInterrupt,0
; No Code (Optimised out)
0x00EA 0x1903 skpnz
0x00EB 0x2903 goto L000045
SETPCLATH UserInterrupt,L000045,0
; No Code (Optimised out)
L000047:
;~ Line : 00060 {
;~ Line : 00061 switch (olow_cmd)
movfw (LocOpt+0x3)
0x00EC 0x0824
0x00ED 0x3E00 addlw 0
0x00EE 0x1903 skpnz
0x00EF 0x28F2 goto L000054
0x00F0 0x2900 goto L000055
;~ Line : 00062 {
;~ Line : 00063 case READ_SCRATCHPAD :
SETPCLATH UserInterrupt,-1,0
0x00F1 0x118A ;bxf PCLATH,3 \ bxf PCLATH,4
L000054::
;~ Line : 00064 onewire_state=ANSWARE_REQUEST;
0x00F2 0x1283 bcf STATUS,RP0
0x00F3 0x1303 bcf STATUS,RP1
0x00F4 0x3006 movlw 6
0x00F5 0x00B4 movwf H'34'
;~ Line : 00065 ANSWARE_DATA=SCRATCHPAD;
0x00F6 0x3040 movlw 64
0x00F7 0x00B6 movwf H'36'
0x00F8 0x01B7 clrf 55
;~ Line : 00066 bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0x01;
movfw 34
0x00F9 0x0822
0x00FA 0x00F3 movwf ACC2
0x00FB 0x01F4 clrf ACC2+1
0x00FC 0x1383 bcf STATUS,IRP
0x00FD 0x3036 movlw 54
SETPCLATH DupBlock0,L000054,0
; No Code (Optimised out)
0x00FE 0x21FC call DupBlock0
;~ Line : 00067 break;
SETPCLATH L000050,0,1
; No Code (Optimised out)
0x00FF 0x2902 goto L000050
;~ Line : 00068
;~ Line : 00069 default :
SETPCLATH UserInterrupt,L000050,0
; No Code (Optimised out)
L000055::
;~ Line : 00070 onewire_state=WAITING_FOR_RESET;
0x0100 0x01B4 clrf H'34'
;~ Line : 00071 break;
SETPCLATH L000050,UserInterrupt,1
; No Code (Optimised out)
0x0101 0x2902 goto L000050
;~ Line : 00072 }
SETPCLATH UserInterrupt,L000050,0
; No Code (Optimised out)
L000050::
;~ Line : 00073 }
;~ Line : 00074 else
SETPCLATH L000046,UserInterrupt,1
; No Code (Optimised out)
0x0102 0x292F goto L000046
SETPCLATH UserInterrupt,L000046,0
; No Code (Optimised out)
L000045:
;~ Line : 00075 {
;~ Line : 00076 switch (olow_cmd)
movfw (LocOpt+0x3)
0x0103 0x0824
0x0104 0x3EFF addlw -1
0x0105 0x1903 skpnz
0x0106 0x2912 goto L000061
0x0107 0x3EFF addlw -1
0x0108 0x1903 skpnz
0x0109 0x2919 goto L000062
0x010A 0x3EFF addlw -1
0x010B 0x1903 skpnz
0x010C 0x291C goto L000063
0x010D 0x3EFF addlw -1
0x010E 0x1903 skpnz
0x010F 0x2921 goto L000064
0x0110 0x292D goto L000065
;~ Line : 00077 {
;~ Line : 00078 case SEARCH_ROM :
SETPCLATH UserInterrupt,-1,0
0x0111 0x118A ;bxf PCLATH,3 \ bxf PCLATH,4
L000061::
;~ Line : 00079 onewire_state=SEARCH_ROM_BIT;
0x0112 0x1283 bcf STATUS,RP0
0x0113 0x1303 bcf STATUS,RP1
0x0114 0x3002 movlw 2
0x0115 0x00B4 movwf H'34'
;~ Line : 00080 bit_temp=(ROM_id[byte_index] >> bit_index) & 0x01;
SETPCLATH DupBlock3,L000061,0
; No Code (Optimised out)
0x0116 0x21E3 call DupBlock3
SETPCLATH L000061,DupBlock3,0
; No Code (Optimised out)
SETPCLATH DupBlock1,L000061,0
; No Code (Optimised out)
0x0117 0x21F2 call DupBlock1
;~ Line : 00081 break;
SETPCLATH L000057,0,1
; No Code (Optimised out)
0x0118 0x292F goto L000057
;~ Line : 00082
;~ Line : 00083 case SKIP_ROM :
SETPCLATH UserInterrupt,L000057,0
; No Code (Optimised out)
L000062::
;~ Line : 00084 ow_active=1;
0x0119 0x3001 movlw 1
0x011A 0x00B5 movwf H'35'
;~ Line : 00085 break;
SETPCLATH L000057,UserInterrupt,1
; No Code (Optimised out)
0x011B 0x292F goto L000057
;~ Line : 00086
;~ Line : 00087 case MATCH_ROM :
SETPCLATH UserInterrupt,L000057,0
; No Code (Optimised out)
L000063::
;~ Line : 00088 onewire_state=MATCH_ROM_READ;
0x011C 0x3005 movlw 5
0x011D 0x00B4 movwf H'34'
;~ Line : 00089 bit_temp=(ROM_id[byte_index] >> bit_index) & 0x01;
SETPCLATH DupBlock3,L000063,0
; No Code (Optimised out)
0x011E 0x21E3 call DupBlock3
SETPCLATH L000063,DupBlock3,0
; No Code (Optimised out)
SETPCLATH DupBlock1,L000063,0
; No Code (Optimised out)
0x011F 0x21F2 call DupBlock1
;~ Line : 00090 break;
SETPCLATH L000057,0,1
0x0120 0x292F goto L000057
;~ Line : 00091
;~ Line : 00092 case READ_ROM :
SETPCLATH UserInterrupt,L000057,0
; No Code (Optimised out)
L000064::
;~ Line : 00093 onewire_state=ANSWARE_REQUEST;
0x0121 0x3006 movlw 6
0x0122 0x00B4 movwf H'34'
;~ Line : 00094 ANSWARE_DATA=ROM_id;
0x0123 0x3038 movlw 56
0x0124 0x00B6 movwf H'36'
0x0125 0x01B7 clrf 55
;~ Line : 00095 bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0x01;
movfw 34
0x0126 0x0822
0x0127 0x00F3 movwf ACC2
0x0128 0x01F4 clrf ACC2+1
0x0129 0x1383 bcf STATUS,IRP
0x012A 0x3036 movlw 54
SETPCLATH DupBlock0,L000064,0
; No Code (Optimised out)
0x012B 0x21FC call DupBlock0
;~ Line : 00096 break;
SETPCLATH L000057,0,1
; No Code (Optimised out)
0x012C 0x292F goto L000057
;~ Line : 00097 default :
SETPCLATH UserInterrupt,L000057,0
; No Code (Optimised out)
L000065::
;~ Line : 00098 onewire_state=WAITING_FOR_RESET;
0x012D 0x01B4 clrf H'34'
;~ Line : 00099 break;
SETPCLATH L000057,UserInterrupt,1
; No Code (Optimised out)
0x012E 0x292F goto L000057
;~ Line : 00100 }
SETPCLATH UserInterrupt,L000057,0
; No Code (Optimised out)
L000057::
;~ Line : 00101 }
L000046:
;~ Line : 00102 }
L000040:
;~ Line : 00103 break;
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x012F 0x29BE goto L000030
;~ Line : 00104 case SEARCH_ROM_BIT :
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000066::
;~ Line : 00105 if(bit_temp)
movfw 35
0x0130 0x0823
0x0131 0x3800 iorlw 0
SETPCLATH L000067,UserInterrupt,0
; No Code (Optimised out)
0x0132 0x1903 skpnz
0x0133 0x2936 goto L000067
SETPCLATH UserInterrupt,L000067,0
; No Code (Optimised out)
L000069:
;~ Line : 00106 {
;~ Line : 00107 bRB0=1;
0x0134 0x1406 bsf 6,0
;~ Line : 00108 }
;~ Line : 00109 else
SETPCLATH L000068,UserInterrupt,1
; No Code (Optimised out)
0x0135 0x2937 goto L000068
SETPCLATH UserInterrupt,L000068,0
; No Code (Optimised out)
L000067:
;~ Line : 00110 {
;~ Line : 00111 bRB0=0;
0x0136 0x1006 bcf 6,0
;~ Line : 00112 }
L000068:
;~ Line : 00113
;~ Line : 00114 Wait(20);
0x0137 0x3000 movlw 0
SETPCLATH DupBlock2,L000066,0
; No Code (Optimised out)
0x0138 0x21EA call DupBlock2
;~ Line : 00115 bRB0=1;
;~ Line : 00116 onewire_state=SEARCH_ROM_CMP_BIT;
0x0139 0x3003 movlw 3
0x013A 0x00B4 movwf H'34'
;~ Line : 00117 break;
SETPCLATH L000030,0,1
; No Code (Optimised out)
0x013B 0x29BE goto L000030
;~ Line : 00118
;~ Line : 00119 case SEARCH_ROM_CMP_BIT :
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000073::
;~ Line : 00120 if(!bit_temp)
movfw 35
0x013C 0x0823
SETPCLATH L000074,UserInterrupt,0
; No Code (Optimised out)
0x013D 0x1D03 skpz
0x013E 0x2941 goto L000074
SETPCLATH UserInterrupt,L000074,0
; No Code (Optimised out)
L000076:
;~ Line : 00121 {
;~ Line : 00122 bRB0=1;
0x013F 0x1406 bsf 6,0
;~ Line : 00123 }
;~ Line : 00124 else
SETPCLATH L000075,UserInterrupt,1
; No Code (Optimised out)
0x0140 0x2942 goto L000075
SETPCLATH UserInterrupt,L000075,0
; No Code (Optimised out)
L000074:
;~ Line : 00125 {
;~ Line : 00126 bRB0=0;
0x0141 0x1006 bcf 6,0
;~ Line : 00127 }
L000075:
;~ Line : 00128 Wait(20);
0x0142 0x3000 movlw 0
SETPCLATH DupBlock2,L000073,0
; No Code (Optimised out)
0x0143 0x21EA call DupBlock2
;~ Line : 00129 bRB0=1;
;~ Line : 00130 onewire_state=SEARCH_ROM_READ_BIT;
0x0144 0x3004 movlw 4
0x0145 0x00B4 movwf H'34'
;~ Line : 00131 break;
SETPCLATH L000030,0,1
; No Code (Optimised out)
0x0146 0x29BE goto L000030
;~ Line : 00132
;~ Line : 00133 case SEARCH_ROM_READ_BIT : Wait(10);
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000080::
0x0147 0x3000 movlw 0
SETPCLATH 0,UserInterrupt,1
; No Code (Optimised out)
0x0148 0x20A8 call Pushn
0x0149 0x300A movlw 10
0x014A 0x20A8 call Pushn
SETPCLATH Wait,0,1
; No Code (Optimised out)
0x014B 0x2207 call Wait
0x014C 0x3002 movlw 2
0x014D 0x07F8 addwf sp
;~ Line : 00134 onewire_state=SEARCH_ROM_BIT;
0x014E 0x3002 movlw 2
0x014F 0x00B4 movwf H'34'
;~ Line : 00135 if (bRB0!=bit_temp)
0x0150 0x3900 andlw 0
0x0151 0x1806 btfsc 6,0
0x0152 0x3E01 addlw 1
0x0153 0x00F1 movwf ACC
movfw 35
0x0154 0x0823
0x0155 0x00F3 movwf ACC2
movfw ACC2
0x0156 0x0873
0x0157 0x0271 subwf ACC,w
SETPCLATH L000081,0,0
; No Code (Optimised out)
0x0158 0x1903 skpnz
0x0159 0x295B goto L000081
SETPCLATH UserInterrupt,L000081,0
; No Code (Optimised out)
L000083:
;~ Line : 00136 {
;~ Line : 00137 onewire_state=WAITING_FOR_RESET;
0x015A 0x01B4 clrf H'34'
;~ Line : 00138 }
L000081:
;~ Line : 00139
;~ Line : 00140 bit_index++;
0x015B 0x0AA1 incf H'21'
;~ Line : 00141 if (bit_index>7)
0x015C 0x3007 movlw 7
0x015D 0x0221 subwf H'21',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x015E 0x207D call ZLTE
SETPCLATH L000086,0,0
; No Code (Optimised out)
0x015F 0x1903 skpnz
0x0160 0x2963 goto L000086
SETPCLATH UserInterrupt,L000086,0
; No Code (Optimised out)
L000088:
;~ Line : 00142 {
;~ Line : 00143 bit_index=0;
0x0161 0x01A1 clrf H'21'
;~ Line : 00144 byte_index++;
0x0162 0x0AA2 incf H'22'
;~ Line : 00145 }
L000086:
;~ Line : 00146 if (byte_index>7)
0x0163 0x3007 movlw 7
0x0164 0x0222 subwf H'22',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x0165 0x207D call ZLTE
SETPCLATH L000091,0,0
; No Code (Optimised out)
0x0166 0x1903 skpnz
0x0167 0x296E goto L000091
SETPCLATH UserInterrupt,L000091,0
; No Code (Optimised out)
L000093:
;~ Line : 00147 {
;~ Line : 00148 bit_index=0;
0x0168 0x01A1 clrf H'21'
;~ Line : 00149 ow_active=1;
0x0169 0x3001 movlw 1
0x016A 0x00B5 movwf H'35'
;~ Line : 00150 onewire_state=GET_CMD;
0x016B 0x3001 movlw 1
0x016C 0x00B4 movwf H'34'
;~ Line : 00151 }
;~ Line : 00152 else
SETPCLATH L000092,UserInterrupt,1
; No Code (Optimised out)
0x016D 0x2970 goto L000092
SETPCLATH UserInterrupt,L000092,0
; No Code (Optimised out)
L000091:
;~ Line : 00153 bit_temp=(ROM_id[byte_index] >> bit_index) & 0x01;
SETPCLATH DupBlock3,L000080,0
; No Code (Optimised out)
0x016E 0x21E3 call DupBlock3
SETPCLATH L000080,DupBlock3,0
; No Code (Optimised out)
SETPCLATH DupBlock1,L000080,0
; No Code (Optimised out)
0x016F 0x21F2 call DupBlock1
SETPCLATH UserInterrupt,0,0
; No Code (Optimised out)
L000092:
;~ Line : 00154
;~ Line : 00155 break;
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x0170 0x29BE goto L000030
;~ Line : 00156
;~ Line : 00157 case MATCH_ROM_READ :
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000097::
;~ Line : 00158 Wait(10);
0x0171 0x3000 movlw 0
SETPCLATH 0,UserInterrupt,1
; No Code (Optimised out)
0x0172 0x20A8 call Pushn
0x0173 0x300A movlw 10
0x0174 0x20A8 call Pushn
SETPCLATH Wait,0,1
; No Code (Optimised out)
0x0175 0x2207 call Wait
0x0176 0x3002 movlw 2
0x0177 0x07F8 addwf sp
;~ Line : 00159 if (bRB0!=bit_temp)
0x0178 0x3900 andlw 0
0x0179 0x1806 btfsc 6,0
0x017A 0x3E01 addlw 1
0x017B 0x00F1 movwf ACC
movfw 35
0x017C 0x0823
0x017D 0x00F3 movwf ACC2
movfw ACC2
0x017E 0x0873
0x017F 0x0271 subwf ACC,w
SETPCLATH L000098,0,0
; No Code (Optimised out)
0x0180 0x1903 skpnz
0x0181 0x2983 goto L000098
SETPCLATH UserInterrupt,L000098,0
; No Code (Optimised out)
L000100:
;~ Line : 00160 {
;~ Line : 00161 onewire_state=WAITING_FOR_RESET;
0x0182 0x01B4 clrf H'34'
;~ Line : 00162 }
L000098:
;~ Line : 00163 bit_index++;
0x0183 0x0AA1 incf H'21'
;~ Line : 00164 if (bit_index>7)
0x0184 0x3007 movlw 7
0x0185 0x0221 subwf H'21',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x0186 0x207D call ZLTE
SETPCLATH L000103,0,0
; No Code (Optimised out)
0x0187 0x1903 skpnz
0x0188 0x298B goto L000103
SETPCLATH UserInterrupt,L000103,0
; No Code (Optimised out)
L000105:
;~ Line : 00165 {
;~ Line : 00166 bit_index=0;
0x0189 0x01A1 clrf H'21'
;~ Line : 00167 byte_index++;
0x018A 0x0AA2 incf H'22'
;~ Line : 00168 }
L000103:
;~ Line : 00169 if (byte_index>7)
0x018B 0x3007 movlw 7
0x018C 0x0222 subwf H'22',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x018D 0x207D call ZLTE
SETPCLATH L000108,0,0
; No Code (Optimised out)
0x018E 0x1903 skpnz
0x018F 0x2996 goto L000108
SETPCLATH UserInterrupt,L000108,0
; No Code (Optimised out)
L000110:
;~ Line : 00170 {
;~ Line : 00171 bit_index=0;
0x0190 0x01A1 clrf H'21'
;~ Line : 00172 ow_active=1;
0x0191 0x3001 movlw 1
0x0192 0x00B5 movwf H'35'
;~ Line : 00173 onewire_state=GET_CMD;
0x0193 0x3001 movlw 1
0x0194 0x00B4 movwf H'34'
;~ Line : 00174 }
;~ Line : 00175 else
SETPCLATH L000109,UserInterrupt,1
; No Code (Optimised out)
0x0195 0x2998 goto L000109
SETPCLATH UserInterrupt,L000109,0
; No Code (Optimised out)
L000108:
;~ Line : 00176 bit_temp=(ROM_id[byte_index] >> bit_index) & 0x01;
SETPCLATH DupBlock3,L000097,0
; No Code (Optimised out)
0x0196 0x21E3 call DupBlock3
SETPCLATH L000097,DupBlock3,0
; No Code (Optimised out)
SETPCLATH DupBlock1,L000097,0
; No Code (Optimised out)
0x0197 0x21F2 call DupBlock1
SETPCLATH UserInterrupt,0,0
; No Code (Optimised out)
L000109:
;~ Line : 00177 break;
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x0198 0x29BE goto L000030
;~ Line : 00178
;~ Line : 00179 case ANSWARE_REQUEST :
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000114::
;~ Line : 00180 if(bit_temp)
movfw 35
0x0199 0x0823
0x019A 0x3800 iorlw 0
SETPCLATH L000115,UserInterrupt,0
; No Code (Optimised out)
0x019B 0x1903 skpnz
0x019C 0x299F goto L000115
SETPCLATH UserInterrupt,L000115,0
; No Code (Optimised out)
L000117:
;~ Line : 00181 {
;~ Line : 00182 bRB0=1;
0x019D 0x1406 bsf 6,0
;~ Line : 00183 }
;~ Line : 00184 else
SETPCLATH L000116,UserInterrupt,1
; No Code (Optimised out)
0x019E 0x29A0 goto L000116
SETPCLATH UserInterrupt,L000116,0
; No Code (Optimised out)
L000115:
;~ Line : 00185 {
;~ Line : 00186 bRB0=0;
0x019F 0x1006 bcf 6,0
;~ Line : 00187 }
L000116:
;~ Line : 00188
;~ Line : 00189 Wait(20);
0x01A0 0x3000 movlw 0
SETPCLATH DupBlock2,L000114,0
; No Code (Optimised out)
0x01A1 0x21EA call DupBlock2
;~ Line : 00190 bRB0=1;
;~ Line : 00191 bit_index++;
0x01A2 0x0AA1 incf H'21'
;~ Line : 00192 if (bit_index>7)
0x01A3 0x3007 movlw 7
0x01A4 0x0221 subwf H'21',w
SETPCLATH 0,0,0
; No Code (Optimised out)
0x01A5 0x207D call ZLTE
SETPCLATH L000121,0,0
; No Code (Optimised out)
0x01A6 0x1903 skpnz
0x01A7 0x29AA goto L000121
SETPCLATH UserInterrupt,L000121,0
; No Code (Optimised out)
L000123:
;~ Line : 00193 {
;~ Line : 00194 bit_index=0;
0x01A8 0x01A1 clrf H'21'
;~ Line : 00195 byte_index++;
0x01A9 0x0AA2 incf H'22'
;~ Line : 00196 }
L000121:
;~ Line : 00197 if (byte_index>7)
0x01AA 0x3007 movlw 7
0x01AB 0x0222 subwf H'22',w
SETPCLATH 0,UserInterrupt,0
; No Code (Optimised out)
0x01AC 0x207D call ZLTE
SETPCLATH L000126,0,0
; No Code (Optimised out)
0x01AD 0x1903 skpnz
0x01AE 0x29B5 goto L000126
SETPCLATH UserInterrupt,L000126,0
; No Code (Optimised out)
L000128:
;~ Line : 00198 {
;~ Line : 00199 bit_index=0;
0x01AF 0x01A1 clrf H'21'
;~ Line : 00200 ow_active=1;
0x01B0 0x3001 movlw 1
0x01B1 0x00B5 movwf H'35'
;~ Line : 00201 onewire_state=GET_CMD;
0x01B2 0x3001 movlw 1
0x01B3 0x00B4 movwf H'34'
;~ Line : 00202 }
;~ Line : 00203 else
SETPCLATH L000127,UserInterrupt,1
; No Code (Optimised out)
0x01B4 0x29BB goto L000127
SETPCLATH UserInterrupt,L000127,0
; No Code (Optimised out)
L000126:
;~ Line : 00204 bit_temp=(ANSWARE_DATA[byte_index] >> bit_index) & 0x01;
movfw 34
0x01B5 0x0822
0x01B6 0x00F3 movwf ACC2
0x01B7 0x01F4 clrf ACC2+1
0x01B8 0x1383 bcf STATUS,IRP
0x01B9 0x3036 movlw 54
SETPCLATH DupBlock0,L000114,0
; No Code (Optimised out)
0x01BA 0x21FC call DupBlock0
SETPCLATH UserInterrupt,0,0
; No Code (Optimised out)
L000127:
;~ Line : 00205 break;
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x01BB 0x29BE goto L000030
;~ Line : 00208 case WAITING_FOR_RESET :
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000132::
;~ Line : 00209 break;
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x01BC 0x29BE goto L000030
;~ Line : 00210
;~ Line : 00211 default : break;
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000133::
SETPCLATH L000030,UserInterrupt,1
; No Code (Optimised out)
0x01BD 0x29BE goto L000030
;~ Line : 00212 }
SETPCLATH UserInterrupt,L000030,0
; No Code (Optimised out)
L000030::
;~ Line : 00213 TMR0=0;
0x01BE 0x0181 clrf H'01'
;~ Line : 00214
;~ Line : 00215 bINTF=0;
0x01BF 0x108B bcf 11,1
;~ Line : 00216 bINTE=1;
0x01C0 0x160B bsf 11,4
;~ Line : 00217
;~ Line : 00218 }
L000025:
;~ Line : 00219
;~ Line : 00220 if (bT0IF)
0x01C1 0x1D0B btfss (H'0B'+0),2
0x01C2 0x29DF goto L000134
L000136:
;~ Line : 00221 {
;~ Line : 00222
;~ Line : 00223 if (bRB0)
0x01C3 0x1C06 btfss (H'06'+0),0
0x01C4 0x29DF goto L000139
L000141:
;~ Line : 00224 {
;~ Line : 00225 while(!bRB0)
L000147:
L000144:
0x01C5 0x1806 btfsc (H'06'+0),0
0x01C6 0x29C8 goto L000145
L000146:
;~ Line : 00226 {}
SETPCLATH L000144,UserInterrupt,1
; No Code (Optimised out)
0x01C7 0x29C5 goto L000144
SETPCLATH UserInterrupt,L000144,0
; No Code (Optimised out)
L000145:
;~ Line : 00227 Wait(14);
0x01C8 0x3000 movlw 0
SETPCLATH 0,UserInterrupt,1
; No Code (Optimised out)
0x01C9 0x20A8 call Pushn
0x01CA 0x300E movlw 14
0x01CB 0x20A8 call Pushn
SETPCLATH Wait,0,1
; No Code (Optimised out)
0x01CC 0x2207 call Wait
0x01CD 0x3002 movlw 2
0x01CE 0x07F8 addwf sp
;~ Line : 00228
;~ Line : 00229 Wait(103);
0x01CF 0x3000 movlw 0
SETPCLATH 0,0,1
; No Code (Optimised out)
0x01D0 0x20A8 call Pushn
0x01D1 0x3067 movlw 103
0x01D2 0x20A8 call Pushn
SETPCLATH Wait,0,1
; No Code (Optimised out)
0x01D3 0x2207 call Wait
0x01D4 0x3002 movlw 2
0x01D5 0x07F8 addwf sp
;~ Line : 00230
;~ Line : 00231 bit_index=0;
0x01D6 0x01A1 clrf H'21'
;~ Line : 00232 bTRB0=1;
0x01D7 0x1683 bsf STATUS,RP0
0x01D8 0x1406 bsf 134,0
;~ Line : 00233 bTRA0=0;
0x01D9 0x1005 bcf 133,0
;~ Line : 00234 bINTF=0;
0x01DA 0x1283 bcf STATUS,RP0
0x01DB 0x108B bcf 11,1
;~ Line : 00235 ow_active=0;
0x01DC 0x01B5 clrf H'35'
;~ Line : 00236 onewire_state=GET_CMD;
0x01DD 0x3001 movlw 1
0x01DE 0x00B4 movwf H'34'
;~ Line : 00237 }
SETPCLATH UserInterrupt,0,0
; No Code (Optimised out)
L000139:
;~ Line : 00238
;~ Line : 00239 }
L000134:
;~ Line : 00240 bT0IF=0;
0x01DF 0x110B bcf 11,2
;~ Line : 00244
SETPCLATH UserIntReturn,-1
0x01E0 0x118A ;bxf PCLATH,3 \ bxf PCLATH,4
;~ Line : 00245
0x01E1 0x2A31 goto UserIntReturn
;~ Line : 00248 }
SETPCLATH 0,UserInterrupt,1
; No Code (Optimised out)
0x01E2 0x0008 return
Förstår inte hur du har lyckats klistra in min kod eftersom den var långt från komplett.. Tycker den var rätt svårtolkad också. Men det är min personliga uppfattning.
Sodjan: Svaret på din fråga.
Anropet av init() i main skapar denna extrakod vid interrupt:
STACK_0 dyker sedan upp på flera ställen och verkar aldrig ha något med init att göra utan ändras och fixas i vissa funktioner som tex Ow_Reset som finns med i biblioteket till MikroC och ser ut enligt följande i ASM.
End 1-wire reset borde inte vara så här svår. Det är ju bara att hålla linan låg i minst 400uS eller vilken tid det nu är och detektera om den hålls ner strax efter att man har släppt den. Då betyder det är det finns minst en 1-wire slav på linan.
Sodjan: Svaret på din fråga.
Kod: Markera allt
void init() {
ANSEL = 0x00;
TRISA = 0b11111011;
TRISB = 0b11111111;
PORTB = 0b00000000;
PORTA = 0b00000000;
INTCON = 0b10010000; // Enable GIE, RBIE
OPTION_REG = 0x02;
INTCON.T0IE=1;
}
Kod: Markera allt
$000D $0870 MOVF STACK_0, 0
$000E $00C5 MOVWF STSAVED_0
Kod: Markera allt
$01DB $ _Ow_Reset:
$01DB $1303 BCF STATUS, RP1
$01DC $1283 BCF STATUS, RP0
$01DD $083F MOVF FARG_Ow_Reset+1, 0
$01DE $00F2 MOVWF STACK_2
$01DF $3001 MOVLW 1
$01E0 $00F0 MOVWF STACK_0
$01E1 $01F1 CLRF STACK_0+1
$01E2 $0872 MOVF STACK_2, 0
$01E3 $ L_Ow_Reset_8:
$01E3 $1903 BTFSC STATUS, Z
$01E4 $29EA GOTO L_Ow_Reset_9
$01E5 $0DF0 RLF STACK_0, 1
$01E6 $0DF1 RLF STACK_0+1, 1
$01E7 $1070 BCF STACK_0, 0
$01E8 $3FFF ADDLW 255
$01E9 $29E3 GOTO L_Ow_Reset_8
$01EA $ L_Ow_Reset_9:
$01EA $0870 MOVF STACK_0, 0
$01EB $00C1 MOVWF Ow_Reset_bit_mask_L0
$01EC $0970 COMF STACK_0, W
$01ED $00F2 MOVWF STACK_2
$01EE $083E MOVF FARG_Ow_Reset+0, 0
$01EF $0084 MOVWF FSR
$01F0 $0800 MOVF INDF, 0
$01F1 $00F0 MOVWF STACK_0
$01F2 $0872 MOVF STACK_2, 0
$01F3 $0570 ANDWF STACK_0, 0
$01F4 $0080 MOVWF INDF
$01F5 $1784 BSF FSR, 7
$01F6 $0872 MOVF STACK_2, 0
$01F7 $0580 ANDWF INDF, 1
$01F8 $21B1 CALL _Delay_500us
$01F9 $0841 MOVF Ow_Reset_bit_mask_L0, 0
$01FA $0480 IORWF INDF, 1
$01FB $1384 BCF FSR, 7
$01FC $21C3 CALL _Delay_80us
$01FD $0841 MOVF Ow_Reset_bit_mask_L0, 0
$01FE $0500 ANDWF INDF, 0
$01FF $00C0 MOVWF Ow_Reset_res_L0
$0200 $0840 MOVF Ow_Reset_res_L0, 0
$0201 $3A00 XORLW 0
$0202 $3001 MOVLW 1
$0203 $1903 BTFSC STATUS, Z
$0204 $3000 MOVLW 0
$0205 $00C0 MOVWF Ow_Reset_res_L0
$0206 $21B1 CALL _Delay_500us
$0207 $0840 MOVF Ow_Reset_res_L0, 0
$0208 $00F0 MOVWF STACK_0
$0209 $0008 RETURN
Klistrade in den, ändrade de uppenbara grejjorna till "min syntax".
Dock vet jag inte hur macrona ser ut så jag gissade lite.
Samma gäller strukturen du har i början av koden.
Men det borde inte vara såstor skillnad, om du talar om vad macrona gör och likadant hur strukturen ser ut, samt även vad jag gissar är enumen för kommandona
Dock vet jag inte hur macrona ser ut så jag gissade lite.
Samma gäller strukturen du har i början av koden.
Men det borde inte vara såstor skillnad, om du talar om vad macrona gör och likadant hur strukturen ser ut, samt även vad jag gissar är enumen för kommandona
Möjligt att kompilatorn du kör är bra men jag kommer nog hålla mig till MikroC ett tag till i och med att jag har köpt ett kort som är "gjort" för den.
Någon jag upptäckte när jag läste manualen var att alla färdiga funktioner som medföljde kompilatorn som ow_reset mm ligger i ett speciellt format som slutar på .mcl
Det är tydligen ett format som ska göra att man ska kunna dela med sig av sina funktioner utan att göra koden publik. .mcl filen fungerar lika bra för MikroPascal, MikroC som MikroBasic.
Jag tror att det är därför som koden inte blir så bra med de färdiga funktionerna tyvärr. Jag kanske borde försöka skriva om funktionerna själv. Eller vad tycker/tror ni?
Någon jag upptäckte när jag läste manualen var att alla färdiga funktioner som medföljde kompilatorn som ow_reset mm ligger i ett speciellt format som slutar på .mcl
Det är tydligen ett format som ska göra att man ska kunna dela med sig av sina funktioner utan att göra koden publik. .mcl filen fungerar lika bra för MikroPascal, MikroC som MikroBasic.
Jag tror att det är därför som koden inte blir så bra med de färdiga funktionerna tyvärr. Jag kanske borde försöka skriva om funktionerna själv. Eller vad tycker/tror ni?