• Martes 5 de Noviembre de 2024, 17:17

Mostrar Mensajes

Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.


Mensajes - SinChip

Páginas: [1]
1
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Viernes 22 de Octubre de 2004, 10:54 »
Gracias de nuevo Oldkami, desde luego que estás ducho en este tema. Respecto al codigo nuevo sobre el fallo del puerto, en realidad no es mucho más que eso, es realmente simple. Voy a colgar otra discusión con lo dicho sobre esto y ademas la rutina de delay_1s, para que veas que no influye en los puertos.

Un saludo, sigo en el tajo :comp:

2
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Miércoles 20 de Octubre de 2004, 17:18 »
Gracias Oldkami por tu rápida respuesta. No obstante, cambiando el origen de la interrupcion a la direccion 100 hex, funciona, no sé por qué no me deja empezar desde la direccion 5 que se supone que es la posicion libre inmediatamente despues del vector de interrupción.

además , he intentado añadir "pagesel" en el vector de interrupcion para saltar a la ISR y me dice que no cabe. No será pq sólo hay una palabra de espacio para el mapeo del vector de int. en la 04?

Bueno, más cositas. Tengo un programa que hace una cuenta binaria de 3 bits (Típico contador Johnson, o como se diga) y la saco por tres líneas del puerto B y ok, pero la saco en RA2,3 y 4 y no lo consigo. El hecho es que siempre que activo un bit del puerto A se desactiva el que hubiere anteriormente, ¿inquietante eh? (con RA4 no pasa esto, es la única que fluctua debidamente sin que la afecten las demás)

He tenido en cuenta el drenador abierto de RA4, pero se ve que la inversión del dato se resuelve de forma transparente al usuario, ya que tengo un pull-up a la salida y el dato sale tal y como lo escribo en el puerto, no invertido como esperaba que lo hiciese.

Por cierto RA2,3 y 4 van colgadas a la entrada de un MUX 8 a 1, y éste funciona aparentemente bien.

Aquí os dejo un pequeño ejemplo que ilustra el fallo mediante una barrido de tres lineas del puerto, parece simple, pero ocurre lo que os he mencionado.

Citar
MAIN  CODE               ; Zona de Programa

inicio:
;-------Configuración de puertos-------
     movlw b'00000011'    ; como salida, y ent RA0, RA1 y RA3 b'00001011'
     banksel TRISA        ; configurando el puerto B
     movwf TRISA

     movlw b'00001001'    ; como salida, y ent RB0 y RB3 -> b'00001001'
     banksel TRISB        ; configurando el puerto B
     movwf TRISB
     movlw b'00001010'    ;
     banksel PORTB
     movwf PORTB

     movlw b'00000000'    ; como salida
     banksel TRISC        ; configurando el puerto B
     movwf TRISC

     movlw b'00000000'    ; como salida
     banksel TRISD        ; configurando el puerto B
     movwf TRISD

     movlw b'00000000'    ; como salida
     banksel TRISE        ; configurando el puerto B
     movwf TRISE

     banksel PORTA
     ;movwf   PORTA
     bcf   PORTA,BIT2
     bcf   PORTA,BIT3
     bcf   PORTA,BIT4 ; limpiamos puerto

salta
     call delay_1s
     bsf   PORTA,BIT3
     call delay_1s
     bsf   PORTA,BIT2
     call delay_1s
     bsf   PORTA,BIT4
     call delay_1s
     goto  salta

No sé si es un fallo software, porque he cambiado por varios micros, incluso usé un 648A programado (sin usar el modo depuración) y pasa lo mismo. Tengo un header que me he hecho yo que convierte 40 a 18 pines, pero esto tampoco falla, ya que la placa destino tiene como os digo 18 pines, y allí es donde usé el 648.

Los pines restantes de los puertos del 877, como veis los configuro como salida, recomendacion que te da Microchip cuando no los vas a usar.

Bueno, o bien encomiendo a San Silicio, aunque me gustaría que me comentarais sobre esto en breve.

Saludito para todos, y gracias de nuevo
 :alien:

3
Microcontroladores / Re: Uso De Interrupciones Con Pic 16f877
« en: Jueves 14 de Octubre de 2004, 12:15 »
Hola , yo también soy nuevo en el foro. He leído y releído vuestras respuestas ya que las necesito para solucionar un problema, pero aún no lo he conseguido. Se trata de hacer saltar al pic 16f877 a cualquier interrupción (estoy mosca porque esto se supone que es algo básico  :whistling: ).

Es la primera vez que trabajo con estos pics, y me parecen bastante potentes y sencillos de manejar, pero aquí hay algo que se me escapa.

Estoy usando las directivas de código relocalizable (CODE, IDATA, UDATA), aunque he usado las mismas estructuras de programa Imarte o Javierv para el uso de interrupciones viendo que no hay ninguna diferencia entre poner un ORG o un CODE  0x... cuando quieres que un bloque empiece desde una direccion concreta. Es decir, estas directivas no creo que me estén planteando problemas, ya que estoy depurando con ICD2 otros programas que he hecho (sin interrupciones) y van bien.

La interrupción que quiero activar es la de RB0 (es decir, INTE dentro de INTCON). Por cierto Imarte, ¿Qué quieres decir con?:

Citar
Ahhh... se me olvidaba, OJO con INTCON.

precisamente a mí me está dando problemas, ya que intento poner a 0 el bit INTF para que vuelva a interrumpir, pero siempre está a 1, y en el 877 no hace falta seleccionar el banco de memoria que contiene a INTCON ya que está reflejado en los 4 bancos.

Os dejo el codiguito que me trae de cabeza, ya estoy empezando a desconfiar en la placa que he hecho, incluso en el icd2 :blink:


Código: Text
  1. ;***** DEFINICIÓN DE VARIABLES ****************************************
  2.  
  3. variables  UDATA 0x110
  4. w_temp    RES 1&#59; Variables para la salvaguarda del contexto
  5. pclath_temp  RES 1
  6. status_temp  RES 1
  7. reg_temp    RES  1
  8.  
  9.  
  10. ;******** VECTORES DE INTERRUPCIÓN *************************************
  11.  
  12. RESET_VECT  CODE    0x000   &#59; Vector de reset del procesador
  13.            nop            &#59; "nop"      
  14.                                 pagesel     inicio  &#59;
  15.       goto      inicio  &#59; Salto al inicio del programa
  16.  
  17. ;*******************************************************************
  18.  
  19. INT_VECTOR  CODE       0x004  &#59; Zona del vector de interrupción
  20.     goto  ServInt  &#59;
  21.  
  22. ISR    CODE  0x005
  23. ServInt:
  24.     banksel   w_temp
  25.                   movwf     w_temp  
  26.     movf  STATUS,w
  27.     movwf  status_temp     &#59;hasta aquí guarda de registros
  28.  
  29.     btfsc  INTCON,INTF  &#59;¿ocurrió flanco en rb0?
  30.     goto  noint
  31.                                 movlw  b'00110100'   &#59; indicar interrupción
  32.     banksel   PORTB
  33.     movwf  PORTB
  34.     bcf   INTCON,INTF                    
  35.    &#59; Limpia las interrupciones pendientes
  36.      
  37. noint  
  38.     banksel   status_temp    &#59; recupera lo guardado
  39.     movf      status_temp,w
  40.     movwf  STATUS
  41.     swapf     w_temp,f
  42.     swapf     w_temp,w
  43.      
  44.       retfie                   &#59;
  45.  
  46.  
  47.  
  48. ;***** PROGRAMA PRINCIPAL *********************************************
  49.  
  50. MAIN    CODE               &#59; Zona de Programa
  51.  
  52. inicio:
  53.  
  54.     bcf  INTCON,GIE  &#59;Deshabilito por si acaso
  55.     movlw  b'00001001'   &#59;
  56.     banksel   TRISB        &#59; configurando el puerto B
  57.     movwf   TRISB
  58.     movlw  b'00000000'   &#59;
  59.     banksel   PORTB
  60.     movwf  PORTB
  61.  
  62.     bsf  INTCON,INTE  &#59;
  63.     banksel   OPTION_REG  &#59;
  64.     bsf  OPTION_REG,INTEDG&#59;
  65.     bsf   INTCON,GIE  &#59;
  66.  
  67.     bcf  INTCON,1&#59; Limpia las interrupciones pendientes
  68.  
  69.     goto  $             &#59; espera interrupciones
  70. fin
  71.     END
  72.  

Bueno, espero que os sirva de algo el codigo, y si hay errores me lo decís. Ojalá sepais que me puede pasar, no estoy muy ducho con los PIC.

Gracias por adelantado.

Páginas: [1]