Realizar efecto ping-pong con 18F4550 (MPLAB)

Quiero hacer un programa que realice un efecto ping pong con 8 leds, el problema es que no puedo hacerlo andar, ya que al querer probarlo me indica el siguiente error:

Código:
Warning[207] F:\PROYECTOS\PIC PROYECTOS\18F4550\EFECTO PING PONG\PROGRAMA.ASM 17 : Found label after column 1. (rrf)
Error[122]   F:\PROYECTOS\PIC PROYECTOS\18F4550\EFECTO PING PONG\PROGRAMA.ASM 17 : Illegal opcode (PORTD)
Warning[207] F:\PROYECTOS\PIC PROYECTOS\18F4550\EFECTO PING PONG\PROGRAMA.ASM 22 : Found label after column 1. (rlf)
Error[122]   F:\PROYECTOS\PIC PROYECTOS\18F4550\EFECTO PING PONG\PROGRAMA.ASM 22 : Illegal opcode (PORTD)
Skipping link step.  Not all sources built successfully.

Es raro por que nunca me paso, no se si es por usar otro pic ya que antes usaba el 16F84a y no pasaba esto.

Acá esta el programa que realicé:

Código:
;Efecto Ping-Pong

;Pic
		#include <p18F4550.inc>

;Etiquetas
PDel0	equ		0x0a
PDel1	equ		0x0b

;Programación de Puertos
		movlw	0x00		;Ingreso 0x00 en W
		movwf	TRISD		;Puerto D configurado como salida
		goto	START		;Programa Principal

;Subrutina: Movimiento Izquierda a Derecha
DERECHA
		rrf		PORTD,1		;Acarreo de bits hacia la derecha
		call	DEMORA		;Demora de 0,5 s.
		return
;Subrutina: Movimiento Derecha a Izquierda
IZQUIERDA
		rlf		PORTD,1		;Acarreo de bits hacia la izquierda
		call	DEMORA		;Demora de 0,5 s.
		return
;Subrutina: Demora de 0,5 s.
DEMORA  movlw     .239      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .232      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL4  goto PDelL5         ; 2 ciclos delay
PDelL5  goto PDelL6         ; 2 ciclos delay
PDelL6  goto PDelL7         ; 2 ciclos delay
PDelL7  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.

;Programa Principal
START
		bsf		PORTD,0		;Inicio del efecto
DER
		call	DERECHA		;Llamado a subrutina DERECHA
		btfss	PORTD,7		;Pregunto si llego al ultimo bit
		goto	DER			;No = Voy a DER
		call	DEMORA		;SI = Demora de 0,5 s.
IZQ
		call	IZQUIERDA	;Llamado a subrutina IZQUIERDA
		btfss	PORTD,0		;Pregunto si llego al primer bit
		goto	IZQ			;No = Voy a IZQ
		call	DEMORA		;Si = Demora de 0,5 s.
		goto	DER			;Voy a DER

;Fin del Programa
		end					;Fin


Que hago mal? :unsure:
 
Revisa en "Configure > Select Device" que esté activo el PIC que estas usando.

Para pasar del PIC16F84 de gama media a un PIC18F de gama alta necesitas conocer su arquitectura (no es igual), además que para los PIC18 hay más instrucciones.

Si insistes en programar un PIC18 en asm busca en el foro, creo que hay algunos temas.
 
He visto una presentación, parecida a una hoja de datos y vi que era algo mas complejo que el 16F84a, quiero usar el 18F4550 por la razon de que tiene mas puertos.
Verifiqué y esta el pic que quiero usar, ya lo había hecho pero revisé por las dudas.
Voy a buscar un poco más en el foro a ver si consigo aprender un poco más.
 
Como opción de gama media como el F84 sugiero el PIC16F877A o uno más nuevo como el PIC16F887, ambos de 40 pines y la misma arquitectura del PIC16F84A.
Ojo con las configuraciones en los registros, puertos y fuses que a diferencia del F84 tienen más cosas.
Saludos.
 
Última edición:
Mmm gracias por el dato, pero por el momento tengo en mi poder el 18F4550, por eso estoy convencido en usar ese y no otro. Otro, por el momento no. Pero capaz que esos pics que me dijiste los compre la próxima vez que vaya a comprar, quiero tener más variedad en mi pequeño laboratorio.
 
por el momento tengo en mi poder el 18F4550, por eso estoy convencido en usar ese y no otro.
Si quieres usar ese código en el 18F4550 cambia las instrucciones rlf por rlcf y rrf por rrcf
Y para la selección de bancos usa banksel
La palabra de configuración también es diferente, algo así como esto:
config FOSC = HS, PLLDIV = 2
config PWRT = ON, LVP = OFF, ICPRT = ON, BOR = OFF, WDT = OFF

Saludos.
 
Sugiero que repases las instrucciones para los PIC18F... "Instruction Set Summary" en la hoja de datos.

- En tu código falta el ORG, no sabe donde empezar el programa (los vectores cambian en los PIC18, no es complicado).
- Insisto con las instrucciones, el error salta porque en los PIC18 las instrucciones rrf y rlf no existen. En los PIC18F hay 4 diferentes para rotar un registro.
- Las instruciones en los PIC18 soportan más parámetros, son opcionales.
- Los PIC18F para el control de puertos I/O digital tienen TRISx (configura IO), PORTx (se utiliza para lectura, soporta escritura pero no se garantiza que el estado el PORT cambie) y LATx (se utiliza para escritura).

Saludos.
 
Este es el que yo hice para un PIC18F4550, por si te sirve. Saludos!

Código:
;Programa que rota luces
    LIST P=18F4550        ;Directiva para definir el procesador
    #include <P18F4550.INC>    ;Definicion de SFRs para el procesador
 
;******************************************************************************
;Bits de Configuracion 
;Microchip ha cambiado el formato para definir los bits de configuracion, por favor
;revisar el archivo P18F2455.INC para informacion adicional de la notacion
;Abajo hay algunos ejemplos
 
;********    Configuracion del Oscilador    **********
    CONFIG    FOSC = INTOSCIO_EC        ;Osc interno, RA6 como pin, USB usa Osc EC
    ;CONFIG FOSC = HSPLL_HS      ;HS oscillator, PLL enabled (HSPLL)
    ;CONFIG PLLDIV = 5            ;Divide by 5 (20 MHz oscillator input)
    ;CONFIG CPUDIV = OSC1_PLL2   ;[Primary Oscillator Src: /1][96 MHz PLL Src: /2]
;********    Otros bits de configuracion    **********
    CONFIG    PWRT = OFF                    ;PWRT deshabilitado
    CONFIG    BOR  = OFF                    ;Brown out reset deshabilitado 
    CONFIG    WDT     = OFF                    ;Watchdog deshabilitado    
    CONFIG  MCLRE = on                    ;MCLR como entrada
    CONFIG    PBADEN = off                    ;Todos los pines como entradas analogicas deshabilitados
    CONFIG    LVP    = OFF                    ;Programacion en bajo voltaje apagado
;*********    Bits de proteccion    ******************
    CONFIG    CP0    = OFF                    ;los bloques del codigo de programa
    CONFIG    CP1    = OFF                    ;no estan protegidos
    CONFIG    CP2    = OFF
    CONFIG    CPB    = OFF                    ;Sector Boot no esta protegido
    CONFIG    CPD    = OFF                    ;La EEPROM no esta protegida
 
 
;******************************************************************************
; Definicion de variables
; Estas variables son necesarias solo si las interrupciones de baja prioridad son usadas. 
; Mas variables podrian se necesarias para almacenar otros SFRs usados en las rutinas de 
; interrupcion.
 
        CBLOCK    0x080
                   ;variable usada para salvar contexto
                ;variable usada para salvar contexto
                   ;variable usada para salvar contexto
        ENDC
 
        CBLOCK    0x000    ;Variables en la ACCESS RAM (Banco 0) max 96 bytes
                           

        ENDC
 
;******************************************************************************
;Datos de la EEPROM 
;Los Datos a ser programados en la  EEPROM son definidos aqui
 
        ORG    0xf00000
 
        DE    "Test Data",0,1,2,3,4,5
 
;******************************************************************************
; Vector de Reset.
; Este codigo comenzara a ejecutarse cuando suceda un reset
 
        ORG    0x0000
 
        goto    Main        ;Se va al inicio del codigo principal
 
;******************************************************************************
; Vector de interrupcion de alta prioridad
; Este codigo comenzara a ejecutarse cuando una interrupcion de alta prioridad ocurra
; o cuando cualquier interrupcion ocurra si es que las prioridades de las interrupciones
; no estan habilitadas
 
        ORG    0x0008
 
        bra    HighInt                        ;Va a la rutina de interrupcion de alta prioridad
 
;******************************************************************************
; Vector de interrupcion de baja prioridad y rutina
; Este codigo comenzara a ejecutrase cuando una interrupcion de baja prioridad ocurra
; Este codigo puede ser eliminado si las interrupciones de baja prioridad no son usadas
 
        ORG    0x0018
 
    
;    *** El codigo de la interrupcion de baja prioridad va aqui ***

 
;******************************************************************************
; Rutina de interrupcion de alta prioridad
; El codigo para la rutina de interrupcion de alta prioridad es colocado aqui para
; evitar conflictos con el vector de interrupciones de baja prioridad
 
HighInt:
 
;    *** El codigo para las interrupciones de alta prioridad va aqui ***
 
;******************************************************************************
; Comienzo del programa principal
; El codigo del programa principal es colocado aqui
 


 
;    *** EL codigo principal va aqui ***
;One instruction cycle consists of four oscillator periods.
;Thus, for an oscillator frequency of 4 MHz, the normal
;instruction execution time is 1 µs.
;Para un Fosc de 48M cada ciclo de instruccion dura 4/48M => 83.3 ns
 
;*******************    Inicializamos perifericos    ***************************
 
Main:

 VAR1 EQU 21
 VAR2 EQU 22

    MOVLW    B'00001111'
    MOVWF    ADCON1,.0                ;dice que Todass los pines (patitas) las vamos usar como I/O digitales
    
    MOVLW 03H                        ;se pone el puerto a como entrada como 00001111 (0F)
                                  
    MOVWF TRISA                        

    MOVLW 00H                        ;se pone como salida el puerto b "0000 0000"
    MOVWF TRISB
    
    

    
SAQUE1
MOVLW    B'00000001'                    ;enciende el primer led
    MOVWF PORTB                    
    CALL RETARDO
    BTFSC PORTA,0                    ;se revisa la entrada del puerto a 
    GOTO RAQUETA1                        ;si es uno lee esta instruccion y se manda a raqueta1
    GOTO SAQUE1                       ;vuelve a iniciar saque1

SAQUE2
    MOVLW    B'10000000'                ;enciende el ultimo led    
    MOVWF PORTB                        
    CALL RETARDO

    BTFSC PORTA,1                    ;si es 0 salta a esta instruccion y revisa el bit 1 del puerto a
    GOTO RAQUETA2                        ;si si es 1 manda a esta instruccion y manda a raqueta2
    GOTO SAQUE2                        ; vuelve a iniciar saque2



RAQUETA1
    MOVLW    B'00000001'                    ;enciende el primer led hasta el ultimo
    MOVWF PORTB                    
    CALL RETARDO
    MOVLW    B'00000010'                    
    MOVWF PORTB            
    CALL RETARDO
    MOVLW    B'00000100'                    
    MOVWF PORTB                    
    CALL RETARDO
    MOVLW    B'00001000'                    
    MOVWF PORTB                
    CALL RETARDO
    MOVLW    B'00010000'                    
    MOVWF PORTB    
    CALL RETARDO
    MOVLW    B'00100000'                    
    MOVWF PORTB                        
    CALL RETARDO
    MOVLW    B'01000000'                    
    MOVWF PORTB                    
    CALL RETARDO
    MOVLW    B'10000000'                    
    MOVWF PORTB                        
    CALL RETARDO
    BTFSS PORTA,1
    GOTO SAQUE1
    GOTO RAQUETA2
                                   
    

RAQUETA2    

    MOVLW    B'10000000'                    ;enciende el ultimo led hasta el primero
    MOVWF PORTB                        
    CALL RETARDO
    MOVLW    B'01000000'                    
    MOVWF PORTB                    
    CALL RETARDO
    MOVLW    B'00100000'                    
    MOVWF PORTB                        
    CALL RETARDO
    MOVLW    B'00010000'                    
    MOVWF PORTB    
    CALL RETARDO
    MOVLW    B'00001000'                    
    MOVWF PORTB                
    CALL RETARDO
    MOVLW    B'00000100'                    
    MOVWF PORTB                    
    CALL RETARDO
    MOVLW    B'00000010'                    
    MOVWF PORTB            
    CALL RETARDO
    MOVLW    B'00000001'                    
    MOVWF PORTB                    
    CALL RETARDO
    BTFSS PORTA,0
    GOTO SAQUE2
   GOTO RAQUETA1
    
RETARDO
        MOVLW 0FF                    ;pone un 1111 1111 en w                    
        MOVWF VAR1                    ;se manda lo que esta en w a var1
    MOVWF VAR2                        ;se manda lo que esta en w a var 2


CICLORETARDO
    DECFSZ VAR1                        ;se incrementa de 1111 1111 a 0000 0000 el valor en var1
    GOTO CICLORETARDO                        ;cuando no es 0 regresa a ciclo1
    DECFSZ VAR2                        ;se incrementa de 1111 1111 a 0000 0000 el valor de var2
    GOTO CICLORETARDO                        ;se manda a ciclo1
    RETURN
    END

 
 END            ;Directiva fin del programa
 
Última edición por un moderador:
Atrás
Arriba