Problema con retardo anidado en asm.

Hola foristas, me estoy entrenando en assembler y trato de realizar un contador binario que vaya hasta 0xFF, la cosa es, ya tengo uno que va hasta 0x0F.

El problema es que este que va hasta 0xFF, se me pone loco. Bueno ya le he puesto retardos anidados desde ms hasta segundos completos y en simulación siempre esté presente el rebote, además al grabar el pic real, me da igual.

No sé si 40ms sean apropiados, en C lo he hecho y simula bien, o quizá tenga alguna otra cosa mal que no conozco porque después de los retardos, entre uno y otro, pasa lo mismo, rebote.

Código:
    list      p=16F84A            ; list directive to define processor
    #include <p16F84A.inc>        ; processor specific variable definitions

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC


;***** VARIABLE DEFINITIONS
BIN        EQU     0x0C        ; variable used for context saving 
CONT       EQU     0X0D 
CONT2      EQU     0X0E

;*************CÓDIGO ASSEMBLER **********************************
    
            ORG     0x000      ; processor reset vector
  INICIO   

            
            BCF     STATUS,5    ;VAMOS AL BANCO 0 A         
            CLRF    PORTB       ;A LIMPIAR PORTB PARA EVITAR RESIDUOS INESPERADOS
            BSF     STATUS,5    ;AHORA VAMOS AL BANCO 1 PARA CONFIGURAR E/S
            CLRF    TRISB       ;PORTB ES SALIDA
            BSF     TRISA,0     ;RA0 ES ENTRADA
            BCF     STATUS,RP0  ;IR A BANCO 0    
          
           
    ESPERA 
           BTFSS    PORTA,0    ; SI RA0 = 1:
           GOTO     ESPERA     ;
           BCF      PORTA,0    ;OLVIDA QUE SE PULSÓ A0 PARA QUE NO  CUENTE el mismo pulso
           
    RETARDO
           MOVLW    0X78       ;PROVEE 
           MOVWF    CONT2      ;[3(CONT)+1](CONT2)+3(CONT2)+1 CICLOS (4MHz, CICLO= 1us)
    CICLO2 MOVLW    0X6E       ;YO PREFIERO, 40ms= 40.000us
           MOVWF    CONT       ;YO ME PASO UN POCO CON: CONT= 110 Y CONT2 = 120 QUE ME 
     CICLO DECFSZ   CONT,1     ;DA:  40.081 CICLOS/ 40,08ms
           GOTO     CICLO      ;
           DECFSZ   CONT2,1    ;
           GOTO     CICLO2     ;            
                               ;
           
           INCF    BIN,1      ;INCREMENTA EL DATO BINARIO 
           GOTO    SALIDA     ;SACA A PORTB EL CONTEO:
   SALIDA
           MOVF     BIN,0      ;MUEVE BIN A PORTB A TRAVÉS DE W
           MOVWF    PORTB      ;PARA VISUALIZARCE
           GOTO     ESPERA     ;VUELVE A REVISAR SI HAY PULSO EN RA0
           END                 ; directive 'end of program'

Ah, y gracias por su valiosa ayuda. :)
 
Última edición por un moderador:
Checa el Cristal HS es para mayores frecuencias de 4 mhz, alomejor se te esta desbordando TMR0 o retardos anidados usa solo 7 ya mas de 7 el Pic se cicla est aplica para subrutinas tambien.
 
Oye, buen DanNeil:

El microcontrolador no puede "olvidar" el estado de una entrada:

ESPERA
BTFSS PORTA,0 ; SI RA0 = 1:
GOTO ESPERA ;
BCF PORTA,0 ;OLVIDA QUE SE PULSÓ A0 PARA QUE NO CUENTE el mismo pulso

Lo que tienes que hacer es esperar que esa terminal se ponga a nivel bajo, mas o menos así:

Código:
ESPERA_NIVELBAJO   BTFSC   PORTA,0
GOTO   ESPERA_NIVELBAJO

ESPERO QUE TE SIRVA. NOS VEMOS.

EDITO:

Tu algoritmo quedaría algo así:

1. Inicializas puertos.
2. Esperas que la terminal RA0 = 1.
3. Generas el retardo antirrebote.
4. Incrementas contador y visualizas.
5. Esperas que la terminal RA0 = 0
6. Regresas al paso 2.
 
Última edición:
Si, pues en esencia tenía bien el código y ya corre perfectamente. Gracias por ordenar mejor el algoritmo. Oigan ese Proteus me ha hecho perder la fe. Verán, siempre, a pesar de que le generaba el retardo adecuado en la vida real, el maldito siempre me mostraba el bounce, pero si le cambio frecuencia al cristal en simulación, va bien, hasta me fuí a el enlace que alguien dejó para un generador de códigos para retardo anidado y ni así corría, me dije, no! es otra cosa lo que está mal.

Ah, y si, perdón, el micro no olvida el estado lo comprobé porque si mantengo el pulsador oprimido, el dato BIN incrementa, sólo que no como una metralleta, sino en orden ascendente uno por uno. Al principio el pulsador mal colocado me hacía salto, y decidí ponerle eso y mejora un poco, pero en definitiva, no olvida, para controlar el bounce podría también usar el TIMER0 y ajustar el flanco, para ascendente digamos, pero eso no me evita tener que hacer el retardo, verdad?.


Gracias y saludos
 
Última edición:
Así es, el retardo de todos modos lo debes realizar para ignorar los rebotes del pulsador. Ya sea usando el timer0 o retardos con lazos anidados, pero debe haber un retardo.

Pues si ya tienes el retardo hecho (el de lazos anidados) utiliza ése. Sólo basta con 30 ó 40 ms para que funcione correctamente.

Nos vemos.
 
Hola como esta foreros? les traigo hoy una duda y realmente no suelo preguntar boberías pero es que hace tanto que no hago ASM que tengo un problemilla. Quiero hacer un retardo ultrarrápido de solo un par de ciclos de reloj más o menos 2uS. Resulta que me puse a programar, luego compile pero a la hora de usar el osciloscopio me da solo un pulso alto. Alguien tiene idea a que se debe este problema? Tal vez no estoy programando de la manera más adecuada. Uso un cristal de 4Mhz y el PIC16F84A

Código:
    ; **** Encabezado ****
    list p=16F84A
    #include P16F84A.inc

    __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

    ;**** Definicion de variables ****
    Led equ	0	; Definimos Led como el bit cero
    ;**** Configuracion de puertos ***


    Reset org	0x00 ; Aqui comienza el micro.-
    			goto	Inicio ; Salto a inicio de mi programa.-
    			org	0x05 ; Origen del codigo de programa.-


    Inicio 		bsf	STATUS,RP0 ; Pasamos de Banco 0 a Banco 1.-
    			movlw	b'11111'	
    			movwf	TRISA	
    			movlw	b'11111110'	
    			movwf	TRISB
    			bcf		STATUS,RP0
    			bcf		PORTB,Led 




    Bucle 		

				bcf	PORTB,Led
				not
				bsf	PORTB,Led
				not
    			goto	Bucle 
     


    end

Muchas gracias de antemano por su ayuda :)
 
Cierto disculpen todos la rutina ASM anda, resulta que conecte mal el pic, pero ahora lo siguiente: Porque hace un ciclo cada 25 mili segundos (medido en osciloscopio)? no debería estar haciendo un ciclo cada 1 o 2 uS? :unsure:
 
Atrás
Arriba