Errores al compilar en MPLAB X

Hola gente,
como ya he dicho necesito asociar el PIc Basic Pro a el MPLAB, para que el PBP sea el compilador, pero aun no lo he logrado.
si alguien sabe cmo hacerlo por favor comparten conmigo :D

gracias.

saludos
 
Gracias ByAxel, he tratado de hacer eso pero no me da, es decir, la opcion micro Engineering PIC BASIC PRO compiler, no me aparece :( ese precisamente es el problema, o dime cual version de PBP debo usar apra esto...
 
Uso el PBP2.6, lo que tienes que agregar es el archivo PBPMPLAB.BAT como dice según el link; al usar el botón 'Browse' cambia el tipo a 'Todos los archivos' y ve a la carpeta del PBP en busca del PBPMPLAB.BAT, aceptas y listo o también puede ser el ejecutable PBPW.EXE.
 
Última edición:
Gracias BYAxel :D eso era, ejecutar el BAT que hay en la carpeta del PBP y el PBPW.EXE y listo! :).
Muchisimas Gracias...

ByAxel te molesto de nuevo, todo me ha ido muy bien hasta el momento de compilar...
cuando le doy compilar me sale un error.
adjunto la imagen y me dices que podria ser

gracias
 

Adjuntos

  • error mplab.JPG
    error mplab.JPG
    78.9 KB · Visitas: 71
Última edición:
Hola, soy bastante nuevo en esto de los PICS programados en C, y resulta que tengo el siguiente problema:

Tengo un proyecto en C de otra persona que fue compilado con el HI-TECH 7.86 PL3 del año 2002, y que al volver a compilarlo con el MPLAB y el compilador de la misma casa HI-TECH pero ACTUAL, me da errores tipo 192, que segun el manual es porque está escrito al estilo antiguo "K&R".... No entiendo mucho a qué se refiere con esto, pero deberian ser cientos de lineas que deberia modificar.

¿Hay algun otro compilador que acepte versiones antiguas, o que el hi-tech se le pueda hacer entender el código que tengo?
 
Cual es el código? podrías subirlo?...
No debería haber tanto problema si se compila en el entorno del MPLAB o el entorno de HiTide que es el IDE para los compiladores de Hi-tech.
 
Por si quereis echarle un vistazo es el zip adjunto. Se trata de un proyecto de vatímetro digital que se publicó en la revista elektor.

Con el HiTide todavia no lo he probado, pero con el Mplab no hay manera.

Saludos
 

Adjuntos

  • 020026-11.zip
    28.9 KB · Visitas: 31
Lo e compilado por otro medio ya que en el MPLAB que tengo no está disponible la opción de Hi-Tech. Pero desde MPLAB se debe crear un proyecto y luego importar el main y todos sus archivos para que pueda compilar.

Sobre el error/incompatibilidad he visto que hay un conflicto con algunas declaraciones PIC16F876A:
- bit RW @ (unsigned)&PORTC*8+2 ; que está en el archivo def.h hace conflicto con la declaración volatile bit RW @ (unsigned)&SSPSTAT*8+2; que está en el archivo de cabecera del PIC, asi que hay que cambiar RW en el archivo def.h y lcd.c del proyecto.

- Esto __CONFIG(CP1|CP0|WRT|CPD|WDTE|FOSC0|BODEN);, tampoco lo reconoce, creo que la declaración de los fuses es de otra forma. Lo puse como comentario y compilo todo...

PD: Use el MPLAB X IDE beta 3 + Hitech picc V9.70.

saludos
 
tengo problemas para copilar este programa agradeceria su ayuda......

list p=16F84 ; Lista de las directivas que definen al microprocesador.
#include <p16F84.inc> ; procesador especifico definicion de variables.

__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

; '__CONFIG' directiva se utiliza para insertar los datos de configuración dentro archivo .asm
; Los mensajes siguientes de la directiva se encuentran en las respectivos archivos .Inc

;***** VARIABLE DEFINITIONS
w_temp EQU 0x0C ; variable utilizada para guardar el contexto
status_temp EQU 0x0D ; variable utilizada para guardar el contexto
irerror EQU 0x0E ; variable utilizada cuando recibe posibles errors
irtimer EQU 0x0F ; variable utilizada para guardar el tiempo bitlenght
ircounter EQU 0x10 ; variable utilizada como contador de bits
ircmd EQU 0x11 ; variable que mantenga el comando recibido
iradr EQU 0x12 ; variable que mantenga la dirección recibido
irtemp EQU 0x13 ; variable utilizada para calcular ircommand de salida
delay1 EQU 0x14 ; variable de tiempo de comparacion de entrada
delay2 EQU 0x15 ; variable de tiempo de entrada
CounterA EQU 0x16 ; variable de contador de tiempoA
CounterB EQU 0x17 ; variable de contador de tiempoB
;led EQU 0x01 ; variable que asigna la salida del LED
ir EQU 0x04 ; variable que asigna la entrada de la Señal IR

;**********************************************************************
ORG 0x000 ; restablece el vector del procesador
goto main ; envia al inicio del programa goto main
ORG 0x004 ; ubicación vector de interrupción
movwf w_temp ; save off current W register contents
movf STATUS,w ; mueve el registro status hacia el registro W
movwf status_temp ; save off contents of STATUS register
movf status_temp,w ; recupera copia de registro de status
movwf STATUS ; restablece el contenido pre-isr registro status
swapf w_temp,f
swapf w_temp,w ; restablece el contenido de pre-isr al registro W
retfie ; retornamos de la interrupcion
init
CLRF PORTA ;Inicializamos el Puerto A y sus configuraciones
BCF STATUS, RP1
BSF STATUS, RP0 ;Seleccionamos el Banco 1
MOVLW B'11110000' ;Valor usado en la inicializacion
MOVWF TRISA
MOVLW B'00000000' ;Valor usado en la inicializacion
MOVWF TRISB ;Set Rb<7:0> como salidas
BCF STATUS, RP0 ;Seleccionamos el banco 0
return ;retornamos a la subrutina
read_sony
BSF irerror,0 ;Set el errorbit (después se borrará cuando se recibe un código correcto)
BCF INTCON,GIE ;Deshabilita interrupciones temporalmente
CLRWDT ;Limpiamos el tiempo watchdog
BSF STATUS,RP0 ;Seleccionamos banco1
MOVLW b'10000101' ;Establece el temporizador y prescaler
MOVWF OPTION_REG
BCF STATUS,RP0 ;Seleccionamos el banco0
BTFSC PORTA,ir ;Si se trata de un corto sobre el señal ir dejar de leer el código de error.
GOTO end_sony
CLRF TMR0 ;Borrar temporizador para medir la longitud startbit
sony_st1
BTFSS PORTA,ir ;Medir el startbit
GOTO sony_st1
MOVF TMR0,0 ;mueve el valor de bitlength a irtimer
MOVWF irtimer
MOVLW d'32' ;Mide la longitude del startbit menos de 2 ms a continua,si no es error
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'213' ;Si la longitud del startbit fue es 2,6ms entonces la lectura final con código de error.
ADDWF irtimer,0 ;Porque cuando no es válido el startbit el código ir ya no es protocolo sony
BTFSC STATUS,C ;Así startbit debe estar entre 2 ms y 2,6 ms.
GOTO end_sony
MOVLW d'7' ;Establecer ir para de recibir 7 bits de comando.
MOVWF ircounter
rd_sony_cmd
CLRF TMR0 ;Medida la primera parte de la bitlength: Si no es entre 300 y 900µs
sony_prt1_c
BTFSC PORTA,ir ;A continuación, la salida inmediata de la rutina con un error.
GOTO sony_prt1_c
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
CLRF TMR0
CLRWDT ;limpiamos el watchdog
sony_prt2_c
BTFSS PORTA,ir ;Part2 medida del comando bits y probar si la duración es de entre 300 y 1600µs
GOTO sony_prt2_c ;Si entre estos intervalos de prueba, si bitpart segundo es más corto o más largo que 900µs
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'230'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO sony_its_1
sony_its_0
BCF STATUS,C ;si inferior a 900 µs recibido el bit es un cero
RRF ircmd,1
GOTO nxt_sony_cmd
sony_its_1
BSF STATUS,C
RRF ircmd,1
nxt_sony_cmd
DECFSZ ircounter,1 ;comprobar si todos los bits de comando son procesados en caso de no,recibir el próximo
GOTO rd_sony_cmd ;si es más de la longitud de 900µs recibido es un uno
BCF STATUS,C
RRF ircmd,1 ;Girar ircmd una posición para convertirse en comando correcto
MOVLW d'5' ;ircounter establecido para recibir 5 bits de dirección
MOVWF ircounter
rd_sony_adr
CLRF TMR0
sony_prt1_a
BTFSC PORTA,ir ;conjunto ir contar medida primer bit de longitud inferior a 300µs o más de 900µs entonces recibir 5 bits de dirección
GOTO sony_prt1_a ;luego sale inmediatamente si es error
MOVF TMR0,0
MOVWF irtimer
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
CLRF TMR0
CLRWDT ;limpiamos el tiempo del watchdog
sony_prt2_a
BTFSS PORTA,ir
GOTO sony_prt2_a ;segunda medida de longitud poco más corto que si 300µs o superior 1600µs
MOVF TMR0,0 ;luego sale si es error
MOVWF irtimer ;Si entre estos intervalos de prueba si el bit es un uno o un cero (más corto o más largo que 900µs)
MOVLW d'5'
SUBWF irtimer,0
BTFSS STATUS,C
GOTO end_sony
MOVLW d'230'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO end_sony
MOVLW d'241'
ADDWF irtimer,0
BTFSC STATUS,C
GOTO sony_its_1_a
sony_its_0_a
BCF STATUS,C ;si bitpart segundo fue más corto que 900µs es un cero
RRF iradr,1
GOTO nxt_sony_adr
sony_its_1_a
BSF STATUS,C ;si bitpart segundo fue más larga que la 900µs es uno
RRF iradr,1
nxt_sony_adr
DECFSZ ircounter,1 ;Comprueba si todos los bits son procesados en caso de no, recibir el próximo
GOTO rd_sony_adr
BCF STATUS,C ;Girar tres veces el iradr a convertirse en la dirección correcta
RRF iradr,1
BCF STATUS,C
RRF iradr,1
BCF STATUS,C
RRF iradr,1
CLRF irerror ;Porque cada bitlength se midió correcto entre los límites no se han producido errores
; bcf PORTA,led
end_sony
BCF INTCON,T0IF ;Borrar timer0 interrumpir un pabellón para evitar interrupciones
BSF STATUS,RP0
MOVLW b'00000101'
MOVWF OPTION_REG
BCF STATUS,RP0
RETURN
ir_to_outp ;Comienza la seleccion de Botones
movf ircmd,W ;Guarda ircmd en irtemp para evitar perder el código recibido
movwf irtemp

movf irtemp,W ;Check si el comando de IR es 0 (button 1) entonces la salidas es 1
sublw d'0' ;hace una resta comando y el numero de codigo
btfss STATUS,Z ;hace una comparacion
goto not_button1 ;si el resultado no es cero salta al siguiente
movlw b'00000001' ;carga la salida al Puerto B
xorwf PORTB,1 ;deja el dato grabado en el Puerto B
;call Tiempo ;tiempo que tarda el dato en el Puerto B
;goto reset ;limpia el puerto si deshabilitamos el puerto deja el codigo en la salida
goto end_output ;si queremos que el dato se quede encendido habilitamos esta funcion y deshabilitamos la anterior
not_button1
movf irtemp,W ;Check si el comando de IR es 1 (button 2) entonces la salidas es 10
sublw d'1'
btfss STATUS,Z
goto not_button2
movlw b'00000010'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button2
movf irtemp,W ;Check si el comando de IR es 2 (button 3) entonces la salidas es 11
sublw d'2'
btfss STATUS,Z
goto not_button3
movlw b'00000100'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button3
movf irtemp,W ;Check si el comando de IR es 3 (button 4) entonces la salidas es 100
sublw d'3'
btfss STATUS,Z
goto not_button4
movlw b'00001000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button4
movf irtemp,W ;Check si el comando de IR es 4 (button 5) entonces la salidas es 10000
sublw d'4'
btfss STATUS,Z
goto not_button5
movlw b'00010000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button5
movf irtemp,W ;Check si el comando de IR es 5 (button 6) entonces la salidas es 110
sublw d'5'
btfss STATUS,Z
goto not_button6
movlw b'00100000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button6
movf irtemp,W ;Check si el comando de IR es 6 (button 7) entonces la salidas es 111
sublw d'6'
btfss STATUS,Z
goto not_button7
movlw b'01000000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button7
movf irtemp,W ;Check si el comando de IR es 7 (button 8) entonces la salidas es 1000
sublw d'7'
btfss STATUS,Z
goto not_button8
movlw b'10000000'
xorwf PORTB,1
;call Tiempo
;goto reset
goto end_output
not_button8
movf irtemp,W ;Check si el comando de IR es 8 (button 9) entonces la salidas es 1001
sublw d'8'
btfss STATUS,Z
goto not_button9
movlw b'00000001'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button9
movf irtemp,W ;Check si el comando de IR es 9 (button 0) entonces la salidas es 2 Puerto A
sublw d'9'
btfss STATUS,Z
goto not_button16
movlw b'00000010'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button16
movf irtemp,W ;Check si el comando de IR es 16(channel up) entonces la salidas es 1010
sublw d'16'
btfss STATUS,Z
goto not_button17
movlw b'00001111'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button17
movf irtemp,W ;Check si el comando de IR es 17 (channel down) entonces la salidas es 1011
sublw d'17'
btfss STATUS,Z
goto not_button18
movlw b'11110000'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button18
movf irtemp,W ;Check si el comando de IR es 18 (volunen up) entonces la salidas es 1100
sublw d'18'
btfss STATUS,Z
goto not_button19
movlw b'00000011'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
not_button19
movf irtemp,W ;Check si el comando de IR es 19 (volumen down) entonces la salidas es 1101
sublw d'19'
btfss STATUS,Z
goto not_button20
movlw b'00001100'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
not_button20
movf irtemp,W ;Check si el comando de IR es 20 (mute) entonces la salidas es 100000
sublw d'20'
btfss STATUS,Z
goto not_button63
movlw b'00000100'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button63
movf irtemp,W ;Check si el comando de IR es 63 (prev ch) entonces la salidas es 100000
sublw d'63'
btfss STATUS,Z
goto not_button21
movlw b'00001000'
xorwf PORTA,1
;call Tiempo
;goto reset
goto end_output
not_button21
movf irtemp,W ;Check si el comando de IR es 21 (Off-On) entonces la salidas es 100000
sublw d'21'
btfss STATUS,Z
goto not_button26
movlw b'11111111'
xorwf PORTB,1
call Tiempo
goto reset
;goto end_output
not_button26
movf irtemp,W ;Check si el comando de IR es 26 (PLAY) entonces la salidas es 1000000
sublw d'26'
btfss STATUS,Z
goto end_output ;Si agregamos mas botones escribimos goto not_buttonSiguiente, pero no hay mas finaliza la busqueda
movlw b'00001111'
xorwf PORTA,1
call Tiempo
goto reset
;goto end_output
reset ;limpia los puertos
clrf PORTB ;PuertoB a cero
clrf PORTA ;PuertoA a cero
end_output
return ;retorna al codigo principal
delayrout1 ;tiempo de comparacion de señal IR
movlw d'255'
movwf delay2
looping2
movlw d'255'
movwf delay1
looping1
nop
nop
decfsz delay1,1
goto looping1
decfsz delay2,1
goto looping2
return
Tiempo ;Tiempo de muestra rapido
movlw d'150'
movwf CounterA
movlw d'150'
movwf CounterB
loopTiempo
decfsz CounterB,1
goto loopTiempo
decfsz CounterA,1
goto loopTiempo
return

;*************************************
;********* MAIN **************
;*************************************
main ;Codigo Principal
call init ;Inicializacion de variables
clrf PORTB ;Limpiamos PuertoB
clrf PORTA ;Limpiamos PuertoA
test
call read_sony ;Funcion que recibe la señal IR
btfsc irerror,0 ;Busqueda de Errores
goto test ;Se queda esperando nueva entrada
call ir_to_outp ;Funcion que verifica los botones y la salida
call delayrout1 ;Tiempo de comparacion de señal IR
goto test ;Se queda esperando nueva entrada

END ;Finaliza el programa
 
hola que tal hize un programa en assembler de controlar 2 motores via rs232 basicamente lo q hago el mandar un listado de cajas a sellar y me activa un motor conectado a una correa (con un led de estado), y cuando las x cajas pasan por un sensor, se activa otro motor "sellandola" , luego va a ir decrementando la cantidad de cajas hasta llegar a 0 y se prende otro led de estado, cuando lo compile en mplab me aparecen los siguientes errores...
Executing: "C:\Program Files\Microchip\MPASM Suite\MPASMWIN.exe" /q /p16F627 "SEGUNDO PARCIAL.asm" /l"SEGUNDO PARCIAL.lst" /e"SEGUNDO PARCIAL.err" /d__DEBUG=1 Error[113] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 28 : Symbol not previously defined (RA0) Error[113] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 31 : Symbol not previously defined (RA0) Message[305] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 41 : Using default destination of 1 (file). Error[113] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 41 : Symbol not previously defined (JUAN.1) Message[305] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 43 : Using default destination of 1 (file). Error[113] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 43 : Symbol not previously defined (PEPE.1) Error[108] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 50 : Illegal character (,) Message[305] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 51 : Using default destination of 1 (file). Error[113] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 51 : Symbol not previously defined (CONTADOR.1) Message[302] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 62 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 64 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 66 : Register in operand not in bank 0. Ensure that bank bits are correct. Message[302] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 68 : Register in operand not in bank 0. Ensure that bank bits are correct. Error[129] D:\TECNICAS II\SEGUNDO PARCIAL.ASM 76 : Expected (END) Halting build on first failure as requested.

POR FAVOR NECESITO SU AYUDA, TENGO QUE ENTREGARLO ANDANDO EN 3 DIAS!...
el programa que hize fue este..
list P=16F627
include P16F627.INC
CONTADOR equ 0x34
PEPE equ 0x35
JUAN equ 0x36
org 0x00
goto main


LOOP clrw
btfss PIR1,RCIF ;se fija si hay dato
goto LOOP
call RECEPCION ;si hay dato llama a RECEPCION
movwf CONTADOR ;guardo dato (para uso en cualquier rutina)
bcf PORTA,3 ;limpio led de apagado
bsf PORTA,2 ; seteo led de encendido
call VELOCIDAD


RECEPCION movf RCREG,W ;guarda dato recibido en acumulador
return


VELOCIDAD movlw b'00001100'
movwf CCP1CON ; activo PWM
SEGUIR movlw b'00001111'
movwf CCPR1L ;configuro velocidad de motor de cinta
ARRIBA btfss PORTA,RA0 ;salta si es alto (si hay que sellar)
goto ARRIBA ;vuelve a testear si no hay que sellar todavia
call RETARDO20
btfss PORTA,RA0 ;me aseguro que no sea un ruido
goto ARRIBA ;vuelve a testear si es un ruido
call PARAR ;llama a rutina de sellado de cajas
goto SEGUIR ;vuelve a encender el motor de cinta si hay que seguir sellando


RETARDO20 movlw .13
movwf PEPE
SALTO2 movlw .254
movwf JUAN
SALTO1 decfsz JUAN.1
goto SALTO1
decfsz PEPE.1
goto SALTO2
return


PARAR clrf CCPR1L ; apago motor de cinta
movlw b'10101010' ;le doy velocidad al motor de sellado
movwf PORTA,RA1 ;enciendo motor se sellado
decfsz CONTADOR.1 ;decremento contador de cajas a sellar
return ;vuelvo a VELOCIDAD si hay que seguir sellando
bcf PORTA,2 ;limpio led de encendido
bsf PORTA,3 ;seteo led de apagado
call LOOP ;vuelvo a esperar un nuevo dato si termine de sellar cajas


main movlw b'00000111'
movwf CMCON ;configuro las entradas como digitales
bsf STATUS,RP0 ;me muevo al banco 1
movlw b'00000010' ;configuro RB1 como entrada (recepcion serial), las demas salidas
movwf TRISB
movlw b'00000001' ;configuro RA0 como entrada (interruptor se sellado), las demas salidas
movwf TRISA
movlw 0x19 ;configuro la velocidad de lectura a 9600 bps
movwf SPBRG
movlw b'00100100' ;habilito la transmicion asincrona por las dudas
movwf TXSTA
bsf STATUS,RP0 ;me muevo al banco 0
movlw b'10010000' ;habilito la recepcion asincrona
movwf RCSTA
goto LOOP


ESPERO SU RESPUESTA POR FAVOR MUCHAS GRACIA!
 
hola, estoy programando un pic 16f84a. tengo el problema de que cuando pongo la directiva en MPLAB

_CONFIG _WDT_OFF & _XT_OSC

me da error diciendo que no se reconoce el caracter "&".

ya intente sin el simbolo, sin espacios y nada.

que estoy haciendo mal? si llamo al archivo p16f84a.inc en el programa.
 
config creo que es con dos barra bajas ej __CONFIG. Un que si, utilizar un programa externo para programar el chip tipo winpic800, lo fusibles se programan en este. Tambien puedes ir a configure-configuration bits y le quitas la pestaña de set to code y lo configuras desde ahi.
 
Buen día a todos:

Estoy haciendo un programa sencillo en lenguaje C para leer la señal de un sensor. La señal será filtrada digitalmente por un dspic30FXXXX.

Cada segundo, la señal resultante del filtrado debe visualizarse en un LCD.

El problema no está en el filtro ni en el LCD. Sucede que al ejecutar la función sprintf() el simulador señala un error de pila: Trap due to stack error, occurred from instruction at 0x001bf0, tras el cual ocurre un reset; y esto es cíclico.

Les pongo aquí un fragmento de la programación, aclarándoles que la función sprintf() la coloqué al principio de main() para ver qué sucedía, pero igual ocurre el error.

Código:
void main(void)
{
	float x=123.45; char m[20]; int y;

	sprintf(m, "%f", x);
	
	FIRFilterInit(&lowpass_5_10_100Filter);
	adc_inicializa();
	timer1_inicializa();
	while(1);	
}

El progrrama sin la función sprintf() funciona excelente, no así cuando la función está presente. ¿Qué estoy haciendo mal?

Por su atención, muchas gracias.
 
Hi,
los errores de stack normalmente son
por falta de memoria de trabajo con
variables locales. Si tienes varias
funciones anidadas la RAM disponible
se va decrementando en cada llamada
a funcion.
:)
 
Muchas gracias por tu respuesta.

Probé utilizando un micro con más memoria y sí funcionó. Al principio yo creí que la librería stdio.h me acaparaba toda la memoria RAM. Pero después caí en la cuenta de que estoy implementando un filtro FIR de orden 60; por lo tanto, el programa reserva 61*2=122 bytes para almacenar los coeficientes y 122bytes para almacenar las muestras, con lo cual ya van 244 bytes. También se reservan bytes para almacenar datos iniciales y de control y son aproximadamente 14 bytes más, lo que nos da un total de 258 bytes. Además, como los buffers deben estar alineados, se desperdician unos cuantos bytes, lo cual deja un espacio miserable para la pila, ya que estoy manejando un dsPIC30F2010 con 512 bytes de RAM.

La verdad, no me había puesto a pensar en eso al principio, por eso te reitero el agradecimiento. Hasta pronto.
 
Atrás
Arriba