PC llego al maximo y desbordo!

buenas gente..
estoy haciendo un programa en asm y en MPLAB me salto esto
"CORE-W0014: Halted due to PC incrementing over the Maximum PC address and wrapping back to Zero"
lei por ahi QUe la solucion es disminuir el codigo.. pero realmente me es imposible, tiene que hacer muchas cosas, QUE PUEDO HACER???
estoy usando el PIC 877A, y tengo 873 lineas de codigo :S je

gracias
 
Última edición por un moderador:
y .. para la proxima te haces una idea y seleccionas un chip quie te sobre la memoria.

ahora digo yo , si para ese modelo estas con el maximo de memoria y migrar a otro no queres para no andar viendo si hay algun otro registro que definir y reconfigurar puertos y demas ajustes ........................
como queres que te ayuden si no pones el programa ??
te comprendo que es tu trabajo y colgar todo el asm no es querible.

pero por lo menos pone bloques de lo que hiciste y lineas de cada bloque .

quizas alguna cosa te puedan orientar .


che.mire mas o menos la data y habla de 4K y de 8K .
y vos decis que tenes 800 lineas.....
hace rato que ando alejado de esos bichos pero por mas que algunas instrucciones usen 2 lineas ..................no me cierra, o no entiendo .
 
Última edición:
no es problema colgarte el assembler, no soy bill gates..
si me ayudas genial..


Código:
	list		p=16f877A	; list directive to define processor
	#include	<p16f877A.inc>	; processor specific variable definitions

	__CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _RC_OSC & _WRT_OFF & _LVP_ON & _CPD_OFF

	ORG	00H
	GOTO	MAIN
	ORG	04H
	GOTO	RSI


MAIN

;.. DECLARACION DE VARIABLES, CONFIGURACION DE PUERTOS E INTERRUPCIONES

	
	ADC		EQU	21H	
	ADC_VIEJO	EQU	22H
	AUX		EQU	23H
	UNIDAD		EQU	24H
	DECENA		EQU	25H
	CENTENA		EQU	26H
	CONTADOR	EQU	27H
	TEMP		EQU	28H
	CUENTA_MILI	EQU	29H	
	WS		EQU	2AH
	ESTATUS		EQU	2BH	
	FLAGS		EQU	2CH
	CONT		EQU	2DH
	ADCDB		EQU	30H
	RESULT_DB	EQU	31H
	CUENTADB	EQU	32H
	
	MOVLW	0AH
	MOVWF	CUENTA_MILI
	CLRF	CONTADOR
	
	MOVLW	3H
	MOVWF	CONT

	BSF	STATUS,RP0
	CLRF	TRISC
	CLRF	TRISE
	MOVLW	B'11100000'
	MOVWF	TRISB
	MOVLW	B'00000000'
	MOVWF	TRISD
	MOVLW	B'00000001'
	MOVWF	TRISA
	MOVLW	B'00001110'
	MOVWF	ADCON1
	MOVLW	B'11101000'
	MOVWF	INTCON
	MOVLW	B'00000000'
	MOVWF	OPTION_REG
	BSF	PIE1,ADIE
	BCF	STATUS,RP0
	MOVLW	B'10000001'
	MOVWF	ADCON0
	BCF	PIR1,ADIF
	BCF	FLAGS,0

;..PROGRAMA PRINCIPAL..
	MOVLW	6H
	MOVWF	TMR0
	CLRF	ADC_VIEJO
	CLRF	ADC
	CLRF	ADRESH
		
BACK
	BTFSC	ADCON0,GO ;TERMINO LA CONVERSION?
	GOTO	BACK  	  ;NO, VUELVO A PREGUNTAR

	

MUESTRA
	MOVF	ADRESH,0
	MOVWF	ADC
	MOVF	ADC_VIEJO,0
	SUBWF	ADC,0
	BTFSC	STATUS,C
	CALL	CAMBIO

	
	BTFSS	FLAGS,0 ;OCURRIO ADC?
	GOTO	BACK
	BTFSC	FLAGS,1 ;
	GOTO	CONVERTIR
	BCF		FLAGS,0
	MOVF	ADC_VIEJO,0
	MOVWF	AUX
SIGUE
	XORLW	00H
	BTFSC	STATUS,Z; AUX=0?
	GOTO	BACK	; SI
	CLRF	UNIDAD
	CLRF	DECENA
	CLRF	CENTENA

RESTA_10
	MOVLW	0AH
	SUBWF	AUX,1		; AUX - 10
	BTFSS	STATUS,C
	GOTO	SUMA_10
	INCF	DECENA,1
	GOTO	RESTA_10
SUMA_10
	MOVLW	0AH
	ADDWF	AUX,1
	MOVF	AUX,0
	MOVWF	UNIDAD
CORREGIR_CENTENA
	MOVLW	0AH
	SUBWF	DECENA,1
	BTFSS	STATUS,C
	GOTO	SUMA_DECENA
	INCF	CENTENA,1
	GOTO	CORREGIR_CENTENA
SUMA_DECENA
	MOVLW	0AH
	ADDWF	DECENA,1
	GOTO	BACK

CAMBIO
	MOVF	ADC,0
	MOVWF	ADC_VIEJO
	RETURN

CONVERTIR
	BCF		FLAGS,0
	MOVF	RESULT_DB,0
	MOVWF	AUX
	GOTO	SIGUE

; ... RSI...
RSI
	MOVWF	WS
	SWAPF	STATUS,0
	MOVWF	ESTATUS

;..QUE INTERRUPCION OCURRIO??	
	BTFSC	INTCON,T0IF ;	TMR0?
	GOTO	TIEMPO
	BTFSC	INTCON,RBIF	;	TECLAS?
	GOTO	TECLA
	BTFSC	PIR1,ADIF	;	ADC?
	GOTO	FIN_ADC
	GOTO	TERMINAL


TIEMPO

	CALL	MANDO_DISPLAY
	BCF		INTCON,T0IF
	DECFSZ	CUENTA_MILI,1 ; LLEGO A 10MSEG?
	GOTO	FIN_RSI	
	BSF		ADCON0,GO

SetupDelay
	movlw 6 ; Carga Temp con 3
	movwf TEMP
SDSSs 	
	decfsz TEMP, F ; Bucle de retardo
	goto SDSSs

	MOVLW	0AH
	MOVWF	CUENTA_MILI
FIN_RSI	
	MOVLW	6H
	MOVWF	TMR0
TERMINAL
	SWAPF	ESTATUS,0
	MOVWF	STATUS
	SWAPF	WS,1
	SWAPF	WS,0	
	RETFIE

MANDO_DISPLAY ;A DISPLAYS
	BCF		STATUS,RP0	
	MOVLW	23H
	MOVWF	FSR
	CLRF	PORTA
	MOVF	CONT,0
	ADDWF	FSR,1
	MOVF	INDF,0
	CALL	TABLA_7SEG
	MOVWF	PORTD
	MOVF	CONT,0
	CALL	TABLA_PA
	MOVWF	PORTA
	DECFSZ	CONT,1
	RETURN
	MOVLW	3H
	MOVWF	CONT
	RETURN
	
TECLA
	BTFSC	PORTB,5
	GOTO	CLEAR
	BTFSC	PORTB,6
	GOTO	MUESTRA_DB
	BTFSC	PORTB,7
	GOTO	MUESTRA_ADC
	GOTO	TERMINAL

CLEAR
	CLRF	ADC_VIEJO
	CLRF	AUX
	CLRF	UNIDAD
	CLRF	DECENA
	CLRF	CENTENA
	GOTO	TERMINAL

MUESTRA_DB
	BSF		FLAGS,1
	MOVF	ADC_VIEJO,0
	MOVWF	ADCDB	
	CLRF	CUENTADB
	INCF	CUENTADB,1	
	MOVF	ADCDB,0
	SUBLW	D'1'		; ES MAYOR KE 1?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1	;NO
	MOVF	ADCDB,0
	SUBLW	D'2'		; ES MAYOR KE 2?
	BTFSC	STATUS,C
	GOTO	DBEL
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'4'		; ES MAYOR KE 4?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'8'		; ES MAYOR KE 8?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'11'		; ES MAYOR KE 11?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'16'		; ES MAYOR KE 16?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'21'		; ES MAYOR KE 21?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'26'		; ES MAYOR KE 26?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'32'		; ES MAYOR KE 32?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'37'		; ES MAYOR KE 37
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'41'		; ES MAYOR KE 41?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'46'		; ES MAYOR KE 46?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'52'		; ES MAYOR KE 52?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'58'		; ES MAYOR KE 58?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'65'		; ES MAYOR KE 65?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'73'		; ES MAYOR KE 73?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'82'		; ES MAYOR KE 82?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'92'		; ES MAYOR KE 92?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'103'		; ES MAYOR KE 103?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'115'		; ES MAYOR KE 115?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'129'		; ES MAYOR KE 129?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'145'		; ES MAYOR KE 145?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'162'		; ES MAYOR KE 162?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'182'		; ES MAYOR KE 182?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'204'		; ES MAYOR KE 204?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'229'		; ES MAYOR KE 229?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
	MOVF	ADCDB,0
	SUBLW	D'251'		; ES MAYOR KE 251?
	BTFSC	STATUS,C
	GOTO	DBEL			;SI
	INCF	CUENTADB,1
DBEL	
	MOVF	CUENTADB,0
	CALL	TABLA_DB
	MOVWF	RESULT_DB
	GOTO	TERMINAL

MUESTRA_ADC
	BCF		FLAGS,1
	GOTO	TERMINAL

TABLA_PA
	ADDWF	PCL,1
	NOP
	RETLW	B'00001000'
	RETLW	B'00000100'
	RETLW	B'00000010'


FIN_ADC

	BCF	PIR1,ADIF
	BSF		FLAGS,0
	GOTO	TERMINAL

TABLA_7SEG
	ADDWF	PCL,1
	RETLW B'00111111' ;0
	RETLW B'00000110' ;1
	RETLW B'01011011' ;2
	RETLW B'01001111' ;3
	RETLW B'01100110' ;4
	RETLW B'01101101' ;5
	RETLW B'01111101' ;6 
	RETLW B'00000111' ;7
	RETLW B'01111111' ;8
	RETLW B'01101111' ;9

TABLA_DB	
	ADDWF	PCL,1
	RETLW	D'020'
	RETLW	D'031'
	RETLW	D'037'
	RETLW	D'043'
	RETLW	D'046'
	RETLW	D'049'
	RETLW	D'052'
	RETLW	D'054'
	RETLW	D'056'
	RETLW	D'057'
	RETLW	D'058'
	RETLW	D'059'
	RETLW	D'060'
	RETLW	D'061'
	RETLW	D'062'
	RETLW	D'063'
	RETLW	D'064'
	RETLW	D'065'
	RETLW	D'066'
	RETLW	D'067'
	RETLW	D'068'
	RETLW	D'069'
	RETLW	D'070'
	RETLW	D'071'
	RETLW	D'072'
	RETLW	D'073'
	RETLW	D'074'
	
	END
 
Última edición por un moderador:
Al parecer tu error es otro, a ese modelo de PIC le cabe fácilmente tu ASM y hasta mucho más... seguramente el problema está en que por lo mismo de que el prog esta algo grande, habrá una que otra sección donde el PC no alcanza a direccionar (recordar que PC solamente puede direccionar 2 Kb de programa por mucho, para abarcar los 8 Kb de este PIC ahy q modificar el PCLATH dependiendo de la zona de memoria a donde se desea accesar). Aquí te dejo el Anexo 556 de Microchip donde se habla del tema. saludos
 

Adjuntos

  • AN556 Salto indexado.pdf
    68.7 KB · Visitas: 31
Daniel Meza, como hago para decirle al pic en que pagina guardar determinada parte del ASM? no enteindo bien eso. ahora mi codigo tiene 400 lineas, donde deberia decirle en que momento cambiar de pagina??
 
Antes de escribir la sección del programa que quieres cambiar de dirección tienes que escribir la directiva 0xXXXX donde XXXX representa la dirección donde el compilador comenzará a "ensamblar" las istrucciónes siguientes a esa directiva. Por ejemplo :

ORG 0x0500

btfss INTCON,RPBI
nop
movlw 0x89
movwf PORTD
etc
etc

Si quieres hacer saltos entre las páginas de memoria del PIC tienes que configurar la parte alta del PC (Registro PCLATH). Por ejemplo:

ORG 0x500 ;Programa en página 0

BCF PCLATH,4
BSF PCLATH,3 ;Selecciona página 1 (800h-FFFh)
CALL SUB1_P1 ;Llama a una subrutina en página 1

ORG 0x900 ;page 1 (800h-FFFh)

SUB1_P1 ;Subrutina en página 1

//Instrucciones de la subrutina

return

Espero que haya sido claro, si no, en el PDF que adjunte enteriormente se explica muy bien eso. O también en la hoja de datos del PIC en la sección PCL & PCLATH se incluyen algunos ejemplos :)
 
Daniel Meza, encontre una buena solucion para el tema de mi programa largo, puse toda una subrutina(ke me llenaba mucho de codigo) y la puse en otro archivo con la extension .inc,
luego la inclui dentro de mi ASM "principal" x asi llamarlo. ahora tengo otro problema.
cuadno entra al archivo del incluido, anda josha, hasta ke llega al ADDWF PCL,1, hace la siguiente instruccion que es un RETLW D'020' (a modo de ejemplo) y me vuelve al ASM principal, no sabes que puede ser?? x lo que veo, el PC en ADDWF PCL,1 esta en 0x108 y luego del RETLW va a PC=0x81 :S
 
Seguimos teniendo el problema con el PCLATH el cual al momento de regresar no brinca a la página correcta. Es algo enredado resolver este problema. Creo que en tu caso te recomendaría implementar tus tablas en la memoria de programa del PIC y después acceder a ellas por medio de los registros EECON1, EEDATA, etc (los referentes a la lectura/escritura en EEPROM). Personalmente desde que descubrí que se podían implementar tablas así no he dejado de utilizar este método y dejé atrás lo referente a retlw's con lo que me olvido de esos problemas que ocurren. En la hoja de datos en la sección "4.0 DATA EEPROM AND FLASH PROGRAM MEMORY" se habla de este método. Y vienen unos ejemplos. Lo malo es que está en inglés pero con el traductor de google no hay preocupación por ello.

Daniel Meza, encontre una buena solucion para el tema de mi programa largo, puse toda una subrutina(ke me llenaba mucho de codigo) y la puse en otro archivo con la extension .inc
Eso solo hace que tu programa se vea "más corto" en si no soluciona el problema ya que al momento de compilarlo, el ensamblador junta los dos programas volviendo al problema del principio.
 
LO LOGREEEEEE!! :D

Eso solo hace que tu programa se vea "más corto" en si no soluciona el problema ya que al momento de compilarlo, el ensamblador junta los dos programas volviendo al problema del principio.

si me di cuenta de eso cuando al simularlo me daba el mismo error.. lo que no entendia es que una pagina de 2K no entren 400 lineas de codigo, y encontre ke la memoria estaba segmenta y esa fue mi pregunta ycuadno me di cuenta ke modificando el PCLATH solo el bit0 podia acceder a la segunda parte de la pagina, fue mi solucion jeje muchas gracias Daniel x tu buena onda :D
 
Que bien... ah al menos fué rápido esos errores como dan dolores de cabeza y desesperación :enfadado:, pero que bien que ya quedó. Aun así, dale una leída a la recomendación que te hice de como implementar las tablas de datos (y evitarte esos problemas a futuro). Estoy seguro de que te será de mucha ayuda. Saludos :apreton:
 
Atrás
Arriba