Autor Tema: Necesito ayuda con un programa para un sumo con pic16f84a  (Leído 3359 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado spire233

  • PIC10
  • *
  • Mensajes: 8
Necesito ayuda con un programa para un sumo con pic16f84a
« en: 27 de Enero de 2015, 03:05:50 »
Apenas empiezo en esto de los pic y me dejaron un proyecto de un micro sumo de 10x10cm, el programa hasta donde yo se, esta correcto, no le veo error, al compilarlo no me sale error, pero a la hora de simularlo con el debugger cuando llega a la parte de los retardos al final, en la instruccion return, me envia al inicio y me dice que hay un error CORE-E0002: Stack under flow error occurred from instruction at 0x00001c, me dijeron que puede ser un problema de los retardos, pero no encuentro ninguna solucion, les adjunto el archivo .asm

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Necesito ayuda con un programa para un sumo con pic16f84a
« Respuesta #1 en: 27 de Enero de 2015, 03:13:52 »
Tu problema es simple...

Código: [Seleccionar]
GOTO DETECCIONIZQ
GOTO STOP; DETIENE LOS MOTORES
GOTO RETRO ;SALTA A RETROCEDER
GOTO GIRO_IZQ ;GIRA EL MOTOR IZQUIERDO
GOTO COMIENZA

STOP
MOVLW B'00001100'
MOVWF PORTB ;DETIENE LOS MOTORES
CALL RETARDG ;LLAMA AL RETARDO
RETURN

Si vas a usar GOTO, para volver vas a necesitar un GOTO tambien.

Si vas a usar RETURN, asegurarte de llamarlo con un CALL, el CALL guarda la direccion donde estaba (Program counter - PC)  en la pila ( stack )  y luego el RETURN devuelve el ultimo valor ingresado a la pila al PC.
Al usar GOTO no se guarda en la pila ninguna direccion. Tu problema lo mas seguro ocurre luego del CALL RETARDG ( Aca llamas a tu retardo, agregando la direccion en la pila y luego con el return carga nuevamente el PC dejando a la pila sin direcciones), luego de ese CALL esta el RETURN, pero vos fuiste con un GOTO, entonces no hay ninguna direccion de memoria guardada en el stack, al intentar sacar algo que no hay en el stack te tira el error, por eso el underflow.

En fin para solucionarlo , cambia los GOTO por CALL en DETECCIONIZQ y DETECCIONDER. Los RETURN de DETECCIONIZQ y DETECCIONDER no tienen sentido podrias borrarlos ya que arriba hay un GOTO al comienzo de la rutina.


PD: Esto iria en Almacen de Assembler y no en Basic  :)
« Última modificación: 27 de Enero de 2015, 03:44:04 por KILLERJC »

Desconectado spire233

  • PIC10
  • *
  • Mensajes: 8
Re: Necesito ayuda con un programa para un sumo con pic16f84a
« Respuesta #2 en: 27 de Enero de 2015, 04:58:40 »
ok, realizare los cambios, no sabia eso de los goto y de los recall, en la escuela no nos explican bien cada funcion :/, y perdon es que no sabia si si iria en esta seccion o en otra. de todas formas, hare las modificaciones  :) gracias!, comentare si se arreglo o no

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Necesito ayuda con un programa para un sumo con pic16f84a
« Respuesta #3 en: 27 de Enero de 2015, 08:46:41 »
Eso basicamente esta explicado en el datasheet. Incluso no hay que leerse todo, mirando las instrucciones y la explicacion que viene adjunta y esta en la misma seccion lo ves.

Syntax: [ label ] CALL k
Operands: 0 £ k £ 2047
Operation: (PC)+ 1 -> TOS ( Top Of Stack ),
k -> PC<10:0>,
(PCLATH<4:3>) -> PC<12:11>

y

Syntax: [ label ] RETURN
Operands: None
Operation: TOS -> PC
Status Affected: None


Para que compares aca tenes el GOTO

Syntax: [ label ] GOTO k
Operands: 0 £ k £ 2047
Operation: k -> PC<10:0>
PCLATH<4:3> -> PC<12:11>


Por ultimo observaras que cuando el codigo es grande y hay que llamar a una funcion en otra parte, hay que tener cuidado con poner bien el valor de PCLATH , pero como tu codigo es corto no vas a tener problema.