Sei sulla pagina 1di 25

; CC5X Version 3.1I, Copyright (c) B Knudsen Data ; C compiler for the PICmicro family ; ************ 30.

Aug 2004 21:40 ************* processor 16F88 radix DEC INDF EQU 0x00 PCL EQU 0x02 STATUS EQU 0x03 FSR EQU 0x04 PORTA EQU 0x05 TRISA EQU 0x85 PORTB EQU 0x06 TRISB EQU 0x86 PCLATH EQU 0x0A Carry EQU 0 Zero_ EQU 2 RP0 EQU 5 RP1 EQU 6 IRP EQU 7 GIE EQU 7 T2CON EQU 0x12 TXREG EQU 0x19 RCREG EQU 0x1A SPBRG EQU 0x99 ANSEL EQU 0x9B CMCON EQU 0x9C EEDATA EQU 0x10C EEADR EQU 0x10D EEDATH EQU 0x10E EEADRH EQU 0x10F PEIE EQU 6 TMR2IF EQU 1 TXIF EQU 4 RCIF EQU 5 TMR2ON EQU 2 CREN EQU 4 SPEN EQU 7 TMR2IE EQU 1 TXIE EQU 4 RCIE EQU 5 BRGH EQU 2 SYNC EQU 4 TXEN EQU 5 RD EQU 0 EEPGD EQU 7 iteration_counter EQU 0x39 drive_right_time EQU 0x3A drive_left_time EQU 0x3B s1_save EQU 0x70 s2 EQU 0x20 s3 EQU 0x21 sv_FSR EQU 0x22 x EQU 0x7F x_2 EQU 0x7F y EQU 0x7F z EQU 0x7F x_3 EQU 0x7F

y_2 want_ints want_ints_2 nate x_4 nate_2 my_byte i k m temp high_byte low_byte C1cnt C2tmp C3cnt C4tmp C5rem right left choice command ci

EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU EQU

0x7F 0 0 0x34 0x34 0x24 0x25 0x27 0x28 0x29 0x2A 0x2B 0x2C 0x34 0x35 0x34 0x35 0x37 0x3D 0x3E 0x23 0x24 0x34

GOTO main ; FILE D:\Pics\code\16F88\Scooter-2\scooter-tutorial.c ;/* ; 8-30-04 ; Copyright Spark Fun Electronics 2004 ; ; Nathan Seidle ; nathan.seidle@colorado.edu ; ; Robot control via PWM using the Timer2 Interrupt ; ;*/ ;#define Baud_9600 ;#define Clock_20MHz //8MHz internal operations ; ;#include "\Pics\c\16F88.h" // device dependent interru pt definitions ;#include "\Pics\c\int16CXX.H" ; ;#pragma origin 4 ORG 0x0004 ; ;//Pin definitions ;#define Right_Enable PORTB.4 ;#define Right_Forward PORTB.3 ;#define Left_Enable PORTB.1 ;#define Left_Forward PORTB.0 ; ;#define STATUS_LED PORTB.6 ; ;#define R_FORWARD() Right_Forward = 0 ;#define R_REV() Right_Forward = 1 ;#define L_FORWARD() Left_Forward = 1 ;#define L_REV() Left_Forward = 0 ;//End Pin Definitions

; ;uns8 iteration_counter; ;uns8 drive_right_time; ;uns8 drive_left_time; ; ;//Interrupt Vectors ;#pragma origin 4 ORG 0x0004 ;interrupt serverX( void) ;{ serverX ; MOVWF SWAPF BCF BCF MOVWF MOVF MOVWF CLRF s1_save STATUS,W 0x03,RP0 0x03,RP1 s2 PCLATH,W s3 PCLATH ; MOVF FSR,W MOVWF sv_FSR BTFSS GOTO INCF MOVF XORLW BTFSS GOTO CLRF ; ; if(TMR2IF) //TMR2 Overflow Interrupt 0x0C,TMR2IF m002 ; { ; iteration_counter++; iteration_counter,1 ; ; if(iteration_counter == 30) iteration_counter,W .30 0x03,Zero_ m001 ; { ; iteration_counter = 0; //~30ms pulse width iteration_counter ; ; //Start your motors! ; Right_Enable = 1; PORTB,4 ; Left_Enable = 1; PORTB,1 ; } ; if(iteration_counter == drive_right_time) Right iteration_counter,W drive_right_time,W 0x03,Zero_ PORTB,4 ; if(iteration_counter == drive_left_time) Left_E iteration_counter,W drive_left_time,W 0x03,Zero_ PORTB,1 ; ; //Clear INT Flag char sv_FSR = FSR; // save FSR if required int_save_registers

BSF BSF _Enable = 0; m001 MOVF XORWF BTFSC BCF nable = 0; MOVF XORWF BTFSC BCF

BCF

m002

MOVF MOVWF MOVF MOVWF SWAPF MOVWF SWAPF SWAPF RETFIE

; 0x0C,TMR2IF ; ; ; sv_FSR,W FSR ; s3,W PCLATH s2,W STATUS s1_save,1 s1_save,W ;}

TMR2IF = 0; } FSR = sv_FSR; int_restore_registers // restore FSR if saved

; FILE \Pics\code\Delay.c ;/* ; 7/23/02 ; Nathan Seidle ; nathan.seidle@colorado.edu ; ; Delays for... Well, everything. ; ; 11-11 Updated the delays - now they actually delay what they say they should. ; ; 10-11-03 Updated delays. New CC5X compiler is muy o ptimized. ; ;*/ ; ;//Really short delay ;void delay_us(uns16 x) ;{ _const1 MOVWF ci MOVLW .0 BSF 0x03,RP1 MOVWF EEADRH BCF 0x03,RP1 RRF ci,W ANDLW .127 ADDLW .73 BSF 0x03,RP1 MOVWF EEADR BTFSC 0x03,Carry INCF EEADRH,1 BSF 0x03,RP0 BSF 0x18C,EEPGD BSF 0x18C,RD NOP NOP BCF 0x03,RP0 BCF 0x03,RP1 BTFSC ci,0 GOTO m003 BSF 0x03,RP1 MOVF EEDATA,W

m003

ANDLW .127 BCF 0x03,RP1 RETURN BSF 0x03,RP1 RLF EEDATA,W RLF EEDATH,W BCF 0x03,RP1 RETURN DW 0x68A DW 0x68A DW 0x31D3 DW 0x37EF DW 0x32F4 DW 0x1072 DW 0x1032 DW 0x32C4 DW 0x3AE2 DW 0x33E7 DW 0x3769 DW 0x567 DW 0xD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x1EBD DW 0x68A DW 0x2680 DW 0x34E1 DW 0x106E DW 0x32CD DW 0x3AEE DW 0x53A DW 0xD DW 0x18A0 DW 0x1029 DW 0x32CB DW 0x3179 DW 0x30EF DW 0x3272 DW 0x31A0 DW 0x376F DW 0x3974

DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW DW delay_us

0x366F 0x68A 0x500 0x100D 0x103A 0x2580 0x3CE5 0x37E2 0x3961 0x1064 0x37E3 0x3A6E 0x37F2 0x106C 0x103A 0x68A 0x1000 0x3950 0x39E5 0x1073 0x1078 0x37F4 0x3920 0x3A65 0x3975 0x56E 0xD 0x2820 0x32F2 0x39F3 0x3D20 0x3A20 0x106F 0x3A73 0x386F 0x68A 0x0 ; ;#ifdef Clock_4MHz ; //Calling with 10us returns 69us ; for ( ; x > 0 ; x--); ;#endif ; ;#ifdef Clock_8MHz ; //Calling with 1us returns 11us ; //Calling with 10us returns 56us ; //for ( ; x > 0 ; x--); ; ; //Calling with 1us returns 7.5us ; //Calling with 10us returns 48 ; //Calling with 1000us returns 4.5ms ; while(--x); ; ; //while(x--); ;#endif ; ;#ifdef Clock_20MHz ; //Calling with 10us returns 13 us ; //Calling with 1us returns 1.8us

; m004 DECF INCF BTFSC DECF MOVF IORWF BTFSC GOTO NOP GOTO x,1 x,W 0x03,Zero_ x+1,1 x,W x+1,W 0x03,Zero_ m005 m004

while(--x) nop();

;#endif ; ;} m005 RETURN ; ;//General short delay ;void delay_ms(uns16 x) ;{ delay_ms ; ;#ifdef Clock_4MHz ; //Clocks out at 1002us per 1ms ; int y; ; for ( ; x > 0 ; x--) ; for ( y = 0 ; y < 108 ; y++); ;#endif ; ;#ifdef Clock_8MHz ; //Clocks out at 1006us per 1ms ; uns8 y, z; ; for ( ; x > 0 ; x--) ; for ( y = 0 ; y < 4 ; y++) ; for ( z = 0 ; z < 69 ; z++); ;#endif ; ;#ifdef Clock_20MHz ; ; uns8 y, z; ; //Clocks out to 1.00ms per 1ms ; //9.99 ms per 10ms ; for ( ; x > 0 ; x--) m006 MOVF IORWF BTFSC GOTO CLRF MOVLW SUBWF BTFSC GOTO CLRF MOVLW SUBWF BTFSC GOTO INCF GOTO x_2,W x_2+1,W 0x03,Zero_ m011 ; m007 y .4 y,W 0x03,Carry m010 ; m008 z .176 z,W 0x03,Carry m009 z,1 m008 for ( z = 0 ; z < 176 ; z++); for ( y = 0 ; y < 4 ; y++)

m009 m010

INCF GOTO DECF INCF BTFSC DECF GOTO

y,1 m007 x_2,1 x_2,W 0x03,Zero_ x_2+1,1 m006 ;#endif ; ;}

m011

RETURN ; ;//Delays in 31.25kHz Low Power mode using the internal

31.25kHz oscillator ;void delay_s_lp(uns16 x) ;{ delay_s_lp ; ; ; ; m012 MOVF IORWF BTFSC GOTO CLRF CLRF MOVLW SUBWF BTFSS GOTO BTFSS GOTO MOVLW SUBWF BTFSC GOTO INCF BTFSC INCF GOTO DECF INCF BTFSC DECF GOTO x_3,W x_3+1,W 0x03,Zero_ m016 ; m013 y_2 y_2+1 .3 y_2+1,W 0x03,Carry m014 0x03,Zero_ m015 .7 y_2,W 0x03,Carry m015 y_2,1 0x03,Zero_ y_2+1,1 m013 x_3,1 x_3,W 0x03,Zero_ x_3+1,1 m012 for ( y = 0 ; y < 775 ; y++); uns16 y; //Clocks out to 1.001s per 1s for ( ; x > 0 ; x--)

m014

m015

; FILE D:\Pics\code\16F88\Scooter-2\scooter-tutorial.c ; ; ;//Function definitions ;#include "\Pics\code\Delay.c" // Delays m016 RETURN ; FILE \Pics\code\Stdio.c ;/* ; 5/21/02 ; Nathan Seidle ; nathan.seidle@colorado.edu

; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; %h ; ; e XTal is bad. ; . ; very well now. ; ; ; ; ; ; odworks.

Serial Out Started on 5-21 rs_out Perfected on 5-24 1Wire Serial Comm works with 4MHz Xtal Connect Serial_Out to Pin2 on DB9 Serial Connector Connect Pin5 on DB9 Connector to Signal Ground 9600 Baud 8-N-1 5-21 5-24 5-25 5-25 5-25 5-25 My first real C and Pic program. Attempting 20MHz implementation 20MHz works Serial In works at 4MHz Passing Strings 9:20 Option Selection 9:45

6-9 'Stdio.c' created. Printf working with %d and 7-20 Added a longer delay after rs_out Trying to get 20MHz on the 16F873 - I think th 20MHz also needs 5V Vdd. Something I dont have 2-9-03 Overhauled the 4MHz timing. Serial out works 6-16-03 Discovered how to pass string in cc5x void test(const char *str); test("zbcdefghij"); TXREG = str[1]; Moved to hardware UART. Old STDIO will be in go

; ; Works great! Even got the special print charact ers (\n, \r, \0) to work. ; ; 4-25-04 Added new %d routine to print 16 bit signed decimal numbers without leading 0s. ; ; ;*/ ; ;//Setup the hardware UART TX module ;void enable_uart_TX(bit want_ints) ;{ enable_uart_TX ; BRGH = 0; //Normal speed UART BCF 0x98,BRGH ; ; SYNC = 0; BCF 0x98,SYNC ; SPEN = 1; BCF 0x03,RP0 BSF 0x18,SPEN ; ;#ifdef Clock_4MHz ; #ifdef Baud_9600 ; SPBRG = 6; //4MHz for 9600 Baud ; #endif ;#endif

; ;#ifdef Clock_8MHz ; #ifdef Baud_4800 ; SPBRG = 25; //8MHz for 4800 Baud ; #endif ; #ifdef Baud_9600 ; SPBRG = 12; //8MHz for 9600 Baud ; #endif ; #ifdef Baud_57600 ; BRGH = 1; //High speed UART ; SPBRG = 7; //8MHz for 57600 Baud ; #endif ;#endif ; ;#ifdef Crazy_Osc ; #ifdef Baud_9600 ; SPBRG = 32; //20MHz for 9600 Baud ; #endif ;#endif ; ;#ifdef Clock_20MHz ; #ifdef Baud_9600 ; SPBRG = 31; //20MHz for 9600 Baud MOVLW .31 BSF 0x03,RP0 MOVWF SPBRG ; #endif ; ; #ifdef Baud_4800 ; SPBRG = 64; //20MHz for 4800 Baud ; #endif ;#endif ; ; if(want_ints) //Check if we want to turn on interru pts BCF 0x03,RP0 BTFSS 0x24,want_ints GOTO m017 ; { ; TXIE = 1; BSF 0x03,RP0 BSF 0x8C,TXIE ; PEIE = 1; BSF 0x0B,PEIE ; GIE = 1; BSF 0x0B,GIE ; } ; ; TXEN = 1; //Enable transmission m017 BSF 0x03,RP0 BSF 0x98,TXEN ;} RETURN ; ;//Setup the hardware UART RX module ;void enable_uart_RX(bit want_ints) ;{ enable_uart_RX ; ; BRGH = 0; //Normal speed UART

BCF BCF BCF BSF

0x98,BRGH ; ; 0x98,SYNC ; 0x03,RP0 0x18,SPEN ; ;#ifdef Clock_4MHz ; #ifdef Baud_9600 ; SPBRG = 6; //4MHz for 9600 Baud ; #endif ;#endif ; ;#ifdef Clock_8MHz ; #ifdef Baud_4800 ; SPBRG = 25; //8MHz for 4800 Baud ; #endif ; #ifdef Baud_9600 ; SPBRG = 12; //8MHz for 9600 Baud ; #endif ; #ifdef Baud_57600 ; BRGH = 1; //High speed UART ; SPBRG = 8; //8MHz for 57600 Baud ; #endif ;#endif ; ;#ifdef Crazy_Osc ; #ifdef Baud_9600 ; SPBRG = 32; //20MHz for 9600 Baud ; #endif ;#endif ; ;#ifdef Clock_20MHz ; #ifdef Baud_9600 ; SPBRG = 31; //20MHz for 9600 Baud SPEN = 1; SYNC = 0;

MOVLW .31 BSF 0x03,RP0 MOVWF SPBRG ; #endif ; ; #ifdef Baud_4800 ; SPBRG = 64; //20MHz for 4800 Baud ; #endif ;#endif ; ; CREN = 1; BCF BSF 0x03,RP0 0x18,CREN ; ; ; ; pts BTFSS 0x24,want_ints_2 GOTO m018 ; { ; BSF 0x03,RP0 BSF 0x8C,RCIE //WREN = 1; if(want_ints) //Check if we want to turn on interru

RCIE = 1;

; BSF BSF 0x0B,PEIE ; 0x0B,GIE ; ; ;} m018 BSF 0x03,RP0 RETURN }

PEIE = 1; GIE = 1;

; ;//Sends nate to the Transmit Register ;void putc(uns8 nate) ;{ putc MOVWF nate ; m019 BTFSS 0x0C,TXIF GOTO m019 ; MOVF nate,W MOVWF TXREG ;} RETURN ; ;uns8 getc(void) ;{ getc ; m020 BTFSS 0x0C,RCIF GOTO m020 ; MOVF RCREG,W RETURN ;} ; ;//Returns ASCII Decimal and Hex values ;uns8 bin2Hex(char x) ;{ bin2Hex MOVWF x_4 ; MOVLW MOVWF MOVF ADDWF RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW RETLW .1 PCLATH x_4,W PCL,1 ; .48 .49 .50 .51 .52 .53 .54 .55 .56 .57 .65 .66 .67 .68 #pragma return[16] = "0123456789ABCDEF" skip(x); return (RCREG); while(RCIF == 0); TXREG = nate; while(TXIF == 0);

RETLW .69 RETLW .70 ;} ; ;//Prints a string including variables ;void printf(const char *nate, int16 my_byte) ;{ printf ; ; ; CLRF high_byte CLRF low_byte ; ; ; ; ; CLRF i ; ; m021 MOVF ADDWF CALL MOVWF i,W nate_2,W _const1 k ; ; MOVF k,1 BTFSC 0x03,Zero_ ; GOTO m044 ; ; XORLW .37 BTFSS 0x03,Zero_ GOTO m042 ; ; INCF i,1 ; MOVF ADDWF CALL MOVWF i,W nate_2,W _const1 k ; ; MOVF k,1 BTFSC 0x03,Zero_ ; GOTO m044 ; ers XORLW .92 BTFSS 0x03,Zero_ GOTO m022 ; ; INCF i,1 ; MOVF i,W k = nate[i]; { i++; else if (k == '\\') //Print special charact break; if (k == '\0') k = nate[i]; { i++; else if (k == '%') //Print var break; if (k == '\0') { k = nate[i]; uns8 y, z; uns8 decimal_output[5]; for(i = 0 ; ; i++) uns8 i, k, m, temp; uns8 high_byte = 0, low_byte = 0;

ADDWF nate_2,W CALL _const1 MOVWF k ; ; CALL putc ; ; ; ; m022 GOTO MOVF XORLW BTFSS GOTO CLRF MOVLW SUBWF BTFSC GOTO BTFSS GOTO MOVLW CALL m024 BTFSC GOTO MOVLW CALL MOVF XORLW BTFSS GOTO MOVLW CALL BCF RLF RLF INCF GOTO m027 MOVF XORLW BTFSS GOTO m043 k,W .98 0x03,Zero_ m027 ; ; m023 m .8 m,W 0x03,Carry m043 ; ; my_byte,7 m024 .49 putc ; my_byte,7 m025 .48 putc ; m025 m,W .3 0x03,Zero_ m026 .32 putc ; ; m026 0x03,Carry my_byte,1 my_byte+1,1 ; m,1 m023 ; ; k,W .100 0x03,Zero_ m038 ; ; ; ; ; my_byte = my_byte << 1; if (m == 3) putc(' '); if (my_byte.7 == 0) putc('0'); { if (my_byte.7 == 1) putc('1'); { for( m = 0 ; m < 8 ; m++ ) } //End Special Characters else if (k == 'b') //Print Binary putc(k);

} } //End Binary else if (k == 'd') //Print Decimal

{ //Print negative sign and take 2's comp /* if(my_byte < 0) {

liment

; ; ; ; ; ; ; MOVF IORWF BTFSS GOTO my_byte,W my_byte+1,W 0x03,Zero_ m028 ; MOVLW .48 CALL putc ; GOTO m043 ; ; ; MOVLW .4 MOVWF m BTFSC my_byte+1,7 GOTO m036 MOVF my_byte,W IORWF my_byte+1,W BTFSC 0x03,Zero_ GOTO m036 ; ; MOVF my_byte,W MOVWF C2tmp MOVF my_byte+1,W MOVWF C2tmp+1 CLRF temp MOVLW .16 MOVWF C1cnt RLF C2tmp,1 RLF C2tmp+1,1 RLF temp,1 BTFSC 0x03,Carry GOTO m031 MOVLW .10 SUBWF temp,W BTFSS 0x03,Carry GOTO m032 MOVLW .10 SUBWF temp,1 DECFSZ C1cnt,1 GOTO m030 ; MOVLW .47 ADDWF m,W MOVWF FSR BCF 0x03,IRP MOVF temp,W MOVWF INDF ; MOVF my_byte,W MOVWF C4tmp

putc('-'); my_byte ^= 0xFFFF; my_byte++; } */ if (my_byte == 0)

putc('0'); else { //Divide number by a series of 10s for(m = 4 ; my_byte > 0 ; m--)

m028 m029

{ temp = my_byte % (uns16)10;

m030

m031 m032

decimal_output[m] = temp;

my_byte = my_byte / (uns16)10;

m033

m034 m035

m036 m037

MOVF my_byte+1,W MOVWF C4tmp+1 CLRF C5rem MOVLW .16 MOVWF C3cnt RLF C4tmp,1 RLF C4tmp+1,1 RLF C5rem,1 BTFSC 0x03,Carry GOTO m034 MOVLW .10 SUBWF C5rem,W BTFSS 0x03,Carry GOTO m035 MOVLW .10 SUBWF C5rem,1 BSF 0x03,Carry RLF my_byte,1 RLF my_byte+1,1 DECFSZ C3cnt,1 GOTO m033 ; DECF m,1 GOTO m029 ; ; INCF m,1 MOVLW .5 SUBWF m,W BTFSC 0x03,Carry GOTO m043 ; MOVLW ADDWF MOVWF BCF MOVF CALL CALL INCF GOTO .47 m,W FSR 0x03,IRP INDF,W bin2Hex putc m,1 m037 ; ; ; ; }

for(m++ ; m < 5 ; m++)

putc(bin2Hex(decimal_output[m])

);

} //End Decimal else if (k == 'h') //Print Hex

m038

MOVF XORLW BTFSS GOTO

k,W .104 0x03,Zero_ m040 ; ; ; { //New trick 3-15-04 putc('0'); putc('x');

MOVLW .48 CALL putc ; MOVLW .120 CALL putc ; ; if(my_byte > 0x00FF)

BTFSC GOTO MOVF BTFSC GOTO SWAPF ANDLW CALL CALL 0.1111)); MOVLW ANDWF CALL CALL

my_byte+1,7 m039 my_byte+1,1 0x03,Zero_ m039 ; ; my_byte+1,W .15 bin2Hex putc ; .15 my_byte+1,W bin2Hex putc ; ; ; my_byte,W .15 bin2Hex putc ; .15 my_byte,W bin2Hex putc ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

{ putc(bin2Hex(my_byte.high8 >> 4));

putc(bin2Hex(my_byte.high8 & 0b.000

} putc(bin2Hex(my_byte.low8 >> 4));

m039

SWAPF ANDLW CALL CALL MOVLW ANDWF CALL CALL

putc(bin2Hex(my_byte.low8 & 0b.0000.111

1));

/*high_byte.3 high_byte.2 = high_byte.1 = high_byte.0 = low_byte.3 low_byte.2 low_byte.1 low_byte.0 putc('0'); putc('x'); = = = =

= my_byte.7; my_byte.6; my_byte.5; my_byte.4; my_byte.3; my_byte.2; my_byte.1; my_byte.0;

putc(bin2Hex(high_byte)); putc(bin2Hex(low_byte));*/ } //End Hex else if (k == 'f') //Print Float

m040

GOTO MOVF XORLW BTFSS GOTO

m043 k,W .102 0x03,Zero_ m041 ; ; { putc('!'); } //End Float else if (k == 'u') //Print Direct Character

MOVLW .33 CALL putc ; ; GOTO m043

m041

MOVF XORLW BTFSS GOTO

k,W .117 0x03,Zero_ m043 { //All ascii characters below 20 are spe //if(my_byte > 20) putc(my_byte); } //End Direct } //End Special Chars else putc(k); }

; ; cial and screwy characters ; ; MOVF my_byte,W CALL putc ; ; ; ; ; GOTO m043 ; m042 MOVF k,W CALL putc ; m043 INCF i,1 GOTO m021

; FILE D:\Pics\code\16F88\Scooter-2\scooter-tutorial.c ;#include "\Pics\code\Stdio.c" // Basic Serial IO m044 RETURN ; ;void boot_up(void); ;void motor_control(uns8 command); ;//End Function Definitions ; ;//Global Variables ;bit stop_moving; ;int right; ;int left; ;//End Global Variables ; ;void main() ;{ main ; uns8 choice; ; ; boot_up(); BSF 0x03,RP0 BCF 0x03,RP1 CALL boot_up ; ; while(1) ; { ; printf("\n\r\n\rScooter 2 Debugging\n\r", 0); m045 CLRF nate_2 CLRF my_byte CLRF my_byte+1 CALL printf ; printf("======================================= =====\n\r", 0); MOVLW .26 MOVWF nate_2 CLRF my_byte

CLRF my_byte+1 CALL printf ; MOVLW MOVWF CLRF CLRF CALL MOVLW MOVWF CLRF CLRF CALL MOVLW MOVWF CLRF CLRF CALL .73 nate_2 my_byte my_byte+1 printf ; .86 nate_2 my_byte my_byte+1 printf ; .109 nate_2 my_byte my_byte+1 printf ; ; CALL getc MOVWF choice ; MOVLW .64 XORWF PORTB,1 ; ; MOVF XORLW BTFSS GOTO choice,W .48 0x03,Zero_ m046 ; ; MOVLW .33 CALL putc ; ; m046 GOTO MOVF XORLW BTFSS GOTO MOVLW MOVWF CLRF CLRF CALL MOVLW MOVWF CLRF CLRF CALL m045 choice,W .49 0x03,Zero_ m045 ; ; .115 nate_2 my_byte my_byte+1 printf ; .137 nate_2 my_byte my_byte+1 printf ; MOVLW .158 MOVWF nate_2 printf(" Press z to stop\n\r", 0); printf(" Press x to return\n\r", 0); { printf("Keyboard control : \n\r", 0); } else if (choice == '1') { putc('!'); if(choice == '0') STATUS_LED ^= 1; choice = getc(); printf("\n\r : ", 0); printf(" 1) Keyboard control\n\r", 0); printf("Main Menu:\n\r", 0);

CLRF my_byte CLRF my_byte+1 CALL printf ; ; ; m047 CALL getc MOVWF choice ; XORLW .120 BTFSC 0x03,Zero_ GOTO m045 motor_control(choice); MOVF choice,W CALL motor_control ; } GOTO m047 ; ; } ; } ; ;}//End Main ; ; ;void motor_control(uns8 command) ;{ motor_control MOVWF command ; //Control Left wheel ; //================================================ ; if(command == 'w') XORLW .119 BTFSS 0x03,Zero_ GOTO m050 ; { ; left++; INCF left,1 ; if(left < 0) BTFSS left,7 GOTO m048 ; { ; L_REV(); BCF PORTB,0 ; drive_left_time--; DECF drive_left_time,1 ; } ; if(left > 0) m048 BTFSC left,7 GOTO m049 MOVF left,1 BTFSC 0x03,Zero_ GOTO m049 ; { ; L_FORWARD(); BSF PORTB,0 ; drive_left_time++; INCF drive_left_time,1 ; } ; if(left == 0) drive_left_time = 0; ; ; if(choice == 'x') break; while(1) { choice = getc();

m049

m050

m051

m052

m053

MOVF left,1 BTFSC 0x03,Zero_ CLRF drive_left_time ; } ; if(command == 's') MOVF command,W XORLW .115 BTFSS 0x03,Zero_ GOTO m053 ; { ; left--; DECF left,1 ; if(left < 0) BTFSS left,7 GOTO m051 ; { ; L_REV(); BCF PORTB,0 ; drive_left_time++; INCF drive_left_time,1 ; } ; if(left > 0) BTFSC left,7 GOTO m052 MOVF left,1 BTFSC 0x03,Zero_ GOTO m052 ; { ; L_FORWARD(); BSF PORTB,0 ; drive_left_time--; DECF drive_left_time,1 ; } ; if(left == 0) drive_left_time = 0; MOVF left,1 BTFSC 0x03,Zero_ CLRF drive_left_time ; } ; //================================================ ; ; //Control right wheel ; //================================================ ; if(command == 'e') MOVF command,W XORLW .101 BTFSS 0x03,Zero_ GOTO m056 ; { ; right++; INCF right,1 ; if(right < 0) BTFSS right,7 GOTO m054 ; { ; R_REV(); BSF PORTB,3 ; drive_right_time--; DECF drive_right_time,1 ; } ; if(right > 0)

m054

BTFSC GOTO MOVF BTFSC GOTO BCF

right,7 m055 right,1 0x03,Zero_ m055 ; ; PORTB,3 { R_FORWARD();

m055

m056

m057

m058

m059

; drive_right_time++; INCF drive_right_time,1 ; } ; if(right == 0) drive_right_time = 0; MOVF right,1 BTFSC 0x03,Zero_ CLRF drive_right_time ; } ; if(command == 'd') MOVF command,W XORLW .100 BTFSS 0x03,Zero_ GOTO m059 ; { ; right--; DECF right,1 ; if(right < 0) BTFSS right,7 GOTO m057 ; { ; R_REV(); BSF PORTB,3 ; drive_right_time++; INCF drive_right_time,1 ; } ; if(right > 0) BTFSC right,7 GOTO m058 MOVF right,1 BTFSC 0x03,Zero_ GOTO m058 ; { ; R_FORWARD(); BCF PORTB,3 ; drive_right_time--; DECF drive_right_time,1 ; } ; if(right == 0) drive_right_time = 0; MOVF right,1 BTFSC 0x03,Zero_ CLRF drive_right_time ; } ; //================================================ ; ; //All Stop ; if(command == 'z') MOVF command,W XORLW .122 BTFSS 0x03,Zero_ GOTO m060 ; { ; drive_right_time = 0;

m060

CLRF drive_right_time ; drive_left_time = 0; CLRF drive_left_time ; right = 0; CLRF right ; left = 0; CLRF left ; } ; ;} RETURN ; ;//Initializes the various ports and interrupts ;void boot_up(void) ;{ ; ; ; //Setup Ports CMCON = 0b.0000.0111; //Turn off comparator on RA p

boot_up

ort MOVLW .7 MOVWF CMCON ; CLRF ANSEL ; ; ; ; ; ; ; ; ; ; ; BCF 0x03,RP0 CLRF PORTA ; MOVLW .1 BSF 0x03,RP0 MOVWF TRISA ; ; ; ; ; ; ; ; ; ; BCF 0x03,RP0 CLRF PORTB ; MOVLW .132 BSF 0x03,RP0 MOVWF TRISB ; ; BCF 0x03,RP0 Left_Enable = 0; TRISB = 0b.1000.0100; //0 = Output 1 = Input //RB0 //RB1 //RB2 //RB3 //RB4 //RB5 //RB6 //RB7 PORTB = Right Motor Forward Right Motor Enable RX : Input but handled with hardware Left Motor Forward Left Motor Enable TX : Output but handled with hardware LED Indicator Start Button 0b.0000.0000; TRISA = 0b.0000.0001; //0 = Output 1 = Input //Pins: //RA0 //RA1 //RA2 //RA3 //RA4 //RA5 //RA6 //RA7 PORTA = Analog signal from IR-Eye IR-Eye Select 3 IR-Eye Select 2 IR-Eye Select 1 VPP NC Xtal Xtal 0b.0000.0000; ANSEL = 0b.0000.0000; //Turn Port A to digital IO

BCF BCF

PORTB,1 ; PORTB,4 Right_Enable = 0;

; ; drive_left_time = 0; CLRF drive_left_time ; drive_right_time = 0; CLRF drive_right_time ; ; right = 0; CLRF right ; left = 0; CLRF left ; ; enable_uart_TX(0); BCF 0x24,want_ints BSF 0x03,RP0 CALL enable_uart_TX ; enable_uart_RX(0); BCF 0x03,RP0 BCF 0x24,want_ints_2 BSF 0x03,RP0 CALL enable_uart_RX ; ; //T2CON = 0b.0111.1011; //Put a prescalar of 16 wit h a postscaler of 16 on Timer2 - BAD makes the motors very jerky ; //T2CON = 0b.0011.1000; //Put a postscalar of 8 on Timer2 - Works well, but causes the ISR to fire 1000 per second ; T2CON = 0b.0111.1000; //Put a postscaler of 16 on T imer2 - Works very well MOVLW .120 BCF 0x03,RP0 MOVWF T2CON ; ; //Setup Interrupts ; TMR2IE = 1; BSF 0x03,RP0 BSF 0x8C,TMR2IE ; PEIE = 1; BSF 0x0B,PEIE ; GIE = 1; BSF 0x0B,GIE ; ; TMR2ON = 1; //Start running TMR2 BCF 0x03,RP0 BSF 0x12,TMR2ON ; ;} RETURN END ; *** KEY INFO *** ; ; ; ; ; 0x0004 0x00FB 0x0106 0x011E 0x0138 P0 P0 P0 P0 P0 38 11 24 26 17 word(s) word(s) word(s) word(s) word(s) 1 0 1 1 0 % % % % % : : : : : serverX delay_us delay_ms delay_s_lp enable_uart_TX

; ; ; ; ; ; ; ; ; ; ; ; ; ;

0x0149 0x015A 0x0160 0x0164 0x0179 0x002A 0x02CF 0x027A 0x0239

P0 17 word(s) 0 % : P0 6 word(s) 0 % : P0 4 word(s) 0 % : P0 21 word(s) 1 % : P0 192 word(s) 9 % : P0 120 word(s) 5 % : P0 37 word(s) 1 % : P0 85 word(s) 4 % : P0 65 word(s) 3 % :

enable_uart_RX putc getc bin2Hex printf _const1 boot_up motor_control main

RAM usage: 32 bytes (26 local), 336 bytes free Maximum call level: 2 (+1 for interrupt) Codepage 0 has 753 word(s) : 36 % Codepage 1 has 0 word(s) : 0 % Total of 664 code words (16 %)

Potrebbero piacerti anche