Autor Tema: uno que empieza  (Leído 2432 veces)

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

Desconectado mji

  • PIC10
  • *
  • Mensajes: 3
uno que empieza
« en: 21 de Marzo de 2006, 21:20:00 »
Estoy empezando con el pic 16f84 los pocos circuitos que he hecho copiados eso si me han funcionado mas o menos pero la dificultad que me he encontrado ha sido al intentar modificar un programa que habia por ahi
el programa era este
list           p=16F84A
ESTADO      EQU      0x03
PORTA      EQU      0x05
PORTB      EQU      0x06

      org      0

      bsf      ESTADO,5
      clrf      PORTA
      comf      PORTA,0
      clrf      PORTB
      bcf      ESTADO,5

INICIO      btfsc      PORTA,0
      goto      APAGAR
      goto      ENCENDER
APAGAR      bcf      PORTB,0
      goto      INICIO
ENCENDER   bsf      PORTB,0
               
                goto            INICIO
        
                 

      end

la dificultad me viene ahora al modificar la etiqueta encender de esta manera:
ENCENDER   bsf      PORTB,0
                         btfsc      PORTA,1
                        goto            INICIO
              goto            ENCENDER

lo que quiero hacer es que cuando de al 1er pulsador  se encienda el led quede encendido y cuando de al 2 pulsador el led se apague me podeis decir donde he metido la pata muchas gracias a todos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
RE: uno que empieza
« Respuesta #1 en: 21 de Marzo de 2006, 23:17:00 »
Hola. Supuse que al pulsador 1 lo tienes conectado a PORTA,0 y al pulsador 2 a PORTA,1.Los pulsadores envian 0v cuando estan presionados, y 5v cuando no lo estan.

Debes tener en cuenta siempre el antirrebote(darle un tiempo a que la señal del pulsador se estabilice) cuando utilizas pulsadores.
Este codigo hace que el led conectado a PORTB,0 encienda cuando presionas el pulsador 1, y se apague cuando presiones el pulsador 2.

Otro detalle,hacer:

CLRF PORTA
COMF PORTA,0

es incorrecto.

CLRF PORTA configura todo el puertoA como salida.
COMF PORTA,0 hace que el valor del puertoA se complemente valiendo entonces el valor binario 11111111. El problema es que al resultado de ese complemento lo guardas en 0(el acumulador o conocido gralmente como W) y no en 1(el registro que en este caso es el puertoA). Por lo tanto, el PUERTOA continua configurado como salida, en lugar de ser entrada. Espero que no hayas quemado los pines....Enfurruñado

Por lo tanto SI seria correcto pero inadecuado hacer:

CLRF PORTA
COMF PORTA,1

Pero te recomiendo que hagas directamente asi:

MOVLW 0xff
MOVWF PORTA

Si bien estas dos ultimas hacen lo mismo, esta ultima opcion que te puse, te permitira mayor flexibilidad si en el futuro deseas alternar entre entradas y salidas.

El programa:

Codigo:


   list p=16F84A

ESTADO    EQU 0x03
PORTA    EQU 0x05
PORTB    EQU 0x06

CONTA0 EQU 0x1C
CONTA1 EQU 0x1D

   org 0

   bsf    ESTADO,5
   movlw    0xff
   movwf    PORTA
   clrf    PORTB
   bcf    ESTADO,5

INICIO    btfss    PORTA,0
   goto    ENCENDER

   btfss    PORTA,1
   goto    APAGAR

   goto    INICIO

APAGAR    call    antirrebote
   bcf    PORTB,0
   goto    INICIO

ENCENDER call    antirrebote
   bsf    PORTB,0
   goto    INICIO

antirrebote
   clrf   CONTA0
RET1
   movlw   .51
   movwf   CONTA1

   decfsz   CONTA1,1
   goto   $-1
   decfsz   CONTA0,1
   goto   RET1
   return

   end





Exitos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado mji

  • PIC10
  • *
  • Mensajes: 3
RE: uno que empieza
« Respuesta #2 en: 22 de Marzo de 2006, 05:21:00 »
muchas gracias por tu tiempo voy a ver si funciona me podias explicar un poco la ultima parte del codigo el ret1 no se ni por donde cogerlo
gracias por anticipado
un saludo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: uno que empieza
« Respuesta #3 en: 22 de Marzo de 2006, 13:29:00 »
Escrito originalmente por mji
muchas gracias por tu tiempo voy a ver si funciona me podias explicar un poco la ultima parte del codigo el ret1 no se ni por donde cogerlo
gracias por anticipado
un saludo


Segun entiendo carga 0 en CONTA0 y .51 en CONTA1.

Va decrementando hasta que son iguales a 0.  Como CONTA0 vale 0, en el primer decremento valdrá 0XFF y no se cumple la condición.  La funcion primero decrementa y luego verifica si el resultado es 0.
Entonces esto produce que se repita el decremento de CONTA1 256 veces.

Una vez CONTA0 es igual a 0 retorna a la instrucción siguiente de donde fue llamada la subrutina


Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)