Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

01/04/2013 #1

Avatar de Vangeluz

Interrupción de rutina de tiempo
Hola que tal, quería saber algo simple pero me es muy liado para entender.

Ya pude entender como guardar en la EEPROM, así que gracias a todos !!!.

Mi duda es como interrumpir una rutina de tiempo. ejemplo :

Código:
 
list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
 
;**** Definicion de variables ****
Pulsador equ  0 ; Definimos Pulsador como el bit 0, en este caso sera para PORTA
Salida    equ  1; Definimos Salida como el bit 1, en este caso sera para PORTB
 
;**** Configuración de puertos ****
 
  ORG  0
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.-
  movlw b'00001' ;RA0 como entrada
  movwf TRISA 
  movlw b'00000000' ; PORTB como salida.- 
  movwf TRISB 
  bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
 
; **** Chequeo *****
chequeo        
                      btfss      PORTA,Pulsador ; presionado ?
                      goto      chequeo
                      call        retardo
                      bsf        PORTB,Salida     ; ENCIENDE LED                        
                      call       5 MINUTOS
                      bcf        PORTB,Salida     ; APAGA LED
 
 
5 MINUTOS       ( TIEMPO 5 MINUTOS )
                      return
 
retardo            ( ejemplo de retardo )
 
                      return
                      end
Esto es solo un simple ejemplo, lo que yo quisiera saber en si, es como interrumpir el tiempo de ese led encendido, lo quise hacer con otro pulsador pero no me salió nada.
Se que la unica forma de interrumpir fue quitando la corriente o aplicando un reset, pero creo que no es lo correcto, quisiera poner otro boton que sea PARAR .... desde ya muchas gracias !!!
01/04/2013 #2

Avatar de fdesergio

Bueno yo lo hecho de esta manera

Uso una rutina digamos de 100mSeg
para tu caso para llegar a los 5 seg necesito ejecutar esa rutina 10*5=50 veces
Inico la rutina de 5 SEG, cargo un REG con el valor 50, llamo a la rutina de 100mSEG cuando termina leo el pin que provocara la interrupcion del conteo, si no esta activo decremento el contador, ademas pruebo si llego a cero el contador para terminar los 5 seg, si no es asi regreso a ejecutar nuevamente la rutina de 100mSEg y asi se repite hasta cuando??? hasta cuando llegue a cero el REG del conteo osea que han pasado los 5 seg o cuando el pin que reviso para interrumpir este activo, lo unico de aclarar es que se revisa ese pin cada 100mSEG y no siempre pero normalmente un pulsador presionado son algo asi como 150mSEG, espero te sirva,c hauuuuuuuu
01/04/2013 #3
Moderador

Avatar de Chico3001

Código:
conth equ 20h
contl equ 21h

5MINUTOS
  movlw h'00'
  movwf conth
  movwf contl
  decfsz contl,f
  goto $-1
  defcsz conth,f
  goto $-3
  return
Obvio hay que ajustar las variables conth y contl para que te den el tiempo necesario, igual vas a tener que añadir mas variables para llegar a los 5 minutos pero el problema es que esta rutina ocupa el micro y no permite ejecutar nada mas hasta que acabe.

La manera correcta es programar el TMR0 para que genere interrupciones cada cierto tiempo
01/04/2013 #4

Avatar de fdesergio

Para las rutina de DEMORA o tiempos este programita va muy bien, chauuuuuuuu
Archivos Adjuntos
Tipo de Archivo: zip calcular_retardos.zip (90,2 KB (Kilobytes), 16 visitas)
02/04/2013 #5

Avatar de Vangeluz

Gracias fdesergio y Chico3001 , lo que me olvide de aclarar, es que el tema tiempos y retardos no es muy importante, ya que de "vago" uso el RETARDOS.inc, de ahi he sacado los tiempos.
La duda mia era como abortar el tiempo, osea cortar en cualquier parte del tiempo transcurrido.
Lo que hice, fue un temporizador con un display 7 segmentos usando del 1 al 6 para 6 tiempos diferentes. ( por ejemplo tiempos de 1 a 6 minutos ).
en el display selecciono del 1 al 6 con un pulsador y con otro inicio el tiempo seleccionado.

El programa ya funciona correctamente, lo que no he conseguido es interumpir el tiempo ya ejecutado, solo lo puedo hacer con un reset, o quitando la alimentacion, osea quisiera interrumpir esa llamada a ese tiempo activado, voy a dejar el tempo.asm a ver si me hago entender .....

Código:
   
;(((((((((((((((((( TODO EN MINUTOS, MAS UN DEJE DE PULSAR, MAS ENCENDIDO PORTA 2))))))))))))))))))))
;(((((((((((((((((((((((((((     GUARDADO Y CHEQUEO DE NUMERO INICIAL    ))))))))))))))))))))))))))))
 list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 CBLOCK   0x0C
 Contador
 ENDC  

 ORG 0x2100    ; Corresponde a la dirección 0 de la zona EEPROM de datos..
NumeroTurno
 DE 0x00    ; El contador en principio a cero.
;**** Definicion de variables ****
Pulsador equ  7 ; Definimos Pulsador como el bit 7, en este caso sera para PORTB

;**** Inicio  del Micro ****

;**** Programa principal ****
;**** Configuración de puertos ****
  
  ORG  0
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.-
  movlw b'00001' ;RA0 como entrada
  movwf TRISA 
  movlw b'10000000' ; RB7 como entrada y los demas como salida.- 
  movwf TRISB 
  bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0
  movlw NumeroTurno   ; Lee la posición 0x00 de memoria EEPROM de datos
  call EEPROM_LeeDato   ; donde se guarda el turno.
  movwf Contador
  movwf PORTB 
  bcf PORTA,1
  bSf PORTA,2
;*********************** CHEQUEA SEGMENTOS ENCENDIDOS Y DETECTA NUMERO *****************************
; ********************************   CHEQUEO NUMERO   **********************************************
SEG_A   btfss   PORTB,0   ; SI HAY A, PUEDE SER   2, 3, 5, 6
   GOTO  NUNO       ; NO, ES 1 o 4
SEG_B   btfss PORTB,1    ; HAY B, ES 2 o 3
   GOTO  NCINCO    ; NO HAY B, ES 5 o 6
SEG_C   btfss PORTB,2   ; HAY C, ES TRES
   GOTO DOS   ; NO, ES DOS
   GOTO TRES   ; SI ES TRES
NUNO    ; B C
   btfss PORTB,1   ; REVISA POR PRIMERA VEZ
   GOTO Testeo   ; NO HAY NADA VA A TESTEO
   btfss  PORTB,6   ; REVISA SI HAY G
   GOTO UNO     ; NO HAY G ES UN 1
   GOTO CUATRO    ; HAY G ES UN 4
NCINCO  ; A C D F G
   btfss PORTB,4   ; REVISA SI HAY E
   GOTO CINCO    ; NO, ES UN CINCO
   GOTO SEIS     ; SI, ES UN SEIS

;**** Testeo de Pulsador ****
Testeo   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.- 
   goto Testeo  ; No, seguimos testeando.- 
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.- 
   goto Testeo  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (1)
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'0000110' ;  (1)
   call EEPROM_EscribeDato
   call NOPULSO
   goto  UNO
UNO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto UNOB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto UNOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1011011' ;  (2) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'1011011' ;  (2)
   call EEPROM_EscribeDato
   call  NOPULSO
   goto DOS
UNOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto UNO  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto UNO  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2  ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min1  ; ( 1 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto UNO
DOS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto DOSB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto DOSB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1001111' ;  (3) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'1001111' ;  (3)
   call EEPROM_EscribeDato
   call NOPULSO 
   goto  TRES
DOSB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto DOS  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto DOS  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2   ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min2  ; ( 2 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto DOS

TRES   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto TRESB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto TRESB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1100110' ;  (4) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'1100110' ;  (4)
   call EEPROM_EscribeDato
   call NOPULSO 
   goto  CUATRO
TRESB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto TRES  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto TRES  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2   ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min3  ; ( 3 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto TRES

CUATRO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CUATROB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CUATROB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1101101' ;  (5) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'1101101' ;  (5)
   call EEPROM_EscribeDato
   call NOPULSO 
   goto  CINCO
CUATROB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CUATRO  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CUATRO  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2   ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min2  ; ( 2 MIN )
   call min2  ; ( 2 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto CUATRO
 
CINCO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CINCOB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CINCOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1111101' ;  (6) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'1111101' ;  (6)
   call EEPROM_EscribeDato
   call NOPULSO  
   goto  SEIS
CINCOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CINCO  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CINCO  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2   ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min3  ; ( 3 MIN )
   call min2  ; ( 2 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto CINCO

SEIS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto SEISB  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto SEISB  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (1) 
   movwf PORTB
   movlw NumeroTurno    ; Se escribe en la posición de memoria EEPROM de
   movwf EEADR     ; datos donde se guarda el turno. En este caso en 
   movlw b'0000110' ;  (1)
   call EEPROM_EscribeDato
   call NOPULSO 
   goto  UNO
SEISB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto SEIS  ; No, seguimos testeando.-
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto SEIS  ; Falsa Alarma, seguimos testeando.-
   bcf PORTA,2   ; APAGAMOS EL LED PORTA 2
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call min3  ; ( 3 MIN )
   call min3  ; ( 3 MIN )
   bcf PORTA,1  ; ( APAGA )
   bsf PORTA,2    ; ENCIENDE PORTA 2
   goto SEIS
NOPULSO   btfsc PORTB,Pulsador ; Testeamos si se solto.-
   goto NOPULSO  ; NO, AUN ESPERAMOS
   return   ; VOLVEMOS PORQUE SOLTO
 
   INCLUDE  <TIEMPOS.INC>
   INCLUDE  <RETARDOS.INC>
   INCLUDE  <EEPROM.INC>
   end
Como lo ven me anda correcto, no tiene fallas, (salvo lo extenso que lo he hecho ).
Pude haber hecho tablas, pero no enlazaba la tabla + el tiempo, asi que lo deje asi.
Como ven es algo simple, pero sigo sin lograr poner un tercer boton ( que no sea RESET ), y que pueda interrumpir el tiempo seleccionado activo, y vuelva al menu de seleccion. Gracias Ambos por su ayuda !!!
02/04/2013 #6
Moderador

Avatar de Chico3001

Si tu rutina es por retardo con contadores, no hay manera de suspender el tiempo mas que con reset, obligatoriamente necesitas implementar retardos con el TMR0 o el TMR1
02/04/2013 #7

Avatar de fdesergio

Vangeluz dijo: Ver Mensaje

El programa ya funciona correctamente, lo que no he conseguido es interumpir el tiempo ya ejecutado, solo lo puedo hacer con un reset, o quitando la alimentacion, osea quisiera interrumpir esa llamada a ese tiempo activado, voy a dejar el tempo.asm a ver si me hago entender .....
Parece no leiste lo que te envie, ahi te explico como hacer la interrupcion en la rutina de 5seg pero usando una rutina mas corta y decrementando un contador, chauuuuuuuuuuuuuu

Chico3001 dijo: Ver Mensaje
Si tu rutina es por retardo con contadores, no hay manera de suspender el tiempo mas que con reset, obligatoriamente necesitas implementar retardos con el TMR0 o el TMR1

No es del todo cierto entre los decrementos de contadores s epuede hacer un testeo de un bit y desviar el PC a otro lado si esta activo, chauuuuuuuuuuuuu
02/04/2013 #8
Moderador

Avatar de Chico3001

fdesergio dijo: Ver Mensaje
No es del todo cierto entre los decrementos de contadores s epuede hacer un testeo de un bit y desviar el PC a otro lado si esta activo, chauuuuuuuuuuuuu
Cierto... ya me acostumbre a pensar en forma estructurada o con objetos...

Debo dejar un rato la programacion web
02/04/2013 #9

Avatar de fdesergio

Por eso me gusta el ASM, si bien es basico es mas frentero, chauuuuuuuuuu
02/04/2013 #10

Avatar de Vangeluz

A ver, a ver, a ver, si he entendido, estimado amigo colombiano, quiza pase por alto el lio de rutina, y me iva por lo mas rapido, con RETARDOS.ASM y me tiraba para la opcion de Chico3001 con la opcion del TMR,
pero analizando lo que comentas, ( que para ti obviamente es algo tan simple y la tienes clara programando ), veo que de esa forma en vez de esperar el tiempo ininterrumpidamente, segun como comentas y entiendo, puedo llamar la rutina de 100mseg y luego testear el estado de otro pin y luego seguir la rutina Nveces y asi hasta llegar al tiempo establecido, al menos que se produzca el cambio en ese pin testeado VERDAD ? (!!! Claro cabeza hueca eso estoy tratando de decirte desde el principio !!! ).

Gracias de verdad, aprecio mucho, el tiempo dedicado a los principiantes como yo, Voy a intentar con la rutina esa de 100mseg a ver si me sale .....

Saludos desde Argentina hacia la gente linda de Colombia, como mi esposa que está en Bogota con sus padres ahora, ( si no regresa mejor !!! )
02/04/2013 #11

Avatar de fdesergio

Ok, suerte, cualquier cosa avisas, chauuuuuuuuuuu
03/04/2013 #12

Avatar de Vangeluz

fdesergio dijo: Ver Mensaje
Ok, suerte, cualquier cosa avisas, chauuuuuuuuuuu
Hola, que tal de nuevo, me estube rompiendo la cabeza de nuevo y pude creo yo, adelantar algo de lo que me has recomendado ( eso espero ).
A ver si te parece bien este adelanto ( no lo probe aun por si se me prende fuego el pic o el computador ), asi que quisiera ver si tu lo apruebas que va a funcionar.
Aclaro que es solo un ejemplo demostrativo, no lo agregue aun a ningun programa.
Tampoco resté los ciclos que suman el call, goto y return, unos pocos microseg, pero creo que aprox 5 segundos deberia haber

Código:
 list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 CBLOCK   0x0C
 Contador
 ENDC  
Inicio
        movlw 0x32      ; 50 en hexadecimal ( eso por lo menos creo yo )
        movwf Contador     ;cargamos Contador con 50
conteo    
        decfsz Contador, f     ; al registro Contador de 50 le quita 1 queda en 49 y va a la siguiente instruccion
        goto $+2      ; No llego a 0 asi que salta 2 lineas y testea boton
        return       ; Si llego a 0 retorna o vuelve al menu o lo que sea que haga, mientras haga algo productivo !!
        btfss porta,1      ; se presionó ?
        goto $+2      ; NO, asi que va a 2 lineas
        return       ; SI, retorna o accion de boton interrumpiendo el conteo o reseteando o no se, lo que sea !!!
        call DEMORA      ; Llama demora de 100 mseg
        goto conteo      ; Vuelve a la rutina de conteo
 
; ***************** 100mseg **********************
 
DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
        movwf     PDel0     ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     PDel1     ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel1, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
Me gustaria que opines, si he avanzado en algo o voy para atras en avance, o si tengo que hacer algun cambio a ese ejemplo, o TODO !! o si tu lo harias muchisimo mas simple como quedaría ... Gracias nuevamente !!
03/04/2013 #13

Avatar de fdesergio

Si lo veo bien, un error es usar el RETURN si bien para ti es el retorno de un proceso abortado para el compilador es una instruccion para terminar una subrutina, lo ideal es usar un goto hacia el el punto de salida, por lo demas ok, probalo, chauuuuuuuuuuuu
04/04/2013 #14

Avatar de Vangeluz

Hola, de nuevo tube exito con el programa, hice una prueba con el programa de 6 tiempos con 7 segmentos y funciona, perfecto.
Lo puse al seleccionar el numero 1 en el display con PORTB,7 y presionar PORTA,0 por 5 segundos enciende un led en PORTA,1 y lo apaga interrumpiendo con el mismo PORTA,0, hasta ahi todo bien, y quedo asi ...

Código:
list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
;**** Definicion de variables ****
Contador equ  0x0C ; Registro para almacenar conteo
Contador1 equ  0x0D ; Registro utilizado en demora.-
Contador2 equ  0x0E ; Registro utilizado en demora.-
Pulsador equ  7 ; Definimos Pulsador como el bit 7, en este caso sera para PORTB
 
;**** Inicio  del Micro ****
Reset  org 0x00  ; Aqui comienza el micro.- 
  goto Inicio  ; Salto a inicio de mi programa.-
 
;**** Programa principal ****
;**** Configuración de puertos ****
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.-
  movlw b'00001' ;RA0 como entrada
  movwf TRISA 
  movlw b'10000000' ; RB7 como entrada y los demas como salida.- 
  movwf TRISB 
  bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 
  movlw b'1000000' ; Comienza en (-) 
  movwf PORTB 
  ;clrf Contador
  movlw 0x32  ; 50 en hexadecimal ( eso por lo menos creo yo )
  movwf Contador ;cargamos Contador con 50
 
;**** Testeo de Pulsador ****
Testeo   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.- 
   goto Testeo  ; No, seguimos testeando.- 
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.- 
   goto Testeo  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (1)
   movwf PORTB
   goto  UNO
UNO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto UNOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto UNOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1011011' ;  (2) 
   movwf PORTB
   goto DOS
UNOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto UNO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto UNO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   ;call seg1  ; ( 1 SEG )
   call conteo
   bcf PORTA,1  ; ( APAGA )
   goto UNO
 
DOS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto DOSB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto DOSB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1001111' ;  (3) 
   movwf PORTB 
   goto  TRES
DOSB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto DOS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto DOS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto DOS
 
TRES   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto TRESB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto TRESB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1100110' ;  (4) 
   movwf PORTB 
   goto  CUATRO
TRESB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto TRES  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto TRES  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto TRES
 
CUATRO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CUATROB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CUATROB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1101101' ;  (5) 
   movwf PORTB 
   goto  CINCO
CUATROB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CUATRO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CUATRO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CUATRO
 
CINCO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CINCOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CINCOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1111101' ;  (6) 
   movwf PORTB  
   goto  SEIS
CINCOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CINCO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CINCO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CINCO
 
SEIS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto SEISB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto SEISB  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (6) 
   movwf PORTB 
   goto  UNO
SEISB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto SEIS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto SEIS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto SEIS
 
conteo    ; ACA cambia los registros no el acumulador, por eso es ,F y no ,W
      decfsz Contador, f ; al registro Contador de 50 le quita 1 queda en 49 y va a la siguiente instruccion
      goto $+2  ; No llego a 0 asi que salta 2 lineas y testea boton
      return
      btfss  PORTA,0  ; se presionó ?
      call Retardo_100ms ; TIEMPO 
      btfss PORTA,0  ; Testeamos nuevamente.-
 
      goto $+3  ; NO, asi que va a 2 linea
      call reset  ; RESETEA EL CONTADOR A 50
      return
      call DEMORA  ; Llama demora de 100 mseg
      goto conteo  ; Vuelve a la rutina de conteo
reset
  movlw 0x32  ; 50 en hexadecimal ( eso por lo menos creo yo )
  movwf Contador ;cargamos Contador con 50
  return
; ***************** 100mseg **********************
 
DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
        movwf     Contador1 ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     Contador2 ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    Contador2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    Contador1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
 
   INCLUDE  <tiempos.INC>
   INCLUDE  <RETARDOS.INC>
   end
Los demas tiempos seleccionados estan con una subrutina externa de tiempos, solo hice la prueba con el numero 1.
Ahora pregunto, (1)cuando voy a la rutina con la Etiqueta RESET, para cargar el contador de nuevo con 50, esta bien ? ( o no es necesario y se autocarga solo al legar a 0 ?).
Otra pregunta, (2)para usar diferentes tiempos, necesito crear otros REG o puedo usar el mismo cargandole diferentes valores ?, por ej: incrementar el valor, segun el numero deseado, ( segun pienso yo ) o hay alguna manera mas facil ? .... Gracias nuevamente por todo !!!
04/04/2013 #15

Avatar de Vangeluz

fdesergio dijo: Ver Mensaje
Si lo veo bien, un error es usar el RETURN si bien para ti es el retorno de un proceso abortado para el compilador es una instruccion para terminar una subrutina, lo ideal es usar un goto hacia el el punto de salida, por lo demas ok, probalo, chauuuuuuuuuuuu

Hola, de nuevo tube exito con el programa, hice una prueba con el programa de 6 tiempos con 7 segmentos y funciona, perfecto.
Lo puse al seleccionar el numero 1 en el display con PORTB,7 y presionar PORTA,0 por 5 segundos enciende un led en PORTA,1 y lo apaga interrumpiendo con el mismo PORTA,0, hasta ahi todo bien, y quedo asi ...

Código:
list p=16F84A
 #include P16F84A.inc
 __CONFIG   _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
;**** Definicion de variables ****
Contador equ  0x0C ; Registro para almacenar conteo
Contador1 equ  0x0D ; Registro utilizado en demora.-
Contador2 equ  0x0E ; Registro utilizado en demora.-
Pulsador equ  7 ; Definimos Pulsador como el bit 7, en este caso sera para PORTB
 
;**** Inicio  del Micro ****
Reset  org 0x00  ; Aqui comienza el micro.- 
  goto Inicio  ; Salto a inicio de mi programa.-
 
;**** Programa principal ****
;**** Configuración de puertos ****
Inicio  bsf STATUS,RP0  ; Pasamos de Banco 0 a Banco 1.-
  movlw b'00001' ;RA0 como entrada
  movwf TRISA 
  movlw b'10000000' ; RB7 como entrada y los demas como salida.- 
  movwf TRISB 
  bcf STATUS,RP0 ; Paso del Banco 1 al Banco 0 
  movlw b'1000000' ; Comienza en (-) 
  movwf PORTB 
  ;clrf Contador
  movlw 0x32  ; 50 en hexadecimal ( eso por lo menos creo yo )
  movwf Contador ;cargamos Contador con 50
 
;**** Testeo de Pulsador ****
Testeo   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.- 
   goto Testeo  ; No, seguimos testeando.- 
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.- 
   goto Testeo  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (1)
   movwf PORTB
   goto  UNO
UNO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto UNOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto UNOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1011011' ;  (2) 
   movwf PORTB
   goto DOS
UNOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto UNO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto UNO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   ;call seg1  ; ( 1 SEG )
   call conteo
   bcf PORTA,1  ; ( APAGA )
   goto UNO
 
DOS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto DOSB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto DOSB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1001111' ;  (3) 
   movwf PORTB 
   goto  TRES
DOSB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto DOS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto DOS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto DOS
 
TRES   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto TRESB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto TRESB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1100110' ;  (4) 
   movwf PORTB 
   goto  CUATRO
TRESB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto TRES  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto TRES  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto TRES
 
CUATRO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CUATROB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CUATROB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1101101' ;  (5) 
   movwf PORTB 
   goto  CINCO
CUATROB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CUATRO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CUATRO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg2  ; ( 2 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CUATRO
 
CINCO   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto CINCOB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto CINCOB  ; Falsa Alarma, seguimos testeando.-
   movlw b'1111101' ;  (6) 
   movwf PORTB  
   goto  SEIS
CINCOB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto CINCO  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto CINCO  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg2  ; ( 2 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto CINCO
 
SEIS   btfss PORTB,Pulsador ; Testeamos si esta a 1 logico.-
   goto SEISB  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTB,Pulsador ; Testeamos nuevamente.-
   goto SEISB  ; Falsa Alarma, seguimos testeando.-
   movlw b'0000110' ;  (6) 
   movwf PORTB 
   goto  UNO
SEISB   btfss PORTA,0  ; Testeamos si esta a 1 logico.-
   goto SEIS  ; No, seguimos testeando.-
   ;call Demora_20ms ; Eliminamos Efecto rebote
   call Retardo_100ms ; TIEMPO 
   btfss PORTA,0  ; Testeamos nuevamente.-
   goto SEIS  ; Falsa Alarma, seguimos testeando.-
   bsf PORTA,1       ; pone un 1 en RA0 (enciende el LED)
   call seg3  ; ( 3 SEG )
   call seg3  ; ( 3 SEG )
   bcf PORTA,1  ; ( APAGA )
   goto SEIS
 
conteo    ; ACA cambia los registros no el acumulador, por eso es ,F y no ,W
      decfsz Contador, f ; al registro Contador de 50 le quita 1 queda en 49 y va a la siguiente instruccion
      goto $+2  ; No llego a 0 asi que salta 2 lineas y testea boton
      return
      btfss  PORTA,0  ; se presionó ?
      call Retardo_100ms ; TIEMPO 
      btfss PORTA,0  ; Testeamos nuevamente.-
      goto $+3  ; NO, asi que va a 3 linea
      call reset  ; RESETEA EL CONTADOR A 50
      return      ; retorna a donde fue llamado en UNOB
      call DEMORA  ; Llama demora de 100 mseg
      goto conteo  ; Vuelve a la rutina de conteo
reset
  movlw 0x32  ; 50 en hexadecimal ( eso por lo menos creo yo )
  movwf Contador ;cargamos Contador con 50
  return
; ***************** 100mseg **********************
 
DEMORA  movlw     .110      ; 1 set numero de repeticion  (B)
        movwf     Contador1 ; 1 |
PLoop1  movlw     .181      ; 1 set numero de repeticion  (A)
        movwf     Contador2 ; 1 |
PLoop2  clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    Contador2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    Contador1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
PDelL1  goto PDelL2         ; 2 ciclos delay
PDelL2  goto PDelL3         ; 2 ciclos delay
PDelL3  clrwdt              ; 1 ciclo delay
        return              ; 2+2 Fin.
 
   INCLUDE  <tiempos.INC>
   INCLUDE  <RETARDOS.INC>
   end
Los demas tiempos seleccionados estan con una subrutina externa de tiempos, solo hice la prueba con el numero 1.
Ahora pregunto, (1)cuando voy a la rutina con la Etiqueta RESET, para cargar el contador de nuevo con 50, esta bien ? ( o no es necesario y se autocarga solo al legar a 0 ?).
Otra pregunta, (2)para usar diferentes tiempos, necesito crear otros REG o puedo usar el mismo cargandole diferentes valores ?, por ej: incrementar el valor, segun el numero deseado, ( segun pienso yo ) o hay alguna manera mas facil ? .... Gracias nuevamente por todo !!!
05/04/2013 #16
Moderador

Avatar de Chico3001

La rutina esta bien... y puedes usar el mismo contador para cargar varios tiempos, pero solo unas observaciones...

Creo que abusas demasiado del GOTO, no esta mal para alguien que inicia, pero si hace que los programas sean menos legibles y mas largos, busca como estructurar el codigo, de esta manera usas el mismo codigo solo cambiando valores a los registros

Segundo, inicializa el contador ANTES de entrar a la subrutina y no despues... ya que algun error en el programa puede escribir ese registro y entrarias a la rutina pensando que el registro esta correctamente configurado cuando en realidad no lo esta... o lo inicializas antes de hacer el call o lo inicializas justo despues de entrar... aunque lo ideal es antes de hacer el call por que asi te da la flexibilidad de usar tiempos diferentes..

tercero, cuida las etiquetas... tienes 2 etiquetas llamadas reset, una al inicio del programa y otra al final... eso se presta para errores... siempre trata de eliminar lo mas que puedas de etiquetas buscando estructurar el codigo... o si no se puede entonces usar etiquetas mas descriptivas o mas dificiles de duplicar..
05/04/2013 #17

Avatar de Vangeluz

Super !!! ... gracias Chico3001, osea que puedo cargar el mismo contador con diferentes tiempos aun incrementando o decrementando su valor inicial, eso esta super.
Lo que no me quedó claro si al llegar a 0 el contador, se reinicia con el valor inicial solo, o hace falta volverlo a cargar como hice con la rutina reset !!! ( porque quiza cree la rutina en vano ).

Lo de los muchos GOTO, es verdad, no puedo vivir sin ellos, por ahora son los unicos con los cual puedo transportarme de un lugar a otro. hasta que lo estructure mejor el armado del programa, asi sea con tablas o mas armoniosamente.

Lo de inicializar antes el contador, mucho no me quedo claro, si por inicializarlo te refieres al decrementar (decfsz Contador ), y al call te refieres al ( call conteo ), entonces supuestamente deberia poner toda la rutina del decremento del contador en cada boton en mi caso, y se haria super largo creo yo, si es que entendi bien.

Es verdad con el tema de las etiquetas, cuando vi que habian 2 RESET lo iva a cambiar pero como vi que decia reset y el otro Reset, lo dejé, no se si toma la diferencia como ambiguo el MPLAB en Mayúsculas y minúsculas, creo que si.

Nuevamente Gracias y perdon por mi ignorancia. Pero estoy aprendiendo muchas cosas con gente que sabe y sobre todo explicar !!!
06/04/2013 #18

Avatar de fdesergio

Lo ideal es cargar el contador ANTES exactamente al comenzar la rutina, osea seria la primera linea de la subrutina, cuando el contador llega a 0, el siguiente paso es 255 porque se decrementa y pasa a ese valor, si o si se debe cargar el contador SIEMPRE nunca esperar que se cargue pues eso no pasara, lo de los goto tengo mis reparos si bien no se ven bien, son muy funcionales, es mas he hecho tablas que en vez de return usan goto y van bien, chauuuuuuuuuuuuuu
06/04/2013 #19

Avatar de Vangeluz

Hola, que tal de nuevo, ... Gracias nuevamente fdsergio, osea entonces quedaria:

Código:
conteo            ; ACA cambia los registros no el acumulador, por eso es ,F y no ,W
      
      movlw    0x32  ; 50 en hexadecimal ( CARGO PRIMERO EL CONTADOR )
      movwf    Contador ;cargamos Contador con 50
   
      decfsz    Contador, f ; al registro Contador de 50 le quita 1 queda en 49 y va a la siguiente instruccion
      goto    $+2  ; No llego a 0 asi que salta 2 lineas y testea boton
      return
      btfss    PORTA,0  ; se presionó ?
      call      Retardo_100ms ; TIEMPO 
      btfss    PORTA,0  ; Testeamos nuevamente.-
      goto    $+3  ; NO, asi que va a 3 linea
      call      reset  ; RESETEA EL CONTADOR A 50
      return      ; retorna a donde fue llamado en UNOB
      call      DEMORA  ; Llama demora de 100 mseg
      goto     conteo  ; Vuelve a la rutina de conteo
Osea que cargaria el contador ahi, en el principio de la rutina y no al principio del programa como lo he hecho hasta ahora.
Luego al terminar la rutina volverlo a cargar con el valor inicial de 50. ..CORRECTO ?

Otra pregunta: puede ser ( segun vi ejemplos por ahi y entendi yo), que en vez de usar el:
decfsz Contador, f usaria el
decfsz Contador, w y con eso no cambiaria nunca el valor de registro sino solo el valor del acumulador ?

Eso evitaria que lo este cargando siempre con 50 el contador y quedaria siempre cargado, o lo entendí mal ?

Desde ya muchas gracias !!!
06/04/2013 #20

Avatar de fdesergio

Si lode cargarlo asi esta bien, lo de decrementar W si esta muy mal pues en las subrutinas lo usas y todo se vuelve un pegote, NO USAR eso asi.

Lo de llamar una subrutina para resetear no es muy bueno pues usas al menso 3 instrucciones, mientras que borrandolo directamente solo usas una asi CLRF CONTADOR y listo.

Para cargar valores en tu caso 50 igual a 0X32 podes hacerlo asi MOVLW .50 el punto indica notacion decimal y el valor es ese, chauuuuuuuuu
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.