TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: bones18 en 26 de Septiembre de 2006, 06:48:48

Título: el bsf es permanente?
Publicado por: bones18 en 26 de Septiembre de 2006, 06:48:48
Wuenas,

estoy haciendo un codigo, este mismo

Principal
   movlw b'00000000'
    movwf PORTA

   bsf PORTA,0
   ;fem un reset al LCD
call fer_reset
   
bucle
   
    bsf PORTA,1
   goto    bucle      ; Crea un bucle cerrado e infinito.
END            ; Fin del programa.
   


Título: Re: el bsf es permanente?
Publicado por: Modulay en 26 de Septiembre de 2006, 06:56:08
¿y cual es el problema?
Título: Re: el bsf es permanente?
Publicado por: bones18 en 26 de Septiembre de 2006, 06:59:53
he apretado el boton publicar sin querer!

bueno acabo el post..

en ambos puertos PORTA,0 y PORTA,1 hay un LED

segun este codigo ambos deberian quedar encendidos, pero no es asi, se enciende el PORTA,0 durante un instante, y se apaga, luego el PORTA,1 que hay en bucle si queda permanentemente encedido

puedo haberme dejado alguna directiva o algo para que pase esto?

gracias!
Título: Re: el bsf es permanente?
Publicado por: bones18 en 26 de Septiembre de 2006, 07:02:00
me olvidaba, es para un PIC16F876
Título: Re: el bsf es permanente?
Publicado por: Modulay en 26 de Septiembre de 2006, 07:29:26
¿configuraste bien los tris?
Postea la rutina fer_reset
Título: Re: el bsf es permanente?
Publicado por: bones18 en 26 de Septiembre de 2006, 07:46:02
aqui va

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F876
   INCLUDE  <P16F876.INC>
#DEFINE WR     PORTC,3
#DEFINE R_D    PORTC,2
#DEFINE C_D    PORTC,1
#DEFINE RESET  PORTC,0

RET1 equ 0x0C
RET2 equ 0x2D
RET3 equ 0x2E
RET4 equ 0x2F
RET5 equ 0x30

; ZONA DE CÓDIGOS ********************************************************************

   ORG    0         ; El programa comienza en la dirección 0.
Inicio

   ;canviem de banc
   bsf   STATUS,RP0      ; Acceso al Banco 1.
   clrf   TRISA           ; Las líneas del Puerto B se configuran como salida.
   clrf   TRISB      ; Tot el port A es configura com a SORTIDA
   clrf    TRISC

   bcf   STATUS,RP0      ; Acceso al Banco 0.
   goto Principal

fer_reset
   bsf RESET
   nop
   bcf RESET
   nop
   nop
   nop
   nop
   bsf RESET
return


Principal
   movlw b'00000000'
                 movwf PORTA

   bsf PORTA,0
   ;fem un reset al LCD
   call fer_reset
bucle
   
               bsf PORTA,1
   goto    bucle      ; Crea un bucle cerrado e infinito.
END   
Título: Re: el bsf es permanente?
Publicado por: microcom en 26 de Septiembre de 2006, 16:08:48
aqui va

   __CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F876
   INCLUDE  <P16F876.INC>
#DEFINE WR     PORTC,3
#DEFINE R_D    PORTC,2
#DEFINE C_D    PORTC,1
#DEFINE RESET  PORTC,0

RET1 equ 0x0C
RET2 equ 0x2D
RET3 equ 0x2E
RET4 equ 0x2F
RET5 equ 0x30

; ZONA DE CÓDIGOS ********************************************************************

   ORG    0         ; El programa comienza en la dirección 0.
Inicio

   ;canviem de banc
   bsf   STATUS,RP0      ; Acceso al Banco 1.
   clrf   TRISA           ; Las líneas del Puerto B se configuran como salida.
   clrf   TRISB      ; Tot el port A es configura com a SORTIDA
   clrf    TRISC

   bcf   STATUS,RP0      ; Acceso al Banco 0.
   goto Principal

fer_reset
   bsf RESET
   nop
   bcf RESET
   nop
   nop
   nop
   nop
   bsf RESET
return


Principal
   movlw b'00000000'
                 movwf PORTA

   bsf PORTA,0
   ;fem un reset al LCD
   call fer_reset
bucle
   
               bsf PORTA,1
   goto    bucle      ; Crea un bucle cerrado e infinito.
END   


por ahi no veo que hallas configurado las lineas del porta como digitales.

MOVLW   07
MOVWF   ADCON1.

saludos



Título: Re: el bsf es permanente?
Publicado por: maunix en 26 de Septiembre de 2006, 16:28:46
por ahi no veo que hallas configurado las lineas del porta como digitales.

MOVLW   07
MOVWF   ADCON1.

saludos

Si los pines están como salida no importa que estén como digitales o no.  Debiera funcionar bien igual el software.

bones18 creo que el problema no está en tu código sino en tu vista.  Es que estas encendiendo y apagando un led en unos pocos microsegundos.  No hay ojo humano capaz de ver ese 'cambio'.

Si usas un osciloscopio de seguro verás al pin cambiar de estado o sino pon un delay después del encendido y después del apagado del led.


Saludos

Título: Re: el bsf es permanente?
Publicado por: microcom en 26 de Septiembre de 2006, 16:42:40
bueno.
 viejo maunix tiene toda razon.

saludos.
Título: Re: el bsf es permanente?
Publicado por: bones18 en 26 de Septiembre de 2006, 17:43:04
bones18 creo que el problema no está en tu código sino en tu vista.  Es que estas encendiendo y apagando un led en unos pocos microsegundos.  No hay ojo humano capaz de ver ese 'cambio'.

Si usas un osciloscopio de seguro verás al pin cambiar de estado o sino pon un delay después del encendido y después del apagado del led.


Saludos



wuenas, a ver el programa empieza con los leds apagados, luego enciendo el 0 y me quedo permanentemente en el bucle donde se enciende el 1.

El problema surge cuando solo solo veo el 1 encendido, mientras que el 0 se enciende solo durante un instante. No estoy encendiendo y apagando en ningun sitio, es como si ya una vez dentro del bucle me cambiara el valor del PORTA,0.  Pero no veo que haya ninguna transicion que pueda despistar mi vista

gracias
Título: Re: el bsf es permanente?
Publicado por: microcom en 26 de Septiembre de 2006, 18:05:10
viendo esto es capaz de estar todos prendidos a la vez.

bsf porta,0           se pierde.
bsf porta,1           esta activo.

porque no le colocas un pequeño retardo para ver.
puesto que no es compatible con lo  que debe pasar.




Título: Re: el bsf es permanente?
Publicado por: BrunoF en 26 de Septiembre de 2006, 19:15:51
Bueno...
Primero:
Ojo con esto:
RET1 equ 0x0C
0x0C es una direccion de memoria de SFR. La primera posicion para registros GPR es la 0x20.

Segundo:
El LED que tenes en PORTA,0 esta puesto en modo sumidero, mientras que deberia estar en modo fuente.(es decir, el led colocado al revez)
Saludos.
Título: Re: el bsf es permanente?
Publicado por: Modulay en 27 de Septiembre de 2006, 04:03:28
Lo simulé en mplab y el puerto A no se entera de las modificaciones,al menos en el bit que setea una única vez.
Bruno ¿a qué te refieres con lo del led? Yo no ví esquema por ningun sitio
Título: Re: el bsf es permanente?
Publicado por: BrunoF en 27 de Septiembre de 2006, 04:23:49
Yo tampoco vi esquema Modulay...

Definiendo los pines como digitales el programa funciona OK. De otra manera no funciona.

Este código funciona bien:
Código: ASM
  1. __CONFIG        _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
  2.         LIST    P=16F876
  3.         INCLUDE <P16F876.INC>
  4. #DEFINE WR      PORTC,3
  5. #DEFINE R_D     PORTC,2
  6. #DEFINE C_D     PORTC,1
  7. #DEFINE RESET   PORTC,0
  8.  
  9. RET1    equ     0x20
  10. RET2    equ     0x21
  11. RET3    equ     0x22
  12. RET4    equ     0x23
  13. RET5    equ     0x24
  14.  
  15. ; ZONA DE CÓDIGOS ********************************************************************
  16.  
  17.         ORG     0       ;El programa comienza en la dirección 0.
  18. Inicio
  19.  
  20.         ;canviem de banc
  21.         bsf     STATUS,RP0      ;Acceso al Banco 1.
  22.         clrf    TRISA           ;Las líneas del Puerto B se configuran como salida.
  23.         clrf    TRISB           ;Tot el port A es configura com a SORTIDA
  24.         clrf    TRISC
  25.         movlw   07
  26.         movwf   ADCON1
  27.         bcf     STATUS,RP0      ;Acceso al Banco 0.
  28.         goto    Principal
  29.  
  30. fer_reset
  31.         bsf     RESET
  32.         nop
  33.         bcf     RESET
  34.         nop
  35.         nop
  36.         nop
  37.         nop
  38.         bsf     RESET
  39.         return
  40.  
  41. Principal
  42.         clrf    PORTA
  43.         bsf     PORTA,0
  44.                                 ;fem un reset al LCD
  45.         call    fer_reset
  46. bucle
  47.    
  48.         bsf     PORTA,1
  49.         goto    bucle           ;Crea un bucle cerrado e infinito.
  50.  
  51.         end
Título: Re: el bsf es permanente?
Publicado por: maunix en 27 de Septiembre de 2006, 08:27:39
Yo tampoco vi esquema Modulay...

Definiendo los pines como digitales el programa funciona OK. De otra manera no funciona.


Asi es, hay que poner los pines en analógicos para que funcione en el SIMULADOR (MPSIM), pero esto es una limitación del simulador, no del pic. 

En el pic, si los dejamos en analógicos y lo ponemos en 1, se debe ver en 1.


bones18 creo que el problema no está en tu código sino en tu vista.  Es que estas encendiendo y apagando un led en unos pocos microsegundos.  No hay ojo humano capaz de ver ese 'cambio'.

Si usas un osciloscopio de seguro verás al pin cambiar de estado o sino pon un delay después del encendido y después del apagado del led.


Saludos



wuenas, a ver el programa empieza con los leds apagados, luego enciendo el 0 y me quedo permanentemente en el bucle donde se enciende el 1.

El problema surge cuando solo solo veo el 1 encendido, mientras que el 0 se enciende solo durante un instante. No estoy encendiendo y apagando en ningun sitio, es como si ya una vez dentro del bucle me cambiara el valor del PORTA,0.  Pero no veo que haya ninguna transicion que pueda despistar mi vista

gracias

Pido disculpas, leí rápido la parte del 'reset' y supuse que estabas viendo eso en un led.

Mira, sería bueno que nos cuentes si en el pin donde tenes los leds, también tenes algún capacitor o una resistencia.

Esto es algo "fundamental".  Si es así, entonces ya tengo el misterio resuelto  :) :)

Título: Re: el bsf es permanente?
Publicado por: bones18 en 27 de Septiembre de 2006, 11:14:17
gracias por todas vuestras respuestas

si, cada led acompaña una resistencia de 100 ohms

adios
Título: Re: el bsf es permanente?
Publicado por: maunix en 27 de Septiembre de 2006, 11:58:28
gracias por todas vuestras respuestas

si, cada led acompaña una resistencia de 100 ohms

adios

Ponle una resistencia de 470 ohms.

La razón es la siguiente: 

Maximum output current sourced by any I/O pin  : 25 mA
Maximum current sunk by PORTA, PORTB, and PORTE (combined) (Note 3) : 200 mA

Le estas poniendo 5V / 100ohms = 50mA

Con suerte no quemaste el pin.


Saludos
Título: Re: el bsf es permanente?
Publicado por: Cryn en 27 de Septiembre de 2006, 21:37:09
holas saludos, yo he usado siempre 150 Ohm (33.3mA de corriente de salida) con los led como salidas de cualquier pic que he usado y siempre ha ido de maravilla y no se ha quemado nada, no veo porqeu se quemara algo en el pic, el que deberia quemarse deberia ser el led, bueno corrijanme si me equivoco, es lo que pienso con la experiencia que he tenido con las resistencias en los leds

y bueno creo que el bsf es permanente, no hay motivo por el cual cambie de valor asi por asi (si no, no sabriamos con seguridad en que banco estamos por ejemplo), algo incorrecto en el codigo hay, talvez alguna configuración, o me temo que podria ser falla del pic.

conclusión el bsf es permanente, cierto?? a menos qeu se le de un bcf, bueno eso ya es otra historia, mientras no se toque el puerto con instrucciones de borrado, el bsf, para mi es permanente.
Título: Re: el bsf es permanente?
Publicado por: BrunoF en 27 de Septiembre de 2006, 22:09:05
Crn.
El registro PORTA es un registro que, al igual que la mayoria de los registros del PIC, es escribible y leible.
El valor del bit0 del registro PORTA, configurado como salida, sólo podrá cambiar de valor cuando una instrucción afectete al bit o aal registro PORTA entero.
Por lo tanto, muchas instrucciones pueden afectar al bit 0 del PORTA.

Instrucciones que afectan escritura al registro PORTA entero:

addwf PORTA,F
andwf PORTA,F
clrf   PORTA
comf  PORTA,F
decf PORTA,F
decfsz PORTA,F
incf PORTA,F
incfsz  PORTA,F
iorwf PORTA,F
movwf PORTA
rlf PORTA,F
rrf PORTA,F
subwf PORTA,F
swapf PORTA,F
xorwf PORTA,F



Instrucciones que afectan escritura solo al bit0 del registro PORTA:

bsf      PORTA,0
bcf     PORTA,0

Por lo tanto:
Hasta que no ocurra instruccion alguna o reset que afecte al bit0 del registro PORTA, el bit0 del registro PORTA permanecera con el ultimo valor que le asignaste.

Ejemplo:
bsf   PORTA,0
nop ;aqui PORTA,0 = 1
nop ;aqui PORTA,0 = 1
nop ;aqui PORTA,0 = 1
clrf PORTB ;aqui PORTA,0 = 1
bsf PORTA,1 ;aqui PORTA,0 = 1
movlw 0x01 ;aqui PORTA,0 = 1
movwf PORTA ;aqui PORTA,0 = 1
nop ;aqui PORTA,0 = 1
nop ;aqui PORTA,0 = 1
clrf PORTA ;aqui PORTA,0 = 0

P.D.:
En resumen, obviamente que todas las instrucciones que afectan a registros GPRs(General Purpose Registers) seran permanentes, hasta que una nueva instruccion o un reset cambien su estado.
¿Imaginas el infierno que seria si luego de determinado tiempo, los registros volvieran automaticamente a su valor inicial?
Seria casi improgramable!

Saludos.



Título: Re: el bsf es permanente?
Publicado por: maunix en 27 de Septiembre de 2006, 22:13:44
holas saludos, yo he usado siempre 150 Ohm (33.3mA de corriente de salida) con los led como salidas de cualquier pic que he usado y siempre ha ido de maravilla y no se ha quemado nada, no veo porqeu se quemara algo en el pic, el que deberia quemarse deberia ser el led, bueno corrijanme si me equivoco, es lo que pienso con la experiencia que he tenido con las resistencias en los leds

Mi cálculo no está completo fue solo una aproximación.  El cálculo completo sería

5V - 1V (caída led, pudiera ser mayor o menor) = 4 V

4V / 150 = 26 mA


Si la caída de tu led es menor a la mencionada o si le quieres sacar mas que 25 mA, tal vez lo puedas hacer pero no es recomendable ni mucho menos.

Puede que se te queme el pic o el led, pero en general si lo usas para manejar cualquier tipo de salida te aseguro que terminarás quemando el pic.

Usar un pic más allá de sus posibilidades, y sobre todo en el consumo de corriente, de ninguna manera me parece la forma de "hacer uso de" , podríamos estar horas pero si quieres hacer un diseño que te permita repetibilidad no me pondría a diseñar algo superando los límites que me dice el fabricante.

El día de mañana respetan a rajatabla esos límites y tu aplicación podría dejar de funcionar o bien dañarías el pic.


y bueno creo que el bsf es permanente, no hay motivo por el cual cambie de valor asi por asi (si no, no sabriamos con seguridad en que banco estamos por ejemplo), algo incorrecto en el codigo hay, talvez alguna configuración, o me temo que podria ser falla del pic.

Es lo que tratamos de develar.

conclusión el bsf es permanente, cierto?? a menos qeu se le de un bcf, bueno eso ya es otra historia, mientras no se toque el puerto con instrucciones de borrado, el bsf, para mi es permanente.

El bsf en realidad hace una lectura/modificación/escritura del registro con el que estás trabajando.

En el caso de un puerto, puede ser que hayas hecho un bsf de otro pin del mismo puerto, y que en el paso siguiente hagas un bsf de otro pin del mismo puerto.

Si el primer pin tiene una carga importante, que le demore más microsegundos que lo que tarda una instrucción en ejecutarse, al querer hacer el segundo bsf el estado del pin no será 1, sino 0 y entonces el bsf no produjo el resultado esperado.

Si quieres mayor información del tema, te sugiero que busques en el mismo foro , algunos posts sobre los registros LATx .

Saludos