1 / 17

C and Assembler Subroutines: Using the LCD

C and Assembler Subroutines: Using the LCD. Outline. Basic structure of CW-created C programs for the HC12 How to incorporate assembly code How to use subroutines With no pass variables With pass variables. Compiler selection.

koko
Download Presentation

C and Assembler Subroutines: Using the LCD

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. C and Assembler Subroutines: Using the LCD

  2. Outline • Basic structure of CW-created C programs for the HC12 • How to incorporate assembly code • How to use subroutines • With no pass variables • With pass variables

  3. Compiler selection • Check both C and assembler to use both varieties of code when using the project wizard

  4. The Project Folder New • The project folder looks a lot like it did before with some new folders • Lets open some and see what’s inside • Most likely we will only need the prm and the sources folders

  5. The Bin Folder The raw machine code that will be pushed out to the board Parameters created during compilation inclusing RAM, ROM start/end addresses, all the variables used, program statistics • These are created after you compile. There are corresponding files created for the simulator and the monitor board. • At this point these files are created after compiling for the simulator only

  6. The S19 and S32 Source Files • Here is the S19 file created by CW. This is the binary data (in hex) that will get pushed to the board. • Many applications are available only in this form without the source code • This code can be pushed with the simple debug program shipped by Technological Arts. We use CW.

  7. The PRM folderSimulator and Monitor Linkers /* This is a linker parameter file for the MC9S12C32 */ NAMES END /* CodeWarrior will pass all the needed files to the linker by command line. But here you may add your own files too. */ SEGMENTS /* here all RAM/ROM areas of the device are listed. Used in PLACEMENT below. */ RAM = READ_WRITE 0x3800 TO 0x3FFF; /* unbanked FLASH ROM */ ROM_4000 = READ_ONLY 0x4000 TO 0x7FFF; ROM_C000 = READ_ONLY 0xC000 TO 0xF77F; END PLACEMENT /* here all predefined and user segments are placed into the SEGMENTS defined above. */ _PRESTART, /* Used in HIWARE format: jump to _Startup at the code start */ STARTUP, /* startup data structures */ ROM_VAR, /* constant variables */ STRINGS, /* string literals */ VIRTUAL_TABLE_SEGMENT, /* C++ virtual table segment */ //.stackstart, /* eventually used for OSEK kernel awareness: Main-Stack Start */ SSTACK, /* allocate stack first to avoid overwriting variables on overflow */ //.stackend, /* eventually used for OSEK kernel awareness: Main-Stack End */ END STACKSIZE 0x100 VECTOR 0 _Startup /* reset vector: this is the default entry point for a C/C++ application. */ //VECTOR 0 Entry /* reset vector: this is the default entry point for an Assembly application. */ //INIT Entry /* for assembly applications: that this is as well the initialization entry point */

  8. The PRM file • No ORG statements are required in C. Absolute memory references are in the prm file • Stack size (100 in this case) can be modified to be larger • The VECTOR statement can be used to identify the location of interrupt service routines

  9. The Source Folder / Assembler subroutines Main_asm.h Main.c #include <hidef.h> /* common defines and macros */ #include <mc9s12c32.h> /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12c32" #include "main_asm.h" /* interface to the assembly module */ void main(void) { /* put your own code here */ EnableInterrupts; asm_main(); /* call the assembly function */ Delay_100us(); DELAY_1MS(); for(;;) {} /* wait forever */ /* please make sure that you never leave this function */ } #ifndef _MAIN_ASM_H #define _MAIN_ASM_H #ifdef __cplusplus extern "C" { /* our assembly functions have C calling convention */ #endif void asm_main(void); /* interface to my assembly main function */ void Delay_10us(void); void Delay_100us(void); void DELAY_1ms(void); void DELAY_10ms(void); #ifdef __cplusplus } #endif #endif /* _MAIN_ASM_H */ Declare routines

  10. Main.asm ;******************************************* ;*This is like the "old" utillib.asm file * ;******************************************* ; export symbols XDEF asm_main XDEF Delay_10us XDEF DELAY_100us xdef DELAY_1ms xdef DELAY_10ms ; we use export 'Entry' as symbol. This allows us to ; reference 'Entry' either in the linker .prm file ; or from C/C++ later on ; include derivative specific macros INCLUDE 'mc9s12c32.inc' ; variable/data section MY_EXTENDED_RAM: SECTION ; Insert here your data definition. demonstration, temp_byte. temp_byte: DS.B 1 To execute assembly language routines simply use them as normal C functions, assembly file PLUS use XDEF in the assembly file to connect the two: ; code section MyCode: SECTION ; assembly routine called by the C/C++ application asm_main: MOVB #1,temp_byte ; demonstration code rts ; ---------------------------------------- ; ; ---------------------------------------- ; Subroutine DELAY: delays 10 uS ; ; ---------------------------------------- DELAY_10us: Delay_10us: DELAY_10US: PSHA LDAA #55 ; for 10 uS delay

  11. How about passing parameters between C and ASM • We have routines that pass data through a CPU register • The LCD routine uses B to pass charaters and commands • CW uses the following registers to pass data • If data is passed back the return values are stored in …

  12. More on passing • Most of the routines we used, LCD_out, LCD_cmd used the register B, so we’re in good shape to use these again • The Read_ATD subroutine that read the A2D and returned a value in D is also in good shape

  13. Passing Variables Main_asm.h Main.c #ifndef _MAIN_ASM_H #define _MAIN_ASM_H #ifdef __cplusplus extern "C" { /* our assembly functions have C calling convention */ #endif void asm_main(void); /* interface to my assembly main function */ void Delay_10us(void); void Delay_100us(void); void DELAY_1MS(void); void DELAY_10ms(void); char LCD_Out(char); #ifdef __cplusplus } #endif #include <hidef.h> /* common defines and macros */ #include <mc9s12c32.h> /* derivative information */ #pragma LINK_INFO DERIVATIVE "mc9s12c32" #include "main_asm.h" /* interface to the assembly module */ extern char LCD_Out(char); void main(void) { /* put your own code here */ EnableInterrupts; asm_main(); /* call the assembly function */ Delay_100us(); DELAY_1MS(); LCD_Out(0x34); for(;;) {} /* wait forever */ /* please make sure that you never leave this function */ }

  14. Main.asm ; export symbols XDEF asm_main XDEF Delay_10us . . xdef DELAY_10MS xdef LCD_Out . . ;===================================================================== ; The 3 major 'low level' LCD routines: ; Init_LCD = no parameters, initializes the LCD (cursor and display on ; clears and homes display, 2 line) ; LCD_CMD = takes value in reg. B and sends it as a command. ; LCD_Out = takes value in reg. B and sends it as data (ASCII codes) ;===================================================================== LCD_Data: LCD_Out: PSHB BCLR LCDCtrlPort, #RW_Bit ;it's data BSET LCDCtrlPort, #E_Bit+RS_Bit STAB LCDDataPort BCLR LCDCtrlPort,#E_Bit PULB RTS RTS

  15. Global Variables • If you want to share data between the two languages, one approach is to use global variables AND the extern keyword (on the C side) plus the XDEF directive (on the assembly side):

  16. LCD • We will need to use the LCD as an indicator of what we are doing while the HC12 is running. We can’t always rely on the simulator • We have three routines in our old utillib.asm file • LCD_init • LCD_out • LCD_cmd • In C we want to create more, with more flexibility

  17. Routines we want for the LCD • LCD_clear • Clears LCD and brings cursor home • LCD_location(2,10) • Moves cursor to row 2, position 10 without clearing the screen • LCD_writeline(buffer) • Clears the screen • Prints the array of characters in buffer[]

More Related