Autor Tema: Duda sobre RB0 como interrupción externa 16f877a  (Leído 5017 veces)

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

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Duda sobre RB0 como interrupción externa 16f877a
« en: 22 de Octubre de 2007, 20:02:20 »
Hola, a ver si alguien me puede decir que me está pasando, estoy usando un pic16f877a para capturar la señal de un receptor de mando a distancia, su salida es una línea, y esta línea la conecto al RB0, que está configurado como interrupción externa, pero no sé si es posible hacer lo que quiero con este pin, o estoy haciendo algo mal en el soft.

Me ocurre lo siguiente, la salida del receptor se encuentra a nivel alto, cuando al receptor le llega una señal, da la siguiente salida: Canal 0 receptor de IR



Esta es la salida sin conectar a la pata RB0 del pic, pero me ocurre lo siguiente, cuando lo conecto al pic, este se mete en la interrupción en su isr al recibir el primer flanco de bajada, y después sale y vuelve al programa principal, pero me ocurre que el RB0 me tira la entrada a cero, es decir cuando conecto la señal anterior al pic, obtengo esto:



Como podéis ver deja la entrada de RB0 a cero, independientemente de la salida del receptor, es decir, es como si una vez que entra en la interrupción el RB0 se dejase de leer, el pic lo pone a cero, no se si esto es así, o tengo algún problema en el soft o hard.

Una vez que sale de la interrupción puedo volver a entrar al presionar un botón del mando y detectar otro flanco de bajada, dentro de la interrupción la única instrucción que hago sobre el pin RB0 es un BTFSS PORTB,0 para saber si está a 1 o a 0, y se queda a cero saliendo de la interrupción por una señal de error que enciende un led cuando se excede un tiempo máximo.

A ver si alguien puede decirme si es posible hacer esto que quiero con el pin RB0 y tengo el problema en otro lado, o no es posible. Gracias
« Última modificación: 22 de Octubre de 2007, 20:08:05 por Jorge555 »

Desconectado microcom

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 568
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #1 en: 22 de Octubre de 2007, 22:02:59 »
anexa el
 codigo
saludos

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #2 en: 22 de Octubre de 2007, 22:24:18 »
El código de la interrupción es este, no he podido ver aún como funciona porque me encuentro con la línea a cero, tb he probado a deshanilitar el bit 4 de INTCON al inicio, pero obtengo el mismo resultado. Sale con la condición de error encendiendome el led3, puede que alguna condición lógica este erronea, lo que se supone que hace es al principio del bucle mira si el bit de entrada cambia, si cambia comprueba cuantos segundos ha pasado y escribe uno o cero en los registros de datos, si no cambia incrementa el contador y vuelve al principio, por todos los caminos tarda unos 50 uS en realizarse. Si pasan 10 ms sin cambia sale con error.

Pero el problema es que me baja la línea, no sé si es por el código.


Código: [Seleccionar]
;*************************** INTERRUPCIONES*************************************************************

ISR
MOVWF W_TEMP ;Salva W y Status
SWAPF STATUS,0
MOVWF STATUS_TEMP
BSF LED2
BCF LED1
BCF LED3
CLRF TICTAC
CLRF DATO1IR
CLRF DATO2IR
CLRF CONTADOR1
CLRF INT_CONTROL ;bit 7 entrada IR, bit 3 y 4 cambio de byte y salida, bit 0:2 contador
CLRF INT_CONTROL_OLD


ISR_LOOP

; ********* Se mira el pin de entrada, si no cambia se va a SUBIR_TIC ************************


BTFSS IR ;Si es cero se ejecuta la siguiente,PORTB,0 ;0.2
GOTO PONER_A_CERO ;---->0.6
BSF INT_CONTROL,7 ;0.4
GOTO COMP_ENTRADA ;---->0.8
PONER_A_CERO ;
BCF INT_CONTROL,7 ;0.8
COMP_ENTRADA ;<----0.8
MOVFW INT_CONTROL_OLD ;1
XORWF INT_CONTROL,W ;Si son iguales Z=1 ;1.2
BTFSC STATUS,Z ;Si es 1 se ejecuta la siguiente ;1.4
GOTO SUBIR_TIC ;--->1.8

;          ********* El pin de entrada a cambiado, en función de los tics damos 1 o 0 *****************


INCF TICTAC,F ;1.6

;          ********* TIC menos 8 mS error, mayor de 8 mS escribir cero, mayor 1.7 mS escribir uno *****

MOVLW D'160' ;2 Tics = 0.1 mS ;1.8
SUBWF TICTAC,W ;2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.2
GOTO INICIO_CERO_UNO ;--->2.6
;
MOVLW D'76' ;2 Tics = 0.1 mS ;2.4
SUBWF TICTAC,W ;2.6
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.8
GOTO  INICIO_CERO_UNO ;---->3.2
;
MOVLW D'34' ;2 Tics = 0.1 mS ;3
SUBWF TICTAC,W ;3.2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;3.4
GOTO ALMACENAR_UNO ;---->3.8
;
MOVLW D'16' ;2 Tics = 0.1 mS ;3.6
SUBWF TICTAC,W ;3.8
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;4
GOTO ALMACENAR_CERO ;----->4.4
;
GOTO ERROR_IR ;----->4.4
;
INICIO_CERO_UNO ;<----3.2
NOP ;3.4
NOP ;3.6
NOP ;3.8
NOP ;4
NOP ;4.2
NOP ;4.4
NOP ;4.6
NOP ;4.8
NOP ;5
NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8

ALMACENAR_CERO ;<-----4.4
BCF PIN_PRUEBA
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas. ;4.6
GOTO ALMACENAR_DATO2 ;------>5
RLF DATO1IR,F ;4.8
NOP ;5
NOP ;5.2
; NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
ALMACENAR_DATO2 ;<-----5
RLF DATO2IR,F ;5.2
; NOP ;5.4
GOTO ALMACENAR_SALIDA ;------->5.8
;
ALMACENAR_UNO ;<------3.8
BSF PIN_PRUEBA
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas. ;4
GOTO ALMACENAR_DATO2_1 ;----->4.4
RLF DATO1IR,F ;4.2
INCF DATO1IR,F ;4.4
NOP ;4.6
NOP ;4.8
NOP ;5
; NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
ALMACENAR_DATO2_1 ;<-----4.4
RLF DATO2IR,F ;4.6
INCF DATO2IR,F ;4.8
NOP ;5
; NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
;
ERROR_IR ;
CLRF DATO1IR ;
CLRF DATO2IR ;
BSF LED3 ;
BCF LED2 ;
GOTO POP ;

ALMACENAR_SALIDA ;<---- 5.8
BTFSC INT_CONTROL,4    ;Si el bit 4 es uno se ejecuta la siguiente, vale 16 o mas. ;6
GOTO DATOS_A_LCD ;
INCF INT_CONTROL,F ;6.2
MOVFW INT_CONTROL ;6.4
MOVWF INT_CONTROL_OLD ;6.6
;DELAYS ;43uS
MOVLW D'71' ;6.8
MOVWF DELAY4 ;7
Delay_4loop ;71*3*0.2=42.6
DECFSZ DELAY4,f ;
GOTO Delay_4loop ;

GOTO ISR_LOOP ;50

SUBIR_TIC ;<-----1.8
MOVLW D'200' ;2 Tics = 0.1 mS ;2
SUBWF TICTAC,W ;2.2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.4
GOTO  ERROR_IR ;
INCF TICTAC,F ;2.6
;DELAYS ;
MOVLW D'77' ;2.8
MOVWF DELAY5 ;3
Delay_5loop ;77*3*0.2=46.2
DECFSZ DELAY5,f ;
GOTO Delay_5loop ;
NOP ;49.4
NOP ;49.6
GOTO ISR_LOOP ;50


DATOS_A_LCD

MOVFW DATO1IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR

MOVLW B'11000000'
CALL LCD_COMANDO

MOVFW DATO2IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR

POP
SWAPF STATUS_TEMP,0
MOVWF STATUS
MOVFW W_TEMP
BCF INTCON,INTF
BCF LED2
RETFIE

Luego en el banco0
   MOVLW B'10010000'
   MOVWF INTCON      ;GIE e INTE, bit 1 flag de INTE
y en el 1
   BCF OPTION_REG,INTEDG   ;Flanco de bajada

el portb.0 está configurado como entrada

Me gustaría saber si es posible leer una comunicación serie por el RB0 y a la vez que se use como interrupción para detectar la entrada de esa comunicación, esta es mi duda.
Llevo un rato dandole vueltas y no consigo ver donde me equivoco, llevo poco tiempo con esto de los pics asi que puede ser cualquier tontería. Gracias. Saludos
« Última modificación: 22 de Octubre de 2007, 23:12:40 por Jorge555 »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #3 en: 22 de Octubre de 2007, 23:13:54 »
Hola Jorge.

Primero: asegurate que el pin RB0 esté como entrada y estes trabajando en el banco 0 del PIC(STATUS,RP0=0).
Segundo: Publicá el código completo porque el problema puede estar en el lado menos pensado del programa.

¿Estás conectando la salida del IR directamente al pin RB0 o pusiste algun componente en el medio?

Espero a que me respondas eso.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #4 en: 22 de Octubre de 2007, 23:34:15 »
Es un poco largo y no se si se entenderá bien, ya que estoy aprendiendo y voy haciendo programillas para probar las distintas cosas, la finalidad de este es capturar los comandos de un mando jvc, y mostrar el valor de los botones en un lcd de 2x16, cristal de 20 MHz.

Como receptor estoy usando un tsop 1738, son 3 pines Vcc, GND y salida, le he puesto una resistencia de pull-up con la salida como indica el data, y un condensador de 10uF entre la salida y tierra,  para eliminar transistorios que disparán la interrupción, el pic conectado directo a la salida del tsop. Por separado el circuito receptor funciona bien, al unirlo al pic mantiene la línea en nivel alto hasta que llega el primer pulso que la baja (como debe hacer), pero después de eso se queda en nivel bajo mientras debería subir (por lo que me hace sospechar de algo del pic), no creo que el problema esté en el hard ya que es muy sencillo, debe ser algo del programa que aún no he podido probar (sobre todo los tiempos) por esta línea, llevo poco con esto y aún me falta mucho que aprender.
Bueno pego ya el código. Gracias

Código: [Seleccionar]
list p=16F877a
#include p16F877a.inc


__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF

;******************************* DEFINICIONES***************************************************

#DEFINE LED1 PORTA,3 ;Rojo
#DEFINE LED2 PORTA,5 ;Azul
#DEFINE LED3 PORTC,5 ;Verde
#DEFINE PULSADOR2 PORTA,1
#DEFINE DATO0 PORTD,0
#DEFINE DATO1 PORTD,1
#DEFINE DATO2 PORTD,2
#DEFINE DATO3 PORTD,3
#DEFINE DATO4 PORTD,4
#DEFINE DATO5 PORTD,5
#DEFINE DATO6 PORTD,6
#DEFINE DATO7 PORTD,7
#DEFINE ENABLE PORTE,2
#DEFINE RS PORTE,0
#DEFINE W_R PORTE,1
#DEFINE LCD_DATOS PORTD
#DEFINE LCD_CTRL PORTE
#DEFINE IR PORTB,0
#DEFINE PIN_PRUEBA PORTA,0
#DEFINE PIN_PRUEBA2 PORTA,2

;****************************** REGISTROS RAM ***************************************************

cblock 0x20
Delay0
Delay1
Delay2
Delay3
DELAY4
DELAY5
W_TEMP
STATUS_TEMP
CUENTA
UNIDADES
DECENAS
CENTENAS
DATO1IR
DATO2IR
TICTAC
INT_CONTROL
INT_CONTROL_OLD
CONTADOR1

endc

;**************************** POSICIONES *********************************************************

ORG 0 ; Posición de memoria donde se coloca la instrucción.
GOTO Start ; Salto a Start, se ejecutará la instrucción debajo de Start.

ORG 4
GOTO ISR

ORG 5 ; Salta el vector de interrupción

;***************************** CONFIGURAR REGISTROS ************************************************

Start ; Inicio del programa

; ****************** BANCO 0 **************************************************************
BCF STATUS, RP0
BCF STATUS, RP1 ; Seleciona el Bank0

CLRF PORTA ; Initialize poerts by clearing output
CLRF PORTB ; data latches
CLRF PORTC
CLRF PORTD
CLRF PORTE

MOVLW B'10010000'
MOVWF INTCON ;GIE e INTE, bit 1 flag de INTE



; ******************** BANCO 1 **************************************************************

BSF STATUS,RP0 ; select Register Page 1

BCF OPTION_REG,INTEDG ;Flanco de bajada

MOVLW B'00000111'
MOVWF TRISA
MOVLW B'00000001'
MOVWF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE

MOVLW 0X06 ;Configurar los pin de A
MOVWF ADCON1 ;como entradas digitales.


BCF STATUS, RP0 ;Bank0


;************************ INICIO SOFT ****************************************************************

BSF LED2 ;Parpadeo de Reset
CALL Delay_2
BCF LED2

CALL INICIALIZA_LCD
MOVLW B'00000001' ;Clear Display
CALL LCD_COMANDO
MOVLW B'00000110' ;Entry mode set
CALL LCD_COMANDO
MOVLW B'00001110' ;Activa lcd y cursor
CALL LCD_COMANDO


;************************** PROGRAMA PRINCIPAL ********************************************************

MAIN_LOOP
BSF LED1
CALL Delay_2
BCF LED1
CALL Delay_2
GOTO MAIN_LOOP

;*************************** INTERRUPCIONES*************************************************************

ISR
MOVWF W_TEMP ;Salva W y Status
SWAPF STATUS,0
MOVWF STATUS_TEMP
BSF LED2
BCF LED1
BCF LED3
CLRF TICTAC
CLRF DATO1IR
CLRF DATO2IR
CLRF CONTADOR1
CLRF INT_CONTROL ;bit 7 entrada IR, bit 3 y 4 cambio de byte y salida, bit 0:2 contador
CLRF INT_CONTROL_OLD


ISR_LOOP

; ********* Se mira el pin de entrada, si no cambia se va a SUBIR_TIC ************************


BTFSS IR ;Si es cero se ejecuta la siguiente,PORTB,0 ;0.2
GOTO PONER_A_CERO ;---->0.6
BSF INT_CONTROL,7 ;0.4
GOTO COMP_ENTRADA ;---->0.8
PONER_A_CERO ;
BCF INT_CONTROL,7 ;0.8
COMP_ENTRADA ;<----0.8
MOVFW INT_CONTROL_OLD ;1
XORWF INT_CONTROL,W ;Si son iguales Z=1 ;1.2
BTFSC STATUS,Z ;Si es 1 se ejecuta la siguiente ;1.4
GOTO SUBIR_TIC ;--->1.8

;          ********* El pin de entrada a cambiado, en función de los tics damos 1 o 0 *****************


INCF TICTAC,F ;1.6

;          ********* TIC menos 8 mS error, mayor de 8 mS escribir cero, mayor 1.7 mS escribir uno *****

MOVLW D'160' ;2 Tics = 0.1 mS ;1.8
SUBWF TICTAC,W ;2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.2
GOTO INICIO_CERO_UNO ;--->2.6
;
MOVLW D'76' ;2 Tics = 0.1 mS ;2.4
SUBWF TICTAC,W ;2.6
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.8
GOTO  INICIO_CERO_UNO ;---->3.2
;
MOVLW D'34' ;2 Tics = 0.1 mS ;3
SUBWF TICTAC,W ;3.2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;3.4
GOTO ALMACENAR_UNO ;---->3.8
;
MOVLW D'16' ;2 Tics = 0.1 mS ;3.6
SUBWF TICTAC,W ;3.8
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;4
GOTO ALMACENAR_CERO ;----->4.4
;
GOTO ERROR_IR ;----->4.4
;
INICIO_CERO_UNO ;<----3.2
NOP ;3.4
NOP ;3.6
NOP ;3.8
NOP ;4
NOP ;4.2
NOP ;4.4
NOP ;4.6
NOP ;4.8
NOP ;5
NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8

ALMACENAR_CERO ;<-----4.4
BCF PIN_PRUEBA
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas. ;4.6
GOTO ALMACENAR_DATO2 ;------>5
RLF DATO1IR,F ;4.8
NOP ;5
NOP ;5.2
; NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
ALMACENAR_DATO2 ;<-----5
RLF DATO2IR,F ;5.2
; NOP ;5.4
GOTO ALMACENAR_SALIDA ;------->5.8
;
ALMACENAR_UNO ;<------3.8
BSF PIN_PRUEBA
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas. ;4
GOTO ALMACENAR_DATO2_1 ;----->4.4
RLF DATO1IR,F ;4.2
INCF DATO1IR,F ;4.4
NOP ;4.6
NOP ;4.8
NOP ;5
; NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
ALMACENAR_DATO2_1 ;<-----4.4
RLF DATO2IR,F ;4.6
INCF DATO2IR,F ;4.8
NOP ;5
; NOP ;5.2
NOP ;5.4
GOTO ALMACENAR_SALIDA ;------>5.8
;
ERROR_IR ;
CLRF DATO1IR ;
CLRF DATO2IR ;
BSF LED3 ;
BCF LED2 ;
GOTO POP ;

ALMACENAR_SALIDA ;<---- 5.8
BTFSC INT_CONTROL,4    ;Si el bit 4 es uno se ejecuta la siguiente, vale 16 o mas. ;6
GOTO DATOS_A_LCD ;
INCF INT_CONTROL,F ;6.2
MOVFW INT_CONTROL ;6.4
MOVWF INT_CONTROL_OLD ;6.6
;DELAYS ;43uS
MOVLW D'71' ;6.8
MOVWF DELAY4 ;7
Delay_4loop ;71*3*0.2=42.6
DECFSZ DELAY4,f ;
GOTO Delay_4loop ;

GOTO ISR_LOOP ;50

SUBIR_TIC ;<-----1.8
MOVLW D'200' ;2 Tics = 0.1 mS ;2
SUBWF TICTAC,W ;2.2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;2.4
GOTO  ERROR_IR ;
INCF TICTAC,F ;2.6
;DELAYS ;
MOVLW D'77' ;2.8
MOVWF DELAY5 ;3
Delay_5loop ;77*3*0.2=46.2
DECFSZ DELAY5,f ;
GOTO Delay_5loop ;
NOP ;49.4
NOP ;49.6
GOTO ISR_LOOP ;50


DATOS_A_LCD

MOVFW DATO1IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR

MOVLW B'11000000'
CALL LCD_COMANDO

MOVFW DATO2IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR

POP
SWAPF STATUS_TEMP,0
MOVWF STATUS
MOVFW W_TEMP
BCF INTCON,INTF
BCF LED2
RETFIE

;********************************** LCD ****************************************************************

INICIALIZA_LCD
CALL Delay
CLRF LCD_CTRL
MOVLW B'00111000' ;8 bits, 2 líneas y 5x8 puntos
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

LCD_E
BSF ENABLE
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BCF ENABLE
RETURN

LCD_COMANDO
CLRF LCD_CTRL
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

LCD_ESCRIBIR
CLRF LCD_CTRL
BSF RS
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

;********************************** BINARIO A LCD *****************************************************

BINARIO_LCD ;Para registros de 8 bits, convierte a centenas, decenas y unidades.

MOVWF CUENTA
CLRF UNIDADES
CLRF DECENAS
CLRF CENTENAS

CENT_LOOP
MOVLW D'100'
SUBWF CUENTA,W
BTFSS STATUS,C
GOTO DEC_LOOP
INCF CENTENAS,F
MOVWF CUENTA
GOTO CENT_LOOP
DEC_LOOP
MOVLW D'10'
SUBWF CUENTA,W
BTFSS STATUS,C
GOTO UNIDAD
INCF DECENAS,F
MOVWF CUENTA
GOTO DEC_LOOP
UNIDAD
MOVF CUENTA,W
MOVWF UNIDADES

MOVLW B'00110000' ;Para el LCD
ADDWF CENTENAS,1
ADDWF DECENAS,1
ADDWF UNIDADES,1

RETURN

;********************************** DELAYS *************************************************************

Delay ;20 mS
MOVLW D'65'
MOVWF Delay1
Delay_loop
decfsz Delay0,f
goto Delay_loop
decfsz Delay1,f
goto Delay_loop

RETURN

Delay_2 ;0.86 s
MOVLW D'22'
MOVWF Delay2
Delay_2loop
decfsz Delay0,f
goto Delay_2loop
decfsz Delay1,f
goto Delay_2loop

decfsz Delay2,f
goto Delay_2loop
return

Delay_3
MOVLW D'82'
MOVWF Delay3
Delay_3loop
DECFSZ Delay3,f
GOTO Delay_3loop
RETURN

end
« Última modificación: 22 de Octubre de 2007, 23:50:05 por Jorge555 »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #5 en: 23 de Octubre de 2007, 00:51:12 »
Hola Jorge. Estuve simulando tu programa, y no encuentro error alguno. El programa se comporta como debería. Asegurate que no hayas puesto una pull up excedida en resistencia y no estes frente a un componente electronico(SENSOR IR  o PIC) defectuoso. Por lo que estuve probando el soft funciona perfecto...

Las capturas de los estados logicos del PIN RB0, ¿cómo las obtuviste?¿Seguro que son correctas?

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #6 en: 23 de Octubre de 2007, 01:14:32 »
Hola, el sensor IR funciona bien por separado, el pic lo he probado en dos, y pasa lo mismo, voy a buscar un tercero. La resistencia de pull-up es de 13k, supongo que la impedancia de entrada de la pata del pic será mucho más alta, por lo que no debería afectar.

Los estados lógicos de RB0, no he podido capturarlo porque se pone la línea a cero, en teoría los capturas por ancho de pulso, la señal del mando comienza con un pulso de 8.4 ms, seguido de uno de 4.2 ms para inidicar inicio de transmisión, y luego manda dos bytes, hay que contar el tiempo entre los flancos de bajada, un 1 se corresponde con 2.1 ms y un cero con 1.05 ms.

Por eso la rutina de la interrupción está pensada para que tarde 50 uS por todos los caminos que pueda tomar (aún me falta ver que está bien los tiempos y que funciona correctamente), y cada vez que hace el bucle incremento un contador en pasos de 50 us. Al inicio del bucle comparo el estado del pin RB0 con su estado anterior, guardados en el bit 7 de INT_CONTROL e INT_CONTROL_OLD, y si cambia miro el contador de TICTAC, cuanto se ha incrementado para saber si es un cero, un uno o condición de inicio, si no cambia solo se incrementa el contador después de esperar 50 uS y si se excede un tiempo máximo sale con una condición de erro, de igual manera si en el cambio no alcanza un tiempo mínimo sale con el ERROR_IR.

Para saber en que registro tengo que almacenar el dato ya que son dos, utilizo los 3 bits bajos de INT_CONTROL para llevar la cuenta, cuando se activa el cuarto sé que ya he escrito los 8 del primer byte, y cuando se pone a 1 el quinto, que se han escrito los 8 del segundo, por lo que escribe el dato en el LCD y sale.

La idea es esta, pero no he podido comprobar nada porque se me pone la línea de RB0 a cero, y he estado mirando datasheets y no he visto el motivo, tb he probado a quitar el bit que activa la interrupción externa dentro del isr, y volver a activarlo a su salida, a ver si era algo de eso pero ocurre lo mismo. No sé donde puede estar el problema, o es que si no se puede leer un bit de entrada cuando ha sido usado para dispara una interrupción.

No sé, se me ha ocurrido hacerlo de esta manera para leer el mando, habra mejores formas, pero ahora tengo la duda de porque se pone a cero ese bit y si se puede usar.

Para capturar el puerto RB0 estoy usando un analizador lógico de PC, uno de estos http://www.rockylogic.com/products/ant8.html , lo tengo desde hace un par de días, supongo que no me engañara.

Gracias por meterlo en el simulador    :)  Saludos.

« Última modificación: 23 de Octubre de 2007, 01:16:43 por Jorge555 »

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #7 en: 23 de Octubre de 2007, 01:37:09 »
Bueno pues acabó de ver el fallo, después de llevar toda la noche comiendome la cabeza con el pic, es el condensador que había puesto para eliminar los transitorios que se meten en el sensor, y ademas de transitorios me eliminaba la señal  :D  :D . Si son muy molestos pues tendré que poner otro filtro, porque con condensadores más bajos se me sigue disparando, pero bueno eso es otra historia, o si no los trato por soft.

Está puesto entre la señal de salida y tierra, por lo que al recibir la señal a una frecuencia elevada su resistencia es baja, y me tira la salida, Rc = 1/2*pi*f*c
si no recuerdo mal, que a una frecuencia de 200 hz (50 ms), que es más o menos a la que se repiten los bytes que manda el mando (o incluso mayor si miramos los bits), me deja con una resistencia de 80 ohmios, c= 10 uF entre RB0 y tierra, acabo de quitarlo y claro está, funciona  :-/

Ahora ya consigo tener la señal en RB0, se me sigue poniendo la señal de error porque algún tiempo o alguna condición está mal, pero eso es más fácil de buscar, esto me pasa por poner condensadores sin pensar  :D  :D

Pero aún asi la duda, por que con el pin al aire funcionaba con ese condensador, y al conectarlo a la entrada del pic no? debería eliminar la señal en ambos casos no?

Gracias por vuestro tiempo. Saludos
« Última modificación: 23 de Octubre de 2007, 03:02:05 por Jorge555 »

Desconectado alogic.on

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 772
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #8 en: 23 de Octubre de 2007, 06:03:39 »
hola pienso que para leer los datos que salen de un mando deberias de usar uno de los perifericos de ese pic, tiene usart, spi e i2c, lo mas probable es que el mando envie por una usart configurada asincrona, y a X baudios. Si es asi, el dato recibido por el pic se almacena en RCREG,una vez terminada la trans/recepcion se pone a uno la bandera PIR1,RCIF y salta la interrupcion si esta activada.
una vez estas dentro de la interrupcion haces con el dato almacenado en RCREG lo que necesites

un saludo espero te de alguna idea

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #9 en: 23 de Octubre de 2007, 11:16:34 »
Pues no lo se aún no me he puesto con los protocolos series, pero puede ser una manera de hacerlo, el i2c son dos hilos por lo que no me valdría, y los unicos pines que me quedan libres son los de la usart, será lo siguiente con lo que me ponga. Saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #10 en: 23 de Octubre de 2007, 16:13:56 »
Hola Jorge! me alegro que hayas dado con el problema. No me parece incorrecto el método que estás usando.

... si no recuerdo mal, que a una frecuencia de 200 hz (50 ms), que es más o menos a la que se repiten los bytes que manda el mando...

Ojo! Que 200Hz son 5ms, no 50.

Cualquier cosita por acá andamos. Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #11 en: 23 de Octubre de 2007, 19:56:56 »
Hola, después de un rato pegandome con el programa he conseguido que me funcione, pero hay un pequeño error que no consigo ver, primero el código completo y luego lo que me pasa

Código: [Seleccionar]
list p=16F877a
#include p16F877a.inc


__CONFIG _CP_OFF & _WDT_OFF & _HS_OSC & _LVP_OFF & _BODEN_OFF

;******************************* DEFINICIONES***************************************************

#DEFINE LED1 PORTA,3 ;Rojo
#DEFINE LED2 PORTA,5 ;Azul
#DEFINE LED3 PORTC,5 ;Verde
#DEFINE PULSADOR2 PORTA,1
#DEFINE DATO0 PORTD,0
#DEFINE DATO1 PORTD,1
#DEFINE DATO2 PORTD,2
#DEFINE DATO3 PORTD,3
#DEFINE DATO4 PORTD,4
#DEFINE DATO5 PORTD,5
#DEFINE DATO6 PORTD,6
#DEFINE DATO7 PORTD,7
#DEFINE ENABLE PORTE,2
#DEFINE RS PORTE,0
#DEFINE W_R PORTE,1
#DEFINE LCD_DATOS PORTD
#DEFINE LCD_CTRL PORTE
#DEFINE IR PORTB,0
#DEFINE PIN_PRUEBA PORTA,0
#DEFINE PIN_PRUEBA2 PORTA,2
#DEFINE PIN_PRUEBA3 PORTC,0

;****************************** REGISTROS RAM ***************************************************

cblock 0x20
Delay0 ; Assign an address to label Delay1
Delay1
Delay2
Delay3
DELAY4
DELAY5
W_TEMP
STATUS_TEMP
CUENTA
UNIDADES
DECENAS
CENTENAS
DATO1IR
DATO2IR
TICTAC
INT_CONTROL
INT_CONTROL_OLD
CONTADOR1

endc

;**************************** POSICIONES *********************************************************

ORG 0 ; Posición de memoria donde se coloca la instrucción.
GOTO Start ; Salto a Start, se ejecutará la instrucción debajo de Start.

ORG 4
GOTO ISR

ORG 5 ; Salta el vector de interrupción

;***************************** CONFIGURAR REGISTROS ************************************************

Start ; Inicio del programa

; ****************** BANCO 0 **************************************************************
BCF STATUS, RP0
BCF STATUS, RP1 ; Seleciona el Bank0

CLRF PORTA ; Initialize poerts by clearing output
CLRF PORTB ; data latches
CLRF PORTC
CLRF PORTD
CLRF PORTE

MOVLW B'10010000'
MOVWF INTCON ;GIE e INTE, bit 1 flag de INTE


; ******************** BANCO 1 **************************************************************

BSF STATUS,RP0 ; select Register Page 1

BCF OPTION_REG,INTEDG ;Flanco de bajada

MOVLW B'00000000' ;Interruptores son entradas
MOVWF TRISA
MOVLW B'00000001'
MOVWF TRISB
CLRF TRISC
CLRF TRISD
CLRF TRISE

MOVLW 0X06 ;Configurar los pin de A
MOVWF ADCON1 ;como entradas digitales.

BCF STATUS, RP0 ;Bank0


;************************ INICIO SOFT ****************************************************************

BSF LED2 ;Parpadeo de Reset
CALL Delay_2
BCF LED2

CALL INICIALIZA_LCD
MOVLW B'00000001' ;Clear Display
CALL LCD_COMANDO
MOVLW B'00000110' ;Entry mode set
CALL LCD_COMANDO
MOVLW B'00001110' ;Activa lcd y cursor
CALL LCD_COMANDO

BCF PIN_PRUEBA2
BCF PIN_PRUEBA


;************************** PROGRAMA PRINCIPAL ********************************************************

MAIN_LOOP
BSF LED1
CALL Delay_2
BCF LED1
CALL Delay_2

GOTO MAIN_LOOP

;*************************** INTERRUPCIONES*************************************************************

ISR

MOVWF W_TEMP ;Salva W y Status
SWAPF STATUS,0
MOVWF STATUS_TEMP
BSF LED2
BCF LED1
BCF LED3
CLRF TICTAC
CLRF DATO1IR
CLRF DATO2IR
CLRF CONTADOR1
CLRF INT_CONTROL ;bit 7 entrada IR, bit 3 y 4 cambio de byte y salida, bit 0:2 contador
CLRF INT_CONTROL_OLD
BCF PIN_PRUEBA
BCF PIN_PRUEBA2
BCF PIN_PRUEBA3


ISR_LOOP


; ********* Se mira el pin de entrada, si no cambia se va a SUBIR_TIC ************************


BTFSS IR ;Si es cero se ejecuta la siguiente,PORTB,0 ;0.2
GOTO PONER_A_CERO ;---->0.6
BSF INT_CONTROL,7 ;0.6
GOTO COMP_ENTRADA ;---->1
PONER_A_CERO ;<----0.6
NOP ;0.8
BCF INT_CONTROL,7 ;1
COMP_ENTRADA ;<----1
MOVFW INT_CONTROL_OLD ;1.2
XORWF INT_CONTROL,W ;Si son iguales Z=1 ;1.4
BTFSS STATUS,Z ;Si es 0 se ejecuta la siguiente ;1.6
GOTO COMPARAR_TIC ;--->2

;************************** Incrementar el TIC **********************************************************

NOP ;2
NOP ;2.2
NOP ;2.4
NOP ;2.6

SUBIR_TIC ;<--2.6
NOP ;2.8
MOVLW D'140' ;1 Tics = 0.1 mS ;3
SUBWF TICTAC,W ;3.2
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente ;3.6
GOTO  ERROR_IR ;
INCF TICTAC,F ;3.8

;
MOVLW D'158' ;4
MOVWF DELAY5 ;4.2
Delay_5loop ;3*0.2*158=94.8
DECFSZ DELAY5,f ;
GOTO Delay_5loop ;
MOVFW INT_CONTROL ;99.2
MOVWF INT_CONTROL_OLD ;99.4
NOP ;99.6
GOTO ISR_LOOP ;100



;          ********* El pin de entrada a cambiado, en función de los tics damos 1 o 0 *****************
;          ********* TIC menos 8 mS error, mayor de 8 mS escribir cero, mayor 1.7 mS escribir uno *****
;    **********   Si es el flanco de subida no comparamos ***************************************

COMPARAR_TIC
BTFSC IR
GOTO SUBIR_TIC


MOVLW D'26' ;1 Tics = 0.1 mS
SUBWF TICTAC,W
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente
GOTO COMPARAR_SALIDA  

MOVLW D'17' ;1 Tics = 0.1 mS
SUBWF TICTAC,W
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente
GOTO ALMACENAR_UNO

MOVLW D'8' ;1 Tics = 0.1 mS
SUBWF TICTAC,W
BTFSC STATUS,C ;Si TICTAC-W mayor que 0, ejecuta la siguiente
GOTO ALMACENAR_CERO


GOTO ERROR_IR


COMPARAR_SALIDA
MOVFW INT_CONTROL
MOVWF INT_CONTROL_OLD
CLRF TICTAC
GOTO ISR_LOOP

ERROR_IR    
BCF LED2
GOTO POP


ALMACENAR_CERO
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.
GOTO ALMACENAR_DATO2
RLF DATO1IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA
ALMACENAR_DATO2
RLF DATO2IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA

ALMACENAR_UNO
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.
GOTO ALMACENAR_DATO2_1
RLF DATO1IR,F
INCF DATO1IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA
ALMACENAR_DATO2_1
RLF DATO2IR,F
INCF DATO2IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA


ALMACENAR_SALIDA

BTFSC INT_CONTROL,4    ;Si el bit 4 es uno se ejecuta la siguiente, vale 16 o mas.
GOTO DATOS_A_LCD
GOTO COMPARAR_SALIDA


DATOS_A_LCD


MOVLW B'10000000'
CALL LCD_COMANDO

MOVFW DATO1IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR

MOVLW B'11000000'
CALL LCD_COMANDO

MOVFW DATO2IR
CALL BINARIO_LCD
MOVFW CENTENAS
CALL LCD_ESCRIBIR
MOVFW DECENAS
CALL LCD_ESCRIBIR
MOVFW UNIDADES
CALL LCD_ESCRIBIR


POP
SWAPF STATUS_TEMP,0
MOVWF STATUS
MOVFW W_TEMP
BCF INTCON,INTF
BCF LED2
RETFIE

;********************************** LCD ****************************************************************

INICIALIZA_LCD
CALL Delay
CLRF LCD_CTRL
MOVLW B'00111000' ;8 bits, 2 líneas y 5x8 puntos
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

LCD_E
BSF ENABLE
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
BCF ENABLE
RETURN

LCD_COMANDO
CLRF LCD_CTRL
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

LCD_ESCRIBIR
CLRF LCD_CTRL
BSF RS
MOVWF LCD_DATOS
CALL LCD_E
CALL Delay
RETURN

;********************************** BINARIO A LCD *****************************************************

BINARIO_LCD ;Para registros de 8 bits, convierte a centenas, decenas y unidades.

MOVWF CUENTA
CLRF UNIDADES
CLRF DECENAS
CLRF CENTENAS

CENT_LOOP
MOVLW D'100'
SUBWF CUENTA,W
BTFSS STATUS,C
GOTO DEC_LOOP
INCF CENTENAS,F
MOVWF CUENTA
GOTO CENT_LOOP
DEC_LOOP
MOVLW D'10'
SUBWF CUENTA,W
BTFSS STATUS,C
GOTO UNIDAD
INCF DECENAS,F
MOVWF CUENTA
GOTO DEC_LOOP
UNIDAD
MOVF CUENTA,W
MOVWF UNIDADES

MOVLW B'00110000'
ADDWF CENTENAS,1
ADDWF DECENAS,1
ADDWF UNIDADES,1

RETURN

;********************************** DELAYS *************************************************************

Delay ;20 mS
MOVLW D'65'
MOVWF Delay1
Delay_loop
decfsz Delay0,f ; Waste time. 
goto Delay_loop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay1,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto Delay_loop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
RETURN

Delay_2 ;0.86 s
MOVLW D'22'
MOVWF Delay2
Delay_2loop
decfsz Delay0,f ; Waste time. 
goto Delay_2loop ; The Inner loop takes 3 instructions per loop * 256 loopss = 768 instructions
decfsz Delay1,f ; The outer loop takes and additional 3 instructions per lap * 256 loops
goto Delay_2loop ; (768+3) * 256 = 197376 instructions / 1M instructions per second = 0.197 sec.
; call it a two-tenths of a second.
decfsz Delay2,f
goto Delay_2loop
return

Delay_3 ;50.2 uS
MOVLW D'82'
MOVWF Delay3
Delay_3loop
DECFSZ Delay3,f
GOTO Delay_3loop
RETURN

end

Con este programa estoy capturando los botones de un mando JVC, y sacando por la pantalla de un LCD los dos bytes que manda convertidos a decimal, la rutina de convertir a decimal un registro de 8 bits cargado en w funciona correctamente, la captura de los botones más o menos bien, me captura el valor que mando pero me lo da con un menos, es decir que si el mando envia 245 115 yo recibo 244 114, si envia 197 120 yo recibo 196 119, no sé donde puede estar el fallo, la parte del código encargada de almacenar los botones e sla siguiente

Código: [Seleccionar]
ALMACENAR_CERO
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.
GOTO ALMACENAR_DATO2
RLF DATO1IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA
ALMACENAR_DATO2
RLF DATO2IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA

ALMACENAR_UNO
BTFSC INT_CONTROL,3    ;Si el bit 3 es uno se ejecuta la siguiente, vale 8 o mas.
GOTO ALMACENAR_DATO2_1
RLF DATO1IR,F
INCF DATO1IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA
ALMACENAR_DATO2_1
RLF DATO2IR,F
INCF DATO2IR,F
INCF INT_CONTROL,F
GOTO ALMACENAR_SALIDA


ALMACENAR_SALIDA

BTFSC INT_CONTROL,4    ;Si el bit 4 es uno se ejecuta la siguiente, vale 16 o mas.
GOTO DATOS_A_LCD
GOTO COMPARAR_SALIDA

Si llamo a almacenar cero, desplaza a la izquierda el dato 1 (dato1ir)  e incrementa un contador, si llamo a almacenar uno desplaza a la izquierda e incrementa el registro en 1, por cada desplazamiento se incrementa un contador (int_control), cuando este alcanza el valor 8 se pasa a almacenar los unos y ceros entrantes en el dato2, cuando vale 16 el contador manda la salida al lcd y sale de la interrupción.

La captura de unos y cero parece que funciona bien, cualquier botón del mando me da su valor correcto menos 1, repasando el código no veo que me puede estar pasando, llevo poco en esto, es posible simular con el mplab este programa y asignar valores a la entrada? o una simulación se haría eterna debida a tanto bucles.

Con un programador como el icd2 sería posible hacer un debug poniendo los breakpoints donde yo quisiese? aunque en este caso de poco serviría porque el programa depende del tiempo de envio del mando.

No sé me esta restando por ahí un 1 a mi resultado final que no se de donde sale, (una solución rápida puede ser incf dato1r,f) pero me gustaría ver donde me equivoco, la instrucción de incremento tb podría ir al final, y con una basta en lugar de 4. Gracias. S2
« Última modificación: 23 de Octubre de 2007, 20:13:12 por Jorge555 »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #12 en: 23 de Octubre de 2007, 22:51:49 »
Hola Jorge.

Me parece que la discrepancia entre los valores enviados y recibidos se debe a que cierto tiempo se pierde entre que ocurre la interrupcion y comenzas a contar la duración de los pulsos. Podrías acelerar por ahí un poco el proceso, pero no creo que esté nada mal incrementar al final el valor en uno siempre y cuando tu discrepancia sea lineal.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 496
    • JMN
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #13 en: 23 de Octubre de 2007, 23:20:19 »
La primera señal es la de inicio que no entra dentro de los unos y ceros, yo sólo cuento el tiempo que hay entre los flancos de bajada, y eso me dice si es un uno o un cero (2 ms un 1, 1 ms un cero), tengo bastante margen de error, ya que si es mayor de 0.8 un 0, si es mayor de 1.7 un 1, si es mayor de 2.6 no almacena nada y si es mayor de 14 pues da error y sale (señal de inicio son unos casi 13), podría ajustar más, ya que estoy tomando pasos de 0.1 ms y probablemente tb funcionaría, pero así parece ser que lo coge bien.

Bueno el caso es que si pulso el mando y sale el  01111000 (120) y el 00110011 (51) pues en mis registros dato1ir y dato2ir se almacenan el 119 y el 50, y así con cualquier número que he probado, siempre uno menos, hago un desplazamiento de 8 veces del acarreo con la instrucción de rotar, no sé si eso tendrá algo que ver, es decir para que ente el 01111000 desplazaría el registro 8 veces a izquierda incrementadolo después del desplazamiento cuando es 1.

No sé, se soluciona con incrementar en 1 los datos al final, pero me resulta curioso saber porque está cogiendo uno menos, si se perdierá el ultimo bit que es el de valor 1, sólo influiria a los números impares, pero veo que tb afecta a los pares, así que se me resta uno, no sé será alguna tontería que no veo, pero que no me la puedo quitar de la cabeza  :D . Le seguiré dando vueltas, Saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Duda sobre RB0 como interrupción externa 16f877a
« Respuesta #14 en: 24 de Octubre de 2007, 00:46:07 »
Ok. Pero entonces mi pregunta es:

¿El que produce la diferencia esa en una unidad es tu algoritmo o es el algoritmo de recepcion?
Si es tu algoritmo, tiene una falla y hay que encontrarla. Si es el de recepcion puede que se deba a lo que mencione en mi post anterior.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything