ayuda programa PIC16F877A

fluxworm

Bovino maduro
#1
hola a todos los bakunos bueno la cuestion esta en que estoy haciendo un programa en el pic16877a y este programa lleva interrupciones la cuestion esta en que cuando mando llamar una interrupcion no la hace la verdad nunca he manejado interrupciones y ya le movi de muchas maneras al programa y nada de nada.
empezare explicando como es la logica de el programa para ver si me pueden echar la mano.
el PIC16F877A tendra como salida los 8 puertos estos puertos son los puertos B despues se tendra un boton el cual al momento de estarle dando un botonaso debera incrementar en 1 por lo que cada led se ira encendiendo de acuerdo a la cuenta que se lleve en el boton despues se tendra una salida de el pic en el cual se pondra un led este led es el de la interrupcion ya que la interrupcion sera interna cada ves que cuente hasta 255 se tendra que desbordar el TMR0 y encender el led despues de eso se tendra que apagar en si lo que este led estara haciendo es nada mas prender y apagar por cada desbordamiento.
ahora aqui les pongo el codigo hasta ahorita llevo lo de el boton y la cuenta de incremento pero no logro activar las interrupciones.
bueno espero que me puedan ayudar gracias.
pongo el codigo en descarga directa ya que esta muy largo el programa

bueno aqui les pongo una imagen de mas o menos como va el circuito para que concuerde con el programa.
 

rleonmx

Bovino Milenario
#2
que interrupcion estas usando?
ya lo simulaste en el mplab?

aqui tu codigo para comentar:
http://pastebin.com/m7855703

los comandos tris son para otros modelos mejor usa mov estando en el banco correcto con las lineas 63 y 65

para que las subrutinas CONFPORT CONFTIMER si solo las ejecutas al principio? mejor ponlas sin subrutina para mayorclaridad
la subrutina INCREMENTA de que llamas en 53 a donde esta?

sigo sin ver que interrupcion quieres usar
 

fluxworm

Bovino maduro
#3
hola rleonmx

hola rleonmx bueno antes que nada gracias por checar el programa pero esta media rara la pagina a donde subiste el codigo ya que esta pagina de internet no lo muestra todo como subi el codigo en .asm cuando lo bajes lo puede abrir con el bloc de notas ahi si checas biene el codigo completo en la pagina donde posteaste el codigo todavia le falta por mostrar porque el incrementa esta hasta abajo despues de configuracion interupciones
 

fluxworm

Bovino maduro
#5
bueno mas que nada el confport y conftimer las uso para poder separar las intrucciones que son solo para puertos y las instrucciones que son solo para timer asi de esta maner la puedo categorizar todo el codigo cada una de estas subrutinas las mando a llamar por medio de un call bueno es la manera mas facil que veo de programar ya que si lo revuelvo todo no le voy a entender.
estoy usando interrupciones internas ya que el timer cada ves que se deborda manda llamar la interrupcion para encender el led y si ya esta simulado en MPLAB y sin errores el problema solo se centra en la parte que es la de la direccion:
ORG 04 ahi mando llamar la interrupcion

y tambien el la parte de codigo que es la de
CONFISR en esta etiqueta comienza la subrutina de configuracion de las interrupciones
ISR en esta etiqueta comienzan la subrutina de la interrupcion
en estas dos subrutinas es en las que estoy batllando ya que no logro encender el led cada ves que se desborda.
 

mcpiebot

Bovino adicto
#6
que tal?

no se si todavia te sirva pero encontre un par de errores en tu codigo

en la subrutina CONFISR, terminas con un retfie, lo cual es incorrecto
ya que retfie se debe usar para terminar SOLO las subrutinas de interrupcion.
asi que CONFISR debe terminar con un return.

en el caso de la subrutina ISR, la terminas con un return, siendo que supone ser una
subrutina de interrupcion, entonces, debe terminar forzosamente, con un RETFIE.

tambien, dentro de ISR modificas el bit GIE, este se modifica automaaticamente, por lo que no necesita ser modificado.

y tambien en esa subrutina, haces mal el respaldo y recuperarcion tanto de WREG como del registro STATUS, en la hoja de datos del 16F877 viene un ejemplo muy descriptivo de como hacerlo bien.

Son los errores que encontre, a mi parecer corrigiendolos tu codigo ya deberia funcionar.
Si tienes alguna duda, estamos en contacto por este medio, Saludos!!
 
Arriba