;************************************************* www.x-robotics.com ******* ; PROGRAMA : GP2D02.asm ; Funcion :Medicion de distancia de 10 a 80 cms con el sensor integrao GP2D02 ; de Sharp y visualizacion en LCD conectado a PORTB 8 lineas + PORTA0, PORTA1 ; y PORTA2 ; ; ;--------------------------------------------------------------------------- ; Revision : 1.00 Fecha: 8/12/2003 Programa para : PIC16F876 ; CPU Clock : 4 MHz Tiempo instruccion : 1uS ; WDT : OFF Tipo de reloj : XT ; Code Prot : OFF cfg USART rs232 ; none ; Autor : ionitron -> ionitron@x-robotics.com <- ;************************************************* www.x-robotics.com ******* processor 16F876 LIST P=16F876 ;Se indica el modo de procesador INCLUDE ;se incluye la definicion de los ;registros internos __config 3D31 ;------------------------ definicion de registros -------------------------- PDel0 EQU 0x21 PDel1 EQU 0x22 PDel2 EQU 0x23 BUFFER EQU 0x24 DATO_A EQU 0x25 DATO_B EQU 0x26 Digito EQU 0x27 INNER EQU 0x28 OUTER EQU 0x29 cnt_bit EQU 0x2A ASCII_H EQU 0x2B ASCII_M EQU 0x2C ASCII_L EQU 0x2D HEXADECIMAL EQU 0x2E despl EQU 0x2F ;offset de tabla conversion cm. max EQU 0x30 ;---------------------------------------------------------------------------- org 0x00 ;vector de inicio goto INICIO org 0x05 ;despues del vector de interrupcion ;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>> ;---------------------------------------------------------------------------- INICIO bcf STATUS,RP0 ;banco 0 bcf STATUS,RP1 clrf PORTA bsf STATUS,RP0 ;banco 1 movlw 0x06 movwf ADCON1 movlw b'00001000' ;pone entradas y salidas.. RA3=IN movwf TRISA clrf TRISB ;portb como salida clrf TRISC bcf STATUS,RP0 ;banco 0 movlw b'00000000' ;todo a 0 menos RA3 a 1 movwf PORTA bsf PORTC,0 movlw d'105' ;offset usado con tabla conversiones movwf despl ;calibracion para centimetros. movlw d'235' movwf max ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' START CALL LCD_INI ;Inicia LCD (CFG puertos...) START_1 MOVLW b'00000001' ;Borrar LCD y Home CALL LCD_REG MOVLW b'00000110' ; CALL LCD_REG MOVLW b'00001100' ;LCD On, cursor Off,Parpadeo Off CALL LCD_REG MOVLW 0x80 ;Direccion caracter CALL LCD_REG REPETIR MOVF Digito,w ;W=Digito CALL DATO_1 ;Coge el caracter IORLW 0 ;Compara BTFSC STATUS,2 ;Es el ultimo? GOTO acabar ;Si CALL LCD_DATOS ;Visualiza caracter INCF Digito,f ;Incrementa numero de Digito GOTO REPETIR ;Vuelve a escribir acabar movlw d'7' movwf cnt_bit ;contador de bits para lectura bcf PORTC,0 ;pone a 0 Vin movlw d'70' ;delay 70mS espera a captura call delay bsf PORTC,0 ;sube de nuevo ;----------------------------------------------- lee call Delayp1 ;delay 0,1mS bcf PORTC,0 ;lee primer bit MSB nop nop nop nop nop nop btfss PORTA,3 ;compara el bit entrante goto es_cero es_uno bsf BUFFER,0 ;pone el bit actual bcf STATUS, C rlf BUFFER,F ;rota a izquierda goto continuar es_cero bcf BUFFER,0 ;pone el bit actual bcf STATUS, C rlf BUFFER,F ;rota a izquierda continuar bsf PORTC,0 decfsz cnt_bit,F goto lee ;--------------------------------------------------------------- lee_ultimo bcf PORTC,0 ;lee primer bit MSB nop nop nop nop nop nop btfss PORTA,3 ;compara el bit entrante goto es_cero2 es_uno2 bsf BUFFER,0 ;pone el bit actual goto continuar2 es_cero2 bcf BUFFER,0 ;pone el bit actual continuar2 bsf PORTC,0 ;mostrar en lcd!************************************************************ movf BUFFER,W call Hex_Ascii movlw b'10001011' ;pone cursor siempre en 8B call LCD_REG movf ASCII_H,W ;sobreescribe el dato distancia CALL LCD_DATOS ;Visualiza caracter movf ASCII_M,W CALL LCD_DATOS ;Visualiza caracter movf ASCII_L,W CALL LCD_DATOS ;Visualiza caracter salida bcf PCLATH,0 ;pagina 0 clrf PORTA ;movf BUFFER,W ;muestra en portb como ejemplo! ;movwf PORTB ;comparar si el dato de buffer esta entre los limites de ;conversion de 105 a 234 si no mostrar error mayor_ ;comprobar limite superior >105 bcf STATUS,C ;borra flag movf BUFFER,W sublw d'234' btfsc STATUS,C goto inferior_ si_mayor ;poner en display el rotulo MIN (excedido valor minimo) movlw b'11000001' ;pone cursor siempre en C1 call LCD_REG movlw 'M' CALL LCD_DATOS ;Visualiza caracter M----------- movlw 'I' CALL LCD_DATOS ;Visualiza caracter I----------- movlw 'N' CALL LCD_DATOS ;Visualiza caracter N----------- goto otracosa ;salta lo demas..................... inferior_ ;comprobar limite inferior <10 bcf STATUS,C ;borra flag movf BUFFER,W sublw d'104' btfss STATUS,C goto no_inferior si_inferior ;poner en display el rotulo MAX (excedido valor maximo) movlw b'11000001' ;pone cursor siempre en C1 call LCD_REG movlw 'M' CALL LCD_DATOS ;Visualiza caracter M----------- movlw 'A' CALL LCD_DATOS ;Visualiza caracter A----------- movlw 'X' CALL LCD_DATOS ;Visualiza caracter X----------- goto otracosa ;salta lo demas..................... no_inferior call calibra ;tabla de conversion de unidades cms bcf PCLATH,0 ;pagina 0 movwf BUFFER ;pone en F el dato devuelto display call Hex_Ascii ;display valor en centimetros.------------ movlw b'11000001' ;pone cursor siempre en C1 call LCD_REG movf ASCII_H,W ;sobreescribe el dato distancia CALL LCD_DATOS ;Visualiza caracter movf ASCII_M,W CALL LCD_DATOS ;Visualiza caracter movf ASCII_L,W CALL LCD_DATOS ;Visualiza caracter ------------ movlw 'c' CALL LCD_DATOS ;Visualiza caracter ------------ movlw 'm' CALL LCD_DATOS ;Visualiza caracter ------------ movlw '.' CALL LCD_DATOS ;Visualiza caracter ------------ otracosa movlw d'20' call delay goto acabar ;bucle infinito ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ;<<<<<<---------------------- TABLA DE DATOS ------------------------->>>>>>> DATO_1 ADDWF PCL,1 RETLW 'D' RETLW 'i' RETLW 's' RETLW 't' RETLW 'a' RETLW 'n' RETLW 'c' RETLW 'i' RETLW 'a' RETLW '=' RETLW 0x00 ;#########################################################RUTINAS DE LCD#### LCD_E BSF PORTA,2 ;Activa señal E NOP NOP NOP ;Espera 1uS BCF PORTA,2 ;Desactiva señal E RETURN LCD_BUSY BSF PORTA,1 ;Pone el LCD en modo lectura BSF STATUS,RP0 ;Selecciona el Banco 1 MOVLW 0xFF MOVWF TRISB ;Puerta B act£a de entrada BCF STATUS,RP0 ;Selecciona el Banco 0 BSF PORTA,2 ;Activa el LCD (Señal E) NOP L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY GOTO L_BUSY ;Est a "1" (Ocupado) BCF PORTA,2 ;Desactiva el LCD (Se¤al E) BSF STATUS,RP0 ;Selecciona el Banco 1 CLRF TRISB ;Puerta B actua como salida BCF STATUS,RP0 ;Selecciona el Banco 0 BCF PORTA,1 ;Pone el LCD en modo escritura RETURN LCD_REG BCF PORTA,0 ;Desactiva RS (Modo instruccion) MOVWF PORTB ;Saca el codigo de instruccion CALL LCD_BUSY ;Espera a que se libere el LCD GOTO LCD_E ;Genera pulso en señal E LCD_DATOS BCF PORTA,0 ;Desactiva RS (Modo instrucci¢n) MOVWF PORTB ;Valor ASCII a sacar por PORTB CALL LCD_BUSY ;Espera a que se libere el LCD BSF PORTA,0 ;Activa RS (Modo dato) GOTO LCD_E ;Genera pulso en señal E LCD_INI MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. MOVLW b'00111000' CALL LCD_REG ;Codigo de instruccion CALL DELAY_5MS ;Temporiza 5 mS. RETURN ;**************************************************************************** ;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de ;inicio del LCD DELAY_5MS movlw .6 ; 1 set number of repetitions (B) movwf PDel0 ; 1 | PLoop1 movlw .207 ; 1 set number of repetitions (A) movwf PDel1 ; 1 | PLoop2 nop ; 1 clear watchdog decfsz PDel1, 1 ; 1 + (1) is the time over? (A) goto PLoop2 ; 2 no, loop decfsz PDel0, 1 ; 1 + (1) is the time over? (B) goto PLoop1 ; 2 no, loop PDelL1 goto PDelL2 ; 2 cycles delay PDelL2 nop ; 1 cycle delay return ; 2+2 Done ;########################################################################### del_1ms movlw d'199' ;delay 1mS movwf INNER in_lp nop nop decfsz INNER,F goto in_lp return delay movwf OUTER ;vueltas de 1mS out_lp call del_1ms decfsz OUTER,F goto out_lp return ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() Hex_Ascii ;cargar en W el dato hex. ""convierte HEX a ASCII para LCD"" ; ;MOVLW .254 MOVWF HEXADECIMAL clrf ASCII_H clrf ASCII_M clrf ASCII_L ; Centenas ; movlw D'100' ;D'100' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ? goto Decenas ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_H,F ;Incrementa el contador de centenas BCD goto Centenas ;Vuelve por otros D'100' ; Decenas ; movlw D'10' ;D'10' --> W subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ? goto Unidades ;Si movwf HEXADECIMAL ;Salva el resto incf ASCII_M,F ;Incrementa el contador de decenas BCD goto Decenas ;Vuelve por otros D'10' ; Unidades ; movf HEXADECIMAL,W ;El resto pertenece movwf ASCII_L ;a las unidades BCD clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL ; Bcd_A_Ascii ; movlw H'30' ;H'30' --> W iorwf ASCII_L,F ;Convierte de BCD a ASCII iorwf ASCII_M,F ;Convierte de BCD a ASCII ; tstf ASCII_H ;ASCII_H --> F btfsc STATUS,Z ;? ASCII_H es D'00' ? goto Espacio ;Si movlw H'30' ;H'30' --> W iorwf ASCII_H,F ;Convierte de BCD a ASCII return ;Retorna ; Espacio ; movlw '0' ;A' ' --> W movwf ASCII_H ;A' ' --> ASCII_H ;movwf ASCII_M ;A' ' --> ASCII_H ;movwf ASCII_L ;A' ' --> ASCII_H return ;Retorna ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()() ; Description: Waits 100 cycles ;------------------------------------------------------------- Delayp1 movlw .23 ; 1 set number of repetitions movwf PDel0 ; 1 | PLoop02 nop ; 1 clear watchdog decfsz PDel0, 1 ; 1 + (1) is the time over? goto PLoop02 ; 2 no, loop PDelL12 goto PDelL22 ; 2 cycles delay PDelL22 nop ; 1 cycle delay return ; 2+2 Done ;<<<<<<---------------------- TABLA DE DATOS ------------------------->>>>>>> org 0x110 calibra movf despl,W ;resta offset en tabla... subwf BUFFER,W bsf PCLATH,0 ;pagina 1 ADDWF PCL,F RETLW d'80' ;105.--- RETLW d'77' ;106.--- RETLW d'74' ;107.--- RETLW d'72' ;108.--- RETLW d'70' ;109.--- RETLW d'67' ;110.--- RETLW d'65' ;111.--- RETLW d'63' ;112.--- RETLW d'61' ;113.--- RETLW d'59' ;114.--- RETLW d'57' ;115.--- RETLW d'55' ;116.--- RETLW d'53' ;117.--- RETLW d'52' ;118.--- RETLW d'51' ;119.--- RETLW d'49' ;120.--- RETLW d'47' ;121.--- RETLW d'45' ;122.--- RETLW d'44' ;123.--- RETLW d'43' ;124.--- RETLW d'42' ;125.--- RETLW d'41' ;126.--- RETLW d'40' ;127.--- RETLW d'39' ;128.--- RETLW d'38' ;129.--- RETLW d'37' ;130.--- RETLW d'36' ;131.--- RETLW d'35' ;132.--- RETLW d'34' ;133. RETLW d'34' ;134.--- RETLW d'33' ;135.--- RETLW d'32' ;136.--- RETLW d'32' ;137. RETLW d'31' ;138.--- RETLW d'31' ;139. RETLW d'30' ;140.--- RETLW d'30' ;141. RETLW d'29' ;142.--- RETLW d'29' ;143. RETLW d'28' ;144.--- RETLW d'28' ;145. RETLW d'27' ;146.--- RETLW d'27' ;147. RETLW d'26' ;148.--- RETLW d'26' ;149. RETLW d'25' ;150. RETLW d'25' ;151.--- RETLW d'25' ;152. RETLW d'24' ;153. RETLW d'24' ;154.--- RETLW d'24' ;155. RETLW d'23' ;156. RETLW d'23' ;157.--- RETLW d'23' ;158. RETLW d'22' ;159. RETLW d'22' ;160.--- RETLW d'22' ;161. RETLW d'22' ;162. RETLW d'21' ;163. RETLW d'21' ;164.--- RETLW d'21' ;165. RETLW d'21' ;166. RETLW d'20' ;167. RETLW d'20' ;168.--- RETLW d'20' ;169. RETLW d'20' ;170. RETLW d'19' ;171. RETLW d'19' ;172.--- RETLW d'19' ;173. RETLW d'19' ;174. RETLW d'18' ;175. RETLW d'18' ;176. RETLW d'18' ;177.--- RETLW d'18' ;178. RETLW d'18' ;179. RETLW d'18' ;180. RETLW d'17' ;181. RETLW d'17' ;182. RETLW d'17' ;183.--- RETLW d'17' ;184. RETLW d'17' ;185. RETLW d'17' ;186. RETLW d'16' ;187. RETLW d'16' ;188. RETLW d'16' ;189.--- RETLW d'16' ;190. RETLW d'16' ;191. RETLW d'16' ;192. RETLW d'15' ;193. RETLW d'15' ;194. RETLW d'15' ;195. RETLW d'15' ;196.--- RETLW d'15' ;197. RETLW d'15' ;198. RETLW d'15' ;199. RETLW d'14' ;200. RETLW d'14' ;201. RETLW d'14' ;202. RETLW d'14' ;203.--- RETLW d'14' ;204. RETLW d'14' ;205. RETLW d'14' ;206. RETLW d'13' ;207. RETLW d'13' ;208. RETLW d'13' ;209. RETLW d'13' ;210.--- RETLW d'13' ;211. RETLW d'13' ;212. RETLW d'13' ;213. RETLW d'12' ;214. RETLW d'12' ;215. RETLW d'12' ;216. RETLW d'12' ;217.--- RETLW d'12' ;218. RETLW d'12' ;219. RETLW d'12' ;220. RETLW d'12' ;221. RETLW d'12' ;222. RETLW d'11' ;223. RETLW d'11' ;224. RETLW d'11' ;225. RETLW d'11' ;226. RETLW d'11' ;227.--- RETLW d'11' ;228. RETLW d'11' ;229. RETLW d'11' ;230 RETLW d'10' ;231. RETLW d'10' ;232. RETLW d'10' ;233. RETLW d'10' ;234.--- RETLW 0xFF ;FF return ;por si acaso ;<<<<<<\\\\\\\\\\\THE\\\\\\\\\\\\\\\\////////////////END//////////////>>>>>>> END