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

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

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Re: Reinicio del PIC
« Respuesta #30 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  :(

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Reinicio del PIC
« Respuesta #31 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

- 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 #32 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:

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Re: Reinicio del PIC
« Respuesta #33 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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Reinicio del PIC
« Respuesta #34 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.

- 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 #35 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.


Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Reinicio del PIC
« Respuesta #36 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)




- 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 #37 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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Reinicio del PIC
« Respuesta #38 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!
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

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

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Reinicio del PIC
« Respuesta #39 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.

- 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 #40 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.

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Re: Reinicio del PIC
« Respuesta #41 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:

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Reinicio del PIC
« Respuesta #42 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.
« Última modificación: 11 de Abril de 2006, 09:41:16 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

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

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Re: Reinicio del PIC
« Respuesta #43 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.

Desconectado fito20

  • PIC12
  • **
  • Mensajes: 91
Re: Reinicio del PIC
« Respuesta #44 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ó
;------------------------------------------


 

anything