Hello,
For inline assembly better to use GLOBAL variables which takes place
outside of all function and you can avoid renaming variables.
Better choice not using inline assembly rather writing assembly code in a
separate files. Then you can make LIBRARIES or simple link to the main
program by an EXTERNal function.
Here is a short example in assemly and C:
------------------------------------ ASM
---------------------------------------
list p=pic16f887
#include <p16f887.inc>
global _initports
global _PORTA_update
global _PORTB_update
global _PORTC_update
global _PORTD_update
global _PORTE_update
global _wPORTA
global _wPORTB
global _wPORTC
global _wPORTD
global _wPORTE
portio_data UDATA
_wPORTA RES 1
_wPORTB RES 1
_wPORTC RES 1
_wPORTD RES 1
_wPORTE RES 1
portio_code CODE
_initports
banksel ANSELH
clrf ANSELH
banksel ANSEL
clrf ANSEL
banksel TRISA
movlw 0xFF
movwf TRISA
clrf TRISB
movlw 0x4F
movwf TRISC
movlw 0x0F
movwf TRISD
movlw 0x06
movwf TRISE
banksel _wPORTA
clrf _wPORTA
clrf _wPORTB
clrf _wPORTC
clrf _wPORTD
clrf _wPORTE
pagesel _PORTA_update
call _PORTA_update
pagesel _PORTB_update
call _PORTB_update
pagesel _PORTC_update
call _PORTC_update
pagesel _PORTD_update
call _PORTE_update
pagesel _PORTE_update
call _PORTE_update
return
_PORTA_update
banksel _wPORTA
movf _wPORTA,W
banksel PORTA
movwf PORTA
return
_PORTB_update
banksel _wPORTB
movf _wPORTB,W
banksel PORTB
movwf PORTB
return
_PORTC_update
banksel _wPORTC
movf _wPORTC,W
banksel PORTC
movwf PORTC
return
_PORTD_update
banksel _wPORTD
movf _wPORTD,W
banksel PORTD
movwf PORTD
return
_PORTE_update
banksel _wPORTE
movf _wPORTE,W
banksel PORTE
movwf PORTE
return
end
--------------------- C ----------------------------------
#include <pic16f887.h>
typedef unsigned int configword;
configword __at _CONFIG1 CONFIG1 =
_LVP_OFF & _FCMEN_OFF & _IESO_OFF &
_BOR_ON & _CPD_OFF & _CP_ON & _MCLRE_ON &
_PWRTE_ON & _WDT_OFF & _HS_OSC;
configword __at _CONFIG2 CONFIG2 = _WRT_OFF & _BOR21V;
extern void initports( void );
extern void PORTA_update( void );
extern void PORTB_update( void );
extern void PORTB_update( void );
extern void PORTD_update( void );
extern void PORTE_update( void );
extern unsigned char wPORTA,wPORTB,wPORTC,wPORTD,wPORTE;
main()
{
initports();
// ...........................
while()
{
wPORTB &= 0x08;
PORTA_update( void );
PORTB_update( void );
PORTB_update( void );
PORTD_update( void );
PORTE_update( void );
}
}
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Here is an other example to show, how to aviod variables in inline assembly:
http://galzsolt.zzl.org/Elektronika/Soroskijelzo_v01/Soroskijelzo_v01.c
There are useful snipets on the internet...
------------------------------------------------------------------------------
Rapidly troubleshoot problems before they affect your business. Most IT
organizations don't have a clear picture of how application performance
affects their revenue. With AppDynamics, you get 100% visibility into your
Java,.NET, & PHP application. Start your 15-day FREE TRIAL of AppDynamics Pro!
http://pubads.g.doubleclick.net/gampad/clk?id=84349831&iu=/4140/ostg.clktrk
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user