problema con interrupción int0

Hola soy nuevo en este foro, y por lo visto hasta el momento es más que interesante.

El problema que tengo es que estoy haciendo un proyecto inalámbrico utilizando el 89s51 y los transceivers rtx-mid. He utilizado código ensamblador, el código funciona bien hasta que cuando quiero volver a iniciar al ciclo mediante la interrupcion int0 esta no responde como si lo había hecho en el primer caso, vamos que el programa ya no salta a la dirección 03H. He probado dos simuladores distintos, y en ambos sucede lo mismo por lo que queda claro que es culpa del código, pero además le ha dado mil vueltas y sigo sin encontrar la causa del problema.

Pego el código a continuación y si alguien fuese tan amable de encontrar el fallo me haría un gran favor. Muchas gracias de antemano.

;RELE

ORG 00H
JMP INICIO

ORG 03H
JMP INT0


ORG 100H

INICIO: MOV IE,#81H
MOV TCON,#01H

CLR P1.0
CLR P1.1

RX: SETB P1.1
ACALL DRX20
SETB P1.0
ACALL DRX200
CLR P1.0
ACALL DRX40
CLR P1.1
ACALL DRX20
SETB P1.1
ACALL DRX200 ;

BUCLE: JMP BUCLE

DRX20: MOV R0,#7
HRX20: DJNZ R0,HRX20
RET

DRX200: MOV R0,#90
HRX200: DJNZ R0,HRX200
RET

DRX40: MOV R0,#16
HRX40: DJNZ R0,HRX40
RET

INT0: MOV PCON,#00H
SETB P1.2
ACALL TX
LJMP RX
RETI

TX: SETB P1.0
ACALL DTX400
SETB P1.3
RET

DTX400: MOV R0,#182
HTX400: DJNZ R0,HTX400
CLR P1.3
RET

END


Muchas gracias, se que puede resultar incomodo el tema del ensamblador, pero a mi me han enseñado así y es lo que utilizo. La mayaoría de llamadas a rutinas son para ajustar los tiempos necearios para el paso de tx y rx del rtx-mid que setean ciertos bits segun mi esquemático.
 
te falta poner SETI en el registro de banderas para activar las interrupciones globales. Tampoco veo donde estas configurando el puerto como entrada ni el flanco de deteccion.
 
te falta poner SETI en el registro de banderas para activar las interrupciones globales. Tampoco veo donde estas configurando el puerto como entrada ni el flanco de deteccion.

El SETI que dices tu es el IE MOV IE,#81H y aquí está activado. Por otra parte, el MOV TCON,#01H indica la activación de la interrupción por flanco. El puerto como entrada no hace falta segun tengo entendido, puesto que es bidireccional.

Creo que el problema no está en lo que indicas, de todos modos muchas gracias antiworldx.

Se aceptan más sugerencias :D
 
De todas formas debes de declararlo como entrada, y si es posible, activa las pull up, y si no tiene, agrega una R de 10K

Hola de nuevo antiworldx el problema que tengo por ahora es lo de la interrupción que una vez se da ya no se vuelve a repetir aunque se active dicha entrada (P3.2) vamos que es de tipo software. Por lo que he leido sí que tiene ese puerto una R de pull up interno, así que creo que no nocesitaré la R externa.

Un saludo y muchas gracias.

He observado el ciclo entero de la interrupción y el problema estaba en que nunca la cerraba, puesto que se quedaba enganchado en el bucle y no había un RET que se ejecutara. Así que he hecho una rutina nueva copiada de la rx y la he llamado desde int0 y la he acabado sin bucle y entonces el ret de esta sí que ejecuta.

Si no ha quedado claro y les interesa haganmelo saber.

Gracias y sobretodo a ti antiworldx por tu interés.
 
Última edición:
Atrás
Arriba