TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: fito20 en 01 de Abril de 2006, 04:42:00

Título: Reinicio del PIC
Publicado por: fito20 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!
Título: RE: Reinicio del PIC
Publicado por: Modulay 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


Título: RE: Reinicio del PIC
Publicado por: fito20 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...
Título: RE: Reinicio del PIC
Publicado por: fito20 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...
Título: RE: Reinicio del PIC
Publicado por: maunix 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
Título: RE: Reinicio del PIC
Publicado por: maunix 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?


Título: RE: Reinicio del PIC
Publicado por: fito20 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.
Título: RE: Reinicio del PIC
Publicado por: maunix 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
Título: RE: Reinicio del PIC
Publicado por: fito20 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ó
;------------------------------------------


Título: RE: Reinicio del PIC
Publicado por: maunix 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
Título: RE: Reinicio del PIC
Publicado por: fito20 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.
Título: RE: Reinicio del PIC
Publicado por: maunix 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
Título: RE: Reinicio del PIC
Publicado por: fito20 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.
Título: RE: Reinicio del PIC
Publicado por: fito20 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ó
;------------------------------------------


Título: RE: Reinicio del PIC
Publicado por: maunix 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
Título: RE: Reinicio del PIC
Publicado por: fito20 en 02 de Abril de 2006, 14:04:00
Muchas gracias Mauricio por la paciencia que estas teniendo conmigo. Mañana mismo lo pruebo todo y te comento. Un abrazo.
Título: RE: Reinicio del PIC
Publicado por: maunix en 02 de Abril de 2006, 14:57:00
Escrito originalmente por fito20
Muchas gracias Mauricio por la paciencia que estas teniendo conmigo. Mañana mismo lo pruebo todo y te comento. Un abrazo.


Gracias, no me molesta dar tips o sugerencias siempre que del otro lado muestren intenciones de comprender y de esforzarse por encontrar una solución.

Tu lo has demostrado con creces así que seguiré ayudandote en lo que esté a mi alcance.

Saludos
Título: RE: Reinicio del PIC
Publicado por: fito20 en 03 de Abril de 2006, 05:29:00
Hola maunix, te cuento.

He probado el codigo incluyendo los retrasos, y cambiando lo que me dijiste, solo que ahora, el LED que enciendo para saber que el circuito esta conectado se apaga y enciende alternativamente, es decir, que el programa se esta reiniciando.

Te muestro el codigo.

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,RP0
   bcf   STATUS,RP1
   clrf   POT_GANANCIA
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,RP0     ; 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

   call   retardo


   NO_CHIP            ; llama a la macro de deshabilitar los 4 potes.

   call   retardo

   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

   call   retardo

test   btfsc   PORTB,2
   call   subdown
   goto   test


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

output   movwf   SSPBUF
   bsf   STATUS,RP0   ; banco 1
ret   btfss   SSPSTAT,BF
   goto   ret
   bcf   STATUS,RP0   ; banco 0
   movf   SSPBUF,W
   return
   
   
retardo   movlw   20        ; Aquí se cargan los registros
   movwf   reg1        ; reg1, reg2 y reg3
              ; con los valores 10, 20 y 30
tres   movlw   30        ; respectivamente
   movwf   reg2

dos   movlw   40
   movwf   reg3

uno   decfsz   reg3,1        ; Aquí se comienza a decrementar
   goto   uno        ; Cuando reg3 llegue a 0
   decfsz   reg2,1        ; le quitare 1 a reg2
   goto   dos        ; cuando reg2 llegue a 0   
   decfsz   reg1,1        ; le quitare 1 a reg1
   goto   tres        ; cuando reg1 llegue a 0
   retlw   00        ; regresare al lugar
              ; de donde se hizo la llamada

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


Título: RE: Reinicio del PIC
Publicado por: fito20 en 03 de Abril de 2006, 06:44:00
Respecto a lo de colocar el pote en la posicion media, si que lo he conseguido, con eso no tengo problema, pero si con el reinicio este que te comento.

Un saludo.
Título: RE: Reinicio del PIC
Publicado por: fito20 en 03 de Abril de 2006, 12:28:00
Mauricio, para programar el PIC uso el ICProg, y por defecto activa el watchdog... porque la casilla de la derecha WDT aparece marcada. La deshabilito al programar el PIC?
Título: RE: Reinicio del PIC
Publicado por: maunix en 03 de Abril de 2006, 15:31:00
Escrito originalmente por fito20
Mauricio, para programar el PIC uso el ICProg, y por defecto activa el watchdog... porque la casilla de la derecha WDT aparece marcada. La deshabilito al programar el PIC?


Te paso a explicar.  No es tema del icprog que tenga dichos casilleros como activados o desactivados, sino que es la información por defecto de un pic.  Si te fijas en el manual de tu pic en Configuration Bits, verás que por default (salvo que lo cambies adrede) el watchdog está activado.  Entonces debes desactivarlo tu mismo! o bien hacer un clrwdt en tu software para evitar que el pic se resetee a causa del watchdog.

El watchdog no es ni mas ni menos que un timer el cual se puede a su vez conectar a un prescaler, que una vez que llega a su cuenta resetea al pic.  esto es util cuando un software se queda colgado por alguna causa, el wdt lo reiniciará siempre que no se pase por la rutina de clrwdt.  Al pasar por clrwdt (clear watchdog timer) se resetea la cuenta del watchdog y entonces vuelve a comenzar.  

Además le debes indicar a tu pic, que tipo de cristal usará, etc.  Todo eso lo debes modificar, no se dará cuenta solito. jeje.

Fijate la directiva config o bien desactiva el wdt al programar el pic.  Además fijate si usas cristal < 4Mhz pon el oscilador como XT, si usas mayor a 4Mhz ponlo como HS.  

Saludos






Título: RE: Reinicio del PIC
Publicado por: fito20 en 04 de Abril de 2006, 04:40:00
Muchas gracias por la explicacion Mauricio, estabas en lo cierto, desactivando el watch dog ya no resetea. (Lo de seleccionar XT ya lo hacia)

He ensayado el codigo con las cuatro posibilidades de configuracion de SPI que me recomendaste en la pagina anterior, pero sigue sin funcionar.

He comprobado que el CS se activa antes de enviar datos, y desactiva despues de recibirlos.

Tambien he aumentado los retardos a 2 segundos, pero tampoco sirve.

Pienso que el problema podria estar relacionado con el envio de bits, el potenciometro acepta 11 bits, y yo le estoy mandando 16 bits desde el PIC. Habria alguna manera para enviar tan solo 11 bits desde el PIC?

Espero tu respuesta. En todo caso, mañana ire a la facultad y testeare el circuito con un osciloscopio para ver exactamente que es lo que esta fallando.

Un saludo.
Título: RE: Reinicio del PIC
Publicado por: maunix en 04 de Abril de 2006, 06:21:00
Escrito originalmente por fito20
Pienso que el problema podria estar relacionado con el envio de bits, el potenciometro acepta 11 bits, y yo le estoy mandando 16 bits desde el PIC. Habria alguna manera para enviar tan solo 11 bits desde el PIC?

Espero tu respuesta. En todo caso, mañana ire a la facultad y testeare el circuito con un osciloscopio para ver exactamente que es lo que esta fallando.

Un saludo.


No, no es importante eso de los 11 o 16 bits.  En realidad la gente que hace estos integrados sabe perfectamente que los modulos SPI mandan en múltiplos de 8 bits los datos, es por eso que recien los aceptan cuando se les indica latchear la informacion.

Como alternativa podrías hacer la transmisión tu mismo, diseñandote toda la trama por software.  Si, suena a engorroso pero no es la muerte.  Un SPI por software es la comunicacion más simple que puedas llegar a imitar (muchisimo más simple que la UART).  La simplicidad radica en que es una comunicación síncrona donde está perfectamente claro donde se envian los datos, donde se latchean, etc.

Me parece muy bien que uses el osciloscopio eso te disipará muchas dudas.  Esta semana estaré de viaje así que espero puedas resolver tu problema o al menos tengas paciencia hasta que yo regrese (o bien algún otro del foro te podría ayudar).

Saludos
Título: RE: Reinicio del PIC
Publicado por: fito20 en 04 de Abril de 2006, 08:56:00
Ok Mauricio, ire posteando lo que consiga y las dudas que me vayan surgiendo. Cuando vuelvas echale un ojo al hilo, por favor.

Un saludo.
Título: RE: Reinicio del PIC
Publicado por: maunix en 04 de Abril de 2006, 10:00:00
Escrito originalmente por fito20
Ok Mauricio, ire posteando lo que consiga y las dudas que me vayan surgiendo. Cuando vuelvas echale un ojo al hilo, por favor.

Un saludo.


Sí, lo haré Giño No te dejaré tirado si esa es tu preocupación  Sonrisa GiganteSonrisa Gigante
Título: RE: Reinicio del PIC
Publicado por: fito20 en 05 de Abril de 2006, 02:53:00
Por fin consegui comunicacion!...pero no la esperada...mientras yo apuntaba al pote 2 y lo trataba de colocar en una posicion fija al accionar el pulsador, lo que ocurre es lo siguiente:

Cuando pulso el boton, es el pote 1 el que varia, y no a una posicion fija, sino que cada vez que lo pulso, el pote aumenta su valor, desde 0K, 40ohm....hasta 50K...

Escribo el codigo, por si alguien ve el error:

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
R_ContC   equ   0x25
R_ContE   equ   0x28
R_ContD   equ   0x29

temp1   equ   0x26
temp2   equ   0x27

#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,RP0
   bcf   STATUS,RP1
   clrf   POT_GANANCIA
   clrf   PORTA
   clrf   PORTB
   clrf   PORTC
   bsf   STATUS,RP0    ; 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
   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
   
   call   Retardo_1s
   NO_CHIP         ; llama a la macro de deshabilitar los 4 potes.
   call   Retardo_1s

   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

   call   Retardo_1s

test   btfsc   PORTB,2
   call   subdown
   goto   test


subdown   GR_GA
   bsf   PORTC,6
   bsf   PORTC,2
   call   Retardo_1s
   bsf   PORTC,7
   bcf   STATUS,RP1
   bcf   STATUS,RP0   ; banco 0
   movlw   B"00000001"   ; apunta a la direccion RDAC2
   call   spien
   movlw   B"0001111"   ; coloca el pote en la posicion 3
   call   spien
   NO_CHIP
   call   Retardo_1s
   bcf   PORTC,7
   return

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

;Envia el byte que viene en el registro "w" mediaante el protocolo spi.


spien   call   Retardo_100ms
   movwf   temp1      ;Salva el byte a transmitir en el registro temporal "temp1"
   movlw   0x08
   movwf   temp2      ;Inicializa el contador
   
bck   bsf   PORTC,5      ;Sube data
   btfss   temp1,7      ;Comprueba el bit y lo baja si es cero
   bcf   PORTC,5
   nop         ;Envia el bit
   bsf   PORTC,3
   nop         ;Da un pulso de reloj
   bcf   PORTC,3
   nop
   rlf   temp1,f      ;Rotamos a la izquierda "temp1"
   decfsz   temp2,f      ;Comprobamos el contador, para ver si hemos enviado los 8 bits
   goto   bck      ;Si no, repetimos el bucle
   bcf   PORTC,5
   return         ;Fin

 
Retardo_1s            ; La llamada "call" aporta 2 ciclos máquina.
   movlw   d"10"         ; Aporta 1 ciclo máquina. Este es el valor de "N".
   goto   Retardo_1Decima      ; Aporta 2 ciclos máquina.

Retardo_1Decima
   movwf   R_ContC         ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
   movlw   d"100"         ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
   movwf   R_ContB         ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
   movlw   d"249"         ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
   movwf   R_ContA         ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno          
   nop            ; Aporta KxMxNx1 ciclos máquina.
   decfsz   R_ContA,F      ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
   goto   R1Decima_BucleInterno   ; Aporta (K-1)xMxNx2 ciclos máquina.
   decfsz   R_ContB,F      ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
   goto   R1Decima_BucleExterno   ; Aporta (M-1)xNx2 ciclos máquina.
   decfsz   R_ContC,F      ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
   goto   R1Decima_BucleExterno2   ; Aporta (N-1)x2 ciclos máquina.
   return            ; El salto del retorno aporta 2 ciclos máquina.




Retardo_100ms            ; La llamada "call" aporta 2 ciclos máquina.
   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_ContD         ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
   movlw   d"249"         ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
   movwf   R_ContE         ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
   nop            ; Aporta KxMx1 ciclos máquina.
   decfsz   R_ContE         ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
   goto   R1ms_BucleInterno      ; Aporta (K-1)xMx2 ciclos máquina.
   decfsz   R_ContD         ; (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ó
;------------------------------------------




Un saludo y gracias.
Título: RE: Reinicio del PIC
Publicado por: en 05 de Abril de 2006, 17:57:00
saludos desde colombia, mi nombre es raul castrillon y soy biomedico, en este momento estoy trabajando en el diseñ de un esterilizador de material quirurgico y pretendo colocarle un LCD pero no se como configurarlo con el PIC estoy buscando ayuda y si usted puede brindarme informacion le agradeceria mucho.
[/code][/cita]
Título: Re: Reinicio del PIC
Publicado por: fito20 en 09 de Abril de 2006, 09:50:45
Hay muchos hilos abiertos sobre LCD, de hecho mas arriba de este post hay uno. Suerte.

Consegui mover el potenciometro como dije mas arriba, pero no logro que haga lo que quiero. Ahora estoy probando el siguiente codigo pero tampoco obedece, sino mas bien hace lo que quiere.

Tengo desactivado el pulsador. El clock del pote esta conectado con un pin del PIC que hace de reloj, todo via software. Envio 11bits solamente, que es lo que entiende el pote.

He desactivado la configuracion del SPI porque lo estoy haciendo en modo manual.

Echadme una manilla por favor.

Código: [Seleccionar]
;---------------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
R_ContC equ 0x25
R_ContE equ 0x28
R_ContD equ 0x29

temp1 equ 0x26
temp2 equ 0x27

#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,RP0
bcf STATUS,RP1
clrf POT_GANANCIA
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; 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
; 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

call Retardo_1s
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call Retardo_1s

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

call Retardo_1s

GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0

bit1 bsf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit2 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit3 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit4 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit5 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit6 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit7 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit8 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit9 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit10 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit11 bcf PORTC,5 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

NO_CHIP
call Retardo_1s


test goto test

 
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.

Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno         
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.




Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
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_ContD ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContE ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContE ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContD ; (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ó
;------------------------------------------

Título: Re: Reinicio del PIC
Publicado por: BrunoF en 09 de Abril de 2006, 12:10:10
Hola, voy mirando el codigo, y te voy poniendo los errores que encuentro. ya pa empezar aca tenes uno grave:

reg1   equ   0x20
POT_GANANCIA   EQU   .32

Estas utilizando la misma posicion GPR para ambas variables, eso trae problemas si no era tu intencion...
Sigamos viendo...
Título: Re: Reinicio del PIC
Publicado por: maunix en 09 de Abril de 2006, 14:49:55
Hola, voy mirando el codigo, y te voy poniendo los errores que encuentro. ya pa empezar aca tenes uno grave:

reg1   equ   0x20
POT_GANANCIA   EQU   .32

Estas utilizando la misma posicion GPR para ambas variables, eso trae problemas si no era tu intencion...
Sigamos viendo...


Muy buen punto BrunoF

fito20 si todavia tienes inconvenientes, aquí he vuelto

Título: Re: Reinicio del PIC
Publicado por: fito20 en 09 de Abril de 2006, 17:16:35
Muchas gracias Bruno y Maunix. No entiendo bien donde esta el error al que os referis? No se que es la posicion GPR  :oops:

Con el codigo de arriba envio 11 bits que es el tamaño del registro del pote. La señal de reloj la voy generando manualmente como maunix me recomendo, a traves del pin 7 del puerrto C, conectado al clock del pote.

Los datos salen por el pin 5 del puerto C, hacia el SDI del pote.

Pero si le mando la secuencia 000 000000001 que seria apuntar al pote 1 y colocarlo en la posicion 1 (45 ohmios), no hace eso.

En el ultimo codigo adjuntado probe a invertir el orden y envie 10000000 000, pero ni asi...empiezo a desesperarme porque en junio tengo que tener terminado el proyecto y veo que esto no funciona  :(
Título: Re: Reinicio del PIC
Publicado por: maunix en 09 de Abril de 2006, 17:34:34
fito20 lo que te decia Bruno es lo siguiente

Tu tienes esta declaración

reg1   equ   0x20
POT_GANANCIA   EQU   .32


Y hacer 0x20 o .32 es lo mismo. (0x20 es 20 en hexa, .32 es 32 en decimal).

Ya que 20 en hexa, es igual a 32 en decimal o dicho de otra forma 20h = 32d


Entonces tu variable reg1 y POT_GANANCIA apuntan al mismo registro de memoria.

Podrias poner algo asi como

reg1   equ   0x20
POT_GANANCIA   EQU   0x21


o bien

reg1   equ   0x32
POT_GANANCIA   equ   .33



Espero te sea de utilidad

Título: Re: Reinicio del PIC
Publicado por: fito20 en 09 de Abril de 2006, 18:36:02
Ei Maunix, muchas gracias por la aclaracion. Nunca consegui aprender a pasar de hexadecimales a decimales y eso...

Lo probare mañana por la mañana, espero que funcione, aunque creo que no sera eso, porque despues no uso para nada la variable POT_GANANCIA, pero si reg1...veremos a ver.

Mañana os cuento. Un saludo y gracias :wink:
Título: Re: Reinicio del PIC
Publicado por: fito20 en 10 de Abril de 2006, 10:04:03
Hola!. Bueno, como no consegui que funcionara el potenciometro AD5204, he ensayado los 1867 de Dallas/Maxim y funcionan correctamente.

Os adjunto el link del datasheet:

http://pdfserv.maxim-ic.com/en/ds/DS1867.pdf#search='digital%20potentiometer%201867'

El codigo con el que lo he ensayado es el siguiente:

Código: [Seleccionar]
;---------------Encabezado-------------

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

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

   
R_ContB equ 0x23
R_ContA equ 0x24
R_ContC equ 0x25
R_ContE equ 0x26
R_ContD equ 0x27


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


NO_CHIP macro
bcf 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,RP0
bcf STATUS,RP1
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; 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
bcf STATUS,RP0 ; banco 0

call Retardo_1s
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call Retardo_1s

bsf PORTC,1 ; ponemos un 1 en LED para encenderlo y ver que funciona el circuito
call Retardo_1s

GR_GA
call Retardo_1s

bit1 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit2 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit3 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit4 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit5 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit6 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit7 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit8 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit9 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit10 bsf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit11 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit12 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit13 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit14 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit15 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit16 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

bit17 bcf PORTC,2 ;Sube data
call Retardo_100ms ;Envia el bit
bsf PORTC,7
call Retardo_100ms ;Da un pulso de reloj
bcf PORTC,7
call Retardo_100ms

NO_CHIP
call Retardo_1s


test goto test

 
Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.

Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno         
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.




Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
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_ContD ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContE ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContE ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContD ; (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ó
;------------------------------------------


Notad que ahora son 17bits los que hay que enviar porque este pote trabaja asi. Son 8bits del 1º pote, 8bits del 2º pote y 1 bit de seleccion.

Lo que no alcanzo a entender es como hacer para tan solo cambiar la posicion de un pote...enviando 9 bits?

Y la segunda duda es si el pin Cout hace las funciones de SDO para leer la posicion del pote desde el PIC, para almacenar su posicion en el mismo.

Un saludo.
Título: Re: Reinicio del PIC
Publicado por: maunix en 10 de Abril de 2006, 10:18:58

Notad que ahora son 17bits los que hay que enviar porque este pote trabaja asi. Son 8bits del 1º pote, 8bits del 2º pote y 1 bit de seleccion.

Lo que no alcanzo a entender es como hacer para tan solo cambiar la posicion de un pote...enviando 9 bits?

Y la segunda duda es si el pin Cout hace las funciones de SDO para leer la posicion del pote desde el PIC, para almacenar su posicion en el mismo.

Un saludo.

Puede que tengas que enviar siempre el dato del segundo pote por mas que no lo quieras cambiar. 

Si no lo quieres cambiar envias siempre el mismo dato y listo. 

A menudo es la única forma. 

Te hablo sin leer el datasheet pero si en el datasheet te dice que necesita 17 bits siempre latcheará 17 bits, y si le enviaste 9, los otros 8 bits los sacará de la transmisión anterior a eso. 

Saludos y me alegro hayas solucionado tu problema, aunque hayas tenido que cambiar el IC.

Título: Re: Reinicio del PIC
Publicado por: fito20 en 10 de Abril de 2006, 11:35:12
Hola Maunix.

He estado mirando el datasheet y en el pin Cout indica: cascade serial port output.

Pero despues aparece en el modo cascada para conectar en serie varios potenciometros.

Me gustaria que me aclarases si dicha salida de datos me sirve para leer la posicion del pote a traves de una entrada del PIC.

Otra cosa que he ensayado es que cambia el valor de ambos potes independientemente del valor del bit 0 que es el que en teoria deberia seleccionar entre los dos potes...algo muy extraño.

Si tienes un poco de tiempo, te rogaria que me lo aclarases porque ya veo la luz cerca. Un abrazo.

Título: Re: Reinicio del PIC
Publicado por: maunix en 10 de Abril de 2006, 11:50:40
Hola Maunix.

He estado mirando el datasheet y en el pin Cout indica: cascade serial port output.

Pero despues aparece en el modo cascada para conectar en serie varios potenciometros.

Me gustaria que me aclarases si dicha salida de datos me sirve para leer la posicion del pote a traves de una entrada del PIC.

Otra cosa que he ensayado es que cambia el valor de ambos potes independientemente del valor del bit 0 que es el que en teoria deberia seleccionar entre los dos potes...algo muy extraño.

Si tienes un poco de tiempo, te rogaria que me lo aclarases porque ya veo la luz cerca. Un abrazo.

Si, de hecho todos los dispositivos SPI se pueden enganchar en cascada.  El tema es que al enviar la información debes enganchar uno detras de otro.  No vas a poder hacer eso de mandar 24 bits sin importarte los primeros bits. 

Esos primeros bits serán enviados al 2do Potenciometro.  Los cuales cuando sigas enviando bits, se pasaran uno tras otro.

Entonces, debes armar una trama de 34bits, es decir 5 bytes, de los cuales puedes descartar a los primeros 6 bits del primer byte a enviar.

Esto lo envias todo uno detrás de otro teniendo en cuenta que primero enviarás los datos del segundo dispositivo y luego del primer dispositivo.  El segundo sería el que está más lejos del PIC en terminos de la salida de datos del pic. 

PIC --> DISPOSITIVO 1 --> DISPOSITIVO 2 --> al SDI del PIC


Para leer, debes tener el mismo cuidado.  Leerás 34 bits de los cuales puedes descartar los ultimos 6!  Ojo con este detalle.

En general, suele ser más comodo manejar 2 CS diferentes, tener puenteados los SDI y SDO de los integrados en conjunto con el PIC y manejar a cada uno con los CS cuando querramos.

Para hcer esto, tener cuidado de que los SDO de los IC sean open collector (algunos no lo son)




Título: Re: Reinicio del PIC
Publicado por: fito20 en 10 de Abril de 2006, 12:48:15
Maunix muchisimas gracias una vez mas por tu aclaracion detallada.

Creo que al final lo que hare sera olvidarme del SDO, y guardar los datos cuando salen del PIC en luegar de tener que leerlos del pote. Asimismo, al arrancar el PIC coloco la posicion de los potes en la mitad para saber donde estan al arrancar el programa y evitar leer de nuevo.

He ensayado la siguiente rutina para ir subiendo de uno en uno la posicion del pote 0, pero no se mueve...creo que el fallo esta en el uso de addlw, que no lo controlo. Me puedes decir como sumo 1 cada vez que presione el pulsador?

Código: [Seleccionar]
reset org 0x00      ; origen del programa, aquí comenzará siempre que ocurra un reset
goto inicio      ; salta a "inicio"

inicio bcf STATUS,RP0
bcf STATUS,RP1
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; banco1
movlw 0x06
movwf ADCON1
movlw 0XCF
movwf TRISA
movlw b'00000100'   
movwf TRISB       ; y pasa el valor a trisb
movlw b'00010000'
movwf TRISC
bcf STATUS,RP0 ; banco 0

call Retardo_1s
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call Retardo_1s

bsf PORTC,1 ; ponemos un 1 en LED para encenderlo y ver que funciona el circuito
call Retardo_1s

movlw B'10000000'
movwf temp3


test btfsc PORTB,2
call subdown
goto test


subdown GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0

movlw B'00000000'
call spien
movlw B'10000000'
call spien
movlw temp3
addlw 0x01
movwf temp3
movlw temp3
call spien
NO_CHIP
return

spien movwf temp1 ;Salva el byte a transmitir en el registro temporal 'temp1'
movlw 0x08
movwf temp2 ;Inicializa el contador
call Retardo_100ms

bck bsf PORTC,2 ;Sube data
btfss temp1,7 ;Comprueba el bit y lo baja si es cero
bcf PORTC,2
nop ;Envia el bit
bsf PORTC,7
nop ;Da un pulso de reloj
bcf PORTC,7
nop
rlf temp1,f ;Rotamos a la izquierda 'temp1'
decfsz temp2,f ;Comprobamos el contador, para ver si hemos enviado los 8 bits
goto bck ;Si no, repetimos el bucle
return

Un abrazo y muchas gracias por la ayuda que me estas prestando maunix
Título: Re: Reinicio del PIC
Publicado por: BrunoF en 10 de Abril de 2006, 13:31:04
Hola.Mira esta parte...

Código: [Seleccionar]

subdown GR_GA
call Retardo_1s
bcf STATUS,RP1
bcf STATUS,RP0 ; banco 0

movlw B'00000000'              ;cargar W=0 (es lo mismo que hacer "clrw")
call spien
movlw B'10000000'              ;cargar W=.128
call spien
movlw temp3                        ;aca viene la cosa...alli estas cargando W con la posicion de memoria que le asignaste a temp3!!!! lo que tenes que hacer es, en todo caso...movf  temp3,w
    ;supongamos que asignaste temp3 equ 0x23 ok?
;alli estas cargando a W con 0x23...erroneo para lo que queres hacer.
addlw 0x01                        ;incrementa el contenido de W en 1.(entonces aca W=0x24)
movwf temp3                        ;temp3=0x24
movlw temp3                        ;W=0x23
call spien ;haciendo como lo hiciste, Siempre se va a enviar el valor 0x23 al potenciometro
NO_CHIP
return


Aca te paso como lo haria yo si es que te entendi bien la idea...

Código: [Seleccionar]

subdown GR_GA
call Retardo_1s
bcf STATUS,RP1      ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0

        clrw
    call spien
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
incf temp3,F
        movf    temp3,W
call spien
NO_CHIP
return


haciendo eso, enviarias 3 bytes por loop, el primero seria 0x00, el segundo 0x80, y el tercero, arrancaria(si temp3 estaba inicializada a cero) con el valor 1, y en cada pasada esta valor se iria incrementando en 1.
Cuando temp3 valga 255, y se le sume 1 mas, se va a producir un overflow, volviendo a valer 0 temp3.

Al resto del codigo no lo mire. Por ahi si no pones retardos, puede que no llegues a apreciar con instrumentos de medicion comunes si el pote esta cambiando...En ese caso puede que necesites alentar un poco el proceso(poner retardos)

P.D. GPR = General Purpose Registers

Exitos!
Título: Re: Reinicio del PIC
Publicado por: maunix en 10 de Abril de 2006, 15:12:33
haciendo eso, enviarias 3 bytes por loop, el primero seria 0x00, el segundo 0x80, y el tercero, arrancaria(si temp3 estaba inicializada a cero) con el valor 1, y en cada pasada esta valor se iria incrementando en 1.
Cuando temp3 valga 255, y se le sume 1 mas, se va a producir un overflow, volviendo a valer 0 temp3.

Al resto del codigo no lo mire. Por ahi si no pones retardos, puede que no llegues a apreciar con instrumentos de medicion comunes si el pote esta cambiando...En ese caso puede que necesites alentar un poco el proceso(poner retardos)


Coincido con la sugerencia de BrunoF. 

Además el incremento podría ser ocasionado cada vez que se pulse la tecla y luego del seteo meter un buen retardo así no se hace la lectura de la tecla nuevamente.  De esta forma te garantizas una transición más lenta del pote.

Título: Re: Reinicio del PIC
Publicado por: fito20 en 10 de Abril de 2006, 16:10:39
Muchas gracias por las sugerencias a ambos. Mañana seguire trabajando y os informo.

Un afectuoso saludo.
Título: Re: Reinicio del PIC
Publicado por: fito20 en 11 de Abril de 2006, 07:17:09
Sois unos maquinas!! Ya funciona!! por fin!...inicializo temp3 a 0 y despues de 256 pulsaciones se desborda y vuelve a comenzar desde 0.

Como necesito 4 potenciometros (GAIN, LOW, MID, HIGH), es decir dos integrados, usare dos salidas del PIC como Chipselects para seleccionar entre uno y otro.

El EQ lleva un display que informara de error en caso de encontrarse el pote en la posicion 256 y querer subir una mas o en caso de bajar mas alla de 0. Como podria modificar subdown para que me comprobara que no estoy en la posicion 256?...comprobando todos los bits del temp3?

Para bajar la posicion en lugar de subirla, la rutina sera practicamente igual...cual es la funcion equivalente a addlw pero que resta? declw?

Un saludo y muchisimas gracias porque sin vuestra ayuda no hubiera llegado hasta aqui :wink:
Título: Re: Reinicio del PIC
Publicado por: BrunoF en 11 de Abril de 2006, 09:39:33
para limitar la subida del pote cuando ya se encuentra al maximo(255):
(fijate que cambie el nombre de la subrutina)

Código: [Seleccionar]

subup GR_GA
call Retardo_1s
bcf STATUS,RP1      ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0

        clrw
call spien
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
incf temp3,W ;incrementar en 1 temp3, guardar resultado en W
btfsc STATUS,Z ;la utima operacion dio cero?(overflow en este caso?)
retlw .0 ;SI! retornar con W= 0 (falso)entonces luego cuando sale de la subrutina pudes interceptar esto
;puede ser tambien GOTO ERROR o hacia donde quieras desviar en caso que ya este al maximo el pote
        movwf temp3 ;NO! entonces copiar W(que contenia el resultado) en temp3
call spien
NO_CHIP
retlw         .1                              ;todo bien, retornar con W=1(verdadero)


Tambien podria hacerce utilizando la instruccion decfsz,etc... hay muchas variantes que pueden utilizarse para comprobar y limitar el pote.

Citar
Para bajar la posicion en lugar de subirla, la rutina sera practicamente igual...cual es la funcion equivalente a addlw pero que resta? declw?

Fijate que yo no uso addlw en la subrutina, porque si pensas incrementar la variable en pasos de a 1, puede resultar mas facil utilizar, por ejemplo, la incf(increment file).
addlw = add literal to W
la opuesta es sublw = substract W from literal

La rutina para cuando presionan para bajar el pote, y comprobar si ya esta en cero puede ser asi:

Código: [Seleccionar]

subdown GR_GA
call Retardo_1s
bcf STATUS,RP1      ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0

                clrw
call spien
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call spien
                movf         temp3,f                     ;mover el contenido de temp3 en si mismo(¿redundante? NO! esto setea el flag Z si el contenido de temp3 es = 0)
                btfsc         STATUS,Z                  ;temp3 = 0?
                retlw         .0                             ;SI!.volver con W=0 (falso)

decf temp3,F ;NO!.decrementar en 1 unidad temp3
                movf temp3,w ;copiar el contenido de temp3 en W
call spien
NO_CHIP
retlw         .1                              ;volver con W=1(verdadero) todo OK!


En el datasheet del PIC podes encontrar todas las instrucciones posibles, y una breve explicacion de cada una
Saludos.
Título: Re: Reinicio del PIC
Publicado por: fito20 en 11 de Abril de 2006, 11:05:02
Mañana montare el segundo pulsador para bajar y probare ambas rutinas juntas (la de up y la de down). Os mantengo informados.

Gracias Bruno por compartir tus conocimientos conmigo :wink:

Un abrazo.
Título: Re: Reinicio del PIC
Publicado por: fito20 en 12 de Abril de 2006, 07:51:53
Pues esto va sobre ruedas. He montado la placa de pruebas con dos pulsadores, uno para subir y otro para bajar y funciona perfectamente.

He disminuido los retardos porque 1 segundo era demasiado. Ahora estan a 100ms.

La unica pega es que no se queda quieta la medida de la impedancia en el polimetro al medir, sobre todo cuando se superan los 25K...no se a que se debe.

El proximo paso sera colocar un nuevo pulsador para elegir entre los 4 potes. Mañana me pondre a ello.

Dejo el codigo de lo que llevo hecho para quien le pueda servir en un futuro.

Os sigo informando. Un saludo y mil gracias.

Código: [Seleccionar]
;---------------Encabezado-------------

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

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

   
R_ContB equ 0x23
R_ContA equ 0x24
R_ContC equ 0x25
R_ContE equ 0x26
R_ContD equ 0x27

temp1 equ 0x28
temp2 equ 0x29
temp3 equ 0x30


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


NO_CHIP macro
bcf 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,RP0
bcf STATUS,RP1
clrf PORTA
clrf PORTB
clrf PORTC
bsf STATUS,RP0 ; banco1
movlw 0x06
movwf ADCON1
movlw 0XCF
movwf TRISA
movlw b'00010100'   
movwf TRISB       ; y pasa el valor a trisb
movlw b'00010000'
movwf TRISC
bcf STATUS,RP0 ; banco 0

call Retardo_1s
NO_CHIP ; llama a la macro de deshabilitar los 4 potes.
call Retardo_1s

bsf PORTC,1 ; ponemos un 1 en LED para encenderlo y ver que funciona el circuito
call Retardo_1s

movlw B'11000000'
movwf temp3


test btfsc PORTB,2
call subup
btfsc PORTB,4
call subdown
goto test


subup GR_GA
call Retardo_100ms
bcf STATUS,RP1      ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0

        clrw
call output
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
incf temp3,W ;incrementar en 1 temp3, guardar resultado en W
btfsc STATUS,Z ;la utima operacion dio cero?(overflow en este caso?)
retlw   .0 ;SI! retornar con W= 0 (falso)entonces luego cuando sale de la subrutina pudes interceptar esto
                ;puede ser tambien GOTO ERROR o hacia donde quieras desviar en caso que ya este al maximo el pote
        movwf temp3 ;NO! entonces copiar W(que contenia el resultado) en temp3
call output
NO_CHIP
retlw   .1                   ;todo bien, retornar con W=1(verdadero)


subdown GR_GA
call Retardo_100ms
bcf STATUS,RP1      ;no me parecen necesarias estas dos lineas(las bcf, pero dejalas x las dudas)
bcf STATUS,RP0 ; banco 0

        clrw
call output
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
        movf    temp3,F         ;mover el contenido de temp3 en si mismo(¿redundante? NO! esto setea el flag Z si el contenido de temp3 es = 0)
        btfsc   STATUS,Z        ;temp3 = 0?
        retlw   .0                             ;SI!.volver con W=0 (falso)

decf temp3,F ;NO!.decrementar en 1 unidad temp3
        movf temp3,w ;copiar el contenido de temp3 en W
call output
NO_CHIP
retlw   .1                              ;todo bien, retornar con W=1(verdadero)


output movwf temp1 ;Salva el byte a transmitir en el registro temporal 'temp1'
movlw 0x08
movwf temp2 ;Inicializa el contador
call Retardo_100ms

bck bsf PORTC,2 ;Sube data
btfss temp1,7 ;Comprueba el bit y lo baja si es cero
bcf PORTC,2
nop ;Envia el bit
bsf PORTC,7
nop ;Da un pulso de reloj
bcf PORTC,7
nop
rlf temp1,f ;Rotamos a la izquierda 'temp1'
decfsz temp2,f ;Comprobamos el contador, para ver si hemos enviado los 8 bits
goto bck ;Si no, repetimos el bucle
return


fallo clrw
call output
movlw B'10000000'     ;cargar W=.128 Supongo que quisiste aca que el pote valga .128....
call output
movf    temp3,W
call output
NO_CHIP
return           


Retardo_1s ; La llamada "call" aporta 2 ciclos máquina.
movlw d'10' ; Aporta 1 ciclo máquina. Este es el valor de "N".
goto Retardo_1Decima ; Aporta 2 ciclos máquina.

Retardo_1Decima
movwf R_ContC ; Aporta 1 ciclo máquina.
R1Decima_BucleExterno2
movlw d'100' ; Aporta Nx1 ciclos máquina. Este es el valor de "M".
movwf R_ContB ; Aporta Nx1 ciclos máquina.
R1Decima_BucleExterno
movlw d'249' ; Aporta MxNx1 ciclos máquina. Este es el valor de "K".
movwf R_ContA ; Aporta MxNx1 ciclos máquina.
R1Decima_BucleInterno         
nop ; Aporta KxMxNx1 ciclos máquina.
decfsz R_ContA,F ; (K-1)xMxNx1 cm (si no salta) + MxNx2 cm (al saltar).
goto R1Decima_BucleInterno ; Aporta (K-1)xMxNx2 ciclos máquina.
decfsz R_ContB,F ; (M-1)xNx1 cm (cuando no salta) + Nx2 cm (al saltar).
goto R1Decima_BucleExterno ; Aporta (M-1)xNx2 ciclos máquina.
decfsz R_ContC,F ; (N-1)x1 cm (cuando no salta) + 2 cm (al saltar).
goto R1Decima_BucleExterno2 ; Aporta (N-1)x2 ciclos máquina.
return ; El salto del retorno aporta 2 ciclos máquina.




Retardo_100ms ; La llamada "call" aporta 2 ciclos máquina.
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_ContD ; Aporta 1 ciclo máquina.
R1ms_BucleExterno
movlw d'249' ; Aporta Mx1 ciclos máquina. Este es el valor de "K".
movwf R_ContE ; Aporta Mx1 ciclos máquina.
R1ms_BucleInterno
nop ; Aporta KxMx1 ciclos máquina.
decfsz R_ContE ; (K-1)xMx1 cm (cuando no salta) + Mx2 cm (al saltar).
goto R1ms_BucleInterno ; Aporta (K-1)xMx2 ciclos máquina.
decfsz R_ContD ; (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ó
;------------------------------------------
Título: Re: Reinicio del PIC
Publicado por: maunix en 12 de Abril de 2006, 08:15:17
Pues esto va sobre ruedas. He montado la placa de pruebas con dos pulsadores, uno para subir y otro para bajar y funciona perfectamente.

He disminuido los retardos porque 1 segundo era demasiado. Ahora estan a 100ms.

La unica pega es que no se queda quieta la medida de la impedancia en el polimetro al medir, sobre todo cuando se superan los 25K...no se a que se debe.

El proximo paso sera colocar un nuevo pulsador para elegir entre los 4 potes. Mañana me pondre a ello.

Dejo el codigo de lo que llevo hecho para quien le pueda servir en un futuro.

Os sigo informando. Un saludo y mil gracias.


fito20 realmente me pone muy contento que te vayan saliendo las cosas y he notado que le has puesto mucho empeño a tu proyecto.

Un abrazo
Título: Re: Reinicio del PIC
Publicado por: fito20 en 12 de Abril de 2006, 14:48:22
Muchas gracias Maunix.

Me he tenido que pelear solo con el proyecto porque el profesor que me guia no entiende mucho de esto, pero me ha servido para echarle mas ganas al tema.

Os agradezco a Bruno, a Chaly29 y a ti toda la ayuda que me estais dando, porque sin vuestra ayuda aun estaria atrancado en las nociones basicas del PIC y del pote digtal sin duda.

Os voy contando. Un saludo.