Code:
;------------------------------------------------------------------------------------
;
; PIC 16F84A/04
; _______ _______
; | \/ |
; Pulsador 1__RA2 --+ 1 >> << 18 +-- RA1__Sensores Derecha
; | |
; Pulsador 2__RA3 --+ 2 >> << 17 +-- RA0__Sensores Izquierda
; | |
; * Pulsador 3__RA4 --+ 3 >> << 16 +-- OSC1
; | |
; /MCLR --+ 4 >> 15 +-- OSC2
; | |
; Vss --+ 5 >> << 14 +-- Vdd
; | |
; * NC__RB0 --+ 6 >> 13 +-- RB7__Motor Drcho.2
; | |
; LED 1__RB1 --+ 7 << >> 12 +-- RB6__Motor Drcho.1
; | |
; LED 2__RB2 --+ 8 << >> 11 +-- RB5__Motor Izdo.2
; | |
; LED 3__RB3 --+ 9 << >> 10 +-- RB4__Motor Izdo.1
; | |
; +----------------+
;
; * Se ha cambiado la conexión el la placa del pulsador 3 de RB0 por RA4 para simplificar !!!
;
;------------------------------------------------------------------------------------
;
; Funcionamiento de los motores (visto desde atrás):
;
; +-------------+----------|----------|--------|-----------|----------+
; | MOTOR -> |Izquierdo | | | Derecho | |
; +-------------+----------+ Función +--------+-----------+ Función |
; | Puerto -> | RB4 RB5 | | | RB6 RB7 | |
; +-------------+----------+----------+--------+-----------+----------+
; | | 0 1 | Atrás | | 0 1 | Atrás |
; +-------------+----------+----------+--------+-----------+----------+
; | | 1 0 | Adelante | | 1 0 | Adelante |
; +-------------+----------+----------+--------+-----------+----------+
;
;
;------------------------------------------------------------------------------------
LIST P=16F84, F=INHX8M
include "P16F84.inc"
errorlevel 1,-224,-302
;******************************************************
constant LED1 = 01
constant LED2 = 02
constant LED3 = 03
constant IZD = 00 ;Sensor Derecha
constant DRC = 01 ;Sensor Izda.
constant SW1 = 02 ;Pulsador 1
constant SW2 = 03 ;Pulsador 2
constant SW3 = 04 ;Pulsador 3
constant LONG = 0x0C ;Puntero RAM para contar longitud recorrida
constant TMP1 = 0x0D ;Punteros para temporizar
constant TMP2 = 0x0E
constant TMP3 = 0x0F
constant PRG1 = 0x10 ;Punteros tiempo programas
constant PRG2 = 0x11
constant PRG3 = 0x12
constant CNT = 0x25 ;Ajuste carga temporizadores
;******************************************************
ORG 0x0000
MOVLW 30
CALL Tiempo
MOVLW 0x00
OPTION
MOVLW 0x1F
TRIS PORTA ;Pone puerto A como entradas.
MOVLW 0x00
TRIS PORTB ;Pone puerto B como salidas.
Set_Prog MOVLW b'11110000' ;Enciende los LEDS y motores parados.
MOVWF PORTB
BSF STATUS,C
MOVLW 50
CALL Tiempo ;0,5 Sg de parpadeo de LEDS.
BTFSS PORTA,SW1
GOTO Set_Prog1
BTFSS PORTA,SW2
GOTO Set_Prog2
BTFSS PORTA,SW3
GOTO Set_Prog3
MOVLW b'11111110' ;Apaga los LEDS y motores parados.
MOVWF PORTB
BSF STATUS,C
MOVLW 50
CALL Tiempo ;0,5 Sg de parpadeo de LEDS
GOTO Set_Prog
Set_Prog1 CALL Prog1
GOTO Inicio
Set_Prog2 CALL Prog2
GOTO Inicio
Set_Prog3 CALL Prog3
Inicio MOVLW b'01011111' ;Rb5 y Rb7 = 0, ir hacia delante.
ANDWF PORTB,F ;Pone puertoB para ir hacia delante.
Loop BTFSS PORTA,IZD
GOTO Topei
BTFSS PORTA,DRC
GOTO Toped
BTFSS PORTA,SW1
CALL Prog1
BTFSS PORTA,SW2
CALL Prog2
BTFSS PORTA,SW3
CALL Prog3
GOTO Loop
Topei CALL Ostia ;Retrocede un poco.
MOVLW b'10011111' ;Giro a derecha.
Toptop ANDWF PORTB,F
BTFSS PORTB,LED1 ;PROG1 ?
CALL Tm1 ;Coge tiempo giro Prog1
BTFSS PORTB,LED2 ;PROG2 ?
CALL Tm2 ;Coge tiempo giro Prog2
BTFSS PORTB,LED3 ;PROG3 ?
CALL Tm3 ;Coge tiempo giro Prog3
CALL Tiempo
CALL Para
BTFSS PORTA,IZD ;Comprobamos si nos hemos
GOTO Topei ;dado otra ostia.
BTFSS PORTA,DRC
GOTO Toped
GOTO Inicio ;Continua marcha alante.
Toped CALL Ostia ;Retrocede un poco.
MOVLW b'01101111' ;Giro a Izda.
GOTO Toptop ;Ahorramos un poco de código.
Tm1 MOVLW 0x02 ;Tiempo giro PROG1 = 0x15..0x30
ADDWF PRG1,f ;Sumamos 2 al tiempo de giro anterior
MOVF PRG1,w
SUBLW 0x30 ;30 - W = W, si negativo C=0, reiniciar a 15.
BTFSS STATUS,C
GOTO PP1 ;Pone tiempo inicial.
MOVF PRG1,w ;Cogemos el tiempo.
RETURN
Tm2 MOVLW 0x02 ;Tiempo giro PROG2 = 0x30..0x45
ADDWF PRG2,f ;Sumamos 2 al tiempo de giro anterior
MOVF PRG2,w
SUBLW 0x45 ;45 - W = W, si negativo C=0, reiniciar a 30.
BTFSS STATUS,C
GOTO PP2 ;Pone tiempo inicial.
MOVF PRG2,w ;Cogemos el tiempo.
RETURN
Tm3 MOVLW 0x02 ;Tiempo giro PROG3 = 0x45..0x60
ADDWF PRG3,f ;Sumamos 2 al tiempo de giro anterior
MOVF PRG3,w
SUBLW 0x60 ;60 - W = W, si negativo C=0, reiniciar a 45.
BTFSS STATUS,C
GOTO PP3 ;Pone tiempo inicial.
MOVF PRG3,w ;Cogemos el tiempo.
RETURN
Ostia CALL Para
MOVLW b'10101111' ;Rb4 y Rb6 = 0, ir patrás.
ANDWF PORTB,F ;Marcha Atras.
BTFSS PORTB,LED1 ;PROG1 ?
MOVF PRG1,w ;Tiempo PRG1 para retroceso.
BTFSS PORTB,LED2 ;PROG2 ?
MOVF PRG2,w ;Tiempo PRG2 para retroceso.
BTFSS PORTB,LED3 ;PROG3 ?
MOVF PRG3,w ;Tiempo PRG3 para retroceso.
MOVWF TMP3
ADDWF TMP3,w ;Doblamos retroceso,no permitida parada.
BSF STATUS,C ;Impedir parada en esta temporización.
CALL Tiempo ;Temp y termina retornando tras
;hacer la siguiente rutina Para.
Para MOVLW b'11110000' ;Rb4-Rb7 = 1, parar motores.
IORWF PORTB,F ;Para Motores.
CALL Pausa
RETURN
PP1 MOVF PRG1,w ;Mas tiempo de giro.
CALL Tiempo
Prog1 MOVLW b'00001111'
IORWF PORTB,F
MOVLW b'11111101' ;Enciende LED1
ANDWF PORTB,F
CALL Pausa
MOVLW b'00001111' ;Apaga LEDS.
IORWF PORTB,F
CALL Pausa
MOVLW b'11111101' ;Enciende LED1
ANDWF PORTB,F
MOVLW 0x15 ;Tiempo de giro inicial Prog1 = 0,15 Sg
MOVWF PRG1
RETURN
PP2 MOVF PRG2,w ;Mas tiempo de giro.
CALL Tiempo
Prog2 MOVLW b'00001111'
IORWF PORTB,F
MOVLW b'11111011' ;Enciende LED2
ANDWF PORTB,F
CALL Pausa
MOVLW b'00001111' ;Apaga LEDS.
IORWF PORTB,F
CALL Pausa
MOVLW b'11111011' ;Enciende LED2
ANDWF PORTB,F
MOVLW 0x30 ;Tiempo de giro inicial Prog2 = 0,3 Sg
MOVWF PRG2
RETURN
PP3 MOVF PRG3,w ;TMas tiempo de giro.
CALL Tiempo
Prog3 MOVLW b'00001111'
IORWF PORTB,F
MOVLW b'11110111' ;Enciende LED3
ANDWF PORTB,F
CALL Pausa
MOVLW b'00001111' ;Apaga LEDS.
IORWF PORTB,F
CALL Pausa
MOVLW b'11110111' ;Enciende LED3
ANDWF PORTB,F
MOVLW 0x45 ;Tiempo de giro inicial Prog3 = 0,45 Sg
MOVWF PRG3
RETURN
Pausa BSF STATUS,C ;Impedir parada en esta temporización.
MOVLW 10 ;0,1 Sg.
Tiempo MOVWF TMP3 ;Carga el tiempo
MOVLW CNT
MOVWF TMP1 ;Carga primera,
MOVWF TMP2 ;segunda y
Tmp_Loop BTFSC STATUS,C ;Permitir parada en la temporización?
GOTO Bien ;No permitido, saltar a Bien.
BTFSC PORTA,IZD ;Comprobamos si nos damos la ostia
GOTO Topedrc ;en el giro temporizado para
MOVLW b'11110000' ;detener los motores.
IORWF PORTB,F
RETURN ;Terminamos
Topedrc BTFSC PORTA,DRC
GOTO Bien ;No hay ostia en la temporización.
MOVLW b'11110000' ;detener los motores.
IORWF PORTB,F
RETURN ;Terminamos
Bien DECF TMP1,F
BTFSS STATUS,Z
GOTO Tmp_Loop
MOVLW CNT
MOVWF TMP1
DECF TMP2,F
BTFSS STATUS,Z
GOTO Tmp_Loop
MOVLW CNT
MOVWF TMP2
DECF TMP3,F
BTFSS STATUS,Z
GOTO Tmp_Loop
BCF STATUS,C
RETURN
;-----------------------------------------------------------------------
; Read a byte from the PIC EEPROM
; The address is read from W and the read value is returned in W
Rd_eeprom MOVWF EEADR ; Load address
BSF STATUS,RP0 ; Select page 1 (80H - FFH)
BSF EECON1,0x00
BCF STATUS,RP0 ; Select page 0 (00H - 7FH)
MOVF EEDATA,W ; Return value
RETURN
;=======================================================================
; Signature
;=======================================================================
ORG 0x03F8
DATA 0x00,'R','e','d','s','t','a','r'
;=======================================================================
; Identifier
;=======================================================================
__idlocs 0x0010 ; Version 1.0
;=======================================================================
; Fuses
;=======================================================================
; Bit 13 Bit 12 Bit 11 Bit 10 Bit 9 Bit 8 Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
; CP CP CP CP CP CP CP CP CP CP PWRTE WDTE FOSC1 FOSC0
; __config 0x0009 ; 00 0000 0000 1001 code protect
__config 0x3FF9 ; 11 1111 1111 1001 no code protect
;=======================================================================
; Internal EEPROM
;=======================================================================
ORG 0x2100
DATA 0x20
DATA 0x20
DATA 0x28
DATA 0x43
DATA 0x29
DATA 0x20
DATA 0x20
DATA 0x20
DATA 0x20
DATA 0x4D
DATA 0x4F
DATA 0x52
DATA 0x45
DATA 0x52
DATA 0x41
DATA 0x20
DATA 0x20
DATA 0x20
DATA 0x32
DATA 0x30
DATA 0x30
DATA 0x34
DATA 0x20
DATA 0x20
DATA 0x21
DATA 0x21
DATA 0x20
DATA 0x51
DATA 0x75
DATA 0x65
DATA 0x20
DATA 0x64
DATA 0x69
DATA 0x76
DATA 0x65
DATA 0x72
DATA 0x74
DATA 0x69
DATA 0x64
DATA 0x6F
DATA 0x20
DATA 0x65
DATA 0x73
DATA 0x20
DATA 0x65
DATA 0x73
DATA 0x74
DATA 0x6F
DATA 0x20
DATA 0x64
DATA 0x65
DATA 0x6C
DATA 0x20
DATA 0x72
DATA 0x6F
DATA 0x62
DATA 0x6F
DATA 0x6D
DATA 0x61
DATA 0x78
DATA 0x78
DATA 0x21
DATA 0x21
DATA 0x20
;-----------------------------------------------------------------------
END
Lesezeichen