Mira lo que sé es lo básico, en cuanto a los PIC los estoy conociendo hace muy poco y me estoy embarcando con un compañero de trabajo en hacer el proyecto mostrado y empesamos con el PIC 16f628.
Lo que no tenemos idea es en programar, y ese es mi proyecto propuesto para que me enseñen por favor, además si me ayudas o recomiendas un software para programar te lo agradeceria mucho.
Bueno tambien te cuento que somos técnicos superiores en electrónica y que tenemos el grabador de pic y el IC-Prog funcionando OK. :-)
por favor si tu puedes ayudarnos a introducirnos en este fantástico mundo de la electrónica te estaremos muy agradesidos.
Podemos empezar con lo básico. :-/ que me recomiendas??????? :-/
Gracias
Gracias amigos por preocuparse.
Estoy intentando con sus ejemplos si tienes mas pues bien recibidos seran.
:-/ chaito :-/
Si lo que quieres es practicar en asm, en el subforo de ASM encontrarás varios post donde hay programas de ejemplo:
Ejemplos de Asembler PIC16F628A - PIC16F648A (http://www.todopic.com.ar/foros/index.php?topic=12659.0)
Ejemplos en Assembler - PIC16F876 (http://www.todopic.com.ar/foros/index.php?topic=12918.0)
Ejemplos en Asembler PIC16F84A (http://www.todopic.com.ar/foros/index.php?topic=12345.0)
Suerte!!! :wink:
;----------------------------------------------------------------------------
; fecha: 26-11-2006
; Esto solo es una prueba para empezar con el f628
LIST P=16F628 ; usar PIC 16F628A
#include <p16f628.inc>
__CONFIG h'3F50'
errorlevel -302 ; Eliminar banco atencion
;---- Declarar equs
status equ h'0003'
option_reg equ h'0001'
trisa equ h'0005' ;
trisb equ h'0006' ;
porta equ h'0005' ; define puerto A
portb equ h'0006' ; define puerto B
#define banco0 BCF,RP0 ;
#define banco1 BSF,RP1 ;
ORG 0x00
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
banco1 ; activa la pagina 1
MOVLW 0x00 ;
MOVWF 0x06 ; puerto a y b todos salidaS
banco0 ; volvemos a la pagina 0
; MOVLW b'00000111' ; comparadores desactivados,
; MOVWF CMCON ; I/O digitales.
CLRF portb ; ponemos a 0 portb
INI BSF portb,0 ; pone a 1 RB0
MOVLW 0xF
MOVWF portb
GOTO INI
end
#define banco0 BCF,RP0 ;
#define banco1 BSF,RP1 ;
;******************************************************************
; Que hace => Debe hacer una pausa o retardo segun volores metidos
; en los registros 1A y 1B. Para un retardo de 2 milisegundos,
; cargar el valor 00 02 en 1A y 1B via W.
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
List P=PIC16F628
#include <p16f628.inc> ;inclusion de fichero de etiquetas
__CONFIG h'3F50'
errorlevel -302 ; Eliminar banco atencion
#define banco0 BCF STATUS,5
#define banco1 BSF STATUS,5
ORG 0x00 ; Empezamos a escribir el programa
banco1
BSF TRISA,0 ; RA0 como entrada
BCF TRISA,1 ; RA1 como salida que es la inversa de RA0
BSF TRISA,2 ; RA2 como entrada para pulsador.
banco0
; Empieza rutina retardo a peticion usuario.
; Poner valor alto en registro 1Ah y el bajo en 1Bh
Pausa MOVLW h'03' ;3d = 00000011b =03h
MOVWF 2Ah
MOVLW h'03' ;3d = 00000011b =03h
MOVWF 2Bh
CALL Pausa_mS ;de 33 mS
Pausa_mS
MOVF 2B,0 ;Move 1B to W
MOVWF 29h ;Move W to 19h
Lazo1 MOVLW h'F8' ;Put 248 cycles in W
MOVWF 2C ;Put 248 into 1C
Lazo2 MOVLW h'0B' ;Put 11 cycles in W
MOVWF 2D ;Put 11 into 1D
Lazo3 DECFSZ 2D,1
GOTO Lazo3
DECFSZ 2C,1
GOTO Lazo2
DECFSZ 29h,1
GOTO Lazo1
INCF 2A,1
DECFSZ 2A,1
GOTO Lazo4
RETURN ;Return a Pausa
Lazo4 MOVLW 64h ;Put 100 loops into W
MOVWF 2B ;Load 1B with 100
Lazo5 MOVLW h'F8' ;Put 248 cycles in W
MOVWF 2C ;Put 248 into 1C
Lazo6 MOVLW 0B ;Put 11 cycles in W
MOVWF 2D ;Put 11 into 1D
Lazo7 DECFSZ 2D,1
GOTO Lazo7
DECFSZ 2C,1
GOTO Lazo6
DECFSZ 2B,1
GOTO Lazo5
DECFSZ 2A,1
GOTO Lazo4
RETURN ;Return a Pausa
END
En cuanto a los define, siento disentir contigo Bruno, en el MPLAB se pueden utilizar definiciones como tú has hecho, pero las has declarado mal ya que no dices el registro y ante la ausencia de este, el MPLAB escoge el solo el registro cero, por lo que deberían ser así:
#define banco0 bsf STATUS,RP0
#define banco1 bcf STATUS,RP0
O como dice Bruno, declarar unas macros.
En cuanto al resto del código, totalmente de acuerdo con lo dicho por los compañeros.
En cuanto a BrunoF, se nota que usa leguages de alto nivel, por lo de las macros, es bueno, intentaré aprender
de los ejemplo, graciasa todos.
__CONFIG h'3F50'
reg1 EQU 2CH ;variables que usaremos pongo
reg2 EQU 2DH ; desde 2C porque en 1C no lo admite
; supongo que es porque esta usada.
BCF STATUS,RP1 ;selecciona banco1
BSF STATUS,RP0 ;selecciona banco 0
MOVLW 0X1F ;valor usado para inicializar
;direccion de datos
MOVWF TRISA ;Pone RA<4:0> como entradas
;TRISA<5> siempre leera como 1
;TRISA<7:6> depende del modo de oscilador
;------- Empieza programa -----
INICIO
BSF PORTB,0 ; pone a 1 RB0
CALL pausa ;
BCF PORTB,0 ; pone a 0 RB0
CALL pausa ;
GOTO INICIO ; va a inicio
; ESTA ES LA CABECERA PARA EL F628A
;
;******************************************************************
; Titulo: 2leds.asm
; Autor: toc-toc
; Fecha: 07-12-06
; Que hace => Enciende un LED en RB0 y otro en RB1
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
LIST P=16F628, ; usar PIC 16F648A
include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
; las tres configuraciones son equivalentes
; Code protection OFF
; Data code protection OFF
; Low voltage programming, RB4 I/O OFF
; Brown-out reset ON
; MCLR desctivado, RA5 I/O OFF
; Watchdog timer OFF
; Power-up timer ON
; OSC es Int 4MHz,RA6 y RA7 son I/O
errorlevel -302 ; Eliminate bank warning
reg1 equ 0x20 ; siempre se necesitan un par
reg2 equ 0x21 ; de registros auxiliares
;*********************************************************************************
ORG 0x00
BSF STATUS,5 ; activa la pagina 1
CLRF TRISA
CLRF TRISB ; puerto a y b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
CLRF PORTB ; ponemos a 0 portb
INICIO
MOVLW .170 ; b10101010
MOVWF PORTB
RRF PORTB,1 ;
CALL pausa
GOTO $-2 ; va a inicio
pausa MOVLW 0xF
MOVWF 2Ah
MOVWF 2Ch
pausa1 DECFSZ 2Ah,1 ; Retardo
GOTO pausa1
DECFSZ 2Ch,1
GOTO pausa1
RETURN
END
He pensado en usar parte del programa para que haga algo mas que girar en ambas
direcciones. Me gustaría que me orientaras para conseguir que gire un determinado
número de pasos y cómo lograr que sea controlado ese número de pasos, no se si me
explico.
; Fecha: 25-01-07
; Que hace => Controlar giro en motor pap, tiene 2 bobinados con toma
; intermedia en ambos. Usamos el derivador ULN2803. Las salias
; se hacen por RA0, RA1, RA2 y RA3. Usa interrupciones RB4...
;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Las tildes estan omitidas de manera intencionada.
;--------------- Encabezado -------------
LIST P=16F628
#include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
;
ERRORLEVEL -302 ; Elimina banco atencion (warning)
; Declarar equs
acum equ 0x20 ; se declaran acum
stat equ 0x21 ; y stat
reg1 equ 0x22 ; siempre se necesitan unos
reg2 equ 0x23 ; de registros auxiliares
; " "
PULSO equ 0X2A ;
#DEFINE BANCO0 BCF STATUS,5 ; RP0 = 0
#DEFINE BANCO1 BSF STATUS,5 ; RP0 = 1
;*********************************************************************************
ORG 0x00
GOTO ini
ORG 0x04 ;viene cuando hay una interrupcion
GOTO rsi ;salta a la rutina de rsi que atiende la interrupcion
ORG 0X05
ini:
BANCO1 ; selecciona banco1
CLRF TRISA ; PORTA todo SALIDAS
MOVLW b'00100111' ; RB0,1,2,5=ENTRADAS RB7=SALIDA
MOVWF TRISB ; pon PORTB
MOVLW b'10000000' ; RBPU=1 (Pull up) no se usa, flanco desc.
MOVWF OPTION_REG ; pon a 1 OPTION_REG
BANCO0 ; volvemos a la pagina 0
; Establece estado comparadores
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
CLRF PORTB ; ponemos a 0 portb
;---- Activa interrupciones ----
MOVLW b'10010000' ;configura las interrupciones
MOVWF INTCON ;GIE y RB0/INT.
CLRF PORTB ; limpia el puerto B
dormir: SLEEP
GOTO dormir ; poner a dormir
;
;---- rutina servicio interrupciones
rsi: BTFSS INTCON,1 ; es interrupcion RB0?
GOTO $-1 ; Si no, espera
; si lo es comenzamos
; guardando el contenido del W
MOVWF acum ; Copia el acumulador al registro acum
MOVF STATUS,W ; Guarda STATUS en el acumulador
CLRF STATUS ; para restaurarlos antes de volver
MOVWF stat ; Copia el acumulador al registro STAT
; Empieza activacion de rutina de uso
; Fecha: 25-01-07
; Que hace => Controlar giro en motor pap, tiene 2 bobinados con toma
; intermedia en ambos. Usamos el derivador ULN2803. Las salias
; se hacen por RA0, RA1, RA2 y RA3. Usa interrupciones RB4...
;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
; Las tildes estan omitidas de manera intencionada.
;--------------- Encabezado -------------
LIST P=16F628
#include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
;
ERRORLEVEL -302 ; Elimina banco atencion (warning)
; Declarar equs
acum equ 0x20 ; se declaran acum
stat equ 0x21 ; y stat
reg1 equ 0x22 ; siempre se necesitan unos
reg2 equ 0x23 ; de registros auxiliares
; " "
PULSO equ 0X2A ;
#DEFINE BANCO0 BCF STATUS,5 ; RP0 = 0
#DEFINE BANCO1 BSF STATUS,5 ; RP0 = 1
;*********************************************************************************
ORG 0x00
GOTO ini
ORG 0x04 ;viene cuando hay una interrupcion
GOTO rsi ;salta a la rutina de rsi que atiende la interrupcion
ORG 0X05
ini:
BANCO1 ; selecciona banco1
CLRF TRISA ; PORTA todo SALIDAS
MOVLW b'00100111' ; RB0,1,2,5=ENTRADAS RB7=SALIDA
MOVWF TRISB ; pon PORTB
MOVLW b'10000000' ; RBPU=1 (Pull up) no se usa, flanco desc.
MOVWF OPTION_REG ; pon a 1 OPTION_REG
BANCO0 ; volvemos a la pagina 0
; Establece estado comparadores
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
CLRF PORTB ; ponemos a 0 portb
;--------------- Encabezado -------------
LIST P=16F628
#include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
ERRORLEVEL -302 ; Elimina banco atencion (warning)
; Declarar equs
acum equ 0x20 ; se declaran acum
stat equ 0x21 ; y stat para interrpciones
reg1 equ 0x22 ; siempre se necesitan unos
reg2 equ 0x23 ; de registros auxiliares
CONTA1 equ 0x24 ; contador de pasos
PULSO equ 0X2A ;
#DEFINE BANCO0 BCF STATUS,5 ; RP0 = 0
#DEFINE BANCO1 BSF STATUS,5 ; RP0 = 1
;*********************************************************************************
ORG 0x00
GOTO ini
; ORG 0x04 ;viene cuando hay una interrupcion
; GOTO rsi ;salta a la rutina de rsi que atiende la interrupcion
ORG 0X05
ini:
BANCO1 ; selecciona banco1
CLRF TRISA ; PORTA todo SALIDAS
MOVLW b'00100111' ; RB0,1,2,5=ENTRADAS RB7=SALIDA
MOVWF TRISB ; pon PORTB
MOVLW b'10000000' ; RBPU=1 (Pull up) no se usa, flanco desc.
MOVWF OPTION_REG ; pon a 1 OPTION_REG
BANCO0 ; volvemos a la pagina 0
; Establecer estado comparadores
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
CLRF PORTB ; ponemos a 0 portb
MOVLW .8 ; cargamos el contador
MOVWF CONTA1 ;
START:
CALL scaner ;verifico pulsos de entrada
MOVWF PORTB
GOTO START
; Escanea las entradas o pulsadores hasta que se aprieta uno
scaner: BTFSC PORTA,0 ; si el bit 0 del puertoA esta en nivel bajo
GOTO GIRAD ; gira a der.
BTFSC PORTA,1 ; aqui pueden ir otros pulsadores
GOTO GIRAI ; gira a izquierda
GOTO scaner ;repite secuencia
; ------------------ motor ------------
GIRAD: DECFSZ CONTA1,1 ; Comprueba estado contador
GOTO avanzad
MOVLW .8 ;
MOVWF CONTA1
avanzad: MOVF CONTA1,0 ;
CALL TABLA1 ; tabla de medio paso
RETURN
GIRAI: DECFSZ CONTA1,1 ; Comprueba estado contador
GOTO avanzai
MOVLW .8 ;
MOVWF CONTA1
avanzai: MOVF CONTA1,0 ;
CALL TABLA1 ; tabla de medio paso
RETURN
;------------------------ TABLA DE ENCENDIDO SECUENCIA ---------------
; MEDIO PASO AVANZA
; Bobina D C B A
; PuertoB 0 0 0 1
; PuertoB 0 0 1 1
; PuertoB 0 0 1 0
; PuertoB 0 1 1 0
; PuertoB 0 1 0 0
; PuertoB 1 1 0 0
; PuertoB 1 0 0 1
TABLA1: ADDWF PC,1 ;
RETLW B'00000001' ;1
RETLW B'00000011' ;2
RETLW B'00000010' ;3
RETLW B'00000110' ;4
RETLW B'00000100' ;5
RETLW B'00001100' ;6
RETLW B'00001000' ;7
RETLW B'00001001' ;8
;------------------------ TABLA DE ENCENDIDO SECUENCIA ---------------
; MEDIO PASO RETROCEDE
TABLA2: ADDWF PC,1 ;
RETLW B'00001001' ;1
RETLW B'00001000' ;2
RETLW B'00001100' ;3
RETLW B'00000100' ;4
RETLW B'00000110' ;5
RETLW B'00000010' ;6
RETLW B'00000011' ;7
RETLW B'00000001' ;8
ENDSALIDA:
MOVLW PCL
MOVWF PORTB GIRAD:
MOVWF CONTA1 ; movfw CONTA1
sublw 0x00
btfss STATUS,Z
goto $+2
goto $+3
decf CONTA1
goto $+3
movlw .7
movwf CONTA1
MOVF CONTA1,0 ;
goto TABLA1 ; tabla de medio paso
GIRAI:
MOVWF CONTA1 ; movfw CONTA1
sublw 0x08
btfsc STATUS,Z
decf CONTA1
MOVWF CONTA1 ; movfw CONTA1
sublw 0x07
btfss STATUS,Z
goto $+2
goto $+3
incf CONTA1
goto $+3
movlw .0
movwf CONTA1
MOVF CONTA1,0 ;
goto TABLA1 ; tabla de medio paso
Seguro Mauricio. No es la muerte y no creo haberlo planteado tan drásticamente, ¿o si?. :P
Yo solamente me refería a mi opinión respecto al movfw(creí haberlo aclarado bien cuando puse el "YO" en mayúsculas en mi post).
El asm al igual que cualquier otro lenguaje de programacion son precisos y requieren, por lo tanto, de codigo preciso por parte del usuario programador.
Saludos!
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT; Que hace => Enciende un LED en RB0 y otro en RB1
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
LIST P=16F628, ;
include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
; __CONFIG 3F70h
; Code protection OFF
; Data code protection OFF
; Low voltage programming, RB4 I/O OFF
; Brown-out reset ON
; MCLR desctivado, RA5 I/O OFF
; Watchdog timer OFF
; Power-up timer ON
; OSC es Int 4MHz,RA6 y RA7 son I/O
errorlevel -302 ; Eliminate bank warning
reg1 equ 0x20 ; siempre se necesitan un par
reg2 equ 0x21 ; de registros auxiliares
;*********************************************************************************
ORG 0x00
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
BSF STATUS,5 ; activa la pagina 1, banco1
CLRF TRISA
CLRF TRISB ; puerto a y b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0, banco 0
CLRF PORTB ; ponemos a 0 portb
INICIO
MOVLW .170 ; b10101010
MOVWF PORTB
BCF STATUS,C ;Asegura que en la primer rotacion ingrese un 0 en PORTB,7
RRF PORTB,1 ;
CALL pausa
GOTO $-2 ; va a inicio
pausa MOVLW 0xF
MOVWF 2Ah
MOVWF 2Ch
pausa1 DECFSZ 2Ah,1 ; Retardo
GOTO pausa1
DECFSZ 2Ch,1
GOTO pausa1
RETURN
END TABLA1: ADDWF PCL,1 ;
RETLW B'00000001' ;1
RETLW B'00000010' ;2
RETLW B'00000011' ;3
RETLW B'00000100' ;4
RETLW B'00000101' ;5
RETLW B'00000110' ;6
RETLW B'00000111' ;7
RETLW B'00001000' ;8
RETLW B'00001001' ;9
RETLW B'00001010' ;10
RETLW B'00001011' ;11
RETLW B'00001100' ;12
RETLW B'00001101' ;13
RETLW B'00001110' ;14
RETLW B'00001111' ;15 ; Fecha: 03 Mar 2007 18:01:29 GMT
; Que hace => Enciende un LED en RB0 y otro en RB1 con pausas de 1 segundo
; Delay = 1 segundo : Clock frequency = 4 MHz
;
;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
;--------------- Encabezado -------------
LIST P=16F628, ; usar PIC 16F648A
include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
; Code protection OFF
; Data code protection OFF
; Low voltage programming, RB4 I/O OFF
; Brown-out reset ON
; MCLR desctivado, RA5 I/O OFF
; Watchdog timer OFF
; Power-up timer ON
; OSC es Int 4MHz,RA6 y RA7 son I/O
errorlevel -302, 306 ; Eliminate bank warning
d1 equ 0x20 ; siempre se necesitan un par
d2 equ 0x21 ; de registros auxiliares
d3 equ 0x22
; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %
ORG 0x00
;*********************************************************************************
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
BSF STATUS,5 ; activa la pagina 1
CLRF TRISA
CLRF TRISB ; puerto a y b todos salidaS
BCF STATUS,5 ; volvemos a la pagina 0
CLRF PORTB ; ponemos a 0 portb
INICIO:
MOVLW .170 ; b10101010
MOVWF PORTB
CALL pausa
BCF STATUS,C ; Asegura que en la primer rotacion ingrese un 0 en PORTB,7
COMF PORTB,1
CALL pausa
GOTO $-2 ; va a inicio
pausa: MOVLW 0x07 ; Retardo
MOVWF d1 ;2Ah
MOVWF 0x2F
MOVWF d2
MOVWF 0x03
MOVWF d3
pausa1:
DECFSZ d1,1 ; Lazo interior
GOTO pausa1
DECFSZ d2,1
GOTO pausa1
DECFSZ d3,1
GOTO pausa1
RETURN
END
;--------------- Encabezado -------------
TITLE "pap01.asm" ; MPLAB solo admite nombres de 9 letras
SUBTITLE "Revision Nº 2"
LIST P=16F628
#include <p16f628.inc>
;************ PALABRA DE CONFIGURACION ******************************************
__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _LVP_OFF & _INTRC_OSC_NOCLKOUT
ERRORLEVEL -302 ; Elimina banco atencion (warning)
; Declarar equs
acum equ 0x20 ; se declaran acum
stat equ 0x21 ; y stat para interrpciones
reg1 equ 0x22 ; siempre se necesitan unos
reg2 equ 0x23 ; de registros auxiliares
CONTA1 equ 0x24 ; contador de pasos
PULSO equ 0X2A ;
D0 equ 0x25 ; siempre se necesitan un par
D1 equ 0x26 ; de registros auxiliares
d2 equ 0x27
d3 equ 0x28
#DEFINE BANCO0 BCF STATUS,5 ; RP0 = 0
#DEFINE BANCO1 BSF STATUS,5 ; RP0 = 1
;*********************************************************************************
ORG 0x00
GOTO ini
; ORG 0x04 ;viene cuando hay una interrupcion
; GOTO rsi ;salta a la rutina de rsi que atiende la interrupcion
ORG 0X05
ini:
BANCO1 ; selecciona banco1
MOVLW b'00001111'
MOVWF TRISA ; PORTA todo SALIDAS
MOVLW b'11110000' ; RB0,1,2,5=ENTRADAS RB7=SALIDA
MOVWF TRISB ; pon PORTB
MOVLW b'10000000' ; RBPU=1 (Pull up) no se usa, flanco desc.
MOVWF OPTION_REG ; pon a 1 OPTION_REG
BANCO0 ; volvemos a la pagina 0
; Establecer estado comparadores
MOVLW b'00000111' ; comparadores desactivados,
MOVWF CMCON ; I/O digitales.
CLRF PORTB ; ponemos a 0 portb
MOVLW .8 ; cargamos el contador
MOVWF CONTA1 ;
START:
CALL scaner ;verifico pulsos de entrada
MOVWF PORTB ;AQUI SE ENTREGA EL VALOR DE LA TABLA AL PUERTO B
; [Llamada a retardo para consolidar las salidas]
CALL pausa
GOTO START
; Escanea las entradas o pulsadores hasta que se aprieta uno
scaner: BTFSC PORTA,0 ; si el bit 0 del puertoA esta en nivel bajo
GOTO GIRAD ; gira a der.
BTFSC PORTA,1 ; aqui pueden ir otros pulsadores
GOTO GIRAI ; gira a izquierda
GOTO scaner ;repite secuencia
; ------------------ motor ------------
GIRAD:
movf CONTA1,W
sublw 0x00
btfss STATUS,Z
goto $+2
goto $+3
decf CONTA1,1
goto $+3
movlw .7
movwf CONTA1
MOVF CONTA1,0 ;
goto TABLA1 ; tabla de medio paso
GIRAI:
movf CONTA1,W
sublw 0x08
btfsc STATUS,Z
decf CONTA1,1
movf CONTA1,W
sublw 0x07
btfss STATUS,Z
goto $+2
goto $+3
incf CONTA1,1
goto $+3
movlw .0
movwf CONTA1
MOVF CONTA1,0 ;
goto TABLA1 ; tabla de medio paso
TABLA1: ADDWF PCL,1 ;
RETLW B'00000001' ;1
RETLW B'00000011' ;2
RETLW B'00000010' ;3
RETLW B'00000110' ;4
RETLW B'00000100' ;5
RETLW B'00001100' ;6
RETLW B'00001000' ;7
RETLW B'00001001' ;8
; una pausa para que se estabilice el dato
pausa: movlw .11 ; 1 set numero de repeticion (B)
movwf D0 ; 1 |
Loop1: movlw .110 ; 1 set numero de repeticion (A)
movwf D1 ; 1 |
Loop2: clrwdt ; 1 clear watchdog
clrwdt ; 1 ciclo delay
decfsz D1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto Loop2 ; 2 no, loop
decfsz D0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto Loop1 ; 2 no, loop
L1: goto L2 ; 2 ciclos delay
L2: clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
END