⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map_bot.asm

📁 用于机器人自动低分辨路的地图测绘程序。用于机器人控制测绘。分为远端控制端和本地控制端。控制电机为标准舵机。
💻 ASM
📖 第 1 页 / 共 3 页
字号:

; CC5X Version 3.1J, Copyright (c) B Knudsen Data
; C compiler for the PICmicro family
; ************   4. Sep 2006   0:09  *************

	processor  16F871
	radix  DEC

INDF        EQU   0x00
TMR0        EQU   0x01
STATUS      EQU   0x03
FSR         EQU   0x04
PORTA       EQU   0x05
TRISA       EQU   0x85
PORTB       EQU   0x06
TRISB       EQU   0x86
T0CS        EQU   5
Carry       EQU   0
Zero_       EQU   2
RP0         EQU   5
RP1         EQU   6
IRP         EQU   7
T0IF        EQU   2
T0IE        EQU   5
GIE         EQU   7
OPTION_REG  EQU   0x81
PORTC       EQU   0x07
PORTD       EQU   0x08
PORTE       EQU   0x09
TMR1L       EQU   0x0E
TMR1H       EQU   0x0F
TMR2        EQU   0x11
RCSTA       EQU   0x18
TXREG       EQU   0x19
RCREG       EQU   0x1A
ADRESH      EQU   0x1E
ADCON0      EQU   0x1F
TRISC       EQU   0x87
TRISD       EQU   0x88
TRISE       EQU   0x89
TXSTA       EQU   0x98
SPBRG       EQU   0x99
ADRESL      EQU   0x9E
ADCON1      EQU   0x9F
PEIE        EQU   6
TMR1IF      EQU   0
TMR2IF      EQU   1
TXIF        EQU   4
RCIF        EQU   5
ADIF        EQU   6
TMR1ON      EQU   0
TMR1CS      EQU   1
T1OSCEN     EQU   3
T1CKPS0     EQU   4
T1CKPS1     EQU   5
TMR2ON      EQU   2
OERR        EQU   1
CREN        EQU   4
ADON        EQU   0
GO          EQU   2
ADCS0       EQU   6
ADCS1       EQU   7
TMR1IE      EQU   0
TMR2IE      EQU   1
TXIE        EQU   4
RCIE        EQU   5
ADIE        EQU   6
encoder_0   EQU   0
encoder_1   EQU   1
encoder_2   EQU   2
encoder_3   EQU   3
pwm_out_0   EQU   1
pwm_out_1   EQU   2
pwm_out_2   EQU   5
pwm_out_3   EQU   4
recv_buffer EQU   0x24
send_buffer EQU   0x2F
servo_pos   EQU   0x43
pwm_value   EQU   0x49
analog_low  EQU   0x4D
analog_high EQU   0x55
cur_analog  EQU   0x5D
servo_mode  EQU   0x5E
cur_servo   EQU   0x5F
pwm_cycle   EQU   0x60
cur_recv_byte EQU   0x61
cur_send_byte EQU   0x62
read_timeout EQU   0x63
reading_data EQU   0
wait_analog EQU   0x65
update_timeout EQU   0x66
running_counter EQU   0x67
recv_counter EQU   0x68
last_valid  EQU   1
last_encoder_0 EQU   2
last_encoder_1 EQU   3
last_encoder_2 EQU   4
last_encoder_3 EQU   5
last_dir    EQU   0x69
encoder_0_count EQU   0x6A
encoder_1_count EQU   0x6B
encoder_2_count EQU   0x6C
encoder_3_count EQU   0x6D
encoder_0_speed EQU   0x6E
encoder_low EQU   0x71
encoder_high EQU   0x75
run_count   EQU   0x6F
svrWREG     EQU   0x70
svrSTATUS   EQU   0x20
tmp         EQU   0x21
dir         EQU   0x21
s           EQU   0x21
C1cnt       EQU   0x22
s_2         EQU   0x21
C2cnt       EQU   0x22
mask        EQU   0x21
ch          EQU   0x23

	ORG 0x0003
	GOTO main

  ; FILE map_bot.c
			;
			;/*
			;    Robot Controller Source
			;	(C) 2006 Jason Hunt nulluser@gmail.com
			;
			;	Version 0.01
			;
			;	16f871.h has been modified as follows:
			;	
			;	// original
			;	// #pragma chip PIC16F871, core 14, code 2048, ram 32 : 0xBF /0 /3
			;
			;	#pragma chip PIC16F871, core 14, code 0x1F00, ram 32 : 0x1FF
			;	#pragma cdata[0] = 0x0180 + 0x0A // CLRF PCLATH, prepare for code page change
			;	#pragma cdata[1] = 0 // NOP
			;	#pragma cdata[2] = 0 // NOP
			;	#pragma resetVector 3 // start address for user program
			;
			;	This reserves space for the serial bootloader.
			;*/
			;
			;#include <int16cxx.h>
			;
			;#pragma chip PIC16f871
			;#pragma config |= 0x3FF2 			// For 20 mhz ceramic resinator
			;
			;
			;#define NUM_RECV_BYTES	11			// Bytes in control packet
			;#define NUM_SEND_BYTES	20			// Bytes in telemetery packet
			;
			;#define NUM_SERVOS	6	   		    // Number of servo outputs
			;
			;#define NUM_ANALOG 8
			;
			;/* Pin Assignments */
			;
			;#pragma bit led_0 @ PORTB.6
			;#pragma bit led_1 @ PORTB.7
			;
			;//#pragma bit encoder_0 @ PORTB.0 // digital in 0
			;//#pragma bit encoder_1 @ PORTA.4
			;//#pragma bit encoder_2 @ PORTE.0
			;//#pragma bit encoder_3 @ PORTE.1
			;
			;#pragma bit encoder_0 @ PORTD.0 // digital in 0
			;#pragma bit encoder_1 @ PORTD.1
			;#pragma bit encoder_2 @ PORTD.2
			;#pragma bit encoder_3 @ PORTD.3
			;
			;
			;//#pragma bit digital_in_4 @ PORTE.2
			;
			;//#pragma bit radio_in_0 @ PORTD.6
			;//#pragma bit radio_in_1 @ PORTD.7
			;
			;//#pragma bit open_collector_0 @ PORTB.4
			;//#pragma bit open_collector_1 @ PORTB.5
			;
			;/* Pin assignments for PWM */
			;#pragma bit pwm_out_0 @ PORTB.1
			;#pragma bit pwm_out_1 @ PORTB.2
			;#pragma bit pwm_out_2 @ PORTB.5
			;#pragma bit pwm_out_3 @ PORTB.4
			;
			;/* Data buffers for serial */
			;unsigned char recv_buffer[NUM_RECV_BYTES];
			;unsigned char send_buffer[NUM_SEND_BYTES];
			;
			;unsigned char servo_pos[NUM_SERVOS];		// Servo Positions
			;unsigned char pwm_value[4];					// PWM Dutysw
			;
			;unsigned char analog_low[8];				// Analog low bytes
			;unsigned char analog_high[8];				// Analog high bytes
			;
			;
			;unsigned char cur_analog;					// Current analog capture
			;
			;unsigned char servo_mode;			// Current state of the servo interrupt system
			;unsigned char cur_servo;			// Current servo 
			;unsigned char pwm_cycle;			// CUrrent PWM cutoff value
			;
			;unsigned char cur_recv_byte;		// Index of recv buffer
			;unsigned char cur_send_byte;		// Index of send buffer
			;unsigned char read_timeout;			// Timeout counter
			;bit reading_data;					// True if reading
			;
			;unsigned char wait_analog;			// True if waiting to start converstion
			;
			;unsigned char update_timeout;
			;
			;unsigned char running_counter;
			;unsigned char recv_counter;
			;bit last_valid;
			;
			;
			;bit last_encoder_0;
			;bit last_encoder_1;
			;bit last_encoder_2;
			;bit last_encoder_3;
			;
			;
			;
			;unsigned char last_dir;
			;
			;unsigned char encoder_0_count;
			;unsigned char encoder_1_count;
			;unsigned char encoder_2_count;
			;unsigned char encoder_3_count;
			;
			;unsigned char encoder_0_speed;
			;
			;
			;unsigned char encoder_low[4];
			;unsigned char encoder_high[4];
			;
			;
			;unsigned char run_count;
			;
			;/*******************
			;** Interrupt Code **
			;*******************/
			;
			;#pragma interruptSaveCheck  n
			;#pragma origin 4
	ORG 0x0004
			;
			;
			;
			;
			;
			;/* the ISR to update the servos */
			;interrupt ISR(void)
			;{
ISR
			;    int_save_registers
	MOVWF svrWREG
	SWAPF STATUS,W
	BCF   0x03,RP0
	BCF   0x03,RP1
	MOVWF svrSTATUS
			;
			;    if (RCIF)
	BTFSS 0x0C,RCIF
	GOTO  m011
			;    {
			;        RCIF = 0;
	BCF   0x0C,RCIF
			;		reading_data = 1;
	BSF   0x64,reading_data
			;		read_timeout = 0;
	CLRF  read_timeout
			;
			;		// Eat data and timeout if sync is off
			;		if (!last_valid)
	BTFSC 0x64,last_valid
	GOTO  m001
			;		{
			;			recv_buffer[cur_recv_byte++] = RCREG;  
	MOVLW .36
	ADDWF cur_recv_byte,W
	MOVWF FSR
	BCF   0x03,IRP
	MOVF  RCREG,W
	MOVWF INDF
	INCF  cur_recv_byte,1
			;			cur_recv_byte = 0;
	CLRF  cur_recv_byte
			;		}
			;
			;
			;		// Send current telemetry data for the first char recevied
			;        // This will utilize full duplex for better transfer
			;		if (cur_recv_byte == 0 && last_valid)
m001	BCF   0x03,RP0
	BCF   0x03,RP1
	MOVF  cur_recv_byte,1
	BTFSS 0x03,Zero_
	GOTO  m002
	BTFSS 0x64,last_valid
	GOTO  m002
			;		{	   
			;            // Package current telemetry data for transmittion
			;			// Start byte
			;		    send_buffer[0] = 0xff;
	MOVLW .255
	MOVWF send_buffer
			;
			;			// Low bytes of analog data
			;			send_buffer[1] = analog_low[0];
	MOVF  analog_low,W
	MOVWF send_buffer+1
			;			send_buffer[2] = analog_low[1];
	MOVF  analog_low+1,W
	MOVWF send_buffer+2
			;			send_buffer[3] = analog_low[2];
	MOVF  analog_low+2,W
	MOVWF send_buffer+3
			;			send_buffer[4] = analog_low[3];
	MOVF  analog_low+3,W
	MOVWF send_buffer+4
			;			send_buffer[5] = analog_low[4];
	MOVF  analog_low+4,W
	MOVWF send_buffer+5
			;			send_buffer[6] = analog_low[5];
	MOVF  analog_low+5,W
	MOVWF send_buffer+6
			;			send_buffer[7] = analog_low[6];
	MOVF  analog_low+6,W
	MOVWF send_buffer+7
			;			send_buffer[8] = analog_low[7];
	MOVF  analog_low+7,W
	MOVWF send_buffer+8
			;
			;			// Shift MSB of analog data to fit into two bytes
			;			send_buffer[9] = analog_high[0] | (analog_high[1]<<2) ;
	BCF   0x03,Carry
	RLF   analog_high+1,W
	ADDWF analog_high+1,W
	ADDWF analog_high+1,W
	IORWF analog_high,W
	MOVWF send_buffer+9
			;			send_buffer[9] += analog_high[2]<<4;
	SWAPF analog_high+2,W
	ANDLW .240
	ADDWF send_buffer+9,1
			;
			;			unsigned int tmp = analog_high[3] * 64;
	RRF   analog_high+3,W
	MOVWF tmp
	RRF   tmp,1
	RRF   tmp,1
	MOVLW .192
	ANDWF tmp,1
			;			send_buffer[9] += tmp;
	MOVF  tmp,W
	ADDWF send_buffer+9,1
			;
			;
			;			send_buffer[10] = analog_high[4] | (analog_high[5]<<2) ;
	BCF   0x03,Carry
	RLF   analog_high+5,W
	ADDWF analog_high+5,W
	ADDWF analog_high+5,W
	IORWF analog_high+4,W
	MOVWF send_buffer+10
			;			send_buffer[10] += analog_high[6]<<4;
	SWAPF analog_high+6,W
	ANDLW .240
	ADDWF send_buffer+10,1
			;
			;			tmp = analog_high[7] * 64;
	RRF   analog_high+7,W
	MOVWF tmp
	RRF   tmp,1
	RRF   tmp,1
	MOVLW .192
	ANDWF tmp,1
			;			send_buffer[10] += tmp;
	MOVF  tmp,W
	ADDWF send_buffer+10,1
			;
			;//			send_buffer[7] = analog_high[3] | (analog_high[4]<<2);
			;
			;			// Other telemetry data
			;//			send_buffer[8] =run_count;// encoder_0_speed;
			;
			;			send_buffer[11] = encoder_low[0];
	MOVF  encoder_low,W
	MOVWF send_buffer+11
			;			send_buffer[12] = encoder_high[0];
	MOVF  encoder_high,W
	MOVWF send_buffer+12
			;
			;			send_buffer[13] = encoder_low[1];
	MOVF  encoder_low+1,W
	MOVWF send_buffer+13
			;			send_buffer[14] = encoder_high[1];
	MOVF  encoder_high+1,W
	MOVWF send_buffer+14
			;
			;			send_buffer[15] = encoder_low[2];
	MOVF  encoder_low+2,W
	MOVWF send_buffer+15
			;			send_buffer[16] = encoder_high[2];
	MOVF  encoder_high+2,W
	MOVWF send_buffer+16
			;
			;			send_buffer[17] = encoder_low[3];
	MOVF  encoder_low+3,W
	MOVWF send_buffer+17
			;			send_buffer[18] = encoder_high[3];
	MOVF  encoder_high+3,W
	MOVWF send_buffer+18
			;
			;			// Stop byte
			;			send_buffer[19] = 0xff;
	MOVLW .255
	MOVWF send_buffer+19
			;
			;			TXIE = 1;					// Enable transmit to send packet 
	BSF   0x03,RP0
	BSF   0x8C,TXIE
			;		} 
			;
			;		// Last char in packet
			;        if (cur_recv_byte >= NUM_RECV_BYTES)
m002	MOVLW .11
	BCF   0x03,RP0
	BCF   0x03,RP1
	SUBWF cur_recv_byte,W
	BTFSS 0x03,Carry
	GOTO  m010
			;        {
			;			cur_recv_byte = 0;
	CLRF  cur_recv_byte
			;
			;
			;            if (recv_buffer[0] == 0xff && recv_buffer[NUM_RECV_BYTES-1] == 0xff)
	INCFSZ recv_buffer,W
	GOTO  m008
	INCFSZ recv_buffer+10,W
	GOTO  m008
			;            {
			;				// first byte is For digital controls.
			;
			;				unsigned char dir = recv_buffer[1] & 0x03;
	MOVLW .3
	ANDWF recv_buffer+1,W
	MOVWF dir
			;
			;				if (dir != last_dir && recv_buffer[2] != 0 && recv_buffer[3] != 0)
	MOVF  dir,W
	XORWF last_dir,W
	BTFSC 0x03,Zero_
	GOTO  m003
	MOVF  recv_buffer+2,1
	BTFSC 0x03,Zero_
	GOTO  m003
	MOVF  recv_buffer+3,1
	BTFSC 0x03,Zero_
	GOTO  m003
			;				{
			;	led_0 = !led_0;
	MOVLW .64
	XORWF PORTB,1
			;					last_dir = dir;
	MOVF  dir,W
	MOVWF last_dir
			;
			;					encoder_high[0] = 0;
	CLRF  encoder_high
			;					encoder_low[0] = 0;
	CLRF  encoder_low
			;
			;					encoder_high[1] = 0;
	CLRF  encoder_high+1
			;					encoder_low[1] = 0;
	CLRF  encoder_low+1
			;
			;					encoder_high[2] = 0;
	CLRF  encoder_high+2
			;					encoder_low[2] = 0;
	CLRF  encoder_low+2
			;
			;					encoder_high[3] = 0;
	CLRF  encoder_high+3
			;					encoder_low[3] = 0;
	CLRF  encoder_low+3
			;
			;				}
			;
			;				if (recv_buffer[1] & 0x01)
m003	BCF   0x03,RP0
	BCF   0x03,RP1
	BTFSS recv_buffer+1,0
	GOTO  m004
			;				{
			;					pwm_value[0] = recv_buffer[2];
	MOVF  recv_buffer+2,W
	MOVWF pwm_value
			;					pwm_value[1] = 0;										
	CLRF  pwm_value+1
			;				}
			;				else
	GOTO  m005
			;				{
			;					pwm_value[0] = 0;
m004	BCF   0x03,RP0
	BCF   0x03,RP1
	CLRF  pwm_value
			;					pwm_value[1] = recv_buffer[2];
	MOVF  recv_buffer+2,W
	MOVWF pwm_value+1
			;				}
			;
			;				if (recv_buffer[1] & 0x02)
m005	BCF   0x03,RP0
	BCF   0x03,RP1
	BTFSS recv_buffer+1,1
	GOTO  m006
			;				{
			;					pwm_value[2] = recv_buffer[3];
	MOVF  recv_buffer+3,W
	MOVWF pwm_value+2
			;					pwm_value[3] = 0;
	CLRF  pwm_value+3
			;				}
			;				else
	GOTO  m007
			;				{
			;					pwm_value[2] = 0;
m006	BCF   0x03,RP0
	BCF   0x03,RP1
	CLRF  pwm_value+2
			;					pwm_value[3] = recv_buffer[3];
	MOVF  recv_buffer+3,W
	MOVWF pwm_value+3
			;				}
			;
			;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -