Autor Tema: Quero contar y sacar 12 bits por el port a y b en forma secuencial  (Leído 2604 veces)

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

Desconectado electronicos

  • PIC10
  • *
  • Mensajes: 5
Hola a todos, como buén principiante estoy enredado en la lógica del planteamiento (eso creo) mi problema es el siguiente: debo realizar un simple contador en el cual cuando apreto un boton, (portA,4) por el port B comience a contar (en binario) desde 0000 0000 hasta llenar sus 8 bits, es decir, cuando el port b llegue a 1111 1111 este vuelva a cero y por el port A comience a contar desde el 1, o sea, a la salida del pic con sus dos ports quedaría 0000 0000 1000, cuando se llene el port b, entonces el port A incrementa en 1 y quedaría 0000 000 0100, bueno y así hasta completar 12 bits.

Lo que tengo hecho es lo siguiente:

   list      p=16f84a
      #include    <P16F84A.INC>
;----------------------------------------
reg1      equ      0x0c
reg2      equ      0x0d

cont      equ      0x0e
Dato_L      equ      0x0f
cont2      equ      0x10


         org   0x00
         goto   inicio
inicio         bsf   STATUS,5
         clrf   TRISB
         movlw   b'11111000'
         movwf   TRISA
         bcf   STATUS,RP0
    ;      clrf   PORTA
       
;-----------------Lee en la EEprom----------------

         movlw   0x01
         movwf   EEADR
         bsf   STATUS,5
         bsf   EECON1,RD
nuevo      
         btfsc   EECON1,0
         goto   nuevo
         bcf   STATUS,5
         movf   EEDATA,W
         movwf   cont
;-----------------------------------------------------

      movf   cont,W
      movwf   PORTB

;----------------------------------------------------

otra
      btfsc   PORTA,3
      goto   otra
      clrf   reg1
      clrf   reg2
bucle      
      decfsz   reg1,F
      goto   bucle
      decfsz   reg2,F
      goto   bucle   


      incf   cont,F                                                                   ;desde esta línea
      movlw   0xFF                                                             ;
      sublw   cont

      btfss   STATUS,Z                   ;el resultado fué uno??
      incf   cont2,F
      movwf   PORTB
      movf   cont2,W;
      movwf   PORTA                                                            ;hasta esta, creo que tengo el error
      
;--------------------------Escribe en la EEprom---------------------------------------

      bcf   STATUS,5
      movlw   0x01
      movwf   EEADR
      movf   cont,W
      movwf   EEDATA
      bsf   STATUS,5
      bsf   EECON1,2
      
      movlw   0x55
      movwf   EECON2
      movlw   0xaa
      movwf   EECON2
      
      bsf   EECON1,1
nuevo2
      btfsc   EECON1,1
      goto   nuevo2
      bcf   STATUS,5
      goto   otra
;--------------------------------------------------------------
      end

El programa no esta completo, también tengo que decrementar, y grabar y leer en la eeprom, pero primero debo sacar el incremento.

Espero que un buen experto de los excelentes que hay en este foro, me pueda dar una manito para solucionar el problema.

Muchas gracias


Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #1 en: 09 de Enero de 2013, 15:48:34 »
Hola, creo que podrias emplear la instruccion INCFSZ
es decir, incrementas el registro, y salta si llega a cero... y esto justamente ocurre cuando superas el valor decimal 255 (1111 1111)
entonces, si esto ocurre, al saltar, incrementas al PORTA  :mrgreen:

ademas, puedes emplear directamente a los puertos como registro de cuentas, y evitas de mover los resultados.. se entiende?


incfsz  PORTB,F
GOTO  A DONDE SEA QUE SIGUE EL PROGRAMA
INCF PORTA,F ; SI supero la cuenta del porb, incremento la salida del porta...


« Última modificación: 09 de Enero de 2013, 15:51:02 por todopic »
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado electronicos

  • PIC10
  • *
  • Mensajes: 5
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #2 en: 09 de Enero de 2013, 16:34:18 »
Hola, muchas gracias por tu respuesta, después de mucho buscar por la web, siempre llegaba aquí, a todopic.
Bueno hice los cambios a mi programa como me indicastes y funciona de maravillas, lo acorté para realizar los cambios y funciona, gracias de nuevo. Ahora sólo me queda agregar un boton para ir atrás, y grabar  el dato en la  eeprom.
Bueno, en realidad, será usado con un 16F877A, el 16F84A lo usé sólo para probar en el Proteus.

javascript:void(0);

Dejo el código para quien le pueda servir.

      list      p=16f84a
      #include    <P16F84A.INC>
;----------------------------------------
reg1      equ   0x0c
reg2      equ   0x0d

cont1      equ   0x0e
cont2      equ   0x0f

      org   0x00
      goto   inicio
inicio      bsf   STATUS,5
      clrf   TRISB
      movlw   b'11111000'
      movwf   TRISA
      bcf   STATUS,RP0    
      clrf   PORTA
      clrf   PORTB
;---------------------------------------------------

otra
      btfsc   PORTA,3   ;pregunto si tecla es oprimida
      goto   otra      ;nop, entonces sigo esperando tecla oprimida
      clrf   reg1      ;si, hay tecla oprimida y limpio reg1
      clrf   reg2      ;y reg2  para iniciar un delay
bucle      
      decfsz   reg1,F      ;comienza delay
      goto   bucle                      ;y sigue
      decfsz   reg2,F      ;.........
      goto   bucle                           ;..........
      
;----------------------------------------------------------------------------------------------------------------------------------------
      incfsz  PORTB,F
      GOTO  label1
      INCF PORTA,F       ; SI supero la cuenta del porb, incremento la salida del porta...


label1   
      goto   otra

      

;--------------------------------------------------------------
      end

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #3 en: 09 de Enero de 2013, 17:06:20 »
puedes hacer el goto label1, y label1 goto otra... directamente colocando  GOTO OTRA  ;-)

 incfsz  PORTB,F
      GOTO OTRA
      INCF PORTA,F       ; SI supero la cuenta del porb, incremento la salida del porta...
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado electronicos

  • PIC10
  • *
  • Mensajes: 5
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #4 en: 09 de Enero de 2013, 19:42:09 »
Gracias de nuevo, bueno, viendo el programa, es clara la redundancia, pero sabes que?
me queda un problema, como estoy trabajando directamente con las puertas, como hago para almacenar
su valor en la eeprom? se pueden cargar en el cont1 y cont2 así nada más?

es decir:
------------------
movf     portb.w
movwf   cont1


movf     porta,w
mowf    cont2
-----------------

lo estoy probando, pero no funciona

Saludos cordiales


Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #5 en: 09 de Enero de 2013, 23:08:07 »
Si, eso tiene que andar perfectamente.. creo que no te funciona porque PORTA y B estan en minuscula...

luego, para restar, podrias hacer similar... con la instruccion DECFSZ


DECFSZ PORTB
goto .....
decf PORTA,f   :mrgreen:
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado electronicos

  • PIC10
  • *
  • Mensajes: 5
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #6 en: 10 de Enero de 2013, 14:12:26 »
Hola todopic, gracias por responder, todo lo que me has indicado me ha funcionado, pero antes te cuento, esta es la segunda vez que escribo este mensaje, ya que en el anterior adjunté el archivo de proteus pero el sistema no lo permitio y parece que perdí lo escrito, no supe como volver, así que todo de nuevo. Bueno, trataré de explicar de nuevo, con el botón de incrementar el sistema cuenta graba y recupera el valor sin problemas, al agregar el segundo botón para decrementar, el sistema definitivamente se pega, si hago un bypass al boton de incrementar y dejo sólo al decrementar  ( como está comentado en el código), el sistema decrementa la cuenta, graba en eeprom y muestra el valor guardado. He pasado muchas horas tratando de entender y revisar el código, pero no funciona con los dos botones, me imagino que no doy con la lógica para que funcione. Quisiera abusar de tu buena voluntad y si me pudieras indicar alguna posible solución al tema, te quedaría muy agradecido.

Saludos cordiales.

código:
      list      p=16f84a
      #include    <P16F84A.INC>
      
      
;----------------------------------------
reg1      equ   0x0c
reg2      equ   0x0d

cont1      equ   0x0e
cont2      equ   0x0f

      org   0x00
      goto   inicio
inicio      bsf   STATUS,5
      clrf   TRISB
      movlw   b'11111100'
      movwf   TRISA
      bcf   STATUS,RP0    
      clrf   PORTA
      clrf   PORTB
      clrf   cont1
      clrf   cont2
;-----------------Lee en la EEprom 1er dato----------------

         movlw   0x01
         movwf   EEADR
         bsf   STATUS,5
         bsf   EECON1,RD
nuevo      
         btfsc   EECON1,0
         goto   nuevo
         bcf   STATUS,5
         movf   EEDATA,W
         movwf   cont1
;-----------------------------------------------------

      movf   cont1,W
      movwf   PORTB

;----------------------------------------------------

;-----------------Lee en la EEprom 2o dato----------------

         movlw   0x02
         movwf   EEADR
         bsf   STATUS,5
         bsf   EECON1,RD
nuevo1      
         btfsc   EECON1,0
         goto   nuevo1
         bcf   STATUS,5
         movf   EEDATA,W
         movwf   cont2
;-----------------------------------------------------

      movf   cont2,W
      movwf   PORTA
      goto   otra2      ; aquí bypass el código para bajar cuenta
      
;----------------------------------------------------tecla para subir cuenta----------------------

otra1
      btfss   PORTA,3   ;pregunto si tecla es oprimida
      goto   otra1      ;nop, entonces sigo esperando tecla oprimida
      
      clrf   reg1      ;si, hay tecla oprimida y limpio reg1
      clrf   reg2      ;y reg2  para iniciar un delay

bucle1      
   ;   decfsz   reg1,F      ;comienza delay bypass el delay para efecto de simul en proteus
   ;   goto   bucle      ;y sigue
   ;   decfsz   reg2,F      ;.........
   ;   goto   bucle                  ;..........
   
      
      incfsz  PORTB,F
      goto  label1
      INCF PORTA,F       ; SI supero la cuenta del porb, incremento la salida del porta...
      movf   PORTA,W
label1      
      movf    PORTB,W
      movwf   cont1
      movf   PORTA,W
      movwf cont2
;----------------------------------------------------------------------------------------------------------------------------

;--------------------------------------------------------tecla para bajar cuenta----------------------------------------------

otra2
      btfsc   PORTA,2   ;pregunto si tecla es oprimida
      goto   otra2      ;nop, entonces sigo esperando tecla oprimida
      clrf   reg1      ;si, hay tecla oprimida y limpio reg1
      clrf   reg2      ;y reg2  para iniciar un delay

bucle2      
   ;   decfsz   reg1,F      ;comienza delay  bypass el delay para efecto de simul en proteus
   ;   goto   bucle      ;y sigue
   ;   decfsz   reg2,F      ;.........
   ;   goto   bucle                  ;..........
   
      
      decfsz  PORTB,F      ;disminuyo portB
      goto  label2      ;si no es cero, voy al label2
      DECF PORTA,F       ; SI   la cuenta del porb llega a cero , decremento la salida del porta...
      movf   PORTA,W      ;y lo saco por portA
label2      
      movf    PORTB,W      ;recupero el valor4 en portB
      movwf   cont1      ;y lo guardo en cont1
      movf   PORTA,W           ;recupero valor en portA
      movwf cont2      ;y lo guardo en cont2
      
;--------------------------Escribe en la EEprom 1er dato---------------------------------------

      bcf   STATUS,5
      movlw   0x01
      movwf   EEADR
      movf   cont1,W
      movwf   EEDATA
      bsf   STATUS,5
      bsf   EECON1,2
      
      movlw   0x55
      movwf   EECON2
      movlw   0xaa
      movwf   EECON2
      
      bsf   EECON1,1
nuevo3
      btfsc   EECON1,1
      goto   nuevo3
      bcf   STATUS,5
      
;--------------------------Escribe en la EEprom 2 dato---------------------------------------

      bcf   STATUS,5
      movlw   0x02
      movwf   EEADR
      movf   cont2,W
      movwf   EEDATA
      bsf   STATUS,5
      bsf   EECON1,2
      
      movlw   0x55
      movwf   EECON2
      movlw   0xaa
      movwf   EECON2
      
      bsf   EECON1,1
nuevo4
      btfsc   EECON1,1
      goto   nuevo4
      bcf   STATUS,5
   

   
;--------------------------------------------------------------
      
label      goto   otra2


      

;--------------------------------------------------------------
      end

Desconectado electronicos

  • PIC10
  • *
  • Mensajes: 5
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #7 en: 11 de Enero de 2013, 14:41:06 »
Estimado todopic: finalmente encontré las solución a mi problema, y el programa funciona perfectamente como yo lo necesito,
nuevamente gracias por tu colaboración, me ayudó no sólo a realizar mi programa, si no que, y lo más valioso, aprendí mucho más y me siento más seguro al escribir código. Gracias y bendiciones, realizan un estupendo trabajo.

Saludos cordiales

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: Quero contar y sacar 12 bits por el port a y b en forma secuencial
« Respuesta #8 en: 11 de Enero de 2013, 17:08:45 »
Hola Electronicos, gracias por tus agradecimientos!  ;-)

me alegro que ya te funciona bien tu programa...
algunas mejoras, para que el programa sea mas legible y estrcturado..

define los pulsadores... debajo de los EQU  de la siguiente forma

#DEFINE PULSADOR_SUMA   PORTA,3   
#DEFINE PULSADOR_RESTA  PORTA,2 

Entonces, en tu programa, en lugar de escribir

btfss   PORTA,3   ;pregunto si tecla es oprimida


lo reemplazas por

BTFSS  PULSADOR_SUMA

¿se entiende?

Luego, yo colocaria los programitas de grabación y lectura de la eeprom, como subrutinas...  las llamas con CALL (y el nombre que le des a la subrutina.. y esta, debe terminar con RETURN)  :mrgreen:

Suerte!

Norberto


Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...