<html><head><title></title><!-- <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> -->
<link rel="stylesheet" href="programCode_fichiers/style.css">
<script language="javascript" src="programCode_fichiers/js.js"></script></head>
<body bgcolor="#f0f0f0">
<table style="border-collapse: collapse;" border="1" bordercolor="#000000" cellpadding="6" cellspacing="0" width="100%"><tbody><tr><td background="programCode_fichiers/title_gradient_large_red.gif" bgcolor="#800000"><font class="largeframe"><nobr>Program Code</nobr><nobr></nobr></font></td></tr>
<tr><td bgcolor="#ffffff">
<a href="http://www.it.lth.se/digp/sammanfattning/2001/lp-2/grupp16/techReport.html">Back</a>
<br><br><br>
<h2>main.c</h2><br>
<br>//Yee Yik & Andreas Lundgren
<br>//Digital Project Fall 2001
<br>//Group 16
<br>
<br>//Main program
<br>
<br>#include "IO-reg.h"
<br>#include "checkNumPad.h"
<br>#include "LCD_driver.h"
<br>#include "buttonHandler.h"
<br>#include "measureMode.h"
<br>
<br>char writePosition;
<br>unsigned int adjustmentNumber;
<br>unsigned long measuredTime;
<br>unsigned int nbrOverflow;
<br>unsigned int deltaF;
<br>
<br>void main (void) {
<br>
<br> char button;
<br> unsigned int temp_nbrOf; //temparary store # of overflow so we can restore the original value later
<br>
<br> /*Initialise the LCD*/
<br> initLCD();
<br> //set position to kolumn 1, row 2.
<br> writePosition = 0x40;
<br>
<br> //set PORTA, bit 3, as input
<br> PACTL &= 0xF7;
<br>
<br> //Turn flash trigger off.
<br> PORTD &= 0xEF;
<br>
<br> //set PORTD, bit 4, as output, rest as input
<br> DDRD |= 0x10;
<br> DDRD &= 0xD0;
<br>
<br> measuredTime = 0;
<br> adjustmentNumber = 0;
<br> nbrOverflow = 0;
<br> deltaF = 0;
<br>
<br> while (1){
<br> /*Check if a buton is pressed, and use the result to display on LCD right away
<br> then wait for the bouncing of 0&1 result from button pressing to stop,
<br> wait for button is released,
<br> and wait for the bouncing result from releasing button to stop*/
<br>
<br> if ((PORTA & 8) != 0){
<br> PORTB &= 0xF7; //Turn light diode off;
<br> if ((PORTA & 4) != 0){
<br> startMeasure();
<br> measuredTime = nbrOverflow;
<br> measuredTime = measuredTime * 0xFFFF;
<br> measuredTime = measuredTime + deltaF;
<br> write_long_position(0, measuredTime);
<br> } else {
<br> temp_nbrOf = nbrOverflow;
<br> startShooting();
<br> nbrOverflow = temp_nbrOf;
<br> }
<br> while ((PORTA & 8) != 0){} // Waiting for button to be released
<br> }
<br> PORTB |= 0x08; //Turn light diode on;
<br>
<br> button = checkNumPad();
<br> if ((button) > 0){
<br> button_handler(button);
<br> wait_bouncing();
<br> wait_button_release();
<br> wait_bouncing();
<br> } //end of if (button is pressed)
<br> } //end of while loop
<br>}
<br>
<br>
<br><h2>buttonHandler.h</h2><br>
<br>void button_handler(char button);
<br>char *long_to_string(long number);
<br>
<br>
<br><h2>buttonHandler.c</h2><br>
<br>//Yee Yik & Andreas Lundgren
<br>//Digital Project Fall 2001
<br>//Group 16
<br>
<br>/*Button handler program
<br> Get a button 1-16 and handles it.*/
<br>
<br>#include "LCD_driver.h"
<br>
<br>extern char writePosition;
<br>extern int adjustmentNumber;
<br>extern long measuredTime;
<br>extern unsigned int nbrOverflow;
<br>extern unsigned int deltaF;
<br>
<br>
<br>char *long_to_string(long number)
<br>{
<br> char string[11];
<br> short pos2 = 9;
<br>
<br> while (number > 0)
<br> {
<br> string[pos2] = (number % 10) + '0';
<br> number = number / 10;
<br> pos2--;
<br> }
<br> string[10] = 0;
<br> return &string[++pos2];
<br>}
<br>
<br>//char button_handler(char button, char writePosition)
<br>void button_handler(char button)
<br>{
<br> switch (button)
<br> {
<br> case 1:
<br> break;
<br> case 2:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 7;
<br> write_character_position(writePosition,'7');
<br> writePosition++;
<br> }
<br> break;
<br> case 3:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 4;
<br> write_character_position(writePosition,'4');
<br> writePosition++;
<br> }
<br> break;
<br> case 4:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 1;
<br> write_character_position(writePosition,'1');
<br> writePosition++;
<br> }
<br> break;
<br> case 5:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 0;
<br> write_character_position(writePosition,'0');
<br> writePosition++;
<br> }
<br> break;
<br> case 6:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 8;
<br> write_character_position(writePosition,'8');
<br> writePosition++;
<br> }
<br> break;
<br> case 7:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 5;
<br> write_character_position(writePosition,'5');
<br> writePosition++;
<br> }
<br> break;
<br> case 8:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 2;
<br> write_character_position(writePosition,'2');
<br> writePosition++;
<br> }
<br> break;
<br> case 9:
<br> break;
<br> case 10:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 9;
<br> write_character_position(writePosition,'9');
<br> writePosition++;
<br> }
<br> break;
<br> case 11:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 6;
<br> write_character_position(writePosition,'6');
<br> writePosition++;
<br> }
<br> break;
<br> case 12:
<br> if (writePosition < 0x44){
<br> adjustmentNumber = (adjustmentNumber * 10) + 3;
<br> write_character_position(writePosition,'3');
<br> writePosition++;
<br> }
<br> break;
<br> case 13: //a backspace button
<br> if (writePosition > 0x40){
<br> write_character_position(--writePosition, 20); //write a space to the position
<br> adjustmentNumber = (adjustmentNumber / 10);
<br> }
<br> break;
<br> case 14:
<br> break;
<br> case 15: //minus sign
<br> if ((measuredTime - adjustmentNumber) > 0){
<br> clear_display();
<br> measuredTime = measuredTime - adjustmentNumber;
<br> if (deltaF < adjustmentNumber)
<br> nbrOverflow--;
<br> deltaF = deltaF - adjustmentNumber;
<br> write_long_position(0x0,measuredTime);
<br> writePosition = 0x40;
<br> adjustmentNumber = 0;
<br> }
<br> break;
<br> case 16: //plus sign
<br> clear_display();
<br> measuredTime = measuredTime + adjustmentNumber;
<br> deltaF = deltaF + adjustmentNumber;
<br> if (deltaF < adjustmentNumber)
<br> nbrOverflow++;
<br> write_long_position(0x0,measuredTime);
<br> writePosition = 0x40;
<br> adjustmentNumber = 0;
<br> break;
<br> }
<br>
<br>}
<br>
<br>
<br><h2>checkNumPad.h</h2><br>
<br>char sweep(void);
<br>void wait_bouncing(void);
<br>void wait_button_release(void);
<br>char checkNumPad (void);
<br>
<br>
<br><h2>checkNumPad.c</h2><br>//Yee Yik & Andreas Lundgren
<br>//Digital Project Fall 2001
<br>//Group 16
<br>
<br>/*Keypad input program
<br> Read input from keypad and send corresponding signal to LCD*/
<br>
<br>#include "IO-reg.h"
<br>
<br>char sweep() {
<br>
<br> if ((PORTD & 0x0F) == 0)
<br> return 0;
<br>
<br> else if ((PORTD & 0x01) != 0 )
<br> return 1;
<br>
<br> else if ((PORTD & 0x02) != 0 )
<br> return 2;
<br>
<br> else if ((PORTD & 0x04) != 0)
<br> return 3;
<br>
<br> else if ((PORTD & 0x08) != 0)
<br> return 4;
<br>
<br> else
<br> return 0;
<br>
<br>} //end of sweep()
<br>
<br>char checkNumPad () {
<br>
<br> char button = 0;
<br> //set PORTB to 1000xxxx (ie set PB7 to 1)
<br> PORTB &= 0x0F;
<br> PORTB |= 0x80;
<br>
<br> if ((button = sweep()) > 0) //some button is pressed
<br> return button;
<br>
<br> //set PORTB to 0100xxxx (ie set PB6 = 1)
<br> PORTB &= 0x0F;
<br> PORTB |= 0x40;
<br>
<br> if ((button = sweep()) > 0) //some button is pressed
<br> return (button + 4);
<br>
<br> //set PORTB to 0010xxxx (ie set PB5 = 1)
<br> PORTB &= 0x0F;
<br> PORTB |= 0x20;
<br>
<br> if ((button = sweep()) > 0) //some button is pressed
<br> return (button + 8);
<br>
<br>
<br> //set PORTB to 0001xxxx (ie set PB4 = 1)
<br> PORTB &= 0x0F;
<br> PORTB |= 0x10;
<br>
<br> if ((button = sweep()) > 0) //some button is pressed
<br> return (button + 12);
<br>
<br> return 0;
<br>
<br>} //end of checkNumPad()
<br>
<br>void wait_bouncing() {
<br>
<br> char i;
<br> //For-loop is 26 clk:s, i=100 & 8 MHz => 300 us
<br> for (i = 100; i >0; i--)
<br> {}
<br>} //end of wait_release()
<br>
<br>void wait_button_release() {
<br> while (checkNumPad() > 0)
<br> {}
<br>} //end of wait_button_release()
<br>
<br>
<br><h2>LCD_driver.h</h2><br>
<br>void write_character_position(char pos, char ch);
<br> //write character ch at position pos on the LCD
<br>void write_string_position(char pos, char *string);
<br> //write string of character at position pos on the LCD
<br>void write_long_position(char pos, long number);
<br> //write long at position po on the LCD
<br>void clear_display(void);
<br> //clear display
<br>void initLCD(void);
<br>
<br>//temporary
<br>void put_character(char ch);
<br>
<br>
<br><h2>LCD_driver.c</h2><br>
<br>#include "int6811.h"
<br>#include "io6811.h"
<br>
<br>char ch;
<br>int x;
<br>
<br>void testBF (void)
<br>{
<br> DDRC = 0;
<br> PORTB &= 0xF8; //retain other value in PB[3:7]
<br> PORTB |= 0x03; //set E = 1, R/W = 1, RS = 0
<br> while (PORTC&0x80) { } //wait until busy flag is off
<br>}
<br>
<br>void put(char ch)
<br>{
<br> PORTC = ch;
<br> DDRC = 0xFF; //enable PORTC as output
<br> PORTB |= 0x01; //set Enable to 1, ie read from PORTC
<br> PORTB &=0xFE; //set Enable to 0, other value unchange
<br> DDRC = 0; //disable PORTC as output
<br>}
<br>
<br>void set_command(void)
<br>{
<br> PORTB &= 0xF9; //write to instruction register, RS = 0, R/W = 0, E = x
<br>}
<br>
<br>void set_character(void)
<br>{
<br> PORTB |= 0x04;
<br> PORTB &= 0xFD; //write to data register, RS = 1, R/W = 0, E = x
<br>}
<br>
<br>void put_command(char ch)
<br>{
<br> testBF();
<br> set_command();
<br> put(ch);
<br>}
<br>
<br>void put_character(char ch)
<br>{
<br> testBF();
<br> set_character();
<br> put(ch);
<br>}
<br>
<br>void wait_15ms(void)
<br>{
<br> for (x = 4700; x != 0; x--); {}
<br> //for-loop is 26 clk:s
<br>}
<br>
<br>void initLCD(void)
<br>{
<br> wait_15ms();
<br> set_command();
<br> put(0x38);
<br> wait_15ms();
<br> put(0x38);
<br> wait_15ms();
<br> put(0x38);
<br> put_command(0x38);
<br> put_command(0x01);
<br> put_command(0x06);
<br> put_command(0x0C);
<br>}
<br>
<br>void clear_display()
<br>{
<br> put_command(0x01);
<br>}
<br>
<br>void write_character_position(char pos, char ch)
<br>{
<br> put_command(128+pos);
<br> put_character(ch);
<br>}
<br>
<br>void write_string_position(char pos, char *string)
<br>{
<br> put_command(128+pos); //+0x40
<br> while (*string != 0)
<br> {
<br> put_character(*string);
<br> string++;
<br> }
<br>}
<br>
<br>void write_long_position(char pos, long number)
<br>{
<br> char i = 15;
<br> if (number == 0){
<br> write_character_position(pos+i,'0');
<br> }
<br> while (number != 0)
<br> {
<br> write_character_position(pos+i,(number % 10) + '0');
<br> number = number / 10;
<br> i--;
<br> }
<br>}
<br>
<br>
<br><h2>measureMode.h</h2><br>
<br>void startMeasure();
<br>void startShooting();
<br>
<br>
<br><h2>measureMode.c</h2><br>
<br>//Enable time capture interrupt from PORTA[0:1]
<br>#include "IO-reg.h"
<br>#include "Vectors.h"
<br>#include <intr6811.h>
<br>
<br>extern unsigned int nbrOverflow;
<br>char waitingForInterrupt;
<br>unsigned int foil1;
<br>unsigned int foil2;
<br>extern unsigned int deltaF;
<br>char waitingForInterrupt2;
<br>char inMeasureMode;
<br>unsigned int i;
<br>
<br>/*MEASURE MODE*/
<br>void startMeasure() {
<br>
<br> waitingForInterrupt = 1;
<br> foil1 = foil2 = 0;
<br> inMeasureMode = 1;
<br>
<br> //Capture falling edge only
<br> TCTL2 |= 0x0A; //xxxx 1x1x
<br> TCTL2 &= 0xFA; //xxxx x0x0
<br>
<br> //clear flag first for PA0 & PA1
<br> TFLG1 = 0x03;
<br> //clear flag first for timer Overflow
<br> TFLG2 = 0x80;
<br>
<br> //Enable PORTA[0:1] for time capture
<br> TMSK1 |= 0x03; //xxxx xx11
<br>
<br> enable_interrupt();
<br>
<br>//start
<br> while (waitingForInterrupt == 1) /*ADD IF TIME PASSED IS TOO LONG, THEN RETURN*/
<br> {
<br> wait_for_interrupt();
<br> }
<br>
<br> disable_interrupt();
<br>
<br> if (foil2 >= foil1)
<br> deltaF = foil2-foil1;
<br> else {
<br> deltaF = 0xFFFF - foil1 + foil2;
<br> nbrOverflow--;
<br> }
<br>
<br>} //end of startMeasure()
<br>
<br>
<br>/*SHOOTING MODE*/
<br>void startShooting() {
<br>
<br> waitingForInterrupt2 = 1;
<br> foil1 = 0;
<br> inMeasureMode = 0;
<br>
<br> //Turn flash trigger off.
<br> PORTD &= 0xEF;
<br>
<br> //Capture falling edge only
<br> TCTL2 |= 0x0A; //xxxx 1x1x
<br> TCTL2 &= 0xFA; //xxxx x0x0
<br>
<br> //clear flag first for PA0
<br> TFLG1 = 0x01;
<br> //clear flag first for timer Overflow
<br> TFLG2 = 0x80;
<br>
<br> //Enable PORTA[0] for time capture
<br> TMSK1 |= 0x01; //xxxx xxx1
<br>
<br> //set PA4 as output campare pin
<br> OC1M |= 0x10;
<br>
<br> enable_interrupt();
<br>
<br>//start
<br>
<br> while(waitingForInterrupt2 == 1) {
<br> wait_for_interrupt();
<br> }
<br>
<br> disable_interrupt();
<br> for (i=0; i < 1000; i++){}
<br> //Turn flash trigger off.
<br> PORTD &= 0xEF;
<br>}
<br>
<br>//Timer Ovwerflow
<br>interrupt void TO_interrupt()
<br>{
<br> nbrOverflow++;
<br>
<br> //clear flag Timer Overflow
<br> TFLG2 = 0x80;
<br>}
<br>
<br>//PA0, first foil, interrupt which cause the system to start counting
<br>interrupt void IC3_interrupt()
<br>{
<br> //clear flag Timer Overflow
<br> TFLG2 = 0x80;
<br>
<br> foil1 = TIC3; //store captured time from TIC 3 to foil1
<br>
<br> if (! inMeasureMode) {
<br> if (nbrOverflow > 0)
<br> TOC4 = foil1;
<br> else
<br> TOC4 = deltaF + foil1;
<br>
<br> //clear flag first for PA4
<br> TFLG1 = 0x10;
<br> //Enable OC4 interrupt
<br> TMSK1 |= 0x10;
<br> } //end of if (!inMeasureMode)
<br> else {
<br> //Enable Timer Overflow
<br> TMSK2 |= 0x80;
<br> }
<br>
<br> //clear flag first for PA0
<br> TFLG1 = 0x01;
<br> //Disable IC3 interrupt
<br> TMSK1 &= 0xFE; //xxxx xxx0
<br>
<br>}
<br>
<br>//end measurement
<br>interrupt void IC2_interrupt()
<br>{
<br> foil2 = TIC2;
<br>
<br> //clear flag first for PA1
<br> TFLG1 = 0x02;
<br> //Disable IC2 interrupts
<br> TMSK1 &= 0xFD; //xxxx xx0x
<br> //Disable Timer Ovewflow
<br> TMSK2 &= 0x7F;
<br>
<br> waitingForInterrupt = 0;
<br>}
<br>
<br>interrupt void OC4_interrupt()
<br>{
<br> foil2 = TCNT;
<br>
<br> if (nbrOverflow == 0) {
<br> PORTD |= 0x10; //Turn flash trigger on.
<br> waitingForInterrupt2 = 0; //Exit while-loop in startShooting()
<br> //Disable OC4 interrupts
<br> TMSK1 &= 0xEF; //xxx0 xxxx
<br> } else if (nbrOverflow == 1) {
<br> TOC4 = deltaF + foil2;
<br> nbrOverflow--;
<br> } else {
<br> TOC4 = foil2;
<br> nbrOverflow--;
<br> }
<br>
<br> //clear flag first for PA4
<br> TFLG1 = 0x10;
<br>}
<br>
<br>
<br>* </intr6811.h><h3>CSTARTUP.S07</h3>
*
<br>*
*
<br>* This module contains the 68HC11 startup routine and *
<br>* must usually be tailored to suit special hardware needs *
<br>*
*
<br>* Note: The routine ?SEG_INIT_L07 is now included in CSTARTUP *
<br>* The size of stack is set in the link-file (lnk6???.xcl) *
<br>* The segment INTVEC is declared COMMON
*
<br>*
*
<br>* Version: 3.30 [IHAW 11/Feb/92]
*
<br>* Revised: 3.31 [IHAW 07/Jul/92] Bug in stack init *
<br>* Revised: 3.32 [IJAR 06/Mar/93] Startup code for K4 added *
<br>* Revised: 4.11 [IMAI 29/Oct/96] Updated for ICC6811 4.11 *
<br>* [SN 19/jan/98] Updated for Digitala projekt *
<br>*
*
<br>*---------------------------------------------------------------*
<br> NAME CSTARTUP
<br> EXTERN ?C_EXIT ; Where to go when program is done
<br>
<br> EXTERN main ; Where to begin execution
<br>
<br>*---------------------------------------------------------------*
<br>* CSTACK - The C stack segment
*
<br>*
*
<br>* Please look in the link-file ??????.xcl how to increment *
<br>* the stack without having to reassemble cstartup.s07 ! *
<br>*---------------------------------------------------------------*
<br>
<br> RSEG CSTACK
<br> RMB 0 ; A bare minimum !!
<br>
<br>*---------------------------------------------------------------*
<br>* Forward declarations of segments used in initialization *
<br>*---------------------------------------------------------------*
<br>
<br> RSEG UDATA0
<br> RSEG UDATA1
<br> RSEG IDATA0
<br> RSEG IDATA1
<br> RSEG ECSTR
<br> RSEG WCSTR
<br> RSEG CDATA0
<br> RSEG CDATA1
<br> RSEG CCSTR
<br> RSEG CONST
<br> RSEG CSTR
<br> RSEG TEMP
<br>
<br>
<br>*---------------------------------------------------------------*
<br>* RCODE - Where the program actually starts *
<br>*---------------------------------------------------------------*
<br> RSEG RCODE
<br>init_C:
<br> LDS #$00FF ; #$01FF for 68HC11E9
<br> ; #$02FF for 68HC11E20
<br>
<br>*---------------------------------------------------------------*
<br>* If the 68HC11 OPTION register MUST be modified, here is the *
<br>* place to do it in order to meet the 64-cycle requirement. *
<br>* You can also do it in the beginning of main if You don't use *
<br>* seg_init
*
<br>*---------------------------------------------------------------*
<br>
<br> LDAA #$00 ;store value 00000000 in TMSK2 to set the speed of TCNT. (500 ns)
<br> STAA $1024
<br>
<br>*---------------------------------------------------------------*
<br>* If it is not a requirement that static/global data is set *
<br>* to zero or to some explicit value at startup, the next line *
<br>* of code can be deleted.
*
<br>*---------------------------------------------------------------*
<br>
<br> BSR seg_init
<br>
<br>*---------------------------------------------------------------*
<br>* If hardware must be initiated from assembly or if interrupts *
<br>* should be on when reaching main, this is the place to insert *
<br>* such code.
*
<br>*---------------------------------------------------------------*
<br>
<br> JSR main main()
<br>
<br>*---------------------------------------------------------------*
<br>* Now when we are ready with our C program (usually 6811 *
<br>* programs are continouous) we must perform a system-dependent *
<br>* action. In this simple case we jump to ?C_EXIT. *
<br>*---------------------------------------------------------------*
<br>* DO NOT CHANGE NEXT LINE OF CSTARTUP IF YOU WANT TO RUN YOUR *
<br>* SOFTWARE WITH THE AID OF THE C-SPY HLL DEBUGGER. *
<br>*---------------------------------------------------------------*
<br> JMP ?C_EXIT
<br>
<br>
<br>*---------------------------------------------------------------*
<br>* Copy initialized PROMmed code to shadow RAM and clear *
<br>* uninitialized variables.
*
<br>*---------------------------------------------------------------*
<br>seg_init:
<br>
<br>*---------------------------------------------------------------*
<br>* Zero out UDATA segments
*
<br>*---------------------------------------------------------------*
<br>
<br> LDD #.SFE.(UDATA0)
<br> SUBD #.SFB.(UDATA0)
<br> BEQ SKIP00
<br> XGDY
<br> LDX #.SFB.(UDATA0)
<br> BSR zero_mem
<br>SKIP00
<br>
<br> LDD #.SFE.(UDATA1)
<br> SUBD #.SFB.(UDATA1)
<br> BEQ SKIP01
<br> XGDY
<br> LDX #.SFB.(UDATA1)
<br> BSR zero_mem
<br>SKIP01
<br>
<br>*---------------------------------------------------------------*
<br>* Copy CDATA segments into IDATA segments *
<br>*---------------------------------------------------------------*
<br>
<br> LDD #.SFE.(CDATA0)
<br> SUBD #.SFB.(CDATA0)
<br> BEQ SKIP02
<br> LDX #.SFB.(CDATA0)
<br> LDY #.SFB.(IDATA0)
<br> BSR copy_mem
<br>SKIP02
<br>
<br> LDD #.SFE.(CDATA1)
<br> SUBD #.SFB.(CDATA1)
<br> BEQ SKIP03
<br> LDX #.SFB.(CDATA1)
<br> LDY #.SFB.(IDATA1)
<br> BSR copy_mem
<br>SKIP03
<br>
<br>*---------------------------------------------------------------*
<br>* Copy CCSTR into ECSTR
*
<br>*---------------------------------------------------------------*
<br>
<br> LDD #.SFE.(CCSTR)
<br> SUBD #.SFB.(CCSTR)
<br> BEQ SKIP04
<br> LDX #.SFB.(CCSTR)
<br> LDY #.SFB.(ECSTR)
<br> BSR copy_mem
<br>SKIP04
<br> RTS ; End of initialization
<br>
<br>*---------------------------------------------------------------*
<br>* Clear memory
*
<br>*---------------------------------------------------------------*
<br>zero_mem:
<br> CLR 0,X
<br> INX
<br> DEY
<br> BNE zero_mem
<br> RTS
<br>
<br>*---------------------------------------------------------------*
<br>* Copy memory
*
<br>* Copy (X) --> (Y), counter in D
*
<br>*---------------------------------------------------------------*
<br>copy_mem:
<br> PSHA
<br> LDAA 0,X
<br> STAA 0,Y
<br> PULA
<br> INX
<br> INY
<br> SUBD #1
<br> BNE copy_mem
<br> RTS
<br>
<br>
<br>
<br>*---------------------------------------------------------------*
<br>* Interrupt vectors must be inserted by the user. Here we *
<br>* only used RESET.
*
<br>*---------------------------------------------------------------*
<br>
<br> COMMON INTVEC
<br> ; Assuming start address = FFD6 for 68HC11
<br> RMB 40
<br>
<br> FDB init_C
<br>
<br> ENDMOD init_C ; 'init_C' is program entry address
<br>
<br>*---------------------------------------------------------------*
<br>* Function/module: exit(int code)
*
<br>*
*
<br>* When C-SPY is used this code will automatically be replaced *
<br>* by a 'debug' version of exit().
*
<br>*---------------------------------------------------------------*
<br> MODULE exit
<br>
<br> PUBLIC exit
<br> PUBLIC ?C_EXIT
<br>
<br> RSEG RCODE
<br>
<br>?C_EXIT:
<br>exit:
<br>*---------------------------------------------------------------*
<br>* The next line could be replaced by user defined code. *
<br>*---------------------------------------------------------------*
<br>end_loop:
<br> BRA end_loop
<br>
<br> END
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>/* - Vectors.h -
<br>
<br> This file defines the interrupt vector addresses of the 68HC11
<br> and appropriate function names that can be used with the interrupts.
<br> It is assumed that the segment INTVEC is located at address 0xFFD6.
<br>*/
<br>
<br>#pragma language=extended
<br>
<br>#define INTVEC_START 0 /* Default for 68HC11 (must be matched
<br>
to the value used at link-time) */
<br>
<br>
<br> /*=======================*/
<br> /* Interrupt Definitions */
<br> /*=======================*/
<br>
<br> /* SCI Serial Communication Interface */
<br>interrupt [INTVEC_START + 0] void SCI_interrupt(void);
<br>
<br> /* SPI Serial Transfer Complete */
<br>interrupt [INTVEC_START + 2] void SPI_interrupt(void);
<br>
<br> /* Pulse Accumulator Input Edge */
<br>interrupt [INTVEC_START + 4] void PAIE_interrupt(void);
<br>
<br> /* Pulse Accumulator Overflow */
<br>interrupt [INTVEC_START + 6] void PAO_interrupt(void);
<br>
<br> /* Timer Overflow */
<br>interrupt [INTVEC_START + 8] void TO_interrupt(void);
<br>
<br> /* Timer Output Compare 5 */
<br>interrupt [INTVEC_START + 10] void OC5_interrupt(void);
<br>
<br> /* Timer Output Compare 4 */
<br>interrupt [INTVEC_START + 12] void OC4_interrupt(void);
<br>
<br> /* Timer Output Compare 3 */
<br>interrupt [INTVEC_START + 14] void OC3_interrupt(void);
<br>
<br> /* Timer Output Compare 2 */
<br>interrupt [INTVEC_START + 16] void OC2_interrupt(void);
<br>
<br> /* Timer Output Compare 1 */
<br>interrupt [INTVEC_START + 18] void OC1_interrupt(void);
<br>
<br> /* Timer Input Compare 4 */
<br>interrupt [INTVEC_START + 10] void IC4_interrupt(void);
<br>
<br> /* Timer Input Compare 3 */
<br>interrupt [INTVEC_START + 20] void IC3_interrupt(void);
<br>
<br> /* Timer Input Compare 2 */
<br>interrupt [INTVEC_START + 22] void IC2_interrupt(void);
<br>
<br> /* Timer Input Compare 1 */
<br>interrupt [INTVEC_START + 24] void IC1_interrupt(void);
<br>
<br> /* Real Time Interrupt */
<br>interrupt [INTVEC_START + 26] void RTI_interrupt(void);
<br>
<br> /* Interrupt ReQuest */
<br>interrupt [INTVEC_START + 28] void IRQ_interrupt(void);
<br>
<br> /* eXtended Interrupt ReQuest */
<br>interrupt [INTVEC_START + 30] void XIRQ_interrupt(void);
<br>
<br> /* SoftWare Interrupt */
<br>interrupt [INTVEC_START + 32] void Software_interrupt(void);
<br>
<br> /* Illegal Opcode Trap */
<br>interrupt [INTVEC_START + 34] void Illegal_Opcode(void);
<br>
<br>/* Watchdog and Clock Monitor are defined i cstartup.s07 */
<br>
<br>
<br><h2>/* FILENAME: IO-reg.h</h2><br> *
<br> * Register and bit macro definitions for
<br> * all HC11 types in A and E series.
<br> *
<br> * Uppdatering 990917: volatile bara f�r PORTCL, SPSR och SCSR.
<br> *
<br> */
<br>
<br>#define REG_BASE 0x1000
<br>
<br>#define PORTA (*(unsigned char *)(REG_BASE + 0x00))
<br>#define PIOC (*(unsigned char *)(REG_BASE + 0x02))
<br>#define PORTC (*(unsigned char *)(REG_BASE + 0x03))
<br>#define PORTB (*(unsigned char *)(REG_BASE + 0x04))
<br>#define PORTCL (*(volatile unsigned char *)(REG_BASE + 0x05))
<br>#define DDRC (*(unsigned char *)(REG_BASE + 0x07))
<br>#define PORTD (*(unsigned char *)(REG_BASE + 0x08))
<br>#define DDRD (*(unsigned char *)(REG_BASE + 0x09))
<br>#define PORTE (*(unsigned char *)(REG_BASE + 0x0A))
<br>#define CFORC (*(unsigned char *)(REG_BASE + 0x0B))
<br>#define OC1M (*(unsigned char *)(REG_BASE + 0x0C))
<br>#define OC1D (*(unsigned char *)(REG_BASE + 0x0D))
<br>#define TCNT (*(unsigned int *)(REG_BASE + 0x0E))
<br>#define TIC1 (*(unsigned int *)(REG_BASE + 0x10))
<br>#define TIC2 (*(unsigned int *)(REG_BASE + 0x12))
<br>#define TIC3 (*(unsigned int *)(REG_BASE + 0x14))
<br>#define TIC4 (*(unsigned int *)(REG_BASE + 0x1E))
<br>#define TOC1 (*(unsigned int *)(REG_BASE + 0x16))
<br>#define TOC2 (*(unsigned int *)(REG_BASE + 0x18))
<br>#define TOC3 (*(unsigned int *)(REG_BASE + 0x1A))
<br>#define TOC4 (*(unsigned int *)(REG_BASE + 0x1C))
<br>#define TOC5 (*(unsigned int *)(REG_BASE + 0x1E))
<br>#define TI4/O4 (*(unsigned int *)(REG_BASE + 0x1E))
<br>#define TCTL1 (*(unsigned char *)(REG_BASE + 0x20))
<br>#define TCTL2 (*(unsigned char *)(REG_BASE + 0x21))
<br>#define TMSK1 (*(unsigned char *)(REG_BASE + 0x22))
<br>#define TFLG1 (*(unsigned char *)(REG_BASE + 0x23))
<br>#define TMSK2 (*(unsigned char *)(REG_BASE + 0x24))
<br>#define TFLG2 (*(unsigned char *)(REG_BASE + 0x25))
<br>#define PACTL (*(unsigned char *)(REG_BASE + 0x26))
<br>#define PACNT (*(unsigned char *)(REG_BASE + 0x27))
<br>#define SPCR (*(unsigned char *)(REG_BASE + 0x28))
<br>#define SPSR (*(volatile unsigned char *)(REG_BASE + 0x29))
<br>#define SPDR (*(unsigned char *)(REG_BASE + 0x2A))
<br>#define BAUD (*(unsigned char *)(REG_BASE + 0x2B))
<br>#define SCCR1 (*(unsigned char *)(REG_BASE + 0x2C))
<br>#define SCCR2 (*(unsigned char *)(REG_BASE + 0x2D))
<br>#define SCSR (*(volatile unsigned char *)(REG_BASE + 0x2E))
<br>#define SCDR (*(unsigned char *)(REG_BASE + 0x2F))
<br>#define ADCTL (*(unsigned char *)(REG_BASE + 0x30))
<br>#define ADR1 (*(unsigned char *)(REG_BASE + 0x31))
<br>#define ADR2 (*(unsigned char *)(REG_BASE + 0x32))
<br>#define ADR3 (*(unsigned char *)(REG_BASE + 0x33))
<br>#define ADR4 (*(unsigned char *)(REG_BASE + 0x34))
<br>#define BPROT (*(unsigned char *)(REG_BASE + 0x35))
<br>#define EPROG (*(unsigned char *)(REG_BASE + 0x36))
<br>#define OPTION (*(unsigned char *)(REG_BASE + 0x39))
<br>#define COPRST (*(unsigned char *)(REG_BASE + 0x3A))
<br>#define PPROG (*(unsigned char *)(REG_BASE + 0x3B))
<br>#define HPRIO (*(unsigned char *)(REG_BASE + 0x3C))
<br>#define INIT (*(unsigned char *)(REG_BASE + 0x3D))
<br>#define TEST1 (*(unsigned char *)(REG_BASE + 0x3E))
<br>#define CONFIG (*(unsigned char *)(REG_BASE + 0x3F))
<br>
<br>/* Bit names for general use */
<br>#define bit7 0x80
<br>#define bit6 0x40
<br>#define bit5 0x20
<br>#define bit4 0x10
<br>#define bit3 0x08
<br>#define bit2 0x04
<br>#define bit1 0x02
<br>#define bit0 0x01
<br>
<br>/* PORTA bit definitions 0x00 */
<br>#define PA7 bit7
<br>#define PA6 bit6
<br>#define PA5 bit5
<br>#define PA4 bit4
<br>#define PA3 bit3
<br>#define PA2 bit2
<br>#define PA1 bit1
<br>#define PA0 bit0
<br>
<br>/* PIOC bit definitions 0x02 */
<br>#define STAF bit7
<br>#define STAI bit6
<br>#define CWOM bit5
<br>#define HNDS bit4
<br>#define OIN bit3
<br>#define PLS bit2
<br>#define EGA bit1
<br>#define INVB bit0
<br>
<br>/* PORTC bit definitions 0x03 */
<br>#define PC7 bit7
<br>#define PC6 bit6
<br>#define PC5 bit5
<br>#define PC4 bit4
<br>#define PC3 bit3
<br>#define PC2 bit2
<br>#define PC1 bit1
<br>#define PC0 bit0
<br>
<br>/* PORTB bit definitions 0x04 */
<br>#define PB7 bit7
<br>#define PB6 bit6
<br>#define PB5 bit5
<br>#define PB4 bit4
<br>#define PB3 bit3
<br>#define PB2 bit2
<br>#define PB1 bit1
<br>#define PB0 bit0
<br>
<br>/* PORTCL bit definitions 0x05 */
<br>#define PCL7 bit7
<br>#define PCL6 bit6
<br>#define PCL5 bit5
<br>#define PCL4 bit4
<br>#define PCL3 bit3
<br>#define PCL2 bit2
<br>#define PCL1 bit1
<br>#define PCL0 bit0
<br>
<br>/* DDRC bit definitions 0x07 */
<br>#define DDC7 bit7
<br>#define DDC6 bit6
<br>#define DDC5 bit5
<br>#define DDC4 bit4
<br>#define DDC3 bit3
<br>#define DDC2 bit2
<br>#define DDC1 bit1
<br>#define DDC0 bit0
<br>
<br>/* PORTD bit definitions 0x08 */
<br>#define PD5 bit5
<br>#define PD4 bit4
<br>#define PD3 bit3
<br>#define PD2 bit2
<br>#define PD1 bit1
<br>#define PD0 bit0
<br>
<br>/* DDRD bit definitions 0x09 */
<br>#define DDD5 bit5
<br>#define DDD4 bit4
<br>#define DDD3 bit3
<br>#define DDD2 bit2
<br>#define DDD1 bit1
<br>#define DDD0 bit0
<br>
<br>/* PORTE bit definitions 0x0A */
<br>#define PE7 bit7
<br>#define PE6 bit6
<br>#define PE5 bit5
<br>#define PE4 bit4
<br>#define PE3 bit3
<br>#define PE2 bit2
<br>#define PE1 bit1
<br>#define PE0 bit0
<br>
<br>/* CFORC bit definitions 0x0B */
<br>#define FOC1 bit7
<br>#define FOC2 bit6
<br>#define FOC3 bit5
<br>#define FOC4 bit4
<br>#define FOC5 bit3
<br>
<br>/* OC1M bit definitions 0x0C */
<br>#define OC1M7 bit7
<br>#define OC1M6 bit6
<br>#define OC1M5 bit5
<br>#define OC1M4 bit4
<br>#define OC1M3 bit3
<br>
<br>/* OC1D bit definitions 0x0D */
<br>#define OC1D7 bit7
<br>#define OC1D6 bit6
<br>#define OC1D5 bit5
<br>#define OC1D4 bit4
<br>#define OC1D3 bit3
<br>
<br>/* TCTL1 bit definition 0x20 */
<br>#define OM2 bit7
<br>#define OL2 bit6
<br>#define OM3 bit5
<br>#define OL3 bit4
<br>#define OM4 bit3
<br>#define OL4 bit2
<br>#define OM5 bit1
<br>#define OL5 bit0
<br>
<br>/* TCTL2 bit definitions 0x21 */
<br>#define EDG4B bit7
<br>#define EDG4A bit6
<br>#define EDG1B bit5
<br>#define EDG1A bit4
<br>#define EDG2B bit3
<br>#define EDG2A bit2
<br>#define EDG3B bit1
<br>#define EDG3A bit0
<br>
<br>/* TMSK1 bit definitions 0x22 */
<br>#define OC1I bit7
<br>#define OC2I bit6
<br>#define OC3I bit5
<br>#define OC4I bit4
<br>#define I4O5I bit3
<br>#define IC1I bit2
<br>#define IC2I bit1
<br>#define IC3I bit0
<br>
<br>/* TFLG1 bit definitions 0x23 */
<br>#define OC1F bit7
<br>#define OC2F bit6
<br>#define OC3F bit5
<br>#define OC4F bit4
<br>#define I4O5F bit3
<br>#define IC1F bit2
<br>#define IC2F bit1
<br>#define IC3F bit0
<br>
<br>/* TMSK2 bit definitions 0x24 */
<br>#define TOI bit7
<br>#define RTII bit6
<br>#define PAOVI bit5
<br>#define PAII bit4
<br>#define PR1 bit1
<br>#define PR0 bit0
<br>
<br>/* TFLG2 bit definitions 0x25 */
<br>#define TOF bit7
<br>#define RTIF bit6
<br>#define PAOVF bit5
<br>#define PAIF bit4
<br>
<br>/* PACTL bit definitions 0x26 */
<br>#define DDRA7 bit7
<br>#define PAEN bit6
<br>#define PAMOD bit5
<br>#define PEDGE bit4
<br>#define DDRA3 bit3
<br>#define I4O5 bit2
<br>#define RTR1 bit1
<br>#define RTR0 bit0
<br>
<br>/* SPCR bit definitions 0x28 */
<br>#define SPIE bit7
<br>#define SPE bit6
<br>#define DWOM bit5
<br>#define MSTR bit4
<br>#define CPOL bit3
<br>#define CPHA bit2
<br>#define SPR1 bit1
<br>#define SPR0 bit0
<br>
<br>/* SPSR bit definitions 0x29 */
<br>#define SPIF bit7
<br>#define WCOL bit6
<br>#define MODF bit4
<br>
<br>/* BAUD bit definitions 0x2B */
<br>#define TCLR bit7
<br>#define SCP2 bit6
<br>#define SCP1 bit5
<br>#define SCP0 bit4
<br>#define RCKB bit3
<br>#define SCR2 bit2
<br>#define SCR1 bit1
<br>#define SCR0 bit0
<br>
<br>/* SCCR1 bit definition 0x2C */
<br>#define R8 bit7
<br>#define T8 bit6
<br>#define M bit4
<br>#define WAKE bit3
<br>
<br>/* SCCR2 bit definitions 0x2D */
<br>#define TIE bit7
<br>#define TCIE bit6
<br>#define RIE bit5
<br>#define ILIE bit4
<br>#define TE bit3
<br>#define RE bit2
<br>#define RWU bit1
<br>#define SBK bit0
<br>
<br>/* SCSR bit definitions 0x2E */
<br>#define TDRE bit7
<br>#define TC bit6
<br>#define RDRF bit5
<br>#define IDLE bit4
<br>#define OR bit3
<br>#define NF bit2
<br>#define FE bit1
<br>
<br>/* SCDR bit definitions 0x2F */
<br>#define R7T7 bit7
<br>#define R6T6 bit6
<br>#define R5T5 bit5
<br>#define R4T4 bit4
<br>#define R3T3 bit3
<br>#define R2T2 bit2
<br>#define R1T1 bit1
<br>#define R0T0 bit0
<br>
<br>/* ADCTL bit definitions 0x30 */
<br>#define CCF bit7
<br>#define SCAN bit5
<br>#define MULT bit4
<br>#define CD bit3
<br>#define CC bit2
<br>#define CB bit1
<br>#define CA bit0
<br>
<br>/* BPROT bit definitions 0x35 */
<br>#define PTCON bit4
<br>#define BPRT3 bit3
<br>#define BPRT2 bit2
<br>#define BPRT1 bit1
<br>#define BPRT0 bit0
<br>
<br>/* EPROG bit definitions 0x36 MC68HC(7)11E20 only */
<br>#define MBE bit7
<br>/* ELAT defined in PPROG */
<br>#define EXCOL bit4
<br>#define EXROW bit3
<br>#define T1 bit2
<br>#define T0 bit1
<br>#define PGM bit0
<br>
<br>/* OPTION bit definitions 0x39 */
<br>#define ADPU bit7
<br>#define CSEL bit6
<br>#define IRQE bit5
<br>#define DLY bit4
<br>#define CME bit3
<br>#define CR1 bit1
<br>#define CR0 bit0
<br>
<br>/* PPROG bit definitions 0x3B */
<br>#define ODD bit7
<br>#define EVEN bit6
<br>#define ELAT bit5 /* MC68HC711E9 only */
<br>#define BYTE bit4
<br>#define ROW bit3
<br>#define ERASE bit2
<br>#define EELAT bit1
<br>#define EEPGM bit0
<br>#define EPGM bit0
<br>
<br>/* HPRIO bit definitions 0x3C */
<br>#define RBOOT bit7
<br>#define SMOD bit6
<br>#define MDA bit5
<br>#define IRVNE bit4
<br>#define PSEL3 bit3
<br>#define PSEL2 bit2
<br>#define PSEL1 bit1
<br>#define PSEL0 bit0
<br>
<br>/* INIT bit definitions 0x3D */
<br>#define RAM3 bit7
<br>#define RAM2 bit6
<br>#define RAM1 bit5
<br>#define RAM0 bit4
<br>#define REG3 bit3
<br>#define REG2 bit2
<br>#define REG1 bit1
<br>#define REG0 bit0
<br>
<br>/* TEST1 bit definitions 0x3E */
<br>#define TILOP bit7
<br>#define OCCR bit5
<br>#define CBYP bit4
<br>#define DISR bit3
<br>#define FCM bit2
<br>#define FCOP bit1
<br>#define TCON bit0
<br>
<br>/* CONFIG bit definitions 0x3F */
<br>#define EE3 bit7 /* MC68HC811E2 only */
<br>#define EE2 bit6 /* MC68HC811E2 only */
<br>#define EE1 bit5 /* MC68HC811E2 only */
<br>#define EE0 bit4 /* MC68HC811E2 only */
<br>#define NOSEC bit3
<br>#define NOCOP bit2
<br>#define ROMON bit1 /* MC68HC11E9 and MC68HC11E8 only */
<br>#define EPON bit1 /* MC68HC711E9 only */
<br>#define EEON bit0
<br>
<br><br>
<br><br>
</td></tr></tbody></table><script language="javascript">postamble();</script>
</body></html>