📄 map_bot.asm
字号:
; 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 + -