C'est pas tellement le .hex qui m'intéresse, c'est plutot le .asm mais avec les "label" et les noms de variables qui correspondent a mon .pde du départ.
Parce que désassembler le .hex pour voir ce qui change quand je modifie une ligne de programme, ca va me compliquer plus a vie que me a simplifier.
Ceci dit, mon arduino a 20 mhz est tellement plus rapide que mon ex pic a 16 mhz/4, que finalement savoir dans que ordre imbriquer mes if c'est moins important finalement. (mais bon, c'est pas une raison pour gaspiller des cycles ^^)
Pour l'example, voila le genre de trucs que j'avais "avant"
Ca c'est un morceau de C que je compile avec SDCC
#define PIC_CLK 2000000
#include <pic16f886.h>
//unsigned int at 0x2007 __CONFIG = (_CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_OFF & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF);
unsigned int at 0x2007 __CONFIG = 0x3732;
// super boucle d'attente
void wait(unsigned int j){
unsigned int a;
unsigned int i;
for (i=0; i<j; i++);
{for (a=0;a<65000;a++);{;}
}
}
// K2000 version beta
void main()
{
unsigned int delay=65000;
TRISB=0; //Port B en sortie (leds rouges)
PORTB=1;
while (1){
while(PORTB<128){
PORTB=PORTB<<1;
//wait(delay);
}
while(PORTB>1){
PORTB=PORTB>>1;
//wait (delay);
}
}
}
Et ca c'est e bazard intermediaire que ca donne en assembleur, avant de rentrer dans GPASM
;--------------------------------------------------------
; File Created by SDCC : free open source ANSI-C Compiler
; Version 2.8.5 #5278 (Dec 12 2008) (Mac OS X i386)
; This file was generated Sat Jun 6 17:27:16 2009
;--------------------------------------------------------
; PIC port for the 14-bit core
;--------------------------------------------------------
; .file "k2000.c"
list p=16f876
radix dec
include "p16f876.inc"
;--------------------------------------------------------
; config word
;--------------------------------------------------------
__config 0x3732
;--------------------------------------------------------
; external declarations
;--------------------------------------------------------
extern _ADCON0_bits
extern _ADCON1_bits
extern _CCP1CON_bits
extern _CCP2CON_bits
extern _EECON1_bits
extern _INTCON_bits
extern _OPTION_REG_bits
extern _PCON_bits
extern _PIE1_bits
extern _PIE2_bits
extern _PIR1_bits
extern _PIR2_bits
extern _PORTA_bits
extern _PORTB_bits
extern _PORTC_bits
extern _RCSTA_bits
extern _SSPCON_bits
extern _SSPCON2_bits
extern _SSPSTAT_bits
extern _STATUS_bits
extern _T1CON_bits
extern _T2CON_bits
extern _TRISA_bits
extern _TRISB_bits
extern _TRISC_bits
extern _TXSTA_bits
extern _INDF
extern _TMR0
extern _PCL
extern _STATUS
extern _FSR
extern _PORTA
extern _PORTB
extern _PORTC
extern _PCLATH
extern _INTCON
extern _PIR1
extern _PIR2
extern _TMR1L
extern _TMR1H
extern _T1CON
extern _TMR2
extern _T2CON
extern _SSPBUF
extern _SSPCON
extern _CCPR1L
extern _CCPR1H
extern _CCP1CON
extern _RCSTA
extern _TXREG
extern _RCREG
extern _CCPR2L
extern _CCPR2H
extern _CCP2CON
extern _ADRESH
extern _ADCON0
extern _OPTION_REG
extern _TRISA
extern _TRISB
extern _TRISC
extern _PIE1
extern _PIE2
extern _PCON
extern _SSPCON2
extern _PR2
extern _SSPADD
extern _SSPSTAT
extern _TXSTA
extern _SPBRG
extern _ADRESL
extern _ADCON1
extern _EEDATA
extern _EEADR
extern _EEDATH
extern _EEADRH
extern _EECON1
extern _EECON2
extern __sdcc_gsinit_startup
;--------------------------------------------------------
; global declarations
;--------------------------------------------------------
global _wait
global _main
global PSAVE
global SSAVE
global WSAVE
global STK12
global STK11
global STK10
global STK09
global STK08
global STK07
global STK06
global STK05
global STK04
global STK03
global STK02
global STK01
global STK00
sharebank udata_ovr 0x0070
PSAVE res 1
SSAVE res 1
WSAVE res 1
STK12 res 1
STK11 res 1
STK10 res 1
STK09 res 1
STK08 res 1
STK07 res 1
STK06 res 1
STK05 res 1
STK04 res 1
STK03 res 1
STK02 res 1
STK01 res 1
STK00 res 1
;--------------------------------------------------------
; global definitions
;--------------------------------------------------------
;--------------------------------------------------------
; absolute symbol definitions
;--------------------------------------------------------
;--------------------------------------------------------
; compiler-defined variables
;--------------------------------------------------------
UDL_k2000_0 udata
r0x1001 res 1
r0x1000 res 1
r0x1002 res 1
r0x1003 res 1
;--------------------------------------------------------
; initialized data
;--------------------------------------------------------
;--------------------------------------------------------
; overlayable items in internal ram
;--------------------------------------------------------
; udata_ovr
;--------------------------------------------------------
; reset vector
;--------------------------------------------------------
STARTUP code
nop
pagesel __sdcc_gsinit_startup
goto __sdcc_gsinit_startup
;--------------------------------------------------------
; code
;--------------------------------------------------------
code_k2000 code
;***
; pBlock Stats: dbName = M
;***
;entry: _main ;Function start
; 2 exit points
;has an exit
;; Starting pCode block
_main ;Function start
; 2 exit points
; .line 19; "k2000.c" TRISB=0; //Port B en sortie (leds rouges)
BANKSEL _TRISB
CLRF _TRISB
; .line 20; "k2000.c" PORTB=1;
MOVLW 0x01
BANKSEL _PORTB
MOVWF _PORTB
;unsigned compare: left < lit(0x80=128), size=1
_00125_DS_
; .line 23; "k2000.c" while(PORTB<128){
MOVLW 0x80
BANKSEL _PORTB
SUBWF _PORTB,W
BTFSC STATUS,0
GOTO _00128_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
; .line 24; "k2000.c" PORTB=PORTB<<1;
BCF STATUS,0
RLF _PORTB,F
GOTO _00125_DS_
;swapping arguments (AOP_TYPEs 1/3)
;unsigned compare: left >= lit(0x2=2), size=1
_00128_DS_
; .line 27; "k2000.c" while(PORTB>1){
MOVLW 0x02
BANKSEL _PORTB
SUBWF _PORTB,W
BTFSS STATUS,0
GOTO _00125_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
;shiftRight_Left2ResultLit:4862: shCount=1, size=1, sign=0, same=1, offr=0
; .line 28; "k2000.c" PORTB=PORTB>>1;
BCF STATUS,0
RRF _PORTB,F
GOTO _00128_DS_
RETURN
; exit point of _main
;***
; pBlock Stats: dbName = C
;***
;entry: _wait ;Function start
; 2 exit points
;has an exit
;5 compiler assigned registers:
; r0x1000
; STK00
; r0x1001
; r0x1002
; r0x1003
;; Starting pCode block
_wait ;Function start
; 2 exit points
; .line 6; "k2000.c" void wait(unsigned int j){
BANKSEL r0x1000
MOVWF r0x1000
MOVF STK00,W
MOVWF r0x1001
; .line 9; "k2000.c" for (i=0; i<j; i++);
CLRF r0x1002
CLRF r0x1003
_00105_DS_
BANKSEL r0x1000
MOVF r0x1000,W
SUBWF r0x1003,W
BTFSS STATUS,2
GOTO _00120_DS_
MOVF r0x1001,W
SUBWF r0x1002,W
_00120_DS_
BTFSC STATUS,0
GOTO _00108_DS_
;genSkipc:3083: created from rifx:0xbfff58c4
BANKSEL r0x1002
INCF r0x1002,F
BTFSC STATUS,2
INCF r0x1003,F
GOTO _00105_DS_
_00108_DS_
; .line 10; "k2000.c" {for (a=0;a<65000;a++);{;}
MOVLW 0xe8
BANKSEL r0x1001
MOVWF r0x1001
MOVLW 0xfd
MOVWF r0x1000
_00111_DS_
MOVLW 0xff
BANKSEL r0x1001
ADDWF r0x1001,F
BTFSS STATUS,0
DECF r0x1000,F
MOVF r0x1001,W
IORWF r0x1000,W
BTFSS STATUS,2
GOTO _00111_DS_
RETURN
; exit point of _wait
; code size estimation:
; 48+ 9 = 57 instructions ( 132 byte)
end
Ca c'etait un exemple "simple", jute pour voir s'il fallait mieux faire un machin=machin>>1 ou machin=machin/2 ou je ne sait pus quelle autre formule qui reviens au meme.
L'idée c'est de faire le meme genre d'essais mais sur arduino