Haz una pregunta
  Foros de Electrónica » Diseño digital » Interfaces y Programación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

13/10/2014 #1


Programa con error en MOVLW
aquí esta el código asm


Código:
_ ;CONFIG _ CP_ OFF & _ W DT_ OFF & _ BODEN_ ON & _ PW RTE_ ON &_ HS_ OSC & _ DATA_ CP_ OFF & _ LVP_ OFF & _ MCLRE_ ON

llave 		        EQU        	0x20 ;Registros de propósito general.  
llave2      	        EQU     	0x21
POSSIG_DER		EQU	 	0x22
POSSIG_IZQ		EQU		0x23
POSSIG_DER2		EQU		0x24
POSSIG_IZQ2		EQU		0x25
llave3      	        EQU     	0x26
POSSIG_DER3		EQU		0x27
POSSIG_IZQ3		EQU		0x28
CONTADOR                EQU             0x29

; Asignacion de pines de entrada con las señales del LPT
STEP		SET 	0x00
DIR		SET 	0x04
STEP2		SET 	0x03
DIR2		SET 	0x02
STEP3		SET 	0x01
DIR3		SET 	0x00

;Asignacion de pines de salida con los motores
M1A		SET 	0x01
M1B		SET 	0x02
M2A		SET 	0x03
M2B		SET 	0x04
M3A		SET 	0x05
M3B		SET 	0x06

ENABLE          SET 	0x07
	
	org	0x00		; Aquí comienza el micro
	goto	INICIO		; Salto a inicio de mi programa
 ;**** Vector de Interrupcion ****
	org	0x04		; Atiendo Interrupcion
	goto	ISR
; **** Programa Principal ****
	org	0x05		; Origen del código de programa

;**********************************************************************************************  
;PROGRAMA PRINCIPAL.  

INICIO:         	
  bsf 		STATUS, RP0     ; Pasamos de Banco 0 a Banco 1
  movlw		b\'11111111\' 	;PORTA como Entrada
  movwf   	TRISA   
  movlw		b\'00000001\' 	;Se configura PORTB (B1-B7) como SALIDA; B0 entrada 
  movwf   	TRISB      	
  bcf     	STATUS, RP0     ;De regreso al banco 0
  movlw         0x07              ;Se configura los comparadores como salidas
  movwf         cmcon		
  movlw  	b\'00110001\'	; Se selecciona TMR1, preescaler de 1/8, modo temporizador
  movwf	        T1CON
  movlw	        0x00		; Cargamos 0 en TMR1 para lograr 87.38 ms con frec.osc=24MHz
  movwf	        TMR1H		; Byte alto de TMR1
  movlw	        0x00
  movwf	        TMR1L		; Byte bajo de TMR1
  bsf	        STATUS,RP0	; Banco 1
  bsf	        PIE1,TMR1IE 	; Activar interrupción por TMR1
  bsf	        INTCON,GIE	; Habilitacion general de interrupciones
  bsf	        INTCON,PEIE	; Habilitacion de Interrupcion por perifericos
  bcf	        STATUS,RP0	; Banco 0

  clrf    	PORTB   		;Pongo en cero el puerto B
  bsf		PORTB, ENABLE           ; Se activan los motores
  clrf		POSSIG_DER	        ;Iniciamos las variables en 0
  clrf		POSSIG_IZQ 
  clrf		POSSIG_DER2	
  clrf		POSSIG_IZQ2
  clrf		POSSIG_DER3	
  clrf		POSSIG_IZQ3	
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
  
BUCLE:           	
 ; btfss		PORTB, ENABLE     ;Testea el enable
 ; call   	DESACTIVAR 
	

; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
  btfss         PORTB, STEP       ; si Step esta en 0 ejecuta la siguiente linea si no se omite
  bsf           llave, 0          ; pone en alto el primer bit de llave

  btfss         PORTB, STEP       ;Se mira el estado de STEP, y si esta en 0 brinco a motor 2 para a revisart el pulso de step2 
				  ;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave en 1
  goto          motor2
  btfss         llave, 0
  goto          motor2
  btfss     	PORTA, DIR         ;este paso indica que el pulso anterio a terminado y ha llegado un pulso nuevo, aqui reviso la direccion seleccionada
  goto      	 DERECHA         ;paso a la izquierda 
  goto      	IZQUIERDA		   ;paso a la derecha 
        
motor2:
; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
  btfss         PORTA, STEP2       ; si Step2 esta en 0 ejecuta la siguiente linea si no se omite
  bsf           llave2, 0          ; pone en alto el primer bit de llave


  btfss         PORTA, STEP2       ;Se mira el estado de STEP2, y si esta en 0 brinco a motor 3 para a revisart el pulso de step3 
				  ;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave2 en 1
  goto          motor3
  btfss         llave2, 0
  goto          motor3
  btfss     	PORTA, DIR2
  goto      	DERECHA2          ;paso a la izquierda 
  goto      	IZQUIERDA2		   ;paso a la derecha         
      
motor3:  
; lo siguiente es para asegurar que se a puesto en bajo el pin y evitar multiples pasos con un solo pulso
  btfss         PORTA, STEP3       ; si Step3 esta en 0 ejecuta la siguiente linea si no se omite
  bsf           llave3, 0          ; pone en alto el primer bit de llave


  btfss         PORTA, STEP3       ;Se mira el estado de STEP2, y si esta en 0 prosigo a revisart el pulso de step
				  ;si esta en 1 se comprueba que el pulso anterior a terminado con el valor de la variable llave2 en 1
  goto          BUCLE
  btfss         llave3, 0
  goto          BUCLE
  btfss     	PORTA, DIR3
  goto      	DERECHA3          ;paso a la izquierda 
  goto      	IZQUIERDA3		   ;paso a la derecha 
					
;**********************************************************************************************  
;DESACTIVAR:      	
;  bcf		PORTB, 0x06       ;desactivo el LB1845 poniendoo en 1 RB6
;BUCLE_2:			
;  btfss		PORTB, ENABLE    	;permanece en esta sobrutina 
;  goto 		BUCLE_2		;mientras el enable este en 0
;  bsf		PORTB, 0x06
;  RETURN
;********************************************************************************************** 
; en las sig tablas deduzco el paso siguiente a realizar
; segun los contadores de paso POSSIG_IZQ y POSSIG_IZQ

IZQUIERDA: 
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
  bcf           llave, 0   		
  movf		POSSIG_IZQ, W
  addwf		PCL, F
  goto 		PASO1    	;POS 0
  goto 		PASO2    	;POS 1
  goto 		PASO3    	;POS 2
  goto 		PASO4   	;POS 3
DERECHA:   
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step) 		
  bcf           llave, 0
  movf		POSSIG_DER, W
  addwf		PCL, F
  goto 		PASO1		;POS 0
  goto 		PASO2		;POS 1
  goto 		PASO3		;POS 2
  goto 		PASO4		;POS 3

IZQUIERDA2: 
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56            ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
  bcf           llave2, 0   		
  movf		POSSIG_IZQ2, W
  addwf		PCL, F
  goto 		PASO1b    	;POS 0
  goto 		PASO2b    	;POS 1
  goto 		PASO3b    	;POS 2
  goto 		PASO4b  	;POS 3
DERECHA2:   
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step) 		
  bcf           llave2, 0
  movf		POSSIG_DER2, W
  addwf		PCL, F
  goto 		PASO1b		;POS 0
  goto 		PASO2b		;POS 1
  goto 		PASO3b		;POS 2
  goto 		PASO4b		;POS 3

IZQUIERDA3: 
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step)
  bcf           llave3, 0   		
  movf		POSSIG_IZQ3, W
  addwf		PCL, F
  goto 		PASO1c    	;POS 0
  goto 		PASO2c    	;POS 1
  goto 		PASO3c    	;POS 2
  goto 		PASO4c   	;POS 3
DERECHA3:   
  bsf	        PORTB, ENABLE     ; Se habilitan motores
  movlw		0x56             ;Se carga la variable que servira como contador de desbordamiento de timer1 
  movwf		CONTADOR         ;Con 0x56 (86) unidades se logra un tiempo de  7.51 s (se apagan motores, si en este tiempo no llega una senal de step) 		
  bcf           llave3, 0
  movf		POSSIG_DER3, W
  addwf		PCL, F
  goto 		PASO1c		;POS 0
  goto 		PASO2c		;POS 1
  goto 		PASO3c		;POS 2
  goto 		PASO4c		;POS 3
;*********************************************************************************************************
 
PASO1:				
  bsf		PORTB, M1A         ;realiso el paso 1 (b\'11\')
  bsf		PORTB, M1B
  movlw		0x03            
  movwf		POSSIG_IZQ               	
  movlw		0x01            
  movwf		POSSIG_DER
  goto    	motor2

PASO2:			
  bsf           PORTB, M1A         ;realiso el paso 2 (b\'01\')
  bcf           PORTB, M1B
  movlw		0x00            
  movwf		POSSIG_IZQ 
  movlw		0x02               
  movwf		POSSIG_DER
  goto    	motor2

PASO3:	
  bcf           PORTB, M1A             ;realiso el paso 3 (b\'00\')
  bcf           PORTB, M1B
  movlw		0x01            
  movwf		POSSIG_IZQ 
  movlw		0x03
  movwf		POSSIG_DER
  goto    	motor2

PASO4:				
  bcf           PORTB, M1A             ;realiso el paso 4 (b\'10\')
  bsf           PORTB, M1B
  movlw		0x02            
  movwf		POSSIG_IZQ 
  movlw		0x00
  movwf		POSSIG_DER
  goto    	motor2

PASO1b:				
  bsf		PORTB, M2A         ;realiso el paso 1 (b\'11\')
  bsf		PORTB, M2B
  movlw		0x03            
  movwf		POSSIG_IZQ2               	
  movlw		0x01            
  movwf		POSSIG_DER2
  goto    	motor3 

PASO2b:			
  bsf           PORTB, M2A         ;realiso el paso 2 (b\'01\')
  bcf           PORTB, M2B 
  movlw		0x00            
  movwf		POSSIG_IZQ2 
  movlw		0x02               
  movwf		POSSIG_DER2
  goto    	motor3 

PASO3b:	
  bcf           PORTB, M2A             ;realiso el paso 3 (b\'00\')
  bcf           PORTB, M2B
  movlw		0x01            
  movwf		POSSIG_IZQ2 
  movlw		0x03
  movwf		POSSIG_DER2
  goto    	motor3

PASO4b:				
  bcf           PORTB, M2A             ;realiso el paso 4 (b\'10\')
  bsf           PORTB, M2B
  movlw		0x02            
  movwf		POSSIG_IZQ2 
  movlw		0x00
  movwf		POSSIG_DER2
  goto    	motor3 

PASO1c:				
  bsf		PORTB, M3A         ;realiso el paso 1 (b\'11\')
  bsf		PORTB, M3B
  movlw		0x03            
  movwf		POSSIG_IZQ3               	
  movlw		0x01            
  movwf		POSSIG_DER3
  goto    	BUCLE  

PASO2c:			
  bsf           PORTB, M3A         ;realiso el paso 2 (b\'01\')
  bcf           PORTB, M3B 
  movlw		0x00            
  movwf		POSSIG_IZQ3 
  movlw		0x02               
  movwf		POSSIG_DER3
  goto    	BUCLE 

PASO3c:	
  bcf           PORTB, M3A             ;realiso el paso 3 (b\'00\')
  bcf           PORTB, M3B
  movlw		0x01            
  movwf		POSSIG_IZQ3 
  movlw		0x03
  movwf		POSSIG_DER3
  goto    	BUCLE 

PASO4c:				
  bcf           PORTB, M3A            ;realiso el paso 4 (b\'10\')
  bsf           PORTB, M3B
  movlw		0x02            
  movwf		POSSIG_IZQ3 
  movlw		0x00
  movwf		POSSIG_DER3
  goto    	BUCLE 


;**** Interrupcion por TMR1 ****
ISR
	btfss	PIR1,TMR1IF	; Consultamos si es por TMR1
	retfie			; No lo es,entonces salimos de interrupcion
	decfsz  CONTADOR
        goto    Actualizo_TMR1        
        bcf	PORTB, ENABLE   ; Si el contador llega a 0 se pone en nivel bajo el pin RB7 para desabilitar motores
	
Actualizo_TMR1			; Actualizo TMR1, no es necesario cargarlo con cero pues por defecto lo hace
	; Restauro valores
	bcf	PIR1,TMR1IF	; Borro bandera de control de Interrupcion
	retfie			; Salimos de interrupción
          

	END    

;********************************************************************************************************* ...
13/10/2014 #2

Avatar de aguevara

debe ser por la diagonal \
13/10/2014 #3


me marca solo en esa parte y al final el end igual me marca error

---------- Actualizado después de 4 minutos ----------

de echo como se ve en la captura no tiene esas diagonales
Imágenes Adjuntas
Tipo de Archivo: jpg asm.jpg (94,0 KB (Kilobytes), 12 visitas)
13/10/2014 #4

Avatar de JoaquinFerrero

¿En qué línea marca el error? ¿Qué error sale? Se aprecia un poco en la imagen, ¿Para que µcontrolador es?

Por favor, reedita tu mensaje y corrige los errores (la primera línea del CONFIG, las barras diagonales inversas, mete todo el código dentro de marcas CODE o PHP...)

A mi el error que me da es que el símbolo cmcon no está definido. NI siquiera tiene un include con las definiciones de los símbolos del µcontrolador.
13/10/2014 #5


de echo maraca error de sintaxis y el include es para el 16f84
13/10/2014 #6

Avatar de JoaquinFerrero

Pues con esos cambios, me sigue dando error donde aparece cmcon.
13/10/2014 #7
Moderador

Avatar de D@rkbytes

khn945 dijo: Ver Mensaje
De hecho marca error de sintaxis y el include es para el 16f84
Lo que pasa es que el código que estás usando no te sirve para un PIC16F84

El PIC16F84 no tiene los registros que se están usando en ese programa.

CMCON
T1CON
TMR1H
TMR1L
PIE1
TMR1IE
PEIE
PIR1
TMR1IF

Ese programa debe ser seguramente para un PIC16F628/A

Nota:
cmcon debe ir con mayúsculas si no ha sido definido de esa forma.
14/10/2014 #8


tienes razon muchas gracias es para el 16f628
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Interfaces y Programación

Lenguajes de programación, gestión y manejo de puertos

Cerrar
Foros de Electrónica » Diseño digital » Interfaces y Programación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.