Autor Tema: Reinicio del PIC  (Leído 11339 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Reinicio del PIC
« en: 01 de Abril de 2006, 04:42:00 »
Hola, necesito que me echeis una mano en la programacion.

Estoy intentando comunicar un PIC con un potenciometro digital, el AD5204. Al arrancar quiero colocar los valores de los potenciometros a midscale, para ello, al arrancar pongo a 1 el SHUTDOWN y un 0 en PRESET, los potes se colocan a 25K cada uno, luego pongo un 1 en PRESET y se mantiene la posicion.

Sin embargo el programa se esta ejecutando continuamente y el pin de PRESET pasa continuamente de 0 a 1...pongo el programita, seguro que es una tonteria, pero no veo donde esta el error para que se este ejecutando continuamente el programa...

Codigo:
reset   org   0x00         ; origen del programa, aquí comenzará siempre que ocurra un reset
   goto    inicio        ; salta a "inicio"
   
inicio   bcf   STATUS,5
   bcf   STATUS,6
   clrf   POT_GANANCIA
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,5     ; banco1
   movlw   0x06
   movwf   ADCON1
   movlw   0XCF
   movwf   TRISA
   movlw   b"11111111"  ;
   movwf   TRISB        ; y pasa el valor a trisb
   movlw   b"00001000"
   movwf   TRISC
   bcf   STATUS,5     ; banco 0
   
   bsf   PORTC,1
   bsf   PORTC,6   
   call   Retardo_100ms
   bcf   PORTC,2
   call   Retardo_100ms
   bsf   PORTC,2
   
   
Retardo_100ms   movlw   d"100"         ; Aporta 1 ciclo máquina. Este es el valor de "M".
      goto   Retardos_ms      ; Aporta 2 ciclos máquina.

Retardos_ms   movwf   R_ContB         ; Aporta 1 ciclo máquina.

R1ms_BucleExterno   movlw   d"249"      ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
         movwf   R_ContA         ; Aporta Mx1 ciclos máquina.

R1ms_BucleInterno   nop            ; Aporta KxMx1 ciclos máquina.
         decfsz   R_ContA         ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
         goto   R1ms_BucleInterno      ; Aporta (K-1)xMx2 ciclos máquina.
         decfsz   R_ContB         ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
         goto   R1ms_BucleExterno    ; Aporta (M-1)x2 ciclos máquina.
         
         return            ; El salto del retorno aporta 2 ciclos máquina

;------------------------------------------
   end           ; se acabó
;------------------------------------------



Muchisimas gracias!

Desconectado Modulay

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 2651
RE: Reinicio del PIC
« Respuesta #1 en: 01 de Abril de 2006, 05:01:00 »
Tal y como lo has implementado,el micro termina el programa cuando se encuentra con "end".
Lo normal es que nunca se llegue a un "fin de ejecución",sino que el micro esté metido en un bucle conitnuo de forma indefinida para que no llegue a pararse por completo.
Puedes probar a dejar al micro metido en un pequeño bucle tras la ultima instrucción de tu programa principal "bsf PORTC,2" haciendo por ejemplo algo asi:
Codigo:

.
.
.
.
               bsf PORTC,2
bucle          goto bucle



Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #2 en: 01 de Abril de 2006, 05:54:00 »
Ei muchas gracias Modulay, ya funciona correctamente Giño

A ver si me puedes echar un cable...sabes de alguna rutina de comuncacion SPI con un potenciometro digital de analog?...es el 5204 que integra 4 potes...llevo tiempo intentando hacerlos cambiar de posicion mediante el PIC pero no lo consigo.

La rutina que uso es:

Codigo:
...
test   btfsc   PORTB,2
   call   subir
   goto   test


subir   GR_GA         ; activa el chipselect del pote
   bcf   STATUS,6
   bcf   STATUS,5   ; banco 0
   movlw   B"00000000"   ; apunto a RDAC1, el primero de los 4 potes que tiene el integrado
   call   output      ; paso el registro al pote por SPI
   movlw   B"00000011"   ; elijo la posicion 3 para el pote
   call   output      ; paso el registro al pote por SPI
   NO_CHIP         ; quito el chip select
   return

output   movwf   SSPBUF
ret   bsf   STATUS,5   ; banco 1
   btfss   SSPSTAT,BF
   goto   ret
   bcf   STATUS,5   ; banco 0
   movf   SSPBUF,W
   return
...


pero no me funciona...

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #3 en: 01 de Abril de 2006, 05:56:00 »
Se me olvidaba comentar que el potenciometro digital tiene un registro de 11 bits, yo le mando 16 bits, de los cuales los 5 primeros le pongo 0, aunque da igual si fueran 1...

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #4 en: 01 de Abril de 2006, 14:57:00 »
Escrito originalmente por Modulay
Tal y como lo has implementado,el micro termina el programa cuando se encuentra con "end".
Lo normal es que nunca se llegue a un "fin de ejecución",sino que el micro esté metido en un bucle conitnuo de forma indefinida para que no llegue a pararse por completo.
Puedes probar a dejar al micro metido en un pequeño bucle tras la ultima instrucción de tu programa principal "bsf PORTC,2" haciendo por ejemplo algo asi:
Codigo:

.
.
.
.
               bsf PORTC,2
bucle          goto bucle





Modulay en rigor técnico, el micro no termina el programa cuando llega a "end".

La directiva end es solamente para que el ensamblador sepa que debe terminar ahi de ensamblar datos.

Esto se ve más obvio cuando uno usa código reubicable en que cada archivo .asm que uno incluye en un proyecto debe tener su corresopndiente end

Lo que ocurre es que como tu bien dijiste hay que poner un goto posterior a bsf PORTC,2 porque sino el PIC seguirá ejecutando la siguiente línea de Retardo100ms.

Lo que ocurre es que en definitiva el pic hace esto y luego encuentra un RETURN el cual es ejecutado con el STACK vacío y esto produce que el program counter sea cargado con 0x0000 lo que produce un efecto similar al reseteo pero en rigor de verdad no es un reseteo, solo que el pic comienza de nuevo a ejecutar el software pero los registros , puertos y demas cosas seguirán como estaban justo antes de ese return.

En definitiva el goto soluciona el problema pero no era el END el inconveniente del código de nuestro amigo sino el return.


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #5 en: 01 de Abril de 2006, 15:01:00 »
Escrito originalmente por fito20
Se me olvidaba comentar que el potenciometro digital tiene un registro de 11 bits, yo le mando 16 bits, de los cuales los 5 primeros le pongo 0, aunque da igual si fueran 1...


No conozco el potenciometro que mencionas pero puede ser que estes utilizando mal el modo SPI del mismo y ese sea tu inconveniente.

Esta bien configurado el SPI?

Segun leo en la parte de tu código tu chequeas ei el PIN RB,2 cambia y sino no haces nada.  

Has revisado que esa parte hasta ahi funcione? es decir que realmente el pic ingresa a la rutina de envio SPI?


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #6 en: 01 de Abril de 2006, 16:01:00 »
Hola maunix, la verdad es que nunca he utilizado la comunicacion SPI y es algo nuevo para mi.

Lo que hago es testear el pin 2 del puerto B, y cuando es pulsado, comienza la rutina de envio de datos hacia el pote. He colocado un led para ver que hasta ese punto funciona, pero midiendo con el polimetro, en el pin SDI no se observa transferencia de datos.

Por si me puedes echar una mano con este tema, te pongo la direccion del datasheet:

http://www.analog.com/UploadedFiles/Data_Sheets/140808745AD5204_6_0.pdf

Os agradeceria cualquier comentario porque estoy un poco perdido en el tema. Muchas gracias de nuevo.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #7 en: 01 de Abril de 2006, 16:16:00 »
Escrito originalmente por fito20
Hola maunix, la verdad es que nunca he utilizado la comunicacion SPI y es algo nuevo para mi.

Lo que hago es testear el pin 2 del puerto B, y cuando es pulsado, comienza la rutina de envio de datos hacia el pote. He colocado un led para ver que hasta ese punto funciona, pero midiendo con el polimetro, en el pin SDI no se observa transferencia de datos.

Por si me puedes echar una mano con este tema, te pongo la direccion del datasheet:

http://www.analog.com/UploadedFiles/Data_Sheets/140808745AD5204_6_0.pdf

Os agradeceria cualquier comentario porque estoy un poco perdido en el tema. Muchas gracias de nuevo.


fito20 sería importante ver la parte del código donde haces lo siguiente

1) Configuras el TRISC
2) Configuras el Módulo SPI

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #8 en: 01 de Abril de 2006, 17:13:00 »
El codigo completo es este, lo que hace es colocar la posicion 3 en el pote 1 (RDAC1) al presionar el pin 2 del puerto B...a ver si das con el problema por favor. Muchas gracias.



Codigo:
;---------------Encabezado-------------

   LIST   p=16f876       
   radix   hex       
   INCLUDE   <P16F876.INC>

;------------mapa de memoria---------

   
reg1   equ   0x20        ; Estos 3 registros los utilizaré
reg2   equ   0x21        ; para hacer el retardo
reg3   equ   0x22           
R_ContB   equ   0x23
R_ContA   equ   0x24

#DEFINE   UP   PORTB,1      ; direccion del pulsador UP
#DEFINE   DOWN   PORTB,2      ; direccion del pulsador DOWN
#DEFINE   MIDS   PORTB,3


#DEFINE   CS1   PORTC,0      ; direccion del pin de seleccion del CHIP 1
#DEFINE   PR   PORTC,2      ; pin del PRESET para poner los potes a midscale
#DEFINE   SCK   PORTC,3      ; pin del CLOCK para la comunicacion SPI
#DEFINE   SDI   PORTC,4      ; pin de entrada de datos para la comunicacion SPI
#DEFINE   SDO   PORTC,5      ; pin de salida de datos para la comunicacion SPI
#DEFINE   SHDN   PORTC,6

POT_GANANCIA   EQU   .32


GR_GA   macro
   bcf   PORTC,0         ; pone un 0 para activar pot graves-ganancia
   endm


NO_CHIP   macro
   bsf   PORTC,0         ; pone un 1 para desactivar pot graves-ganancia
   endm


;-------Configuración de puertos-------

reset   org   0x00         ; origen del programa, aquí comenzará siempre que ocurra un reset
   goto    inicio        ; salta a "inicio"
   
inicio   bcf   STATUS,5
   bcf   STATUS,6
   clrf   POT_GANANCIA
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,5     ; banco1
   movlw   0x06
   movwf   ADCON1
   movlw   0XCF
   movwf   TRISA
   movlw   b"11111111"  ;
   movwf   TRISB        ; y pasa el valor a trisb
   movlw   b"00001000"
   movwf   TRISC
   bcf   STATUS,5     ; banco 0
   NO_CHIP
   bsf   PORTC,1
   bsf   PORTC,6   
   bsf   PORTC,2

test   btfsc   PORTB,2
   call   subdown
   goto   test


subdown   GR_GA
   bsf   PORTC,7
   bcf   STATUS,6
   bcf   STATUS,5
   movlw   B"00000000"   ; apunta a la direccion RDAC1
   call   output
   movlw   B"00000011"   ; coloca el pote en la posicion 3
   call   output
   NO_CHIP
   return

output   movwf   SSPBUF
ret   bsf   STATUS,5   ; banco 1
   btfss   SSPSTAT,BF
   goto   ret
   bcf   STATUS,5   ; banco 0
   movf   SSPBUF,W
   return
   
   
Retardo_100ms   movlw   d"100"         ; Aporta 1 ciclo máquina. Este es el valor de "M".
      goto   Retardos_ms      ; Aporta 2 ciclos máquina.

Retardos_ms   movwf   R_ContB         ; Aporta 1 ciclo máquina.

R1ms_BucleExterno   movlw   d"249"      ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
         movwf   R_ContA         ; Aporta Mx1 ciclos máquina.

R1ms_BucleInterno   nop            ; Aporta KxMx1 ciclos máquina.
         decfsz   R_ContA         ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
         goto   R1ms_BucleInterno      ; Aporta (K-1)xMx2 ciclos máquina.
         decfsz   R_ContB         ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
         goto   R1ms_BucleExterno    ; Aporta (M-1)x2 ciclos máquina.
         
         return            ; El salto del retorno aporta 2 ciclos máquina

;------------------------------------------
   end           ; se acabó
;------------------------------------------



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #9 en: 01 de Abril de 2006, 17:52:00 »
A ver, tengo varias sugerencias para tu código.

1) Si usas el include para el 16F876 para que defines los pines SCK y restantes? Eso solo lo debieras hacer si hicieras el SPI por software

2) Tus tris están mal seteados.  
Ponlos de esta manera: (ojo solo modifico los que atañen al SPI el resto los dejo como tu los habias configurado)

   movlw   b"00010000"  
   movwf   TRISC

El RC4 debe ser entrada.  El RC3 salida para el clock.


3) Donde configuras el módulo SPI?
TE paso un codigo de ejemplo de configuracion del SPI.  Tu acomodalo hasta que te de como te pide el integrado.

Codigo:

   bsf   STATUS,RP0
   movlw   b"01000000"      ;CKE=1
   movwf   SSPSTAT

   bcf   STATUS,RP0
   movlw   b"00100010"
   movwf   SSPCON



4) Si transmites a 1Mbit o por ahi, con el tester no veras nada.... debieras usar un osciloscopio.  

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #10 en: 01 de Abril de 2006, 18:07:00 »
Maunix muchas gracias por tu ayuda, porque como ves estoy un poco flojo en el tema y lo necesito para el proyecto fin de carrera.

Tengo unas cuantas dudas

1) Si usas el include para el 16F876 para que defines los pines SCK y restantes? Eso solo lo debieras hacer si hicieras el SPI por software

Pero segun tengo planteado el codigo, la comunicacion SPI la estoy haciendo via software no?

2) Tus tris están mal seteados.
Ponlos de esta manera: (ojo solo modifico los que atañen al SPI el resto los dejo como tu los habias configurado)

movlw b"00010000"
movwf TRISC

El RC4 debe ser entrada. El RC3 salida para el clock.


Tio, que fallo mas tonto, muchas gracias porque no lo hubiera visto nunca.

3) Donde configuras el módulo SPI?

Creia que por defecto venia configurado, modificare y añadire dichas lineas al codigo

4) Si transmites a 1Mbit o por ahi, con el tester no veras nada.... debieras usar un osciloscopio.

Transmito con un cristal de 4MHz, usare el osciloscopio porque sera dificil percibirlo con el polimetro como bien dices


Muchas gracias por todo maunix, mañana modificare el programa y lo probare. Si tengo algun problema te lo planteo por aqui, asi que te rogaria que no perdieses mucho de vista este hilo.

Un saludo y mil gracias.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #11 en: 01 de Abril de 2006, 19:50:00 »
Escrito originalmente por fito20

1) Si usas el include para el 16F876 para que defines los pines SCK y restantes? Eso solo lo debieras hacer si hicieras el SPI por software

Pero segun tengo planteado el codigo, la comunicacion SPI la estoy haciendo via software no?




En realidad en los microcontroladores siempre haces algo por "software" pero si tu te fijas aquí solo pones el dato en el registro SSPBUF y es el pic quien se encarga de "automáticamente" generar las señales de clock y data sin que tu lo controles.

Tu solo verificas que la transmisión se complete pero nada mas!  El resto lo hace el pic.

Hacerlo por software sería que configures unos pines como salida y tu mismo generes las señales de clock subiendo y bajando la señal del pic, a la vez que subes y bajas las señales de dato de acuerdo a si debes sacar uun 1 o un 0.  Se entendio?

Suelo andar por acá seguido, me ausento cuando por razones de trabajo o de falta de tiempo no puedo ingresar al foro.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #12 en: 02 de Abril de 2006, 04:35:00 »
Ok Mauricio, ya lo entendi. Hoy ensayare el codigo nuevo a ver si consigo hacer que funcione. Ya te cuento. Muchas gracias.

Un saludo. Fito.

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
RE: Reinicio del PIC
« Respuesta #13 en: 02 de Abril de 2006, 07:06:00 »
Bueno, pues he ensayado el nuevo codigo que adjunto mas abajo. Ya se percibe actividad en el clock y en el SDI, aunque no dispongo de osciloscopio para comprobarlo adecuadamente.

Sin embargo, no se modifica la posicion del potenciometro. A ver si me podeis echar una mano por favor.

Codigo:
;---------------Encabezado-------------

   LIST   p=16f876       
   radix   hex       
   INCLUDE   <P16F876.INC>

;------------mapa de memoria---------

   
reg1   equ   0x20        ; Estos 3 registros los utilizaré
reg2   equ   0x21        ; para hacer el retardo
reg3   equ   0x22           
R_ContB   equ   0x23
R_ContA   equ   0x24

#DEFINE   UP   PORTB,1      ; direccion del pulsador UP
#DEFINE   DOWN   PORTB,2      ; direccion del pulsador DOWN
#DEFINE   MIDS   PORTB,3


#DEFINE   CS1   PORTC,0      ; direccion del pin de seleccion del CHIP 1
#DEFINE   PR   PORTC,2      ; pin del PRESET para poner los potes a midscale
#DEFINE   SHDN   PORTC,6

POT_GANANCIA   EQU   .32


GR_GA   macro
   bcf   PORTC,0         ; pone un 0 para activar pot graves-ganancia
   endm


NO_CHIP   macro
   bsf   PORTC,0         ; pone un 1 para desactivar pot graves-ganancia
   endm


;-------Configuración de puertos-------

reset   org   0x00         ; origen del programa, aquí comenzará siempre que ocurra un reset
   goto    inicio        ; salta a "inicio"
   
inicio   bcf   STATUS,5
   bcf   STATUS,6
   clrf   POT_GANANCIA
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,5     ; banco1
   movlw   0x06
   movwf   ADCON1
   movlw   0XCF
   movwf   TRISA
   movlw   b"11111111"  ;
   movwf   TRISB        ; y pasa el valor a trisb
   movlw   b"00010000"
   movwf   TRISC
   movlw   B"10000000"      ;
   movwf   SSPSTAT         ; cargo el reguistro SSPSTAT con el valor anterior
   bcf   STATUS,RP0      ; banco 0

   NO_CHIP            ; llama a la macro de deshabilitar los 4 potes.
   movlw   B"00110010"      ; no collision, no overflow, habilito el puerto SPI, clock inactivo en nivel alto, FOSC/64
   movwf   SSPCON         ; pasamos estos valores a control SPI
   bsf   PORTC,1         ; ponemos un 1 en LED para encenderlo y ver que funciona el circuito
;   bsf   PORTC,6          ; ponemos un 1 en SHUTDOWN
;   bsf   PORTC,2         ; ponemos un 1 en PRESET para midscale

test   btfsc   PORTB,2
   call   subdown
   goto   test


subdown   GR_GA
   bsf   PORTC,7
   bcf   STATUS,6
   bcf   STATUS,5   ; banco 0
   movlw   B"00000000"   ; apunta a la direccion RDAC1
   call   output
   movlw   B"00000011"   ; coloca el pote en la posicion 3
   call   output
   NO_CHIP
   return

output   movwf   SSPBUF
ret   bsf   STATUS,5   ; banco 1
   btfss   SSPSTAT,BF
   goto   ret
   bcf   STATUS,5   ; banco 0
   movf   SSPBUF,W
   return
   
   
Retardo_100ms   movlw   d"100"         ; Aporta 1 ciclo máquina. Este es el valor de "M".
      goto   Retardos_ms      ; Aporta 2 ciclos máquina.

Retardos_ms   movwf   R_ContB         ; Aporta 1 ciclo máquina.

R1ms_BucleExterno   movlw   d"249"      ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
         movwf   R_ContA         ; Aporta Mx1 ciclos máquina.

R1ms_BucleInterno   nop            ; Aporta KxMx1 ciclos máquina.
         decfsz   R_ContA         ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
         goto   R1ms_BucleInterno      ; Aporta (K-1)xMx2 ciclos máquina.
         decfsz   R_ContB         ; (M-1)x1 cm (cuando no salta) + 2 cm (al saltar).
         goto   R1ms_BucleExterno    ; Aporta (M-1)x2 ciclos máquina.
         
         return            ; El salto del retorno aporta 2 ciclos máquina

;------------------------------------------
   end           ; se acabó
;------------------------------------------



Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: Reinicio del PIC
« Respuesta #14 en: 02 de Abril de 2006, 10:31:00 »
Esta parte yo que tu la cambiaría asi.  Fijate que moví el label ret una línea para abajo.
Los dos puntos ":" yo los uso para mayor claridad en mis softwares para distinguir rapidamente un label de una instruccion o una constante.
Lo que hago aquí es no volver a cambiar la página una y otra vez,  ya que no es necesario
Otro consejo, si declaras los include para las constantes de los registros (lo que está dentro del P16F876.inc", no uses STATUS,5, usa STATUS,RP0 .  Eso deja el código más claro.  Es más facil recordar que significa el RP0 y no el STATUS,5.

Codigo:

output:   movwf   SSPBUF

   bsf   STATUS,RB0   ; banco 1

ret:   btfss   SSPSTAT,BF

   goto   ret

   bcf   STATUS,RB0   ; banco 0

   movf   SSPBUF,W

   return




Algunos consejos.

1) Es importante que observes que tengas el PULLUP resistor a la salida del DATA OUT del integrado.  Ahí en la datasheet te dice que lo pongas.

Pagina 5. SDO: Serial Data Output, Open Drain transistor requires pull-up resistor.


2) Además, supongamos que hiciste bien el hardware y que esté todo bien, fijate que en las datasheet te dice :

An optional reset (PR) pin forces all the AD5204 wipers to the midscale position by loading 80H into the VR latch.

Has comprobado esto? es decir, que cuando resetees el módulo la R de cada potenciómetro digital vaya al valor medio? Antes de prender el pic o mejor aún sin que esté el pic.  O también podría ser un pin controlado por tu PIC el cual podrías accionar cuando inicies tu firmware.

3) Cuando inicias el firmware del pic no das tiempo a nada, es decir supones que se enciende el pic y todas las tensiones ya se establecieron.  Te sugiero que hagas un delay despues de configurar los puertos antes de leer cualquier señal en el Puerto B.

4) Al seleccionar el CHIP con el CS porque no esperas algunos mseg? total no tienes apuro.  Esto es para ir viendo posibles problemas.  Lo mismo haría antes de deseleccionar el CHIP.

Por ejemplo

1. CS del Integrado
2. Delay n mseg
3. Envias 1er byte
4. Envias 2do byte
5. Delay n mseg
6. Quitas CS del Integrado

5) Puede ser que estemos usando mal el modo de SPI que necesite este integrado.  No está muy claro el datasheet jeje, asi que veamos las posibles configuraciones.

Posibilidad 1

Codigo:

   bsf   STATUS,RP0
   movlw   B"10000000"
   movwf   SSPSTAT   
   bcf   STATUS,RP0
   movlw   B"00110010"
   movwf   SSPCON   




Posibilidad 2

Codigo:

   bsf   STATUS,RP0
   movlw   B"11000000"
   movwf   SSPSTAT   
   bcf   STATUS,RP0
   movlw   B"00110010"
   movwf   SSPCON   



Posibilidad 3

Codigo:

   bsf   STATUS,RP0
   movlw   B"10000000"
   movwf   SSPSTAT   
   bcf   STATUS,RP0
   movlw   B"00100010"
   movwf   SSPCON   



Posibilidad 4

Codigo:

   bsf   STATUS,RP0
   movlw   B"11000000"
   movwf   SSPSTAT   
   bcf   STATUS,RP0
   movlw   B"00100010"
   movwf   SSPCON   




Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything