Autor Tema: ASEMBLER  (Leído 1879 veces)

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

Desconectado xxgaaraxx

  • PIC10
  • *
  • Mensajes: 3
ASEMBLER
« en: 29 de Junio de 2015, 23:00:48 »
Saludos a todos, tenia una consulta: lo que sucede es que quería realizar un programa que primero ponga el uno el bit 1 del puerto D y luego poner en uno el bit3 del puerto D pero sin que se afecte lo anterior es decir que al final me quede 00001010 pero no me queda así. Solo me queda la ultima acción es decir 00001000, mi pregunta es porque, osea es como que no guardase  la primera acción en el PORTB.

AQUI ESTA EL CÓDIGO
LIST     p=16F877A         
INCLUDE   <p16F877.inc>     


       ORG    0x00               
       goto   INICIO             
       ORG    0x05               

INICIO
       bcf STATUS,IRP            
       BSF    STATUS,RP0           
       CLRF    TRISD            
       BCF    STATUS,RP0          
       CLRF    PORTD           

       BSF PORTD,1             
      BSF PORTD,3
       END                        

Desconectado Chaly29

  • Moderador Global
  • DsPIC33
  • *****
  • Mensajes: 4315
Re: ASEMBLER
« Respuesta #1 en: 29 de Junio de 2015, 23:50:44 »
Hola xxgaaraxx, en tu programa, cuando el micro llega al final del mismo no sabe que hacer, porque no se lo indicas y entonces sucede cualquier cosa, por lo tanto debes de indicarle que hacer.

Puedes colocar un bucle cerrado y que se quede ahí hasta que le cortes la alimentación, puedes hacerlo así:

Código: ASM
  1. AQUI ESTA EL CÓDIGO
  2. LIST     p=16F877A          
  3. INCLUDE   <p16F877.inc>      
  4.  
  5.  
  6.        ORG    0x00                
  7.        goto   INICIO              
  8.        ORG    0x05              
  9.  
  10. INICIO
  11.        BCF    STATUS,IRP            
  12.        BSF    STATUS,RP0            
  13.        CLRF   TRISD            
  14.        BCF    STATUS,RP0          
  15.        CLRF   PORTD            
  16.  
  17.        BSF    PORTD,1            
  18.        BSF    PORTD,3
  19.  
  20. BUCLE
  21.        NOP
  22.        GOTO   BUCLE
  23.  
  24.        END

Espero te sea de ayuda.

Un saludo.

Atte. CARLOS.

La teoría es cuando se sabe todo y nada funciona. La práctica es cuando todo funciona y nadie sabe por qué.

Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 109
Re: ASEMBLER
« Respuesta #2 en: 29 de Junio de 2015, 23:56:04 »
Tecnicamente tu código está bien, y deberían de estar ambos pines en SET...

Es un bug de microchip, lo hemos visto varios colegas en muchas ocasiones sobre todo en las familias 16XXX y menores.

Resulta que cuando escribes el valor de un bit del puerto y luego activas otro pin, el estado del primero se corrompe.

Hemos revisado bastante y no encontramos información en microchip en donde ellos mencionen que es uno de sus bugs mayores, pero imaginamos que esa es una de las razones por las cuales a partir de la famila 18xxx  añadieron los registros LATx para escritura dejando a los PORTx como lectura.

No hay solución pero le puedes dar la vuelta de varias maneras, una muy sencilla es cambiar por completo el valor de todos los pines

movlw    b'00001010'
movwf    PORTD


Otra seria leer primero el valor del puerto, para no cambiar el estado de los demás pines, y luego hacer las operaciones...

movlw b'00001010'
iorwf   PORTD,w         ; Con esta instrucción debería de bastar, pero aun así podría haber algún problema...
movwf PORTD

Imaginamos que el problema pudiera estar en la configuración lógica de los flip flops asociados a un puerto, ya que incluso ese problema lo hemos visto en la serie 18xxx si en lugar de usar LATx para escribir se hiciera a través de PORTx....

Es todo lo que se al respecto y ojala te sirva la información.

Saludos

Desconectado xxgaaraxx

  • PIC10
  • *
  • Mensajes: 3
Re: ASEMBLER
« Respuesta #3 en: 30 de Junio de 2015, 01:27:29 »
Gracias por la ayuda , algo similar me sucede con el incf portb,f quería consultar si eso sucede también  por la misma razón. Este programa con cada pulso en el pin 0 del puerto va aumentando (PIN1 DEL PORTA en 1) o disminuyendo en 1(PIN1 DEL PORTA en 0) . El problema es que  cuando esta en modo AUMENTO solo aumenta de 000000000 a 000000001 y ahí se queda (por mas que siga pulsando) y cuando esta en modo DECREMENTO solo disminuye de 000000000 a 11111111 (por mas que siga pulsando) ; es como sino guardara el valor final obtenido y otra vez empezara de 00000000.

AQUÍ ESTA EL CÓDIGO


 List p=16F84 ;Tipo de procesador
 include <p16F84.inc> ;Definiciones de registros internos

org 0x00 ;Vector de Reset
goto Inicio
org 0x05

Delay_20_ms:
 bcf INTCON,T0IF ;Desconecta el flag de rebosamiento
 movlw 0x63 ;Complemento hex. de 156
 movwf TMR0 ;carga el TMR0
Delay_20_ms_1
 clrwdt ;Refrescar el WDT
 btfss INTCON,T0IF ;Rebasamiento del TMR0 ??
 goto Delay_20_ms_1 ;Todavía no
 bcf INTCON,T0IF ;Ahora si, reponer el flag
 return

Inicio

 bsf STATUS,RP0 ;Selecciona banco 1
 clrf TRISB ;Puerta B se configura como salida
 movlw b'00011111'
 movwf TRISA ;Puerta A se configura como entrada
 movlw b'00000110'
 movwf OPTION_REG ;Preescaler de 128 para el TMR0
 bcf STATUS,RP0 ;Selecciona banco 0
 clrf PORTB
Loop
 clrwdt ;Refrescar el WDT
 btfss PORTA,0 ;Subida de la señal RA0 ?
 goto Loop ;No
 call Delay_20_ms ;Elimina rebotes

Loop_2
 clrwdt ;Refrescar el WDT
 btfss PORTA,0 ;Bajada de RA0 (pulso) ??
 goto Loop_2 ;No
 call Delay_20_ms ;Ha habido pulso, eliminar rebotes

 btfss PORTA,1 ;RA1 = 1
 goto Down ;No, cuenta descendente
 goto Up

Up

INCF PORTB,F
 goto Loop

Down
DECF PORTB,F ;Cuenta descendente
 
 goto Loop

end ;Fin del programa fuente

Desconectado xxgaaraxx

  • PIC10
  • *
  • Mensajes: 3
Re: ASEMBLER
« Respuesta #4 en: 30 de Junio de 2015, 02:21:14 »
LO SOLUCIONE ASÍ  :)                                      PD: GRACIAS VIXCTOR POR LA INFO DEL BUG

LIST     p=16F877A         
INCLUDE   <p16F877.inc>     

   A EQU 0X21
       ORG    0x00               
       goto   INICIO             
       ORG    0x05               

INICIO
       bcf STATUS,IRP           
       BSF    STATUS,RP0           
       CLRF    TRISD             
       BCF    STATUS,RP0           
       CLRF    PORTD
       CLRF A     
       BSF  A,3
       MOVF  A,W
       MOVWF PORTD
       BSF  A,1
       MOVF  A,W
       MOVWF PORTD

       END          

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: ASEMBLER
« Respuesta #5 en: 30 de Junio de 2015, 05:04:31 »
en realidad xxgaaraxx tus problemas son otros, eso no es un BUG lo que dice vixctor, corresponde al funcionamiento del PIC, y es una desventaja de los PIC de gama baja.

Lo que no entiendo es por que tenes 2 codigos. Uno para un PIC16F84 y otro para un PIC16F877A

En tu primer programa el de PIC16F84A seria algo mejor esto asi:

Código: ASM
  1. Loop
  2.         btfss PORTA,0           ; RA0=1? Si estan en 1 salta
  3.         goto Loop               ; No vuelve
  4.         call Delay_20_ms        ; Elimina rebotes
  5. Loop_2
  6.         btfsc PORTA,0           ; RA0=0? Es decir solto el boton?
  7.         goto Loop_2             ; No, espero que suelte
  8.  
  9.         btfss PORTA,1           ; RA1=1? SI: Ascendente, NO: descendente
  10.         goto Down               ; NO
  11.         INCF PORTB,F            ; SI
  12.         goto Loop
  13.  
  14. Down
  15.         DECF PORTB,F ;Cuenta descendente
  16.         goto Loop

Quitandole el WDT ( poniendolo en OFF con los FUSES ) por que ? por que puede que ese delay sea muy grande y active el WDT, por otra parte cambie el segundo BTFSS por un BTFSC, De esa forma solo incrementa/decrementa cuando hay un flanco de bajada del boton.

De todas formas es buena practica, en los PIC16F ( que solo tienen el registro PORTx ) de usar un registro como usaste vos en tu programa. Y es malo hacer esto:

BSF   PORTD,1
BCF   PORTD,0
BSF   PORTD,2

segun lo que este conectado al pin del micro puede que ocurra un error, por que el micro funciona con la base de leer-modifica-escribir, es decir cada instruccion hace eso,  si suponete que tenes una gran capacidad en el RD1, cuando se ejecuta la primera instruccion no hay problema pero cuando se ejecuta la segunda, ocurre que por esa capacidad al leer el puerto se toma como un 0 (ya que va creciendo lentamente la tension ) entonces al leer el portd,1 lee 0 , modifica el portd,2 de la instruccion y luego guarda, efectuandose el error.

Distinto los PIC18 que usan distintos registros ( LATx , PORTx ) LATx es el registro de latch de salida, este lo usas para escribir en el puerto ( para ponerle un 1 o un 0 ) y PORTx para leer el pin, entonces ahora el micro lee del LATx que no es influenciado por lo que esta presente en el pin y se evitan esos problemas.


 

anything